refactor: Split config
This commit is contained in:
84
config/hallway_automation.lua
Normal file
84
config/hallway_automation.lua
Normal file
@@ -0,0 +1,84 @@
|
||||
local debug = require("config.debug")
|
||||
local utils = require("automation:utils")
|
||||
|
||||
local module = {}
|
||||
|
||||
local timeout = utils.Timeout.new()
|
||||
local forced = false
|
||||
--- @type OpenCloseInterface?
|
||||
local trash = nil
|
||||
--- @type OpenCloseInterface?
|
||||
local door = nil
|
||||
|
||||
--- @type fun(on: boolean)[]
|
||||
local callbacks = {}
|
||||
|
||||
--- @param on boolean
|
||||
local function callback(on)
|
||||
for _, f in ipairs(callbacks) do
|
||||
f(on)
|
||||
end
|
||||
end
|
||||
|
||||
---@type fun(device: DeviceInterface, on: boolean)
|
||||
function module.switch_callback(_, on)
|
||||
timeout:cancel()
|
||||
callback(on)
|
||||
forced = on
|
||||
end
|
||||
|
||||
---@type fun(device: DeviceInterface, open: boolean)
|
||||
function module.door_callback(_, open)
|
||||
if open then
|
||||
timeout:cancel()
|
||||
|
||||
callback(true)
|
||||
elseif not forced then
|
||||
timeout:start(debug.debug_mode and 10 or 2 * 60, function()
|
||||
if trash == nil or trash:open_percent() == 0 then
|
||||
callback(false)
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
---@type fun(device: DeviceInterface, open: boolean)
|
||||
function module.trash_callback(_, open)
|
||||
if open then
|
||||
callback(true)
|
||||
else
|
||||
if not forced and not timeout:is_waiting() and (door == nil or door:open_percent() == 0) then
|
||||
callback(false)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
---@type fun(device: DeviceInterface, state: { state: boolean })
|
||||
function module.light_callback(_, state)
|
||||
print("LIGHT = " .. tostring(state.state))
|
||||
if state.state and (trash == nil or trash:open_percent()) == 0 and (door == nil or door:open_percent() == 0) then
|
||||
-- If the door and trash are not open, that means the light got turned on manually
|
||||
timeout:cancel()
|
||||
forced = true
|
||||
elseif not state.state then
|
||||
-- The light is never forced when it is off
|
||||
forced = false
|
||||
end
|
||||
end
|
||||
|
||||
--- @param t OpenCloseInterface
|
||||
function module.set_trash(t)
|
||||
trash = t
|
||||
end
|
||||
|
||||
--- @param d OpenCloseInterface
|
||||
function module.set_door(d)
|
||||
door = d
|
||||
end
|
||||
|
||||
--- @param c fun(on: boolean)
|
||||
function module.add_callback(c)
|
||||
table.insert(callbacks, c)
|
||||
end
|
||||
|
||||
return module
|
||||
Reference in New Issue
Block a user