defmodule Grizzly.ZWave.Commands.UserCodeSet do @moduledoc """ UserCodeSet sets the user code Params: * `:user_id` - the id of the user code (required) * `:user_id_status` - the status if the user id slot (required) * `:user_code` - a 4 - 10 user code pin in string format (required) """ @behaviour Grizzly.ZWave.Command alias Grizzly.ZWave.Command alias Grizzly.ZWave.CommandClasses.UserCode @type param :: {:user_id, byte()} | {:user_id_status, UserCode.user_id_status()} | {:user_code, String.t()} @impl Grizzly.ZWave.Command @spec new([param()]) :: {:ok, Command.t()} def new(params) do command = %Command{ name: :user_code_set, command_byte: 0x01, command_class: UserCode, params: params, impl: __MODULE__ } {:ok, command} end @impl Grizzly.ZWave.Command @spec encode_params(Command.t()) :: binary() def encode_params(command) do user_id = Command.param!(command, :user_id) user_id_status = Command.param!(command, :user_id_status) user_code = Command.param!(command, :user_code) # CC:0063.01.01.11.009 - The User Code field MUST be set to 0x00000000 (4 bytes) # when User ID Status is equal to 0x00 (Available). user_code = if user_id_status == :available do <<0x00, 0x00, 0x00, 0x00>> else user_code end <> <> user_code end @impl Grizzly.ZWave.Command @spec decode_params(binary()) :: {:ok, [param()]} def decode_params(<>) do {:ok, [ user_id: user_id, user_id_status: UserCode.user_id_status_from_byte(user_id_status_byte), user_code: user_code_binary ]} end end