defmodule TehamaClient.Device do
@moduledoc """
A tehama device.
Note that `addr` and `apt` are trimmed to remove whitespace.
"""
use TypedStruct
# require Logger
typedstruct do
@typedoc "A typed Device struct"
field(:addr, String.t())
field(:apt, String.t())
field(:node_id, String.t())
field(:building, String.t())
field(:location_note, String.t())
field(:latest_link_status_data_read_time, String.t())
field(:battery_v, integer())
field(:link_partner, String.t())
field(:link_quality, integer())
field(:radio_dec_id, integer())
field(:radio_hex_id, String.t())
field(:readings, [TehamaClient.Reading.t()])
end
def new(data) do
# Logger.debug("Parsing #{__MODULE__} raw data: #{inspect(data, pretty: true)}")
%__MODULE__{
addr: (data["Addr"] || "") |> String.trim(),
apt: (data["Apt"] || "") |> String.trim(),
node_id: data["NodeId"],
building: data["Building"],
location_note: data["LocationNote"],
latest_link_status_data_read_time: data["LatestLinkStatusDataReadTime"],
battery_v: data["BattVolt"] |> TehamaClient.Object.parse_i(),
link_partner: data["LP"],
link_quality: data["LQ"] |> TehamaClient.Object.parse_i(),
radio_dec_id: data["RadioID-Dec"] |> TehamaClient.Object.parse_i(),
radio_hex_id: data["RadioID-Hex"],
readings: parse_readings(data["readings"])
}
end
defp parse_readings(readings) when is_list(readings) do
readings
|> Enum.map(&TehamaClient.Reading.new/1)
end
defp parse_readings(_) do
[]
end
end