Powered by AppSignal & Oban Pro

Homex

example.livemd

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")