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