Packages
grizzly
8.15.2
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/commands/switch_binary_report.ex
defmodule Grizzly.ZWave.Commands.SwitchBinaryReport do
@moduledoc """
Module for the SWITCH_BINARY_REPORT command
Params:
* `:target_value` - `:on`, `:off`, or `:unknown` (required)
* `:current_value` - `:on`, `:off`, or `:unknown` (required V2)
* `:duration` - How long in seconds the switch should take to reach target value or the factory default (:default)
Beyond 127 seconds, the duration is truncated to the minute. E.g. 179s is 2 minutes and 180s is 3 minutes
(required V2)
"""
@behaviour Grizzly.ZWave.Command
alias Grizzly.ZWave.{Command, DecodeError}
alias Grizzly.ZWave.CommandClasses.{SwitchBinary, SwitchSupport}
@type value() :: :on | :off | :unknown
@type param() ::
{:target_value, value()}
| {:duration, SwitchSupport.duration()}
| {:current_value, value()}
@impl Grizzly.ZWave.Command
def new(opts) do
# TODO: validate opts
command = %Command{
name: :switch_binary_report,
command_byte: 0x03,
command_class: SwitchBinary,
params: opts,
impl: __MODULE__
}
{:ok, command}
end
@impl Grizzly.ZWave.Command
def encode_params(command) do
target_value_byte = encode_target_value(Command.param!(command, :target_value))
case Command.param(command, :current_value) do
nil ->
<<target_value_byte>>
current_value ->
duration = Command.param!(command, :duration)
duration_byte = SwitchSupport.duration_to_byte(duration)
current_value_byte = encode_target_value(current_value)
<<current_value_byte, target_value_byte, duration_byte>>
end
end
def encode_target_value(:off), do: 0x00
def encode_target_value(:unknown), do: 0xFE
def encode_target_value(:on), do: 0xFF
@impl Grizzly.ZWave.Command
def decode_params(<<target_value_byte>>) do
case value_from_byte(target_value_byte) do
{:ok, target_value} ->
{:ok, [target_value: target_value]}
{:error, %DecodeError{}} = error ->
error
end
end
def decode_params(<<current_value, target_value, duration_byte>>) do
with {:ok, target_value} <- value_from_byte(target_value),
{:ok, duration} <- SwitchSupport.duration_from_byte(duration_byte),
{:ok, current_value} <-
value_from_byte(current_value) do
{:ok,
[
target_value: target_value,
duration: duration,
current_value: current_value
]}
end
end
defp value_from_byte(0x00), do: {:ok, :off}
defp value_from_byte(0xFE), do: {:ok, :unknown}
defp value_from_byte(0xFF), do: {:ok, :on}
defp value_from_byte(byte),
do: {:error, %DecodeError{value: byte, param: :target_value, command: :switch_binary_report}}
end