Homex
Mix.install([
{:homex, path: __DIR__},
{:req, "~> 0.6.2"}
])
Homex
defmodule MySwitch do
use Homex.Entity.Switch, name: "my-switch"
def handle_on(entity) do
IO.puts("Switch turned on")
entity
end
def handle_off(entity) do
IO.puts("Switch turned off")
entity
end
end
defmodule MyTemperature do
use Homex.Entity.Sensor,
device: :nested,
name: "my-temperature",
unit_of_measurement: "°C",
device_class: "temperature"
def handle_init(entity) do
:timer.send_interval(10_000, :measure)
entity
end
def handle_info(:measure, entity) do
entity |> set_value(Enum.random(-40..40//1))
end
end
defmodule MyHumidity do
use Homex.Entity.Sensor,
name: "my-humidiy",
unit_of_measurement: "%",
device_class: "humidity"
def handle_init(entity) do
:timer.send_interval(10_000, :measure)
entity
end
def handle_info(:measure, entity) do
entity |> set_value(Enum.random(20..90//1))
end
end
defmodule MyButton do
use Homex.Entity.Button, name: "my-button"
def handle_press(entity) do
IO.puts("my button was pressed")
entity
end
end
defmodule MyLight do
use Homex.Entity.Light, name: "my-light", modes: [:brightness]
def handle_init(entity) do
entity |> set_on() |> set_brightness(50)
end
def handle_brightness(entity, brightness) do
IO.puts("Light set to #{brightness}%")
entity
end
end
defmodule MyDevice do
use Homex.Entity.DeviceTrigger, name: "my-device-trigger"
end
defmodule MyCamera do
use Homex.Entity.Camera, name: "my-camera"
def handle_init(entity) do
:timer.send_interval(5_000, :snap)
entity
end
def handle_info(:snap, entity) do
response = Req.get!("https://picsum.photos/200")
entity |> set_image(response.body) |> set_attributes(%{foo: "bar"})
end
end
{:ok, pid} =
Homex.start_link(
node_id: "livebook",
devices: [nested: [name: "my-nested-device", via: :default]],
entities: [MySwitch, MyTemperature, MyHumidity, MyButton, MyLight, MyDevice, MyCamera]
)
Homex.put_device(:new, name: "foo", via: :default)
Homex.add_entity({MyLight, name: "new-light", device: :new})
Homex.Entity.DeviceTrigger.trigger("my-device-trigger")
Homex.Entity.snapshot("my-light")