Packages

A Gleam library to write and run Home Assistant automations.

Current section

Files

Jump to
glome src glome@homeassistant@attributes.erl
Raw

src/glome@homeassistant@attributes.erl

-module(glome@homeassistant@attributes).
-compile(no_auto_import).
-export([from_dynamic_and_domain/2]).
-export_type([device_class/0, attributes/0]).
-type device_class() :: tv |
speaker |
media_receiver |
gas_sensor |
battery_sensor |
power_sensor |
battery_charging |
cold_sensor |
connectivity_sensor |
door_sensor |
garage_door_sensor |
heat_sensor |
light_sensor |
lock_sensor |
moisture_sensor |
motion_sensor |
moving_sensor |
occupancy_sensor |
opening_sensor |
plug_sensor |
presence_sensor |
problem_sensor |
running_sensor |
safety_sensor |
smoke_sensor |
sound_sensor |
tamper_sensor |
update_sensor |
vibration_sensor |
window_sensor |
aqi_sensor |
carbon_dioxide_sensor |
carbon_monoxide_sensor |
current_sensor |
date_sensor |
energy_sensor |
frequency_sensor |
humidity_sensor |
illuminance_sensor |
monetary_sensor |
nitrogen_dioxide_sensor |
nitrogen_monoxide_sensor |
nitrous_oxide_sensor |
ozone_sensor |
pm1_sensor |
pm10_sensor |
pm25_sensor |
power_factor_sensor |
pressure_sensor |
signal_strength_sensor |
sulphur_dioxide_sensor |
temperature_sensor |
timestamp_sensor |
volatile_organic_compounds_sensor |
voltage_sensor |
unknown_device_class |
{device_class, binary()}.
-type attributes() :: {attributes,
binary(),
device_class(),
gleam@dynamic:dynamic()}.
-spec from_dynamic_and_domain(
gleam@dynamic:dynamic(),
glome@homeassistant@domain:domain()
) -> {ok, attributes()} | {error, glome@core@error:glome_error()}.
from_dynamic_and_domain(Attributes_message, Domain) ->
Device_class_value = begin
_pipe = glome@core@json:get_field_by_path(
Attributes_message,
<<"device_class"/utf8>>
),
_pipe@1 = gleam@result:then(
_pipe,
fun glome@core@json:get_field_as_string/1
),
gleam@result:unwrap(_pipe@1, <<"unknown_device_class"/utf8>>)
end,
Device_class = case {Device_class_value, Domain} of
{<<"tv"/utf8>>, media_player} ->
tv;
{<<"speaker"/utf8>>, media_player} ->
speaker;
{<<"receiver"/utf8>>, media_player} ->
media_receiver;
{<<"battery"/utf8>>, sensor} ->
battery_sensor;
{<<"battery"/utf8>>, binary_sensor} ->
battery_sensor;
{<<"battery_charging"/utf8>>, binary_sensor} ->
battery_charging;
{<<"cold"/utf8>>, binary_sensor} ->
cold_sensor;
{<<"connectivity"/utf8>>, binary_sensor} ->
connectivity_sensor;
{<<"door"/utf8>>, binary_sensor} ->
door_sensor;
{<<"garage_door"/utf8>>, binary_sensor} ->
garage_door_sensor;
{<<"gas"/utf8>>, binary_sensor} ->
gas_sensor;
{<<"heat"/utf8>>, binary_sensor} ->
heat_sensor;
{<<"light"/utf8>>, binary_sensor} ->
light_sensor;
{<<"lock"/utf8>>, binary_sensor} ->
lock_sensor;
{<<"moisture"/utf8>>, binary_sensor} ->
moisture_sensor;
{<<"motion"/utf8>>, binary_sensor} ->
motion_sensor;
{<<"moving"/utf8>>, binary_sensor} ->
moving_sensor;
{<<"occupancy"/utf8>>, binary_sensor} ->
occupancy_sensor;
{<<"opening"/utf8>>, binary_sensor} ->
opening_sensor;
{<<"plug"/utf8>>, binary_sensor} ->
plug_sensor;
{<<"power"/utf8>>, binary_sensor} ->
power_sensor;
{<<"presence"/utf8>>, binary_sensor} ->
presence_sensor;
{<<"problem"/utf8>>, binary_sensor} ->
problem_sensor;
{<<"running"/utf8>>, binary_sensor} ->
running_sensor;
{<<"safety"/utf8>>, binary_sensor} ->
safety_sensor;
{<<"smoke"/utf8>>, binary_sensor} ->
smoke_sensor;
{<<"sound"/utf8>>, binary_sensor} ->
sound_sensor;
{<<"tamper"/utf8>>, binary_sensor} ->
tamper_sensor;
{<<"update"/utf8>>, binary_sensor} ->
update_sensor;
{<<"vibration"/utf8>>, binary_sensor} ->
vibration_sensor;
{<<"window"/utf8>>, binary_sensor} ->
window_sensor;
{<<"aqi"/utf8>>, sensor} ->
aqi_sensor;
{<<"carbon_dioxide"/utf8>>, sensor} ->
carbon_dioxide_sensor;
{<<"carbon_monoxide"/utf8>>, sensor} ->
carbon_monoxide_sensor;
{<<"current"/utf8>>, sensor} ->
current_sensor;
{<<"date"/utf8>>, sensor} ->
date_sensor;
{<<"energy"/utf8>>, sensor} ->
energy_sensor;
{<<"frequency"/utf8>>, sensor} ->
frequency_sensor;
{<<"gas"/utf8>>, sensor} ->
gas_sensor;
{<<"humidity"/utf8>>, sensor} ->
humidity_sensor;
{<<"illuminance"/utf8>>, sensor} ->
illuminance_sensor;
{<<"monetary"/utf8>>, sensor} ->
monetary_sensor;
{<<"nitrogen_dioxide"/utf8>>, sensor} ->
nitrogen_dioxide_sensor;
{<<"nitrogen_monoxide"/utf8>>, sensor} ->
nitrogen_monoxide_sensor;
{<<"nitrous_oxide"/utf8>>, sensor} ->
nitrous_oxide_sensor;
{<<"ozone"/utf8>>, sensor} ->
ozone_sensor;
{<<"pm1"/utf8>>, sensor} ->
pm1_sensor;
{<<"pm10"/utf8>>, sensor} ->
pm10_sensor;
{<<"pm25"/utf8>>, sensor} ->
pm25_sensor;
{<<"power_factor"/utf8>>, sensor} ->
power_factor_sensor;
{<<"power"/utf8>>, sensor} ->
power_sensor;
{<<"pressure"/utf8>>, sensor} ->
pressure_sensor;
{<<"signal_strength"/utf8>>, sensor} ->
signal_strength_sensor;
{<<"sulphur_dioxide"/utf8>>, sensor} ->
sulphur_dioxide_sensor;
{<<"temperature"/utf8>>, sensor} ->
temperature_sensor;
{<<"timestamp"/utf8>>, sensor} ->
timestamp_sensor;
{<<"volatile_organic_compounds"/utf8>>, sensor} ->
volatile_organic_compounds_sensor;
{<<"voltage"/utf8>>, sensor} ->
voltage_sensor;
{<<"unknown_device_class"/utf8>>, _@1} ->
unknown_device_class;
{Value, _@2} ->
{device_class, Value}
end,
Friendly_name = begin
_pipe@2 = glome@core@json:get_field_by_path(
Attributes_message,
<<"friendly_name"/utf8>>
),
_pipe@3 = gleam@result:then(
_pipe@2,
fun glome@core@json:get_field_as_string/1
),
gleam@result:unwrap(_pipe@3, <<"unknown_friendly_name"/utf8>>)
end,
{ok, {attributes, Friendly_name, Device_class, Attributes_message}}.