%D \module %D [ file=s-youless, %D version=2013.11.12, %D title=\CONTEXT\ Style File, %D subtitle=Youless 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. %D This is experimental code. When I have collected enough data I will make the %D graphics nicer and provide some more. %D %D The Jouless can serve web pages but there is not much detail in them. They also are %D somewhat bad \HTML, like unquoted attributes and so. We don't need this anyway as we %D can also fetch data directly. The data is collected using a dedicated helper script %D (of course we could just call it as module too). The data is fetched from the Jouless %D device using queries (currently we use json, but a more direct parsing of data might %D be more efficient). The data is converted into a proper \LUA\ table and saved (merged). % in cronjob on one of the servers: % % mtxrun --script youless --collect --host=192.168.2.50 --watt youless-watt.lua % mtxrun --script youless --collect --host=192.168.2.50 --kwk youless-kwh.lua \startluacode require("util-you") moduledata.youless = { } function moduledata.youless.kwh(specification) -- todo end function moduledata.youless.watt(specification) local year = tonumber(specification.year) or os.today().year local data = table.load(specification.filename or "youless-watt.lua") if not data or data.variant ~= "watt" then context("invalid variant") return end utilities.youless.analyze(data) -- for the moment no specific font scaling local years = data.years if not years then context("no years") return end for y=year,year do local year = years[y] local scale = 20 local mark = 3 local maxwatt = specification.maxwatt or year.maxwatt for m=1,12 do local month = year.months[m] if month then context.startMPpage { offset = "10pt" } context("linecap := butt; pickup pencircle scaled .5") for i=0,(math.div(maxwatt,1000)+1)*1000,100 do context("draw (%s,%s) -- (%s,%s) withcolor .6white ;",0,i/scale,31 * 24,i/scale) end context("draw (0,%s) -- (31 * 24,%s) dashed dashpattern(on 6 off 6) withcolor darkgreen withpen pencircle scaled 1 ;",year.watt /scale,year.watt /scale) context("draw (0,%s) -- (31 * 24,%s) dashed dashpattern(off 6 on 6) withcolor darkred withpen pencircle scaled 1 ;",month.watt/scale,month.watt/scale) 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 dx = xoffset + h local dy = hour.watt/scale local dm = hour.maxwatt/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,"darkgray") 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 local max = (math.div(maxwatt,1000)+1) for i=0,max*1000,1000 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") shifted (%s,%s) ; ]],m, y, 31 * 24 / 2, -50) context([[draw textext.lft("watt") shifted (%s,%s) ; ]],-10,-25) context.stopMPpage() else -- maybe placeholder end end end end \stopluacode \continueifinputfile{s-youless.mkiv} \setupbodyfont[dejavu] % smaller sizes also look ok % printer (oce) : > 3000 W startup (900 W idle, 2000 W printing) % coffeemaker : 1500 W when heating % baseline day : 2250 W (servers, airco, workstations, routers, switches, heating, etc) % baseline night : 1750 W \starttext \startluacode -- os.execute([[mtxrun --script youless --collect --watt "c:/data/system/youless/data/youless-watt.lua"]]) -- os.execute([[mtxrun --script youless --collect --watt --nobackup "c:/data/system/youless/data/youless-watt.lua"]]) -- moduledata.youless.watt { year = 2013, filename = "c:/data/system/youless/data/youless-watt.lua" } moduledata.youless.watt { year = 2013, filename = "youless-watt.lua" } \stopluacode \stoptext