From 794b8eef19826d5d4b4c54fddd8b0a6ceea86216 Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Tue, 7 May 2024 00:02:02 +0200 Subject: [PATCH] Quickly hacked in is_on function on devices in lua In order to get feature parity with pre-lua the is_on function is manually implemented on all wrapped devices in lua This implementation will need to be improved in the future. --- config.lua | 13 ++++++++----- src/device_manager.rs | 12 ++++++++++++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/config.lua b/config.lua index bdacb27..237d531 100644 --- a/config.lua +++ b/config.lua @@ -137,8 +137,7 @@ automation.device_manager:add(IkeaOutlet.new({ topic = mqtt_z2m("workbench/outlet"), client = mqtt_client, })) - -local hallway_lights = automation.device_manager:add(HueGroup.new({ +local hallway_lights = HueGroup.new({ identifier = "hallway_lights", ip = hue_ip, login = hue_token, @@ -149,7 +148,8 @@ local hallway_lights = automation.device_manager:add(HueGroup.new({ { topic = mqtt_z2m("hallway/remote") }, }, client = mqtt_client, -})) +}) +automation.device_manager:add(hallway_lights) automation.device_manager:add(ContactSensor.new({ identifier = "hallway_frontdoor", @@ -173,6 +173,9 @@ local bedroom_air_filter = AirFilter.new({ }) automation.device_manager:add(bedroom_air_filter) -automation.device_manager:schedule("0/1 * * * * *", function() - print("Device: " .. bedroom_air_filter:get_id()) +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) diff --git a/src/device_manager.rs b/src/device_manager.rs index 333a45e..5d3143e 100644 --- a/src/device_manager.rs +++ b/src/device_manager.rs @@ -5,6 +5,7 @@ use std::sync::Arc; use futures::future::join_all; use futures::Future; +use google_home::traits::OnOff; use mlua::FromLua; use tokio::sync::{RwLock, RwLockReadGuard}; use tokio_cron_scheduler::{Job, JobScheduler}; @@ -42,6 +43,17 @@ impl mlua::UserData for WrappedDevice { methods.add_async_method("get_id", |_lua, this, _: ()| async { Ok(crate::devices::Device::get_id(this.0.read().await.as_ref())) }); + + methods.add_async_method("set_on", |_lua, this, on: bool| async move { + let mut device = this.0.write().await; + let device = device.as_mut(); + + if let Some(device) = device.cast_mut() as Option<&mut dyn OnOff> { + device.set_on(on).await.unwrap() + }; + + Ok(()) + }); } }