refactor: Remove unneeded wrapper functions when specifying callbacks
All checks were successful
Build and deploy / build (push) Successful in 10m32s
Build and deploy / Deploy container (push) Successful in 45s

These wrappers can be moved up to where the callback itself is defined
instead of having to wrap the call manually. This also works a lot nicer
now that it is possible to provide multiple callback functions.
This commit is contained in:
2025-09-08 04:13:01 +02:00
parent e26fd9f132
commit a2e65c2d1a

View File

@@ -425,49 +425,57 @@ device_manager:add(HueSwitch.new({
local hallway_light_automation = { local hallway_light_automation = {
timeout = Timeout.new(), timeout = Timeout.new(),
forced = false, forced = false,
switch_callback = function(self, on) switch_callback = function(self)
self.timeout:cancel() return function(_, on)
self.group.set_on(on)
self.forced = on
end,
door_callback = function(self, open)
if open then
self.timeout:cancel() self.timeout:cancel()
self.group.set_on(on)
self.group.set_on(true) self.forced = on
elseif not self.forced then
self.timeout:start(debug and 10 or 2 * 60, function()
if self.trash == nil or self.trash:open_percent() == 0 then
self.group.set_on(false)
end
end)
end end
end, end,
trash_callback = function(self, open) door_callback = function(self)
if open then return function(_, open)
self.group.set_on(true) if open then
else self.timeout:cancel()
if
not self.timeout:is_waiting() self.group.set_on(true)
and (self.door == nil or self.door:open_percent() == 0) elseif not self.forced then
and not self.forced self.timeout:start(debug and 10 or 2 * 60, function()
then if self.trash == nil or self.trash:open_percent() == 0 then
self.group.set_on(false) self.group.set_on(false)
end
end)
end end
end end
end, end,
light_callback = function(self, on) trash_callback = function(self)
if return function(_, open)
on if open then
and (self.trash == nil or self.trash:open_percent()) == 0 self.group.set_on(true)
and (self.door == nil or self.door:open_percent() == 0) else
then if
-- If the door and trash are not open, that means the light got turned on manually not self.timeout:is_waiting()
self.timeout:cancel() and (self.door == nil or self.door:open_percent() == 0)
self.forced = true and not self.forced
elseif not on then then
-- The light is never forced when it is off self.group.set_on(false)
self.forced = false end
end
end
end,
light_callback = function(self)
return function(_, state)
if
state.on
and (self.trash == nil or self.trash:open_percent()) == 0
and (self.door == nil or self.door:open_percent() == 0)
then
-- If the door and trash are not open, that means the light got turned on manually
self.timeout:cancel()
self.forced = true
elseif not state.on then
-- The light is never forced when it is off
self.forced = false
end
end end
end, end,
} }
@@ -477,9 +485,7 @@ local hallway_storage = LightBrightness.new({
room = "Hallway", room = "Hallway",
topic = mqtt_z2m("hallway/storage"), topic = mqtt_z2m("hallway/storage"),
client = mqtt_client, client = mqtt_client,
callback = function(_, state) callback = hallway_light_automation:light_callback(),
hallway_light_automation:light_callback(state.state)
end,
}) })
turn_off_when_away(hallway_storage) turn_off_when_away(hallway_storage)
device_manager:add(hallway_storage) device_manager:add(hallway_storage)
@@ -504,13 +510,12 @@ hallway_light_automation.group = {
end, end,
} }
local frontdoor_presence = { local function presence(duration)
timeout = Timeout.new(), local timeout = Timeout.new()
}
setmetatable(frontdoor_presence, { return function(_, open)
__call = function(self, open)
if open then if open then
self.timeout:cancel() timeout:cancel()
if not presence_system:overall_presence() then if not presence_system:overall_presence() then
mqtt_client:send_message(mqtt_automation("presence/contact/frontdoor"), { mqtt_client:send_message(mqtt_automation("presence/contact/frontdoor"), {
@@ -519,21 +524,19 @@ setmetatable(frontdoor_presence, {
}) })
end end
else else
self.timeout:start(debug and 10 or 15 * 60, function() timeout:start(duration, function()
mqtt_client:send_message(mqtt_automation("presence/contact/frontdoor"), nil) mqtt_client:send_message(mqtt_automation("presence/contact/frontdoor"), nil)
end) end)
end end
end, end
}) end
device_manager:add(IkeaRemote.new({ device_manager:add(IkeaRemote.new({
name = "Remote", name = "Remote",
room = "Hallway", room = "Hallway",
client = mqtt_client, client = mqtt_client,
topic = mqtt_z2m("hallway/remote"), topic = mqtt_z2m("hallway/remote"),
callback = function(_, on) callback = hallway_light_automation:switch_callback(),
hallway_light_automation:switch_callback(on)
end,
battery_callback = check_battery, battery_callback = check_battery,
})) }))
local hallway_frontdoor = ContactSensor.new({ local hallway_frontdoor = ContactSensor.new({
@@ -546,10 +549,10 @@ local hallway_frontdoor = ContactSensor.new({
topic = mqtt_automation("presence/contact/frontdoor"), topic = mqtt_automation("presence/contact/frontdoor"),
timeout = debug and 10 or 15 * 60, timeout = debug and 10 or 15 * 60,
}, },
callback = function(_, open) callback = {
hallway_light_automation:door_callback(open) presence(debug and 10 or 15 * 60),
frontdoor_presence(open) hallway_light_automation:door_callback(),
end, },
battery_callback = check_battery, battery_callback = check_battery,
}) })
device_manager:add(hallway_frontdoor) device_manager:add(hallway_frontdoor)
@@ -561,9 +564,7 @@ local hallway_trash = ContactSensor.new({
sensor_type = "Drawer", sensor_type = "Drawer",
topic = mqtt_z2m("hallway/trash"), topic = mqtt_z2m("hallway/trash"),
client = mqtt_client, client = mqtt_client,
callback = function(_, open) callback = hallway_light_automation:trash_callback(),
hallway_light_automation:trash_callback(open)
end,
battery_callback = check_battery, battery_callback = check_battery,
}) })
device_manager:add(hallway_trash) device_manager:add(hallway_trash)