# `Jido.Sensor.Spec`
[🔗](https://github.com/agentjido/jido/blob/v2.3.0/lib/jido/sensor/spec.ex#L1)

The normalized representation of a sensor specification.

Contains all metadata needed to configure and run a sensor,
including the module, name, description, configuration, and schema.

## Fields

- `module` - The sensor module (required)
- `name` - Sensor name (required)
- `description` - Optional sensor description
- `config` - Configuration map for the sensor (default: %{})
- `schema` - Optional Zoi schema for introspection

## Examples

    Sensor.Spec.new!(%{module: MySensor, name: "my_sensor"})
    # => %Sensor.Spec{module: MySensor, name: "my_sensor", config: %{}}

    Sensor.Spec.new(%{module: MySensor, name: "my_sensor", config: %{interval: 1000}})
    # => {:ok, %Sensor.Spec{module: MySensor, name: "my_sensor", config: %{interval: 1000}}}

# `t`

```elixir
@type t() :: %Jido.Sensor.Spec{
  config: map(),
  description: nil | binary(),
  module: atom(),
  name: binary(),
  schema: nil | any()
}
```

# `new`

```elixir
@spec new(map()) :: {:ok, t()} | {:error, term()}
```

Creates a new Sensor.Spec from a map of attributes.

Returns `{:ok, spec}` or `{:error, reason}`.

## Examples

    Sensor.Spec.new(%{module: MySensor, name: "my_sensor"})
    # => {:ok, %Sensor.Spec{module: MySensor, name: "my_sensor", config: %{}}}

    Sensor.Spec.new(%{name: "missing_module"})
    # => {:error, validation_errors}

# `new!`

```elixir
@spec new!(map()) :: t()
```

Creates a new Sensor.Spec from a map, raising on error.

## Examples

    Sensor.Spec.new!(%{module: MySensor, name: "my_sensor"})
    # => %Sensor.Spec{module: MySensor, name: "my_sensor", config: %{}}

# `schema`

```elixir
@spec schema() :: Zoi.schema()
```

Returns the Zoi schema for Sensor.Spec.
