Packages
grizzly
8.0.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
@type value :: :on | :off | :unknown
@type duration :: non_neg_integer | :unknown
@type param :: {:value, value()} | {:target_value, value()} | {:duration, duration()}
@impl true
@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 true
@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 true
# 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),
{:ok, duration} <- duration_from_byte(duration_byte) do
{:ok, [value: value, target_value: target_value, duration: duration]}
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_duration(secs) when is_integer(secs) and secs in 0..127, do: secs
defp encode_duration(secs) when is_integer(secs) and secs in 128..(126 * 60),
do: 0x80 + div(secs, 60)
defp encode_duration(:unknown), do: 0xFE
defp encode_duration(_), do: 0xFE
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}}
defp duration_from_byte(duration_byte) when duration_byte in 0x00..0x7F,
do: {:ok, duration_byte}
defp duration_from_byte(duration_byte) when duration_byte in 0x80..0xFD,
do: {:ok, (duration_byte - 0x80 + 1) * 60}
defp duration_from_byte(0xFE), do: {:ok, :unknown}
defp duration_from_byte(byte),
do: {:error, %DecodeError{value: byte, param: :duration, command: :basic_report}}
end