print("Hello from lua") local host = automation.util.get_hostname() print("Running @" .. host) local debug, value = pcall(automation.util.get_env, "DEBUG") if debug and value ~= "true" then debug = false end local function mqtt_z2m(topic) return "zigbee2mqtt/" .. topic end local function mqtt_automation(topic) return "automation/" .. topic end automation.fulfillment = { openid_url = "https://login.huizinga.dev/api/oidc", } local mqtt_client = automation.new_mqtt_client({ host = (host == "zeus" and "olympus.lan.huizinga.dev") or (host == "hephaestus" and "olympus.vpn.huizinga.dev") or "mosquitto", port = 8883, client_name = "automation-" .. host, username = "mqtt", password = automation.util.get_env("MQTT_PASSWORD"), tls = host == "zeus" or host == "hephaestus", }) automation.device_manager:add(Ntfy.new({ topic = automation.util.get_env("NTFY_TOPIC"), event_channel = automation.device_manager:event_channel(), })) local presence = Presence.new({ topic = mqtt_automation("presence/+/#"), client = mqtt_client, event_channel = automation.device_manager:event_channel(), }) automation.device_manager:add(presence) automation.device_manager:add(DebugBridge.new({ identifier = "debug_bridge", topic = mqtt_automation("debug"), client = mqtt_client, })) local hue_ip = "10.0.0.136" local hue_token = automation.util.get_env("HUE_TOKEN") automation.device_manager:add(HueBridge.new({ identifier = "hue_bridge", ip = hue_ip, login = hue_token, flags = { presence = 41, darkness = 43, }, })) automation.device_manager:add(LightSensor.new({ identifier = "living_light_sensor", topic = mqtt_z2m("living/light"), client = mqtt_client, min = 22000, max = 23500, event_channel = automation.device_manager:event_channel(), })) automation.device_manager:add(WakeOnLAN.new({ name = "Zeus", room = "Living Room", topic = mqtt_automation("appliance/living_room/zeus"), client = mqtt_client, mac_address = "30:9c:23:60:9c:13", broadcast_ip = "10.0.0.255", })) local living_mixer = KasaOutlet.new({ identifier = "living_mixer", ip = "10.0.0.49" }) automation.device_manager:add(living_mixer) local living_speakers = KasaOutlet.new({ identifier = "living_speakers", ip = "10.0.0.182" }) automation.device_manager:add(living_speakers) automation.device_manager:add(AudioSetup.new({ identifier = "living_audio", topic = mqtt_z2m("living/remote"), client = mqtt_client, mixer = living_mixer, speakers = living_speakers, })) automation.device_manager:add(IkeaOutlet.new({ outlet_type = "Kettle", name = "Kettle", room = "Kitchen", topic = mqtt_z2m("kitchen/kettle"), client = mqtt_client, timeout = debug and 5 or 300, remotes = { { topic = mqtt_z2m("bedroom/remote") }, { topic = mqtt_z2m("kitchen/remote") }, }, })) automation.device_manager:add(IkeaOutlet.new({ outlet_type = "Light", name = "Light", room = "Bathroom", topic = mqtt_z2m("bathroom/light"), client = mqtt_client, timeout = debug and 60 or 45 * 60, })) automation.device_manager:add(Washer.new({ identifier = "bathroom_washer", topic = mqtt_z2m("bathroom/washer"), client = mqtt_client, threshold = 1, event_channel = automation.device_manager:event_channel(), })) automation.device_manager:add(IkeaOutlet.new({ outlet_type = "Charger", name = "Charger", room = "Workbench", topic = mqtt_z2m("workbench/charger"), client = mqtt_client, timeout = debug and 5 or 20 * 3600, })) automation.device_manager:add(IkeaOutlet.new({ name = "Outlet", room = "Workbench", topic = mqtt_z2m("workbench/outlet"), client = mqtt_client, })) local hallway_lights = HueGroup.new({ identifier = "hallway_lights", ip = hue_ip, login = hue_token, group_id = 81, scene_id = "3qWKxGVadXFFG4o", timer_id = 1, remotes = { { topic = mqtt_z2m("hallway/remote") }, }, client = mqtt_client, }) automation.device_manager:add(hallway_lights) automation.device_manager:add(ContactSensor.new({ identifier = "hallway_frontdoor", topic = mqtt_z2m("hallway/frontdoor"), client = mqtt_client, presence = { topic = mqtt_automation("presence/contact/frontdoor"), timeout = debug and 10 or 15 * 60, }, trigger = { devices = { hallway_lights }, timeout = debug and 10 or 2 * 60, }, action = function(closed) -- if state then -- hallway_lights:set_on(true) -- presence:set_presence("contact/frontdoor", true) -- else -- -- TODO: New timeout implementation -> Device stores timestamp of last state change. -- -- Generic timeout implementation then works by storing the timestamp at the start and comparing once the timer expires. -- -- If the timestamp has changed -> Cancel the state change -- -- Maybe add some sort identifier, such that if the function gets called repeatedly it will overwrite the existing timeout? -- -- Tag? Autogenerated from position in lua code? Not sure if that is possible -- automation.timeout(2 * 60, function() -- hallway_lights:set_on(false) -- end) -- automation.timeout(15 * 60, function() -- presence:set_presence("contact/frontdoor", false) -- end) -- end end, })) local function trash_action(device) local previous = device:is_on() local function f(_, closed) print(_) if closed then if not previous then device:set_on(false) end else previous = device:is_on() device:set_on(true) end end return f end automation.device_manager:add(ContactSensor.new({ identifier = "hallway_trash", topic = mqtt_z2m("hallway/trash"), client = mqtt_client, trigger = { devices = {} }, action = trash_action(hallway_lights), })) local bedroom_air_filter = AirFilter.new({ name = "Air Filter", room = "Bedroom", topic = "pico/filter/bedroom", client = mqtt_client, }) automation.device_manager:add(bedroom_air_filter) automation.device_manager:schedule("0 0 19 * * *", function() bedroom_air_filter:set_on(true) end) automation.device_manager:schedule("0 0 20 * * *", function() bedroom_air_filter:set_on(false) end) automation.timeout(10, function() print("Cool stuff") end)