defmodule Grizzly.ZWave.CommandClasses.Indicator do
@moduledoc """
"Indicator" Command Class
The Indicator Command Class is used to help end users to monitor the operation or condition of the
application provided by a supporting node.
"""
@behaviour Grizzly.ZWave.CommandClass
alias Grizzly.ZWave.DecodeError
@type value :: byte | :on | :off | :restore
@type resource :: [indicator_id: indicator_id, property_id: property_id, value: byte]
@type indicator_id ::
byte
| :armed
| :disarmed
| :ready
| :fault
| :busy
| :enter_id
| :enter_pin
| :code_accepted
| :armed_stay
| :armed_away
| :alarming
| :alarming_burglar
| :alarming_smoke_fire
| :alarming_co
| :bypass_challenger
| :entry_delay
| :alarming_medical
| :alarming_freeze_warning
| :alarming_water_leak
| :alarming_panic
| :zone_1_armed
| :zone_2_armed
| :zone_3_armed
| :zone_4_armed
| :zone_5_armed
| :zone_6_armed
| :zone_7_armed
| :zone_8_armed
| :lcd_backlight
| :button_1
| :button_2
| :button_3
| :button_4
| :button_5
| :button_6
| :button_7
| :button_8
| :button_9
| :button_10
| :button_11
| :button_12
| :node_identify
| :sound_1
| :sound_2
| :sound_3
| :sound_4
| :sound_5
| :sound_6
| :sound_7
| :sound_8
| :sound_9
| :sound_10
| :sound_11
| :sound_12
| :sound_13
| :sound_14
| :sound_15
| :sound_16
| :sound_17
| :sound_18
| :sound_19
| :sound_20
| :sound_21
| :sound_22
| :sound_23
| :sound_24
| :sound_25
| :sound_26
| :sound_27
| :sound_28
| :sound_29
| :sound_30
| :sound_31
| :sound_32
| :undefined
@type property_id ::
byte
| :multilevel
| :binary
| :toggling_periods
| :toggling_cycles
| :toggling_on_time
| :timeout_minutes
| :timeout_seconds
| :timeout_hundredths_second
| :sound_level
| :low_power
| :undefined
@impl true
def byte(), do: 0x87
@impl true
def name(), do: :indicator
def indicator_id_to_byte(:undefined), do: 0x00
def indicator_id_to_byte(:armed), do: 0x01
def indicator_id_to_byte(:disarmed), do: 0x02
def indicator_id_to_byte(:ready), do: 0x03
def indicator_id_to_byte(:fault), do: 0x04
def indicator_id_to_byte(:busy), do: 0x05
def indicator_id_to_byte(:enter_id), do: 0x06
def indicator_id_to_byte(:enter_pin), do: 0x07
def indicator_id_to_byte(:code_accepted), do: 0x08
def indicator_id_to_byte(:code_not_accepted), do: 0x09
def indicator_id_to_byte(:armed_stay), do: 0x0A
def indicator_id_to_byte(:armed_away), do: 0x0B
def indicator_id_to_byte(:alarming), do: 0x0C
def indicator_id_to_byte(:alarming_burglar), do: 0x0D
def indicator_id_to_byte(:alarming_smoke_fire), do: 0x0E
def indicator_id_to_byte(:alarming_co), do: 0x0F
def indicator_id_to_byte(:bypass_challenge), do: 0x10
def indicator_id_to_byte(:entry_delay), do: 0x11
def indicator_id_to_byte(:exit_delay), do: 0x12
def indicator_id_to_byte(:alarming_medical), do: 0x13
def indicator_id_to_byte(:alarming_freeze_warning), do: 0x14
def indicator_id_to_byte(:alarming_water_leak), do: 0x15
def indicator_id_to_byte(:alarming_panic), do: 0x16
def indicator_id_to_byte(:zone_1_armed), do: 0x20
def indicator_id_to_byte(:zone_2_armed), do: 0x21
def indicator_id_to_byte(:zone_3_armed), do: 0x22
def indicator_id_to_byte(:zone_4_armed), do: 0x23
def indicator_id_to_byte(:zone_5_armed), do: 0x24
def indicator_id_to_byte(:zone_6_armed), do: 0x25
def indicator_id_to_byte(:zone_7_armed), do: 0x26
def indicator_id_to_byte(:zone_8_armed), do: 0x27
def indicator_id_to_byte(:lcd_backlight), do: 0x30
def indicator_id_to_byte(:button_backlit_letters), do: 0x40
def indicator_id_to_byte(:button_backlit_digits), do: 0x41
def indicator_id_to_byte(:button_backlit_commands), do: 0x42
def indicator_id_to_byte(:button_1), do: 0x43
def indicator_id_to_byte(:button_2), do: 0x44
def indicator_id_to_byte(:button_3), do: 0x45
def indicator_id_to_byte(:button_4), do: 0x46
def indicator_id_to_byte(:button_5), do: 0x47
def indicator_id_to_byte(:button_6), do: 0x48
def indicator_id_to_byte(:button_7), do: 0x49
def indicator_id_to_byte(:button_8), do: 0x4A
def indicator_id_to_byte(:button_9), do: 0x4B
def indicator_id_to_byte(:button_10), do: 0x4C
def indicator_id_to_byte(:button_11), do: 0x4D
def indicator_id_to_byte(:button_12), do: 0x4E
def indicator_id_to_byte(:node_identify), do: 0x50
def indicator_id_to_byte(:sound_1), do: 0x60
def indicator_id_to_byte(:sound_2), do: 0x61
def indicator_id_to_byte(:sound_3), do: 0x62
def indicator_id_to_byte(:sound_4), do: 0x63
def indicator_id_to_byte(:sound_5), do: 0x64
def indicator_id_to_byte(:sound_6), do: 0x65
def indicator_id_to_byte(:sound_7), do: 0x66
def indicator_id_to_byte(:sound_8), do: 0x67
def indicator_id_to_byte(:sound_9), do: 0x68
def indicator_id_to_byte(:sound_10), do: 0x69
def indicator_id_to_byte(:sound_11), do: 0x6A
def indicator_id_to_byte(:sound_12), do: 0x6B
def indicator_id_to_byte(:sound_13), do: 0x6C
def indicator_id_to_byte(:sound_14), do: 0x6D
def indicator_id_to_byte(:sound_15), do: 0x6E
def indicator_id_to_byte(:sound_16), do: 0x6F
def indicator_id_to_byte(:sound_17), do: 0x70
def indicator_id_to_byte(:sound_18), do: 0x71
def indicator_id_to_byte(:sound_19), do: 0x72
def indicator_id_to_byte(:sound_20), do: 0x73
def indicator_id_to_byte(:sound_21), do: 0x74
def indicator_id_to_byte(:sound_22), do: 0x75
def indicator_id_to_byte(:sound_23), do: 0x76
def indicator_id_to_byte(:sound_24), do: 0x77
def indicator_id_to_byte(:sound_25), do: 0x78
def indicator_id_to_byte(:sound_26), do: 0x79
def indicator_id_to_byte(:sound_27), do: 0x7A
def indicator_id_to_byte(:sound_28), do: 0x7B
def indicator_id_to_byte(:sound_29), do: 0x7C
def indicator_id_to_byte(:sound_30), do: 0x7D
def indicator_id_to_byte(:sound_31), do: 0x7E
def indicator_id_to_byte(:sound_32), do: 0x7F
def indicator_id_to_byte(:buzzer), do: 0xF0
def indicator_id_to_byte(byte) when byte in 0x00..0xF0, do: byte
def property_id_to_byte(:undefined), do: 0x00
def property_id_to_byte(:multilevel), do: 0x01
def property_id_to_byte(:binary), do: 0x02
def property_id_to_byte(:toggling_periods), do: 0x03
def property_id_to_byte(:toggling_cycles), do: 0x04
def property_id_to_byte(:toggling_on_time), do: 0x05
def property_id_to_byte(:timeout_minutes), do: 0x06
def property_id_to_byte(:timeout_seconds), do: 0x07
def property_id_to_byte(:timeout_hundredths_second), do: 0x08
def property_id_to_byte(:sound_level), do: 0x09
def property_id_to_byte(:low_power), do: 0x0A
def property_id_to_byte(byte) when byte in 0..10, do: byte
def value_to_byte(:off, :multilevel), do: 0x00
def value_to_byte(:restore, :multilevel), do: 0xFF
def value_to_byte(byte, :multilevel) when byte in 0x00..0x63, do: byte
def value_to_byte(0xFF, :multilevel), do: 0xFF
def value_to_byte(:off, :binary), do: 0x00
def value_to_byte(:on, :binary), do: 0xFF
def value_to_byte(byte, :binary) when byte in 0x00..0x63, do: byte
def value_to_byte(0xFF, :binary), do: 0xFF
def value_to_byte(byte, _property_id), do: byte
def indicator_id_from_byte(0x01), do: {:ok, :armed}
def indicator_id_from_byte(0x02), do: {:ok, :disarmed}
def indicator_id_from_byte(0x03), do: {:ok, :ready}
def indicator_id_from_byte(0x04), do: {:ok, :fault}
def indicator_id_from_byte(0x05), do: {:ok, :busy}
def indicator_id_from_byte(0x06), do: {:ok, :enter_id}
def indicator_id_from_byte(0x07), do: {:ok, :enter_pin}
def indicator_id_from_byte(0x08), do: {:ok, :code_accepted}
def indicator_id_from_byte(0x09), do: {:ok, :code_not_accepted}
def indicator_id_from_byte(0x0A), do: {:ok, :armed_stay}
def indicator_id_from_byte(0x0B), do: {:ok, :armed_away}
def indicator_id_from_byte(0x0C), do: {:ok, :alarming}
def indicator_id_from_byte(0x0D), do: {:ok, :alarming_burglar}
def indicator_id_from_byte(0x0E), do: {:ok, :alarming_smoke_fire}
def indicator_id_from_byte(0x0F), do: {:ok, :alarming_co}
def indicator_id_from_byte(0x10), do: {:ok, :bypass_challenge}
def indicator_id_from_byte(0x11), do: {:ok, :entry_delay}
def indicator_id_from_byte(0x12), do: {:ok, :exit_delay}
def indicator_id_from_byte(0x13), do: {:ok, :alarming_medical}
def indicator_id_from_byte(0x14), do: {:ok, :alarming_freeze_warning}
def indicator_id_from_byte(0x15), do: {:ok, :alarming_water_leak}
def indicator_id_from_byte(0x16), do: {:ok, :alarming_panic}
def indicator_id_from_byte(0x20), do: {:ok, :zone_1_armed}
def indicator_id_from_byte(0x21), do: {:ok, :zone_2_armed}
def indicator_id_from_byte(0x22), do: {:ok, :zone_3_armed}
def indicator_id_from_byte(0x23), do: {:ok, :zone_4_armed}
def indicator_id_from_byte(0x24), do: {:ok, :zone_5_armed}
def indicator_id_from_byte(0x25), do: {:ok, :zone_6_armed}
def indicator_id_from_byte(0x26), do: {:ok, :zone_7_armed}
def indicator_id_from_byte(0x27), do: {:ok, :zone_8_armed}
def indicator_id_from_byte(0x30), do: {:ok, :lcd_backlight}
def indicator_id_from_byte(0x40), do: {:ok, :button_backlit_letters}
def indicator_id_from_byte(0x41), do: {:ok, :button_backlit_digits}
def indicator_id_from_byte(0x42), do: {:ok, :button_backlit_commands}
def indicator_id_from_byte(0x43), do: {:ok, :button_1}
def indicator_id_from_byte(0x44), do: {:ok, :button_2}
def indicator_id_from_byte(0x45), do: {:ok, :button_3}
def indicator_id_from_byte(0x46), do: {:ok, :button_4}
def indicator_id_from_byte(0x47), do: {:ok, :button_5}
def indicator_id_from_byte(0x48), do: {:ok, :button_6}
def indicator_id_from_byte(0x49), do: {:ok, :button_7}
def indicator_id_from_byte(0x4A), do: {:ok, :button_8}
def indicator_id_from_byte(0x4B), do: {:ok, :button_9}
def indicator_id_from_byte(0x4C), do: {:ok, :button_10}
def indicator_id_from_byte(0x4D), do: {:ok, :button_11}
def indicator_id_from_byte(0x4E), do: {:ok, :button_12}
def indicator_id_from_byte(0x50), do: {:ok, :node_identify}
def indicator_id_from_byte(0x60), do: {:ok, :sound_1}
def indicator_id_from_byte(0x61), do: {:ok, :sound_2}
def indicator_id_from_byte(0x62), do: {:ok, :sound_3}
def indicator_id_from_byte(0x63), do: {:ok, :sound_4}
def indicator_id_from_byte(0x64), do: {:ok, :sound_5}
def indicator_id_from_byte(0x65), do: {:ok, :sound_6}
def indicator_id_from_byte(0x66), do: {:ok, :sound_7}
def indicator_id_from_byte(0x67), do: {:ok, :sound_8}
def indicator_id_from_byte(0x68), do: {:ok, :sound_9}
def indicator_id_from_byte(0x69), do: {:ok, :sound_10}
def indicator_id_from_byte(0x6A), do: {:ok, :sound_11}
def indicator_id_from_byte(0x6B), do: {:ok, :sound_12}
def indicator_id_from_byte(0x6C), do: {:ok, :sound_13}
def indicator_id_from_byte(0x6D), do: {:ok, :sound_14}
def indicator_id_from_byte(0x6E), do: {:ok, :sound_15}
def indicator_id_from_byte(0x6F), do: {:ok, :sound_16}
def indicator_id_from_byte(0x70), do: {:ok, :sound_17}
def indicator_id_from_byte(0x71), do: {:ok, :sound_18}
def indicator_id_from_byte(0x72), do: {:ok, :sound_19}
def indicator_id_from_byte(0x73), do: {:ok, :sound_20}
def indicator_id_from_byte(0x74), do: {:ok, :sound_21}
def indicator_id_from_byte(0x75), do: {:ok, :sound_22}
def indicator_id_from_byte(0x76), do: {:ok, :sound_23}
def indicator_id_from_byte(0x77), do: {:ok, :sound_24}
def indicator_id_from_byte(0x78), do: {:ok, :sound_25}
def indicator_id_from_byte(0x79), do: {:ok, :sound_26}
def indicator_id_from_byte(0x7A), do: {:ok, :sound_27}
def indicator_id_from_byte(0x7B), do: {:ok, :sound_28}
def indicator_id_from_byte(0x7C), do: {:ok, :sound_29}
def indicator_id_from_byte(0x7D), do: {:ok, :sound_30}
def indicator_id_from_byte(0x7E), do: {:ok, :sound_31}
def indicator_id_from_byte(0x7F), do: {:ok, :sound_32}
def indicator_id_from_byte(0xF0), do: {:ok, :buzzer}
# Devices can return an indicator id == 0
def indicator_id_from_byte(0x00), do: {:ok, :undefined}
def indicator_id_from_byte(byte) when byte in 0x80..0x9F, do: {:ok, byte}
def indicator_id_from_byte(byte),
do: {:error, %DecodeError{value: byte, param: :indicator_id, command: nil}}
def property_id_from_byte(0x01), do: {:ok, :multilevel}
def property_id_from_byte(0x02), do: {:ok, :binary}
def property_id_from_byte(0x03), do: {:ok, :toggling_periods}
def property_id_from_byte(0x04), do: {:ok, :toggling_cycles}
def property_id_from_byte(0x05), do: {:ok, :toggling_on_time}
def property_id_from_byte(0x06), do: {:ok, :timeout_minutes}
def property_id_from_byte(0x07), do: {:ok, :timeout_seconds}
def property_id_from_byte(0x08), do: {:ok, :timeout_hundredths_second}
def property_id_from_byte(0x09), do: {:ok, :sound_level}
def property_id_from_byte(0x0A), do: {:ok, :low_power}
def property_id_from_byte(0x00), do: {:ok, :undefined}
def property_id_from_byte(byte),
do: {:error, %DecodeError{value: byte, param: :property_id, command: nil}}
def value_from_byte(0x00, :multilevel), do: {:ok, :off}
def value_from_byte(0xFF, :multilevel), do: {:ok, :restore}
def value_from_byte(byte, :multilevel) when byte in 0x01..0x63, do: {:ok, byte}
def value_from_byte(byte, :multilevel),
do: {:error, %DecodeError{value: byte, param: :value, command: nil}}
def value_from_byte(0x00, :binary), do: {:ok, :off}
def value_from_byte(0xFF, :binary), do: {:ok, :on}
def value_from_byte(byte, :binary),
do: {:error, %DecodeError{value: byte, param: :value, command: nil}}
def value_from_byte(byte, _property_id), do: {:ok, byte}
end