aboutsummaryrefslogtreecommitdiff
path: root/alarm.lua
blob: afbd406157cc2d0011b04ee547fee917c36e0124 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
local httpd = require 'httpd'
local hue = require 'hue'
local config = require 'config'

local alarm = { }

local days = {
    'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday',
    'Saturday'
}

function alarm.httpd_process(method, path, headers, content)
    local alarms = config.loaded.alarms
    if path == '/alarm' then
        if method == 'GET' then
            local page = [[
<html>
<body>
<form method="post">
<table>
%s</table>
<input type="submit">
</form>
</body>
</html>
]]
            local row = [[
  <tr><td>%s</td>
    <td><input type="checkbox" name="en%d"%s></td>
    <td><input type="text" name="time%d" value="%02d:%02d"></td>
  </tr>
]]
            local rows = { }
            for di, d in ipairs(days) do
                local checked = alarms[di] and alarms[di].active and ' checked'
                    or ''
                local h = alarms[di] and alarms[di].hour or 0
                local m = alarms[di] and alarms[di].min or 0
                rows[#rows + 1] = string.format(row, d, di, checked, di, h, m)
            end
            page = string.format(page, table.concat(rows))
            return 200, 'OK', { ['Content-Type'] = 'text/html' }, page
        elseif method == 'POST' then
            local form = httpd.parse_form(content)
            for di, d in ipairs(days) do
                active = form['en'..di] and true or false
                h, m = form['time'..di]:match('^(%d+):(%d+)$')
                h = h and tonumber(h)
                m = m and tonumber(m)
                if h and m then
                    alarms[di] = { active = active, hour = h, min = m }
                else
                    return 200, 'OK', {}, 'Bad parameters\n'
                end
            end
            config.save()
            return 200, 'OK', {}, 'OK!\n'
        end
    end
end

function alarm.test(tm)
    local di = tm.wday
    local a = config.loaded.alarms[di]
    if a and a.active and a.hour == tm.hour and a.min == tm.min then
        alarm.ring()
    end
end

function alarm.ring()
    hue.on(nil, 64)
end

return alarm