1
2
3
4
5
6
7
8
9
10
11
12
13
14\setupbodyfont[dejavu]
15
16\starttext
17
18\startluacode
19
20local evohome = require("util-evo")
21
22moduledata.evohome = { }
23
24function moduledata.evohome.status(specification)
25
26 local presets = evohome.helpers.loadpresets(specification.presets)
27 local zones = evohome.helpers.loadtemperatures(presets)
28
29
30
31 if not zones then
32 context("no zones")
33 context.blank()
34 return
35 end
36
37 local t = zones.time
38
39 t = t and os.date("%Y-%m-%d %H:%M:%S",t) or "unknown time"
40
41 context.starttitle { title = t }
42
43 context.starttabulate { "|l|c|c|c|c|" }
44 context.BC() context("name")
45 context.BC() context("current")
46 context.BC() context("min")
47 context.BC() context("max")
48 context.BC() context("target")
49 context.NC() context.NR()
50 for i=1,#zones do
51 local zone = zones[i]
52 context.NC() context.word(zone.name)
53 context.NC() context("%0.1f",zone.current)
54 context.NC() context("%0.1f",zone.min)
55 context.NC() context("%0.1f",zone.max)
56 context.NC() context("%0.1f",zone.target)
57 context.NC() context.NR()
58 end
59 context.stoptabulate()
60
61 for i=1,#zones do
62 local zone = zones[i]
63
64 local data = evohome.helpers.getzonestate(presets,zone.name)
65 local schedule = data and data.schedule or { }
66 context.startsubject { title = zone.name }
67 context.starttabulate { "|l|c|c|" }
68 context.BC() context("day")
69 context.BC() context("time")
70 context.BC() context("temperature")
71 context.NR()
72 local daily = schedule.dailySchedules
73 if daily then
74 for i=1,#daily do
75 local d = daily[i]
76 local s = d.switchpoints
77 if s then
78 for i=1,#s do
79 context.NC()
80 if i == 1 then
81 context.word(d.dayOfWeek)
82 end
83 context.NC() context(s[i].timeOfDay)
84 context.NC() context(s[i].temperature)
85 context.NC() context.NR()
86 end
87 end
88 end
89 end
90 context.stoptabulate()
91 context.stopsubject()
92 end
93
94 context.stoptitle()
95
96end
97
98function moduledata.evohome.history(specification)
99
100 local presets = evohome.helpers.loadpresets(specification.presets)
101 local zones = evohome.helpers.loadtemperatures(presets)
102
103 if not zones then
104 context("no zones")
105 context.blank()
106 return
107 end
108
109 local data = evohome.helpers.loadhistory(presets)
110
111 if not zones then
112 context("no history")
113 return
114 end
115
116 local years = data.years
117
118 if not years then
119 context("no years")
120 return
121 end
122
123 local minyear = specification.year or 2017
124 local maxyear = minyear
125 local minmonth = specification.month or 1
126 local maxmonth = specification.month or 12
127
128 local scale = 1/8
129 local mark = 3
130 local abstemp = 25
131
132 for y=minyear,maxyear do
133
134 local year = years[y]
135
136 for m=minmonth,maxmonth do
137
138 local month = year.months[m]
139
140 if month then
141
142 context.starttitle { title = "\\month{" .. m .. "}\\enspace" .. y }
143
144 for i=1,#zones do
145
146 local zone = zones[i]
147 local where = zone.name
148 local mintemp = zone.min
149 local maxtemp = zone.max
150
151
152 context.startlinecorrection()
153 context.startMPcode()
154 context("linecap := butt; pickup pencircle scaled .5")
155
156 context("fill (%s,%s) -- (%s,%s) -- (%s,%s) -- (%s,%s) -- cycle withcolor .8white ;",
157 0, mintemp/scale,
158 31 * 24, mintemp/scale,
159 31 * 24, maxtemp/scale,
160 0, maxtemp/scale
161 )
162
163 for i=0,abstemp do
164 context("draw (%s,%s) -- (%s,%s) withcolor .6white ;",
165 0, i/scale,
166 31 * 24, i/scale
167 )
168 end
169
170 local days = month.days
171 if days then
172 local nd = os.nofdays(y,m)
173 for d=1,nd do
174 local day = days[d]
175 local xoffset = (d-1) * 24
176 local wd = os.weekday(d,m,y)
177 local weekend = wd == 1 or wd == 7
178 if not weekend then
179
180 elseif mark == 1 then
181 context("draw (%s,%s) -- (%s,%s) ; ",xoffset, -17.5,xoffset, -32.5)
182 context("draw (%s,%s) -- (%s,%s) ; ",xoffset+24,-17.5,xoffset+24,-32.5)
183 elseif mark == 2 then
184 context("draw (%s,%s) -- (%s,%s) ; ",xoffset, -17.5,xoffset+24,-17.5)
185 context("draw (%s,%s) -- (%s,%s) ; ",xoffset, -32.5,xoffset+24,-32.5)
186 elseif mark == 3 then
187 context("draw unitsquare xysized (%s,%s) shifted (%s,%s) ; ",24,15,xoffset,-32.5)
188 end
189 context([[draw textext("%s") shifted (%s,%s) ; ]],d,xoffset + 12,-25)
190 if day then
191 for h=0,23 do
192 local hours = day.hours
193 if hours then
194 local hour = hours[h]
195 if hour then
196 local a = 0
197 local n = 0
198 local m = 0
199 for minute, d in next, hour do
200 local v = d[where]
201 if v then
202 a = a + v
203 n = n + 1
204 if v > m then
205 m = v
206 end
207 end
208 end
209 if n > 0 then
210 a = a / n
211 else
212 a = 0
213 end
214 local dx = xoffset + h
215 local dy = a/scale
216 local dm = m/scale
217 context("draw (%s,%s) -- (%s,%s) withcolor %s ; ",
218 dx, 0,dx,dy,weekend and "darkmagenta" or "darkblue")
219 context("draw (%s,%s) -- (%s,%s) withcolor %s ; ",
220 dx,dy,dx,dm,"darkred")
221 end
222 end
223 end
224 end
225 end
226 for d=0,30 do
227 local xoffset = d * 24
228 context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+ 0,0,xoffset+ 0,-10)
229 context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+ 6,0,xoffset+ 6,-2.5)
230 context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+12,0,xoffset+12,-5)
231 context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+18,0,xoffset+18,-2.5)
232 end
233 local xoffset = 31 * 24
234 context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset,0,xoffset,-10)
235 end
236
237 for i=0,abstemp,5 do
238 context([[draw textext.lft("%s") shifted (%s,%s) ; ]],i,-10,i/scale)
239 context("draw (%s,%s) -- (%s,%s) withcolor .2white ;",0,i/scale,31 * 24,i/scale)
240 end
241
242 context([[draw textext("\strut\month{%s}\enspace%s\enspace:\enspace%s") shifted (%s,%s) ; ]], m, y, where, 31 * 24 / 2, -50)
243 context([[draw textext.lft("\textdegree{}C") shifted (%s,%s) ; ]],-10,-25)
244
245 context("currentpicture := currentpicture xsized TextWidth") ;
246
247 context.stopMPcode()
248 context.stoplinecorrection()
249
250 end
251
252 context.stoptitle()
253
254 end
255
256 end
257
258 end
259
260end
261
262\stopluacode
263
264\continueifinputfile{sevohome.mkiv}
265
266\usemodule[art01]
267
268\setuplayout
269 [article]
270 [footer=0cm,
271 header=1cm,
272 topspace=5mm,
273 bottomspace=5mm]
274
275\starttext
276
277 \startluacode
278
279
280
281
282
283
284
285
286
287
288
289
290 local specification = {
291 year = 2018,
292
293 presets = "c:/data/develop/domotica/evohome/evohome-presets.lua",
294 }
295
296
297 moduledata.evohome.history(specification)
298
299 \stopluacode
300
301\stoptext
302 |