Packages
grizzly
8.8.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/commands/basic_report.ex
defmodule Grizzly.ZWave.Commands.BasicReport do
@moduledoc """
This module implements the BASIC_REPORT command of the COMMAND_CLASS_BASIC
command class
Params:
* `:value` - the current value (:on or :off or :unknown)
* `:target_value` - the target value (:on or :off or :unknown) - v2
* `:duration` - the time in seconds needed to reach the Target Value at the
actual transition rate - v2
"""
@behaviour Grizzly.ZWave.Command
alias Grizzly.ZWave.{Command, DecodeError}
alias Grizzly.ZWave.CommandClasses.Basic
import Grizzly.ZWave.Encoding
@type value :: :on | :off | :unknown | byte()
@type duration :: non_neg_integer | :unknown
@type param :: {:value, value()} | {:target_value, value()} | {:duration, duration()}
@impl Grizzly.ZWave.Command
@spec new([param()]) :: {:ok, Command.t()}
def new(params) do
command = %Command{
name: :basic_report,
command_byte: 0x03,
command_class: Basic,
params: params,
impl: __MODULE__
}
{:ok, command}
end
@impl Grizzly.ZWave.Command
@spec encode_params(Command.t()) :: binary()
def encode_params(command) do
value_byte = Command.param!(command, :value) |> encode_value()
target_value = Command.param(command, :target_value)
if target_value == nil do
<<value_byte>>
else
duration_byte = Command.param!(command, :duration) |> encode_duration()
target_value_byte = encode_value(target_value)
<<value_byte, target_value_byte, duration_byte>>
end
end
@impl Grizzly.ZWave.Command
# v1
def decode_params(<<value_byte>>) do
case value_from_byte(value_byte, :value) do
{:ok, value} ->
{:ok, [value: value]}
{:error, %DecodeError{}} = error ->
error
end
end
# v2
def decode_params(<<value_byte, target_value_byte, duration_byte>>) do
with {:ok, value} <- value_from_byte(value_byte, :value),
{:ok, target_value} <- value_from_byte(target_value_byte, :target_value) do
{:ok, [value: value, target_value: target_value, duration: decode_duration(duration_byte)]}
else
{:error, %DecodeError{}} = error ->
error
end
end
defp encode_value(:on), do: 0xFF
defp encode_value(:off), do: 0x00
defp encode_value(:unknown), do: 0xFE
defp encode_value(value) when is_integer(value), do: value
defp value_from_byte(0x00, _param), do: {:ok, :off}
defp value_from_byte(0xFF, _param), do: {:ok, :on}
defp value_from_byte(0xFE, _param), do: {:ok, :unknown}
defp value_from_byte(byte, _param) when byte in 0x01..0x63, do: {:ok, :on}
defp value_from_byte(byte, param),
do: {:error, %DecodeError{value: byte, param: param, command: :basic_report}}
end