Packages
grizzly
0.10.0
9.1.4
9.1.2
9.1.1
9.1.0
9.0.0
8.15.3
8.15.2
8.15.1
8.15.0
8.14.0
8.13.0
8.12.0
8.11.3
8.11.2
8.11.1
8.11.0
8.10.0
8.9.0
8.8.1
8.8.0
8.7.1
8.7.0
8.6.12
8.6.11
8.6.10
8.6.9
8.6.8
8.6.7
retired
8.6.6
8.6.5
8.6.4
8.6.3
8.6.2
8.6.1
8.6.0
8.5.3
8.5.2
8.5.1
8.5.0
8.4.0
8.3.0
8.2.3
8.2.2
8.2.1
8.2.0
8.1.0
8.0.1
8.0.0
7.4.3
7.4.2
7.4.1
7.4.0
7.3.0
7.2.0
7.1.4
7.1.3
7.1.2
7.1.1
7.1.0
7.0.4
7.0.3
7.0.2
7.0.1
7.0.0
6.8.8
6.8.7
6.8.6
6.8.5
6.8.4
6.8.3
6.8.2
6.8.1
6.8.0
6.7.1
6.7.0
6.6.1
6.6.0
6.5.1
6.5.0
6.4.0
6.3.0
6.2.0
6.1.1
6.1.0
6.0.1
6.0.0
5.4.1
5.4.0
5.3.0
5.2.8
5.2.7
5.2.6
5.2.5
5.2.4
5.2.3
5.2.2
5.2.1
5.2.0
5.1.2
5.1.1
5.1.0
5.0.2
5.0.1
5.0.0
4.0.1
4.0.0
3.0.0
2.1.0
2.0.0
1.0.1
1.0.0
0.22.7
0.22.6
0.22.5
0.22.4
0.22.3
0.22.2
0.22.1
0.22.0
0.21.1
0.21.0
0.20.2
0.20.1
0.20.0
0.19.1
0.19.0
0.18.3
0.18.2
0.18.1
0.18.0
0.17.7
0.17.6
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.2
0.16.1
0.16.0
0.15.11
0.15.10
0.15.9
0.15.8
0.15.7
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.8
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.0
0.12.3
0.12.2
0.12.1
0.12.0
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.0
0.9.0-rc.4
0.9.0-rc.3
0.9.0-rc.2
0.9.0-rc.1
0.9.0-rc.0
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.0
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.0
0.4.3
0.4.2
Elixir Z-Wave library
Current section
Files
Jump to
Current section
Files
lib/grizzly/zwave/decoder.ex
defmodule Grizzly.ZWave.Decoder do
@moduledoc false
defmodule Generate do
@moduledoc false
alias Grizzly.ZWave.{Command, Commands, DecodeError}
@mappings [
# {command_class_byte, command_byte, command_module}
# Basic
{0x20, 0x01, Commands.BasicSet},
{0x20, 0x02, Commands.BasicGet},
{0x20, 0x03, Commands.BasicReport},
# Battery
{0x80, 0x02, Commands.BatteryGet},
{0x80, 0x03, Commands.BatteryReport},
# Z/IP (0x23)
{0x23, 0x02, Commands.ZIPPacket},
{0x23, 0x03, Commands.ZIPKeepAlive},
# Switch Binary (0x25)
{0x25, 0x01, Commands.SwitchBinarySet},
{0x25, 0x02, Commands.SwitchBinaryGet},
{0x25, 0x03, Commands.SwitchBinaryReport},
# Switch Multilevel (0x26)
{0x26, 0x01, Commands.SwitchMultiLevelSet},
{0x26, 0x02, Commands.SwitchMultiLevelGet},
{0x26, 0x03, Commands.SwitchMultilevelReport},
{0x26, 0x04, Commands.SwitchMultilevelStartLevelChange},
{0x26, 0x05, Commands.SwitchMultiLevelStopLevelChange},
# Sensor binary
{0x30, 0x02, Commands.SensorBinaryGet},
{0x30, 0x03, Commands.SensorBinaryReport},
# Network Management Inclusion (0x34)
{0x34, 0x01, Commands.NodeAdd},
{0x34, 0x02, Commands.NodeAddStatus},
{0x34, 0x03, Commands.NodeRemove},
{0x34, 0x04, Commands.NodeRemoveStatus},
{0x34, 0x11, Commands.NodeAddKeysReport},
{0x34, 0x12, Commands.NodeAddKeysSet},
{0x34, 0x13, Commands.NodeAddDSKReport},
{0x34, 0x14, Commands.NodeAddDSKSet},
{0x34, 0x15, Commands.SmartStartJoinStarted},
# Network Management Basic Node (0x4D)
{0x4D, 0x07, Commands.DefaultSetComplete},
{0x4D, 0x08, Commands.DSKGet},
{0x4D, 0x09, Commands.DSKReport},
# Network Management Proxy (0x52)
{0x52, 0x01, Commands.NodeListGet},
{0x52, 0x02, Commands.NodeListReport},
{0x52, 0x04, Commands.NodeInfoCacheReport},
# Multi Channel
{0x60, 0x07, Commands.MultiChannelEndpointGet},
{0x60, 0x08, Commands.MultiChannelEndpointReport},
# Association group info
{0x59, 0x01, Commands.AssociationGroupNameGet},
{0x59, 0x02, Commands.AssociationGroupNameReport},
{0x59, 0x03, Commands.AssociationGroupInfoGet},
{0x59, 0x04, Commands.AssociationGroupInfoReport},
{0x59, 0x05, Commands.AssociationGroupCommandListGet},
{0x59, 0x06, Commands.AssociationGroupCommandListReport},
# Door Lock
{0x62, 0x01, Commands.DoorLockOperationSet},
{0x62, 0x02, Commands.DoorLockOperationGet},
{0x62, 0x03, Commands.DoorLockOperationReport},
# User Code
{0x63, 0x01, Commands.UserCodeSet},
{0x63, 0x02, Commands.UserCodeGet},
{0x63, 0x03, Commands.UserCodeReport},
{0x63, 0x04, Commands.UserCodeUsersNumberGet},
{0x63, 0x05, Commands.UserCodeUsersNumberReport},
# Supervision
{0x6C, 0x01, Commands.SupervisionGet},
{0x6C, 0x02, Commands.SupervisionReport},
# Configuration
{0x70, 0x04, Commands.ConfigurationSet},
# Alarm
{0x71, 0x05, Commands.AlarmReport},
# Manufacturer Specific
{0x72, 0x04, Commands.ManufacturerSpecificGet},
{0x72, 0x05, Commands.ManufacturerSpecificReport},
{0x72, 0x06, Commands.ManufacturerSpecificDeviceSpecificGet},
{0x72, 0x07, Commands.ManufacturerSpecificDeviceSpecificReport},
# Association (0x85)
{0x85, 0x03, Commands.AssociationReport},
# Version (0x86)
{0x86, 0x11, Commands.VersionGet},
{0x86, 0x12, Commands.VersionReport},
{0x86, 0x13, Commands.CommandClassGet},
{0x86, 0x14, Commands.CommandClassReport},
# Firmware Update Metadata
{0x7A, 0x01, Commands.FirmwareMDGet},
{0x7A, 0x02, Commands.FirmwareMDReport},
{0x7A, 0x03, Commands.FirmwareUpdateMDRequestGet},
{0x7A, 0x04, Commands.FirmwareUpdateMDRequestReport},
{0x7A, 0x05, Commands.FirmwareUpdateMDGet},
{0x7A, 0x06, Commands.FirmwareUpdateMDReport},
{0x7A, 0x07, Commands.FirmwareUpdateMDStatusReport},
{0x7A, 0x08, Commands.FirmwareUpdateActivationSet},
{0x7A, 0x09, Commands.FirmwareUpdateActivationReport},
# Wake Up
{0x84, 0x04, Commands.WakeUpIntervalSet},
{0x84, 0x05, Commands.WakeUpIntervalSet},
{0x84, 0x06, Commands.WakeUpIntervalReport},
{0x84, 0x07, Commands.WakeUpNotification},
{0x84, 0x08, Commands.WakeUpNoMoreInformation},
{0x84, 0x09, Commands.WakeUpIntervalCapabilitiesGet},
{0x84, 0x0A, Commands.WakeUpIntervalCapabilitiesReport},
# Sensor multilevel
{0x31, 0x01, Commands.SensorMultilevelSupportedSensorGet},
{0x31, 0x02, Commands.SensorMultilevelSupportedSensorReport},
{0x31, 0x04, Commands.SensorMultilevelGet},
{0x31, 0x05, Commands.SensorMultilevelReport},
# Meter
{0x32, 0x01, Commands.MeterGet},
{0x32, 0x02, Commands.MeterReport},
# Thermostat mode
{0x40, 0x01, Commands.ThermostatModeSet},
{0x40, 0x02, Commands.ThermostatModeGet},
{0x40, 0x03, Commands.ThermostatModeReport},
# Thermostat setpoint
{0x43, 0x01, Commands.ThermostatSetpointSet},
{0x43, 0x02, Commands.ThermostatSetpointGet},
{0x43, 0x03, Commands.ThermostatSetpointReport},
# Thermostat fan mode
{0x44, 0x01, Commands.ThermostatFanModeSet},
{0x44, 0x02, Commands.ThermostatFanModeGet},
{0x44, 0x03, Commands.ThermostatFanModeReport},
# Thermostat fan state
{0x45, 0x02, Commands.ThermostatFanStateGet},
{0x45, 0x03, Commands.ThermostatFanStateReport},
# Thermostat setback
{0x47, 0x01, Commands.ThermostatSetbackSet},
{0x47, 0x02, Commands.ThermostatSetbackGet},
{0x47, 0x03, Commands.ThermostatSetbackReport},
# Thermostat operating state
{0x42, 0x02, Commands.ThermostatOperatingStateGet},
{0x42, 0x03, Commands.ThermostatOperatingStateReport},
# Node provisioning
{0x78, 0x01, Commands.NodeProvisioningSet},
{0x78, 0x02, Commands.NodeProvisioningDelete},
{0x78, 0x03, Commands.NodeProvisioningListIterationGet},
{0x78, 0x04, Commands.NodeProvisioningListIterationReport},
{0x78, 0x05, Commands.NodeProvisioningGet},
{0x78, 0x06, Commands.NodeProvisioningReport}
]
defmacro __before_compile__(_) do
# Exceptions
from_binary =
for {command_class_byte, command_byte, command_module} <- @mappings do
quote do
def from_binary(
<<unquote(command_class_byte), unquote(command_byte), params::binary>>
),
do: decode(unquote(command_module), params)
end
end
command_module =
for {command_class_byte, command_byte, command_module} <- @mappings do
quote do
def command_module(unquote(command_class_byte), unquote(command_byte)),
do: {:ok, unquote(command_module)}
end
end
quote do
@spec from_binary(binary) :: {:ok, Command.t()} | {:error, DecodeError.t()}
unquote(from_binary)
# No Operation (0x00) - There is no command byte or args for this command, only the command class byte
def from_binary(<<0x00>>), do: decode(Commands.NoOperation, [])
@spec command_module(byte, byte) :: {:ok, module} | {:error, :unsupported_command}
unquote(command_module)
def command_module(_cc_byte, _c_byte), do: {:error, :unsupported_command}
defp decode(command_impl, params) do
case command_impl.decode_params(params) do
{:ok, decoded_params} ->
command_impl.new(decoded_params)
{:error, %DecodeError{}} = error ->
error
end
end
end
end
end
@before_compile Generate
end