lib/tehama_client/objects/device.ex

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