lib/grizzly/zwave/command_classes/sensor_binary.ex

defmodule Grizzly.ZWave.CommandClasses.SensorBinary do
  @moduledoc """
  Deprecated command class for triggered/not triggered sensors.
  """

  @behaviour Grizzly.ZWave.CommandClass
  alias Grizzly.ZWave.DecodeError

  @type sensor_type() ::
          :general_purpose
          | :smoke
          | :co
          | :co2
          | :heat
          | :water
          | :freeze
          | :tamper
          | :aux
          | :door_window
          | :tilt
          | :motion
          | :glass_break

  @impl Grizzly.ZWave.CommandClass
  def byte(), do: 0x30

  @impl Grizzly.ZWave.CommandClass
  def name(), do: :sensor_binary

  @doc """
  Encode the type value for the sensor report
  """
  @spec encode_type(sensor_type()) :: byte()
  def encode_type(:general_purpose), do: 0x01
  def encode_type(:smoke), do: 0x02
  def encode_type(:co), do: 0x03
  def encode_type(:co2), do: 0x04
  def encode_type(:heat), do: 0x05
  def encode_type(:water), do: 0x06
  def encode_type(:freeze), do: 0x07
  def encode_type(:tamper), do: 0x08
  def encode_type(:aux), do: 0x09
  def encode_type(:door_window), do: 0x0A
  def encode_type(:tilt), do: 0x0B
  def encode_type(:motion), do: 0x0C
  def encode_type(:glass_break), do: 0x0D

  @doc """
  Parse the type value from a byte
  """
  @spec decode_type(byte()) :: {:ok, sensor_type()} | {:error, DecodeError.t()}
  def decode_type(0x01), do: {:ok, :general_purpose}
  def decode_type(0x02), do: {:ok, :smoke}
  def decode_type(0x03), do: {:ok, :co}
  def decode_type(0x04), do: {:ok, :co2}
  def decode_type(0x05), do: {:ok, :heat}
  def decode_type(0x06), do: {:ok, :water}
  def decode_type(0x07), do: {:ok, :freeze}
  def decode_type(0x08), do: {:ok, :tamper}
  def decode_type(0x09), do: {:ok, :aux}
  def decode_type(0x0A), do: {:ok, :door_window}
  def decode_type(0x0B), do: {:ok, :tilt}
  def decode_type(0x0C), do: {:ok, :motion}
  def decode_type(0x0D), do: {:ok, :glass_break}

  def decode_type(byte),
    do: {:error, %DecodeError{value: byte, param: :sensor_type, command: :sensor_binary}}
end