diff options
Diffstat (limited to 'tex/context/modules/mkiv/s-evohome.mkiv')
-rw-r--r-- | tex/context/modules/mkiv/s-evohome.mkiv | 295 |
1 files changed, 295 insertions, 0 deletions
diff --git a/tex/context/modules/mkiv/s-evohome.mkiv b/tex/context/modules/mkiv/s-evohome.mkiv new file mode 100644 index 000000000..1577517e5 --- /dev/null +++ b/tex/context/modules/mkiv/s-evohome.mkiv @@ -0,0 +1,295 @@ +%D \module +%D [ file=s-evohome, +%D version=2017.11.12, +%D title=\CONTEXT\ Style File, +%D subtitle=Evohome Graphics, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\setupbodyfont[dejavu] + +\starttext + +\startluacode + +local evohome = require("util-evo") + +moduledata.evohome = { } + +function moduledata.evohome.status(specification) + + local presets = evohome.helpers.loadpresets(specification.presets) + local zones = evohome.helpers.loadtemperatures(presets) + + -- todo : time + + if not zones then + context("no zones") + context.blank() + return + end + + local t = zones.time + + t = t and os.date("%Y-%m-%d %H:%M:%S",t) or "unknown time" + + context.starttitle { title = t } + + context.starttabulate { "|l|c|c|c|c|" } + context.BC() context("name") + context.BC() context("current") + context.BC() context("min") + context.BC() context("max") + context.BC() context("target") + context.NC() context.NR() + for i=1,#zones do + local zone = zones[i] + context.NC() context.word(zone.name) + context.NC() context("%0.1f",zone.current) + context.NC() context("%0.1f",zone.min) + context.NC() context("%0.1f",zone.max) + context.NC() context("%0.1f",zone.target) + context.NC() context.NR() + end + context.stoptabulate() + + for i=1,#zones do + local zone = zones[i] +-- evohome.helpers.updatezone(presets,zone.name) + local data = evohome.helpers.getzonestate(presets,zone.name) + local schedule = data and data.schedule or { } + context.startsubject { title = zone.name } + context.starttabulate { "|l|c|c|" } + context.BC() context("day") + context.BC() context("time") + context.BC() context("temperature") + context.NR() + local daily = schedule.dailySchedules + if daily then + for i=1,#daily do + local d = daily[i] + local s = d.switchpoints + if s then + for i=1,#s do + context.NC() + if i == 1 then + context.word(d.dayOfWeek) + end + context.NC() context(s[i].timeOfDay) + context.NC() context(s[i].temperature) + context.NC() context.NR() + end + end + end + end + context.stoptabulate() + context.stopsubject() + end + + context.stoptitle() + +end + +function moduledata.evohome.history(specification) + + local presets = evohome.helpers.loadpresets(specification.presets) + local zones = evohome.helpers.loadtemperatures(presets) + + if not zones then + context("no zones") + context.blank() + return + end + + local data = evohome.helpers.loadhistory(presets) + + if not zones then + context("no history") + return + end + + local years = data.years + + if not years then + context("no years") + return + end + + local minyear = specification.year or 2017 + local maxyear = minyear + local minmonth = specification.month or 1 + local maxmonth = specification.month or 12 + + local scale = 1/8 -- 20 + local mark = 3 + local abstemp = 25 + + for y=minyear,maxyear do + + local year = years[y] + + for m=minmonth,maxmonth do + + local month = year.months[m] + + if month then + + context.starttitle { title = "\\month{" .. m .. "}\\enspace" .. y } -- todo: function context.Month(m) end + + for i=1,#zones do + + local zone = zones[i] + local where = zone.name + local mintemp = zone.min + local maxtemp = zone.max + + -- context.startMPpage { offset = "10pt" } + context.startlinecorrection() + context.startMPcode() + context("linecap := butt; pickup pencircle scaled .5") + + context("fill (%s,%s) -- (%s,%s) -- (%s,%s) -- (%s,%s) -- cycle withcolor .8white ;", + 0, mintemp/scale, + 31 * 24, mintemp/scale, + 31 * 24, maxtemp/scale, + 0, maxtemp/scale + ) + + for i=0,abstemp do + context("draw (%s,%s) -- (%s,%s) withcolor .6white ;", + 0, i/scale, + 31 * 24, i/scale + ) + end + + local days = month.days + if days then + local nd = os.nofdays(y,m) + for d=1,nd do + local day = days[d] + local xoffset = (d-1) * 24 + local wd = os.weekday(d,m,y) + local weekend = wd == 1 or wd == 7 + if not weekend then + -- okay + elseif mark == 1 then + context("draw (%s,%s) -- (%s,%s) ; ",xoffset, -17.5,xoffset, -32.5) + context("draw (%s,%s) -- (%s,%s) ; ",xoffset+24,-17.5,xoffset+24,-32.5) + elseif mark == 2 then + context("draw (%s,%s) -- (%s,%s) ; ",xoffset, -17.5,xoffset+24,-17.5) + context("draw (%s,%s) -- (%s,%s) ; ",xoffset, -32.5,xoffset+24,-32.5) + elseif mark == 3 then + context("draw unitsquare xysized (%s,%s) shifted (%s,%s) ; ",24,15,xoffset,-32.5) + end + context([[draw textext("%s") shifted (%s,%s) ; ]],d,xoffset + 12,-25) + if day then + for h=0,23 do + local hours = day.hours + if hours then + local hour = hours[h] + if hour then + local a = 0 + local n = 0 + local m = 0 + for minute, d in next, hour do + local v = d[where] + a = a + v + n = n + 1 + if v > m then + m = v + end + end + a = a / n + local dx = xoffset + h + local dy = a/scale + local dm = m/scale + context("draw (%s,%s) -- (%s,%s) withcolor %s ; ", + dx, 0,dx,dy,weekend and "darkmagenta" or "darkblue") + context("draw (%s,%s) -- (%s,%s) withcolor %s ; ", + dx,dy,dx,dm,"darkred") + end + end + end + end + end + for d=0,30 do + local xoffset = d * 24 + context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+ 0,0,xoffset+ 0,-10) + context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+ 6,0,xoffset+ 6,-2.5) + context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+12,0,xoffset+12,-5) + context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset+18,0,xoffset+18,-2.5) + end + local xoffset = 31 * 24 + context("draw (%s,%s) -- (%s,%s) withcolor darkgray ; ",xoffset,0,xoffset,-10) + end + + for i=0,abstemp,5 do + context([[draw textext.lft("%s") shifted (%s,%s) ; ]],i,-10,i/scale) + context("draw (%s,%s) -- (%s,%s) withcolor .2white ;",0,i/scale,31 * 24,i/scale) + end + + context([[draw textext("\strut\month{%s}\enspace%s\enspace:\enspace%s") shifted (%s,%s) ; ]], m, y, where, 31 * 24 / 2, -50) + context([[draw textext.lft("\textdegree{}C") shifted (%s,%s) ; ]],-10,-25) + + context("currentpicture := currentpicture xsized TextWidth") ; + + context.stopMPcode() + context.stoplinecorrection() + -- context.stopMPpage() + end + + context.stoptitle() + + end + + end + + end + +end + +\stopluacode + +\continueifinputfile{s-evohome.mkiv} + +\usemodule[art-01] + +\setuplayout + [article] + [footer=0cm, + header=1cm, + topspace=5mm, + bottomspace=5mm] + +\starttext + + \startluacode + + -- os.execute([[mtxrun --script evohome --collect --presets=c:/data/develop/domotica/code/evohome-presets.lua]]) + + -- local specification = { + -- year = 2017, + -- -- month = 11, + -- presets = "c:/data/develop/domotica/evohome/evohome-presets.lua", + -- } + + -- moduledata.evohome.status (specification) + -- moduledata.evohome.history(specification) + + local specification = { + year = 2018, + -- month = 11, + presets = "c:/data/develop/domotica/evohome/evohome-presets.lua", + } + + -- moduledata.evohome.status (specification) + moduledata.evohome.history(specification) + + \stopluacode + +\stoptext |