Waterzijdig inregelen van je vloerverwarming met een Raspberry Pi

Note to English readers: This post is in Dutch as it discusses how to finetune a typical domestic central heating installation commonly found in The Netherlands. If Google Translate can’t help you out feel free to ask your question in English in the comments section.

Vorig jaar ben ik begonnen met het waterzijdig inregelen van mijn vloerverwarming. Ondanks de vele nuttige posts rondom het onderwerp miste ik een goede aanpak die rekening hield met de traagheid van vloerverwarming en de constante beïnvloeding van het hele systeem als je aan 1 knop draait. Ik heb daarom een dashboard ontwikkeld waarop realtime te zien is wat de retourtemperatuur van iedere groep is, hoe deze zich verhoudt tot het gemiddelde van alle groepen en wat het gevolg is van een bijstelling over de tijd van 1 uur. Dat ziet er als volgt uit:

returntempdashboard

Om dit dashboard zelf te bouwen heb je het volgende nodig:

  • Digitale temperatuursensoren die je kunt bevestigen op een retourleiding. Ik heb zelf de DS18B20 gebruikt, deze zijn eenvoudig en goedkoop te verkrijgen op AliExpress bij vele leveranciers zoals deze voor rond de $ 0,60. Je hebt er 1 nodig per retourleiding.
  • Een weerstand van 4,7KΩ. Per 10 te bestellen bij Kiwi Electronics voor € 1.
  • Een IoT development board met een ESP8266 chip en een draadloze antenne dat de ESP Easy software kant draaien. Ook hier veel leveranciers, zoek naar een NodeMCU board zoals deze voor rond de $ 3. Je hebt er 1 nodig per vloerverwarmingsverdeler.
  • Een Raspberry Pi 3 waarop je de software draait. Ik heb de RPi 3 basisbundel besteld bij Kiwi Electronics, daar zit een goede voeding, SD kaart en behuizing bij. De kit is standaard geprijsd op € 69,95. Je kunt uiteraard ook een andere Linux PC gebruiken maar dan werken de commando’s mogelijk anders.

Voor ieder IoT board heb je daarnaast een USB voeding en een micro-USB kabel nodig. Ook heb je een paar meter CAT5 kabel nodig om de sensoren met elkaar te verbinden, een paar jumper kabeltjes om je sensoren makkelijk op je IoT board te prikken en wat krimpkous om de sensors en de bekabeling netjes te isoleren. Dit had ik al liggen, in totaal heb ik 15*0,60 + 1 + 3*2,60 + 1*69,95 = € 87,75 uitgegeven. Dat hoop ik deze winter terug te gaan verdienen 🙂

Stap 1: Flashen en configuren IoT board met ESP Easy

Je gaat je IoT board voorzien van ESP Easy, hoe je dat moet doen vind je hier. Ik heb release R120 gebruikt (2.0.0 is nog in beta). Nadat je ESP Easy hebt ingeladen staat hier hoe je ermee kan inloggen op je draadloze netwerk.

Eenmaal juist geconfigureerd kun je in je webbrowser naar het IP adres van ESP Easy surfen. Je ziet dan een eenvoudige website met een aantal menu-opties. Hier kun je nu nog niet zoveel, eerst moet je je sensoren gaan aansluiten.

Stap 2: Solderen en aansluiten sensoren op je IoT board

Tijd om de soldeerbout op te warmen en aan de slag te gaan. De DS18B20 sensoren zijn digitale sensoren die parallel aan elkaar kunnen worden aangesloten. Dat ziet er schematisch zo uit (pin headers zijn van een Pi):

Voor het aansluiten gebruik je bij voorkeur CAT5 (of betere) bekabeling, let daarbij op dat je één twisted pair gebruikt voor de Data en de Gnd zoals hieronder weergegeven. De V+ (in ons geval 3,3 Volt vanaf het IoT board) krijgt een eigen ader. Soldeer geen aderparen aan elkaar, dit heeft een negatief effect op de weerstand (lees: betrouwbaarheid) van je bekabeling.

Aan het einde van je lus met DS18B20 sensoren soldeer je de 4,7 KΩ weerstand tussen de Data en de V+ en voorzie je de draden van een stekkertje door wat jumperkabeltjes aan stukken te knippen. De sensoren sluit je als volgt aan op het IoT board:

  • V+ op een 3V3 pin naar keuze (er zijn er meerdere)
  • Gnd op een GND pin naar keuze (er zijn er meerdere)
  • Data op D5 (dat is eigenlijk GPIO14, voor details zie hier)

De sensoren kun je met een paar tie-wraps met de vlakke kant tegen de retourleiding aan bevestigen. Dit werkt nauwkeurig genoeg, we willen immers het verschil weten in temperatuur tussen de leidingen. Als je alles aan elkaar hebt gesoldeerd, bevestigd en aangesloten dan ziet het er ongeveer zo uit:

Stap 3: Configureren Raspberry Pi met Mosquitto, Influx en Node-Red

Tijd om je Raspberry Pi in te richten. Ik gebruik de standaard Raspbian Jessie installatie met de 4.9 kernel. Je zult de Pi headless gebruiken dus download de Lite versie zonder grafische toeters of bellen. De tutorial om dit op je SD kaart te zetten vind je hier, vergeet niet om een leeg bestand aan te maken op de SD kaart (sudo touch ssh) met de naam ssh zodat je Pi bij de eerste keer opstarten meteen via SSH benaderbaar is.

Als je voor het eerst je Pi benadert via SSH (ssh pi@, password is raspberry) dan kun je het beste de tool raspi-config draaien. Daarmee stel je snel je hostname (pi3server in mijn geval), tijdzone en locales in en dat scheelt je weer foutmeldingen tijdens het installeren van de volgende applicaties. Daarna draai je sudo apt-get update en daarna sudo apt-get upgrade zodat je helemaal up to date bent. Ik heb de Pi met een netwerkkabel aangesloten op mijn router, mocht je de Pi via wireless aan willen sluiten dan staat hier hoe je dat kunt doen.

Installatie van Influx

Influx is een database die alle data wegschrijft met een timestamp en is daarom goed geschikt voor het opslaan van onze retourtemperaturen. Een andere functie van Influx is het zelf continu uitvoeren van berekeningen en deze opslaan naast de bestaande data, deze functie gebruiken we om de gemiddelde retourtemperatuur uit te rekenen. De installatie van influx is eenvoudig, de instructie om de Influx repository toe te voegen aan je Pi staat hier, voer de commando’s in voor Debian users. Na installatie kun je de Influx console openen (typ influx). Je ziet dan een > en typt de volgende commando’s in:

CREATE DATABASE testdb
CREATE RETENTION POLICY “a_year” ON testdb DURATION 52w REPLICATION 1 default
CREATE CONTINUOUS QUERY “cq_averageALL” ON “testdb” BEGIN SELECT mean(“temp”) INTO “averagereturntempALL” FROM “returntemp” GROUP BY time(1m) END
CREATE CONTINUOUS QUERY “cq_averageGND” ON “testdb” BEGIN SELECT mean(“temp”) INTO “averagereturntempGND” FROM “returntemp” WHERE “floor” = ‘GND’ GROUP BY time(1m) END
CREATE CONTINUOUS QUERY “cq_average1ST” ON “testdb” BEGIN SELECT mean(“temp”) INTO “averagereturntemp1ST” FROM “returntemp” WHERE “floor” = ‘1ST’ GROUP BY time(1m) END
CREATE CONTINUOUS QUERY “cq_average2nd” ON “testdb” BEGIN SELECT mean(“temp”) INTO “averagereturntemp2ND” FROM “returntemp” WHERE “floor” = ‘2ND’ GROUP BY time(1m) END

De eerste 2 commando’s maken een database genaamd testdb aan met een retention policy van 1 jaar, dit kun je zelf inkorten naar een half jaar (26w in plaats van 52w) of minder. De CONTINUOUS QUERY commando’s zijn de berekeningen die de database uitvoert op je retourtemperaturen. Je bent nu klaar met de installatie van influx!

Installatie van Mosquitto

Mosquitto is een MQTT server waar ESP Easy de retourtemperaturen naartoe publiceert. Deze kunnen we dan in Node-Red uitlezen en wegschrijven naar Influx. Ook Mosquitto voeg je gemakkelijk toe aan je reposity, zie deze uitleg. Om Mosquitto automatisch te laten opstarten typ je:

sudo systemctl enable mosquitto.service

Er is verder geen configuratie benodigd.

Installatie van Node.js en Node-RED

Eerst installeren we Node.js, we gebruikt de 6.x LTS (Long Time Support) versie. Met deze commando’s voeg je Node.js toe aan je repository en installeer je deze:

curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash –
sudo apt-get install -y nodejs

Daarna kun je Node-RED zelf installeren, de instructies daarvoor staan hier. Als Node-RED geïnstalleerd is moet je nog een script downloaden om deze automatisch te laten starten, daarvoor voer je deze commando’s uit:

sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/nodered.service -O /lib/systemd/system/nodered.service
sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-start -O /usr/bin/node-red-start
sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-stop -O /usr/bin/node-red-stop
sudo chmod +x /usr/bin/node-red-st*

Standaard wijst dit script 256 MB RAM toe aan Node-RED. Met de Pi 3 is er gelukkig meer geheugen beschikbaar dan op de Pi 1 en kun je dit getal beter verhogen. Open daarvoor met je favoriete teksteditor het configuratiebestand en verander de volgende regel:

pico /lib/systemd/system/nodered.service

Zoek en pas aan –> Environment=”NODE_OPTIONS=–max-old-space-size=512

Ctrl-O, dan Ctrl-X

sudo systemctl daemon-reload
sudo systemctl enable nodered.service

Als je nu je Pi herstart (sudo reboot) dan zul je na enkele minuten (1 tot 2) kunnen inloggen op http://pi3server:1880 Het kan zijn dat je router dit niet ondersteunt of dat je je Pi een andere hostname hebt gegeven, vervang dan “pi3server” in de URL door het IP adres van je Pi of door een FQDN (bij xs4all routers is dit bijvoorbeeld pi3server.fritz.box).

Als je Node-RED hebt opgestart moet je nog een aantal extra modules installeren voordat je echt aan de slag kunt. Klik daarvoor op het menu-icoon rechtboven en navigeer naar “Manage palette”. Kies in dat venster de tab “Install” en installeer de volgende modules:

node-red-contrib-influxdb
node-red-dashboard

Het scherm ziet er als volgt uit. Typ (een deel van) de naam in, druk op Enter en dan op installeer.

Screen Shot 2017-08-19 at 22.59.10

Stap 4: Configureren ESP Easy

Nu je Influx, Mosquitto en Node-RED hebt draaien kunnen we ESP Easy verder instellen. Log in op het IP adres van je ESP Easy IoT board zoals je dat in stap 1 al eerder hebt gedaan. We geen nu een aantal instellingen aanpassen om ervoor te zorgen dat ESP Easy de temperatuursensoren uitleest en naar je MQTT server (Mosquitto) verstuurt:

Kies “Tools” uit het menu en dan naast de tekst “System” druk je op de knop “Advanced”. Daar vul je op de tweede regel bij Publish Template in: /%sysname%/%valname%

Screen Shot 2017-08-19 at 23.06.27

Kies ‘Config” uit het menu en verander Name: in een eenvoudig te herkennen hostname. Ik heb hier gekozen voor groundlevel. Verder vul je bij Protocol: OpenHAB MQTT in en bij Controller Hostname: De FQDN of het IP adres van je Pi.

Screen Shot 2017-08-19 at 23.06.36

Kies “Devices” en dan op Edit van de eerst regel. Je ziet nu onderstaand scherm. Kies de DS18B20 als temperatuursensor uit de lijst en kies daarna GPIO-14 bij 1st GPIO. Als de ESP Easy je sensoren kan uitlezen verschijnt er een menu bij Device Nr: waar je een sensor kan kiezen. Kies er 1 en vul de overige velden in zoals hieronder aangegeven.

Screen Shot 2017-08-19 at 23.06.52

Als je het goed hebt gedaan zul je nu op de eerste regel na enkele minuten (Let op: Dit kan even duren!) een temperatuur verschijnen zoals hieronder. Nu kun je gaan uitzoeken welke sensor dat is 🙂 het makkelijkste is om eerst alle sensoren toe te voegen en er dan één stevig vast te houden. Je zult na 1 minuut (de sensoren worden eens per minuut uitgelezen) een duidelijke stijging van de temperatuur zien. Zo kun je uitpuzzelen welke sensor op welke groep geplakt zit. Na wat geduld kom je dan tot onderstaand lijstje. Let op het opnummeren van de IDX/Variable, deze heeft een interne functie voor ESP Easy en moet uniek zijn.

Screen Shot 2017-08-16 at 20.36.50

Nu je dit hebt ingesteld zal je IoT board met een interval van 1 minuut de temperatuur per sensor publiceren naar de MQTT server. Deze berichten zien er als volgt uit:

1492182469: Received PUBLISH from ESPClient1 (d0, q0, r0, m0, ‘/groundlevel/BG-Woonkamer-1’, … (5 bytes))

1492182469: Sending PUBLISH to ESPClient1 (d0, q0, r0, m0, ‘/groundlevel/BG-Woonkamer-1’, … (5 bytes))

1492182470: Received PUBLISH from ESPClient1 (d0, q0, r0, m0, ‘/groundlevel/BG-Woonkamer-2’, … (5 bytes))

Je kunt dit ook zelf controleren door de Mosquitto server te stoppen (sudo service mosquitto stop) en op de command line te starten (mosquitto -v) in verbose mode.

Stap 5: Inregelen communicatie en dashboard in Node-Red

Nu komt het leukste deel: Het samenbrengen van alle informatie in Node-RED. Eerst gaan we de retourtemperaturen die je binnenkrijgt van de MQTT server opvangen, formatteren en naar Influx sturen. Dit heet een Flow en ziet er als volgt uit:

Screen Shot 2017-08-19 at 23.30.50

Je kunt flows eenvoudig importeren, ga naar het hamburgermenu rechtboven, kies Import en dan Clipboard. Daarin plak je onderstaande tekst:

[{“id”:”f6489a06.95b788″,”type”:”mqtt in”,”z”:”a5027913.f5fd98″,”name”:””,”topic”:”/groundlevel/#”,”qos”:”0″,”broker”:”d8398787.86b648″,”x”:132,”y”:317,”wires”:[[“b6b87a3.a88b388”]]},{“id”:”3274a96.5d4c756″,”type”:”mqtt in”,”z”:”a5027913.f5fd98″,”name”:””,”topic”:”/1stfloor/#”,”qos”:”0″,”broker”:”d8398787.86b648″,”x”:123.5,”y”:184,”wires”:[[“3b1b3ba4.4d0844”]]},{“id”:”3b1b3ba4.4d0844″,”type”:”function”,”z”:”a5027913.f5fd98″,”name”:”format1ST”,”func”:”var temp = parseFloat(msg.payload);\nvar sensorname = msg.topic.substring(10);\nmsg.payload = [{\n temp: temp\n},\n{\n floor: \”1ST\”,\n group: sensorname\n}];\nreturn msg; \n”,”outputs”:1,”noerr”:0,”x”:438.5,”y”:184,”wires”:[[“5e5fd0e2.14689”]]},{“id”:”b6b87a3.a88b388″,”type”:”function”,”z”:”a5027913.f5fd98″,”name”:”formatGND”,”func”:”var temp = parseFloat(msg.payload);\nvar sensorname = msg.topic.substring(13);\nmsg.payload = [{\n temp: temp\n},\n{\n floor: \”GND\”,\n group: sensorname\n}];\nreturn msg; \n”,”outputs”:1,”noerr”:0,”x”:433,”y”:317,”wires”:[[“5e5fd0e2.14689”]]},{“id”:”5e5fd0e2.14689″,”type”:”influxdb out”,”z”:”a5027913.f5fd98″,”influxdb”:”cd8575.dbb66a88″,”name”:”InfluxDB”,”measurement”:”returntemp”,”precision”:””,”retentionPolicy”:””,”x”:800.5,”y”:276,”wires”:[]},{“id”:”d8398787.86b648″,”type”:”mqtt-broker”,”z”:””,”broker”:”localhost”,”port”:”1883″,”clientid”:””,”usetls”:false,”compatmode”:true,”keepalive”:”60″,”cleansession”:true,”willTopic”:””,”willQos”:”0″,”willPayload”:””,”birthTopic”:””,”birthQos”:”0″,”birthPayload”:””},{“id”:”cd8575.dbb66a88″,”type”:”influxdb”,”z”:””,”hostname”:”pi3server.fritz.box”,”port”:”8086″,”protocol”:”http”,”database”:”testdb”,”name”:”InfluxDB”,”usetls”:false,”tls”:””}]

Nu heb je als het goed is dezelfde Flow op je scherm en kun je gaan aanpassen. Ik heb 2 verdiepingen weergegeven, je kunt overbodige nodes verwijderen zodat je alleen de begane grond (=groundlevel) overhoudt. Dubbelklik op de paarse node die /groundlevel/# heet, je ziet dan onderstaand scherm:

Screen Shot 2017-08-19 at 23.36.36

Klik op het potlood om je MQTT server (= broker) toe te voegen, je ziet dan een scherm zoals onderstaand. Neem de instellingen over (de andere tabs zijn niet nodig), druk op Add en in het volgende venster op Done. Je hebt nu een abonnement op alle retourtemperaturen van de begane grond.

Screen Shot 2017-08-19 at 23.25.06

Dubbelklik nu op de node die formatGND heet, je ziet dan een veld met Javascript code. Node-RED is geheel gebouwd in Javascript en dat betekent dat je makkelijk je eigen functies kunt schrijven.

Screen Shot 2017-08-19 at 23.52.35

Deze functie leest de sensorwaardes uit die naar de MQTT server gestuurd worden, dit zijn echter strings en daar kan Influx niet mee werken. In de eerste regel code zetten we de temperatuur dus om naar een getal. In de tweede regel knippen we de eerste 13 letters af van de naam van het MQTT bericht zodat we alleen de naam van de sensor overhouden in Influx. In regel 7 staat de afkorting van de verdieping, in dit geval GND. Pas de code aan indien nodig.

Dan volgt het koppelen met de Influx database. Dubbelklik op de Influx node en klik op het potlood naast de tekst Add new Influxdb… Je ziet dan dit scherm, neem de instellingen over.

Screen Shot 2017-08-19 at 23.27.09

Druk daarna op Add. je komt dan terug in het eerdere venster (zie onder). Vul bij Measurement de tekst returntemp in. Onder deze “tabel” worden alle retourtemperaturen opgeslagen.

Screen Shot 2017-08-19 at 23.27.02

Druk nu op de grote rode knop Deploy rechtsboven. Als je alles goed hebt ingesteld gaat Node-RED vanaf nu je temperatuurdata opslaan in de Influx database. Dat kun je zelf controleren door op de command line het volgende in te typen:

influx
Connected to http://localhost:8086 version 1.3.1
InfluxDB shell version: 1.3.3
> use testdb
Using database testdb
> select * from returntemp

Je krijgt als het goed is dan onderstaand resultaat te zien:

1503173196277338006 GND   Hal-4        21

1503173197226135884 GND   Woonkamer-1  21.31

1503173199052534609 GND   Woonkamer-2  21.25

1503173200056344977 GND   Keuken-5     21

1503173201062343300 GND   Berging-6    21

1503173202894103400 GND   Woonkamer-3  20.88

Nu je data beschikbaar is rest er nog een laatste stap en dat is het weergeven in een dashboard. Daarvoor maken we een nieuwe flow. Ga naar het hamburgermenu rechtsboven, kies Import en Clipboard en plak daarin onderstaande tekst:

[{“id”:”a4085cc4.caca4″,”type”:”tab”,”label”:”dashboard”,”disabled”:false,”info”:””},{“id”:”fea655f5.89af18″,”type”:”inject”,”z”:”a4085cc4.caca4″,”name”:””,”topic”:””,”payload”:””,”payloadType”:”date”,”repeat”:”60″,”crontab”:””,”once”:true,”x”:136,”y”:878,”wires”:[[“4da54f93.3c8e1″,”61b47228.d9416c”,”ead3c5e3.6571d8″,”f3bb0033.8320a”,”41925978.3b0358″,”b58cbee1.cd4df”,”751b64d8.71b92c”,”c87e0f14.78579″,”3aae1b1b.73a614″,”f28f4671.665f18″,”25f3a3f6.f02c2c”,”7882743.66ddd8c”,”35b6a7e9.297a98″,”960110f5.be4d8″,”cee976df.676db8″,”2b963f72.f3542″,”1ff9f8fb.2eed77″]]},{“id”:”4da54f93.3c8e1″,”type”:”influxdb in”,”z”:”a4085cc4.caca4″,”influxdb”:”cd8575.dbb66a88″,”name”:”Woonkamer-1″,”query”:”select LAST(\”temp\”) FROM \”returntemp\” WHERE \”group\” = ‘Woonkamer-1′”,”rawOutput”:false,”precision”:””,”retentionPolicy”:””,”x”:420,”y”:208,”wires”:[[“d379a865.470b98”]]},{“id”:”a8ee8f8d.bd099″,”type”:”ui_gauge”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”81a27fd9.1f5fe”,”order”:0,”width”:0,”height”:0,”gtype”:”gage”,”title”:”Woonkamer-1″,”label”:”Graden”,”format”:”{{value | number:2}}”,”min”:”15″,”max”:”45″,”colors”:[“#00b500″,”#e6e600″,”#ca3838″],”seg1″:””,”seg2″:””,”x”:805,”y”:229,”wires”:[]},{“id”:”d379a865.470b98″,”type”:”change”,”z”:”a4085cc4.caca4″,”name”:”MV”,”rules”:[{“t”:”move”,”p”:”payload[0].last”,”pt”:”msg”,”to”:”payload”,”tot”:”msg”},{“t”:”set”,”p”:”topic”,”pt”:”msg”,”to”:”Woonkamer-1″,”tot”:”str”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:589,”y”:208,”wires”:[[“a8ee8f8d.bd099″,”93bd9e5a.44134”]]},{“id”:”93bd9e5a.44134″,”type”:”ui_chart”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”780aed60.895484″,”order”:2,”width”:0,”height”:0,”label”:”Woonkamer-1″,”chartType”:”line”,”legend”:”false”,”xformat”:”HH:mm:ss”,”interpolate”:”linear”,”nodata”:””,”dot”:false,”ymin”:”15″,”ymax”:”45″,”removeOlder”:1,”removeOlderPoints”:””,”removeOlderUnit”:”3600″,”cutout”:0,”useOneColor”:false,”colors”:[“#1f77b4″,”#aec7e8″,”#ff7f0e”,”#2ca02c”,”#98df8a”,”#d62728″,”#ff9896″,”#9467bd”,”#c5b0d5″],”x”:805.5,”y”:190,”wires”:[[],[]]},{“id”:”61b47228.d9416c”,”type”:”influxdb in”,”z”:”a4085cc4.caca4″,”influxdb”:”cd8575.dbb66a88″,”name”:”averagereturntempALL”,”query”:”select LAST(\”mean\”) FROM \”averagereturntempall\””,”rawOutput”:false,”precision”:””,”retentionPolicy”:””,”x”:402,”y”:163,”wires”:[[“daa2220f.93fae”,”40397165.f29ed”,”c140acdc.98e2a”,”a715febb.548f3″]]},{“id”:”daa2220f.93fae”,”type”:”ui_text”,”z”:”a4085cc4.caca4″,”group”:”81a27fd9.1f5fe”,”order”:3,”width”:0,”height”:0,”name”:””,”label”:”CV Retourtemp”,”format”:”{{msg.payload[0].last | number:2}}”,”layout”:”row-center”,”x”:804.5,”y”:151,”wires”:[]},{“id”:”ead3c5e3.6571d8″,”type”:”influxdb in”,”z”:”a4085cc4.caca4″,”influxdb”:”cd8575.dbb66a88″,”name”:”Woonkamer-2″,”query”:”select LAST(\”temp\”) FROM \”returntemp\” WHERE \”group\” = ‘Woonkamer-2′”,”rawOutput”:false,”precision”:””,”retentionPolicy”:””,”x”:417,”y”:290,”wires”:[[“336e8f9d.92de1”]]},{“id”:”4c1332f7.29d7ac”,”type”:”ui_gauge”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”81a27fd9.1f5fe”,”order”:0,”width”:0,”height”:0,”gtype”:”gage”,”title”:”Woonkamer-2″,”label”:”Graden”,”format”:”{{value | number:2}}”,”min”:”15″,”max”:”45″,”colors”:[“#00b500″,”#e6e600″,”#ca3838″],”seg1″:””,”seg2″:””,”x”:807,”y”:312,”wires”:[]},{“id”:”336e8f9d.92de1″,”type”:”change”,”z”:”a4085cc4.caca4″,”name”:”MV”,”rules”:[{“t”:”move”,”p”:”payload[0].last”,”pt”:”msg”,”to”:”payload”,”tot”:”msg”},{“t”:”set”,”p”:”topic”,”pt”:”msg”,”to”:”Woonkamer-2″,”tot”:”str”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:593,”y”:290,”wires”:[[“4c1332f7.29d7ac”,”54dad0a.9637b3″]]},{“id”:”f3bb0033.8320a”,”type”:”influxdb in”,”z”:”a4085cc4.caca4″,”influxdb”:”cd8575.dbb66a88″,”name”:”Woonkamer-3″,”query”:”select LAST(\”temp\”) FROM \”returntemp\” WHERE \”group\” = ‘Woonkamer-3′”,”rawOutput”:false,”precision”:””,”retentionPolicy”:””,”x”:412,”y”:378,”wires”:[[“ed319690.971378”]]},{“id”:”1b1a9eca.62d121″,”type”:”ui_gauge”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”81a27fd9.1f5fe”,”order”:0,”width”:0,”height”:0,”gtype”:”gage”,”title”:”Woonkamer-3″,”label”:”Graden”,”format”:”{{value | number:2}}”,”min”:”15″,”max”:”45″,”colors”:[“#00b500″,”#e6e600″,”#ca3838″],”seg1″:””,”seg2″:””,”x”:808,”y”:393,”wires”:[]},{“id”:”ed319690.971378″,”type”:”change”,”z”:”a4085cc4.caca4″,”name”:”MV”,”rules”:[{“t”:”move”,”p”:”payload[0].last”,”pt”:”msg”,”to”:”payload”,”tot”:”msg”},{“t”:”set”,”p”:”topic”,”pt”:”msg”,”to”:”Woonkamer-3″,”tot”:”str”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:595,”y”:375,”wires”:[[“1b1a9eca.62d121″,”c7f94b32.ee3258”]]},{“id”:”41925978.3b0358″,”type”:”influxdb in”,”z”:”a4085cc4.caca4″,”influxdb”:”cd8575.dbb66a88″,”name”:”Hal-4″,”query”:”select LAST(\”temp\”) FROM \”returntemp\” WHERE \”group\” = ‘Hal-4′”,”rawOutput”:false,”precision”:””,”retentionPolicy”:””,”x”:419,”y”:453,”wires”:[[“2d2617f6.30a0c8”]]},{“id”:”6dc7e1c9.cbe65″,”type”:”ui_gauge”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”81a27fd9.1f5fe”,”order”:0,”width”:0,”height”:0,”gtype”:”gage”,”title”:”Hal-4″,”label”:”Graden”,”format”:”{{value | number:2}}”,”min”:”15″,”max”:”45″,”colors”:[“#00b500″,”#e6e600″,”#ca3838″],”seg1″:””,”seg2″:””,”x”:775,”y”:474,”wires”:[]},{“id”:”2d2617f6.30a0c8″,”type”:”change”,”z”:”a4085cc4.caca4″,”name”:”MV”,”rules”:[{“t”:”move”,”p”:”payload[0].last”,”pt”:”msg”,”to”:”payload”,”tot”:”msg”},{“t”:”set”,”p”:”topic”,”pt”:”msg”,”to”:”Hal-4″,”tot”:”str”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:595,”y”:453,”wires”:[[“6dc7e1c9.cbe65″,”6455f3a8.eaffec”]]},{“id”:”b58cbee1.cd4df”,”type”:”influxdb in”,”z”:”a4085cc4.caca4″,”influxdb”:”cd8575.dbb66a88″,”name”:”Keuken-5″,”query”:”select LAST(\”temp\”) FROM \”returntemp\” WHERE \”group\” = ‘Keuken-5′”,”rawOutput”:false,”precision”:””,”retentionPolicy”:””,”x”:415,”y”:530,”wires”:[[“1b413a8e.5302f5”]]},{“id”:”13dd8d30.5f3ca3″,”type”:”ui_gauge”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”81a27fd9.1f5fe”,”order”:0,”width”:0,”height”:0,”gtype”:”gage”,”title”:”Keuken-5″,”label”:”Graden”,”format”:”{{value | number:2}}”,”min”:”15″,”max”:”45″,”colors”:[“#00b500″,”#e6e600″,”#ca3838″],”seg1″:””,”seg2″:””,”x”:784,”y”:548,”wires”:[]},{“id”:”1b413a8e.5302f5″,”type”:”change”,”z”:”a4085cc4.caca4″,”name”:”MV”,”rules”:[{“t”:”move”,”p”:”payload[0].last”,”pt”:”msg”,”to”:”payload”,”tot”:”msg”},{“t”:”set”,”p”:”topic”,”pt”:”msg”,”to”:”Keuken-5″,”tot”:”str”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:599,”y”:529,”wires”:[[“13dd8d30.5f3ca3″,”ef739c5d.f76ba”]]},{“id”:”751b64d8.71b92c”,”type”:”influxdb in”,”z”:”a4085cc4.caca4″,”influxdb”:”cd8575.dbb66a88″,”name”:”Berging-6″,”query”:”select LAST(\”temp\”) FROM \”returntemp\” WHERE \”group\” = ‘Berging-6′”,”rawOutput”:false,”precision”:””,”retentionPolicy”:””,”x”:410,”y”:603,”wires”:[[“561aaa98.5bfbf4”]]},{“id”:”bd3fd343.cb22c”,”type”:”ui_gauge”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”81a27fd9.1f5fe”,”order”:0,”width”:0,”height”:0,”gtype”:”gage”,”title”:”Berging-6″,”label”:”Graden”,”format”:”{{value | number:2}}”,”min”:”15″,”max”:”45″,”colors”:[“#00b500″,”#e6e600″,”#ca3838″],”seg1″:””,”seg2″:””,”x”:784,”y”:624,”wires”:[]},{“id”:”561aaa98.5bfbf4″,”type”:”change”,”z”:”a4085cc4.caca4″,”name”:”MV”,”rules”:[{“t”:”move”,”p”:”payload[0].last”,”pt”:”msg”,”to”:”payload”,”tot”:”msg”},{“t”:”set”,”p”:”topic”,”pt”:”msg”,”to”:”Berging-6″,”tot”:”str”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:600,”y”:603,”wires”:[[“bd3fd343.cb22c”,”3c7e0369.43ccfc”]]},{“id”:”54dad0a.9637b3″,”type”:”ui_chart”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”780aed60.895484″,”order”:3,”width”:0,”height”:0,”label”:”Woonkamer-2″,”chartType”:”line”,”legend”:”false”,”xformat”:”HH:mm:ss”,”interpolate”:”linear”,”nodata”:””,”dot”:false,”ymin”:”15″,”ymax”:”45″,”removeOlder”:1,”removeOlderPoints”:””,”removeOlderUnit”:”3600″,”cutout”:0,”useOneColor”:false,”colors”:[“#1f77b4″,”#aec7e8″,”#ff7f0e”,”#2ca02c”,”#98df8a”,”#d62728″,”#ff9896″,”#9467bd”,”#c5b0d5″],”x”:806,”y”:270,”wires”:[[],[]]},{“id”:”c7f94b32.ee3258″,”type”:”ui_chart”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”780aed60.895484″,”order”:4,”width”:0,”height”:0,”label”:”Woonkamer-3″,”chartType”:”line”,”legend”:”false”,”xformat”:”HH:mm:ss”,”interpolate”:”linear”,”nodata”:””,”dot”:false,”ymin”:”15″,”ymax”:”45″,”removeOlder”:1,”removeOlderPoints”:””,”removeOlderUnit”:”3600″,”cutout”:0,”useOneColor”:false,”colors”:[“#1f77b4″,”#aec7e8″,”#ff7f0e”,”#2ca02c”,”#98df8a”,”#d62728″,”#ff9896″,”#9467bd”,”#c5b0d5″],”x”:809,”y”:353,”wires”:[[],[]]},{“id”:”6455f3a8.eaffec”,”type”:”ui_chart”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”780aed60.895484″,”order”:5,”width”:0,”height”:0,”label”:”Hal-4″,”chartType”:”line”,”legend”:”false”,”xformat”:”HH:mm:ss”,”interpolate”:”linear”,”nodata”:””,”dot”:false,”ymin”:”15″,”ymax”:”45″,”removeOlder”:1,”removeOlderPoints”:””,”removeOlderUnit”:”3600″,”cutout”:0,”useOneColor”:false,”colors”:[“#1f77b4″,”#aec7e8″,”#ff7f0e”,”#2ca02c”,”#98df8a”,”#d62728″,”#ff9896″,”#9467bd”,”#c5b0d5″],”x”:776,”y”:434,”wires”:[[],[]]},{“id”:”ef739c5d.f76ba”,”type”:”ui_chart”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”780aed60.895484″,”order”:6,”width”:0,”height”:0,”label”:”Keuken-5″,”chartType”:”line”,”legend”:”false”,”xformat”:”HH:mm:ss”,”interpolate”:”linear”,”nodata”:””,”dot”:false,”ymin”:”15″,”ymax”:”45″,”removeOlder”:1,”removeOlderPoints”:””,”removeOlderUnit”:”3600″,”cutout”:0,”useOneColor”:false,”colors”:[“#1f77b4″,”#aec7e8″,”#ff7f0e”,”#2ca02c”,”#98df8a”,”#d62728″,”#ff9896″,”#9467bd”,”#c5b0d5″],”x”:787,”y”:511,”wires”:[[],[]]},{“id”:”3c7e0369.43ccfc”,”type”:”ui_chart”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”780aed60.895484″,”order”:7,”width”:0,”height”:0,”label”:”Berging-6″,”chartType”:”line”,”legend”:”false”,”xformat”:”HH:mm:ss”,”interpolate”:”linear”,”nodata”:””,”dot”:false,”ymin”:”15″,”ymax”:”45″,”removeOlder”:1,”removeOlderPoints”:””,”removeOlderUnit”:”3600″,”cutout”:0,”useOneColor”:false,”colors”:[“#1f77b4″,”#aec7e8″,”#ff7f0e”,”#2ca02c”,”#98df8a”,”#d62728″,”#ff9896″,”#9467bd”,”#c5b0d5″],”x”:786,”y”:586,”wires”:[[],[]]},{“id”:”ea45370e.cc44f8″,”type”:”ui_text”,”z”:”a4085cc4.caca4″,”group”:”780aed60.895484″,”order”:1,”width”:0,”height”:0,”name”:””,”label”:”Retourtemp BG”,”format”:”{{msg.payload[0].last | number:2}}”,”layout”:”row-center”,”x”:800.5,”y”:92,”wires”:[]},{“id”:”c87e0f14.78579″,”type”:”influxdb in”,”z”:”a4085cc4.caca4″,”influxdb”:”cd8575.dbb66a88″,”name”:”averagereturntempGND”,”query”:”select LAST(\”mean\”) FROM \”averagereturntempGND\””,”rawOutput”:false,”precision”:””,”retentionPolicy”:””,”x”:408,”y”:101,”wires”:[[“ea45370e.cc44f8”]]},{“id”:”f28f4671.665f18″,”type”:”influxdb in”,”z”:”a4085cc4.caca4″,”influxdb”:”cd8575.dbb66a88″,”name”:”Slaapkamer-1″,”query”:”select LAST(\”temp\”) FROM \”returntemp\” WHERE \”group\” = ‘Slaapkamer-1′”,”rawOutput”:false,”precision”:””,”retentionPolicy”:””,”x”:415,”y”:823,”wires”:[[“cb035165.a64e1”]]},{“id”:”8d2dc3f7.94e5b”,”type”:”ui_gauge”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”843e7357.0b845″,”order”:0,”width”:0,”height”:0,”gtype”:”gage”,”title”:”Slaapkamer-1″,”label”:”Graden”,”format”:”{{value | number:2}}”,”min”:”15″,”max”:”45″,”colors”:[“#00b500″,”#e6e600″,”#ca3838″],”seg1″:””,”seg2″:””,”x”:811,”y”:838,”wires”:[]},{“id”:”cb035165.a64e1″,”type”:”change”,”z”:”a4085cc4.caca4″,”name”:”MV”,”rules”:[{“t”:”move”,”p”:”payload[0].last”,”pt”:”msg”,”to”:”payload”,”tot”:”msg”},{“t”:”set”,”p”:”topic”,”pt”:”msg”,”to”:”Slaapkamer-1″,”tot”:”str”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:598,”y”:820,”wires”:[[“8d2dc3f7.94e5b”,”831ddb81.475ba8″]]},{“id”:”25f3a3f6.f02c2c”,”type”:”influxdb in”,”z”:”a4085cc4.caca4″,”influxdb”:”cd8575.dbb66a88″,”name”:”Slaapkamer-2″,”query”:”select LAST(\”temp\”) FROM \”returntemp\” WHERE \”group\” = ‘Slaapkamer-2′”,”rawOutput”:false,”precision”:””,”retentionPolicy”:””,”x”:405,”y”:898,”wires”:[[“c87db96.50c4248”]]},{“id”:”2a026926.6ccce6″,”type”:”ui_gauge”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”843e7357.0b845″,”order”:0,”width”:0,”height”:0,”gtype”:”gage”,”title”:”Slaapkamer-2″,”label”:”Graden”,”format”:”{{value | number:2}}”,”min”:”15″,”max”:”45″,”colors”:[“#00b500″,”#e6e600″,”#ca3838″],”seg1″:””,”seg2″:””,”x”:808,”y”:919,”wires”:[]},{“id”:”c87db96.50c4248″,”type”:”change”,”z”:”a4085cc4.caca4″,”name”:”MV”,”rules”:[{“t”:”move”,”p”:”payload[0].last”,”pt”:”msg”,”to”:”payload”,”tot”:”msg”},{“t”:”set”,”p”:”topic”,”pt”:”msg”,”to”:”Slaapkamer-2″,”tot”:”str”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:598,”y”:898,”wires”:[[“2a026926.6ccce6″,”5e07de28.8e958”]]},{“id”:”7882743.66ddd8c”,”type”:”influxdb in”,”z”:”a4085cc4.caca4″,”influxdb”:”cd8575.dbb66a88″,”name”:”Slaapkamer-3″,”query”:”select LAST(\”temp\”) FROM \”returntemp\” WHERE \”group\” = ‘Slaapkamer-3′”,”rawOutput”:false,”precision”:””,”retentionPolicy”:””,”x”:411,”y”:975,”wires”:[[“cb172f69.49dda”]]},{“id”:”8719a8ea.a42768″,”type”:”ui_gauge”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”843e7357.0b845″,”order”:0,”width”:0,”height”:0,”gtype”:”gage”,”title”:”Slaapkamer-3″,”label”:”Graden”,”format”:”{{value | number:2}}”,”min”:”15″,”max”:”45″,”colors”:[“#00b500″,”#e6e600″,”#ca3838″],”seg1″:””,”seg2″:””,”x”:764,”y”:993,”wires”:[]},{“id”:”cb172f69.49dda”,”type”:”change”,”z”:”a4085cc4.caca4″,”name”:”MV”,”rules”:[{“t”:”move”,”p”:”payload[0].last”,”pt”:”msg”,”to”:”payload”,”tot”:”msg”},{“t”:”set”,”p”:”topic”,”pt”:”msg”,”to”:”Slaapkamer-3″,”tot”:”str”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:602,”y”:974,”wires”:[[“8719a8ea.a42768″,”ff79d64c.ddc058”]]},{“id”:”35b6a7e9.297a98″,”type”:”influxdb in”,”z”:”a4085cc4.caca4″,”influxdb”:”cd8575.dbb66a88″,”name”:”Badkamer-4″,”query”:”select LAST(\”temp\”) FROM \”returntemp\” WHERE \”group\” = ‘Badkamer-4′”,”rawOutput”:false,”precision”:””,”retentionPolicy”:””,”x”:423,”y”:1048,”wires”:[[“10245d19.617e93”]]},{“id”:”ca5f9a4f.971698″,”type”:”ui_gauge”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”843e7357.0b845″,”order”:0,”width”:0,”height”:0,”gtype”:”gage”,”title”:”Badkamer-4″,”label”:”Graden”,”format”:”{{value | number:2}}”,”min”:”15″,”max”:”45″,”colors”:[“#00b500″,”#e6e600″,”#ca3838″],”seg1″:””,”seg2″:””,”x”:754,”y”:1069,”wires”:[]},{“id”:”10245d19.617e93″,”type”:”change”,”z”:”a4085cc4.caca4″,”name”:”MV”,”rules”:[{“t”:”move”,”p”:”payload[0].last”,”pt”:”msg”,”to”:”payload”,”tot”:”msg”},{“t”:”set”,”p”:”topic”,”pt”:”msg”,”to”:”Badkamer-4″,”tot”:”str”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:603,”y”:1048,”wires”:[[“ca5f9a4f.971698″,”f21cf75e.4c94b8”]]},{“id”:”831ddb81.475ba8″,”type”:”ui_chart”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”3515892a.30f126″,”order”:4,”width”:0,”height”:0,”label”:”Slaapkamer-1″,”chartType”:”line”,”legend”:”false”,”xformat”:”HH:mm:ss”,”interpolate”:”linear”,”nodata”:””,”dot”:false,”ymin”:”15″,”ymax”:”45″,”removeOlder”:1,”removeOlderPoints”:””,”removeOlderUnit”:”3600″,”cutout”:0,”useOneColor”:false,”colors”:[“#1f77b4″,”#aec7e8″,”#ff7f0e”,”#2ca02c”,”#98df8a”,”#d62728″,”#ff9896″,”#9467bd”,”#c5b0d5″],”x”:812,”y”:798,”wires”:[[],[]]},{“id”:”5e07de28.8e958″,”type”:”ui_chart”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”3515892a.30f126″,”order”:5,”width”:0,”height”:0,”label”:”Slaapkamer-2″,”chartType”:”line”,”legend”:”false”,”xformat”:”HH:mm:ss”,”interpolate”:”linear”,”nodata”:””,”dot”:false,”ymin”:”15″,”ymax”:”45″,”removeOlder”:1,”removeOlderPoints”:””,”removeOlderUnit”:”3600″,”cutout”:0,”useOneColor”:false,”colors”:[“#1f77b4″,”#aec7e8″,”#ff7f0e”,”#2ca02c”,”#98df8a”,”#d62728″,”#ff9896″,”#9467bd”,”#c5b0d5″],”x”:809,”y”:879,”wires”:[[],[]]},{“id”:”ff79d64c.ddc058″,”type”:”ui_chart”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”3515892a.30f126″,”order”:6,”width”:0,”height”:0,”label”:”Slaapkamer-3″,”chartType”:”line”,”legend”:”false”,”xformat”:”HH:mm:ss”,”interpolate”:”linear”,”nodata”:””,”dot”:false,”ymin”:”15″,”ymax”:”45″,”removeOlder”:1,”removeOlderPoints”:””,”removeOlderUnit”:”3600″,”cutout”:0,”useOneColor”:false,”colors”:[“#1f77b4″,”#aec7e8″,”#ff7f0e”,”#2ca02c”,”#98df8a”,”#d62728″,”#ff9896″,”#9467bd”,”#c5b0d5″],”x”:810,”y”:956,”wires”:[[],[]]},{“id”:”f21cf75e.4c94b8″,”type”:”ui_chart”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”3515892a.30f126″,”order”:7,”width”:0,”height”:0,”label”:”Badkamer-4″,”chartType”:”line”,”legend”:”false”,”xformat”:”HH:mm:ss”,”interpolate”:”linear”,”nodata”:””,”dot”:false,”ymin”:”15″,”ymax”:”45″,”removeOlder”:1,”removeOlderPoints”:””,”removeOlderUnit”:”3600″,”cutout”:0,”useOneColor”:false,”colors”:[“#1f77b4″,”#aec7e8″,”#ff7f0e”,”#2ca02c”,”#98df8a”,”#d62728″,”#ff9896″,”#9467bd”,”#c5b0d5″],”x”:756,”y”:1031,”wires”:[[],[]]},{“id”:”3aae1b1b.73a614″,”type”:”influxdb in”,”z”:”a4085cc4.caca4″,”influxdb”:”cd8575.dbb66a88″,”name”:”averagereturntemp1ST”,”query”:”select LAST(\”mean\”) FROM \”averagereturntemp1ST\””,”rawOutput”:false,”precision”:””,”retentionPolicy”:””,”x”:418,”y”:769,”wires”:[[“d0ef2c5a.91874”]]},{“id”:”d0ef2c5a.91874″,”type”:”ui_text”,”z”:”a4085cc4.caca4″,”group”:”3515892a.30f126″,”order”:1,”width”:0,”height”:0,”name”:””,”label”:”Retourtemp 1e”,”format”:”{{msg.payload[0].last | number:2}}”,”layout”:”row-center”,”x”:810.5,”y”:760,”wires”:[]},{“id”:”40397165.f29ed”,”type”:”ui_text”,”z”:”a4085cc4.caca4″,”group”:”843e7357.0b845″,”order”:3,”width”:0,”height”:0,”name”:””,”label”:”CV Retourtemp”,”format”:”{{msg.payload[0].last | number:2}}”,”layout”:”row-center”,”x”:809,”y”:722,”wires”:[]},{“id”:”cee976df.676db8″,”type”:”influxdb in”,”z”:”a4085cc4.caca4″,”influxdb”:”cd8575.dbb66a88″,”name”:”Kamer-1″,”query”:”select LAST(\”temp\”) FROM \”returntemp\” WHERE \”group\” = ‘Kamer-1′”,”rawOutput”:false,”precision”:””,”retentionPolicy”:””,”x”:394,”y”:1275,”wires”:[[“82df671.b6c1498”]]},{“id”:”fdfe59c.5febea8″,”type”:”ui_gauge”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”3d224515.ebe47a”,”order”:0,”width”:0,”height”:0,”gtype”:”gage”,”title”:”Kamer-1″,”label”:”Graden”,”format”:”{{value | number:2}}”,”min”:”15″,”max”:”45″,”colors”:[“#00b500″,”#e6e600″,”#ca3838″],”seg1″:””,”seg2″:””,”x”:747,”y”:1290,”wires”:[]},{“id”:”82df671.b6c1498″,”type”:”change”,”z”:”a4085cc4.caca4″,”name”:”MV”,”rules”:[{“t”:”move”,”p”:”payload[0].last”,”pt”:”msg”,”to”:”payload”,”tot”:”msg”},{“t”:”set”,”p”:”topic”,”pt”:”msg”,”to”:”Kamer-1″,”tot”:”str”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:597,”y”:1272,”wires”:[[“fdfe59c.5febea8″,”494d10f2.599c9”]]},{“id”:”2b963f72.f3542″,”type”:”influxdb in”,”z”:”a4085cc4.caca4″,”influxdb”:”cd8575.dbb66a88″,”name”:”Kamer-2″,”query”:”select LAST(\”temp\”) FROM \”returntemp\” WHERE \”group\” = ‘Kamer-2′”,”rawOutput”:false,”precision”:””,”retentionPolicy”:””,”x”:384,”y”:1350,”wires”:[[“d3d04323.742db”]]},{“id”:”308763ff.713b5c”,”type”:”ui_gauge”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”3d224515.ebe47a”,”order”:0,”width”:0,”height”:0,”gtype”:”gage”,”title”:”Kamer-2″,”label”:”Graden”,”format”:”{{value | number:2}}”,”min”:”15″,”max”:”45″,”colors”:[“#00b500″,”#e6e600″,”#ca3838″],”seg1″:””,”seg2″:””,”x”:744,”y”:1371,”wires”:[]},{“id”:”d3d04323.742db”,”type”:”change”,”z”:”a4085cc4.caca4″,”name”:”MV”,”rules”:[{“t”:”move”,”p”:”payload[0].last”,”pt”:”msg”,”to”:”payload”,”tot”:”msg”},{“t”:”set”,”p”:”topic”,”pt”:”msg”,”to”:”Kamer-2″,”tot”:”str”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:597,”y”:1350,”wires”:[[“308763ff.713b5c”,”6d810fa5.de24a”]]},{“id”:”1ff9f8fb.2eed77″,”type”:”influxdb in”,”z”:”a4085cc4.caca4″,”influxdb”:”cd8575.dbb66a88″,”name”:”Kamer-3″,”query”:”select LAST(\”temp\”) FROM \”returntemp\” WHERE \”group\” = ‘Kamer-3′”,”rawOutput”:false,”precision”:””,”retentionPolicy”:””,”x”:390,”y”:1427,”wires”:[[“87c32122.279d”]]},{“id”:”d3e9f8f5.6911c8″,”type”:”ui_gauge”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”3d224515.ebe47a”,”order”:0,”width”:0,”height”:0,”gtype”:”gage”,”title”:”Kamer-3″,”label”:”Graden”,”format”:”{{value | number:2}}”,”min”:”15″,”max”:”45″,”colors”:[“#00b500″,”#e6e600″,”#ca3838″],”seg1″:””,”seg2″:””,”x”:743,”y”:1445,”wires”:[]},{“id”:”87c32122.279d”,”type”:”change”,”z”:”a4085cc4.caca4″,”name”:”MV”,”rules”:[{“t”:”move”,”p”:”payload[0].last”,”pt”:”msg”,”to”:”payload”,”tot”:”msg”},{“t”:”set”,”p”:”topic”,”pt”:”msg”,”to”:”Kamer-3″,”tot”:”str”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:601,”y”:1426,”wires”:[[“d3e9f8f5.6911c8″,”7faea596.719d1c”]]},{“id”:”494d10f2.599c9″,”type”:”ui_chart”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”db5bf62e.561068″,”order”:4,”width”:0,”height”:0,”label”:”Kamer-1″,”chartType”:”line”,”legend”:”false”,”xformat”:”HH:mm:ss”,”interpolate”:”linear”,”nodata”:””,”dot”:false,”ymin”:”15″,”ymax”:”45″,”removeOlder”:1,”removeOlderPoints”:””,”removeOlderUnit”:”3600″,”cutout”:0,”useOneColor”:false,”colors”:[“#1f77b4″,”#aec7e8″,”#ff7f0e”,”#2ca02c”,”#98df8a”,”#d62728″,”#ff9896″,”#9467bd”,”#c5b0d5″],”x”:748,”y”:1250,”wires”:[[],[]]},{“id”:”6d810fa5.de24a”,”type”:”ui_chart”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”db5bf62e.561068″,”order”:5,”width”:0,”height”:0,”label”:”Kamer-2″,”chartType”:”line”,”legend”:”false”,”xformat”:”HH:mm:ss”,”interpolate”:”linear”,”nodata”:””,”dot”:false,”ymin”:”15″,”ymax”:”45″,”removeOlder”:1,”removeOlderPoints”:””,”removeOlderUnit”:”3600″,”cutout”:0,”useOneColor”:false,”colors”:[“#1f77b4″,”#aec7e8″,”#ff7f0e”,”#2ca02c”,”#98df8a”,”#d62728″,”#ff9896″,”#9467bd”,”#c5b0d5″],”x”:745,”y”:1331,”wires”:[[],[]]},{“id”:”7faea596.719d1c”,”type”:”ui_chart”,”z”:”a4085cc4.caca4″,”name”:””,”group”:”db5bf62e.561068″,”order”:6,”width”:0,”height”:0,”label”:”Kamer-3″,”chartType”:”line”,”legend”:”false”,”xformat”:”HH:mm:ss”,”interpolate”:”linear”,”nodata”:””,”dot”:false,”ymin”:”15″,”ymax”:”45″,”removeOlder”:1,”removeOlderPoints”:””,”removeOlderUnit”:”3600″,”cutout”:0,”useOneColor”:false,”colors”:[“#1f77b4″,”#aec7e8″,”#ff7f0e”,”#2ca02c”,”#98df8a”,”#d62728″,”#ff9896″,”#9467bd”,”#c5b0d5″],”x”:746,”y”:1408,”wires”:[[],[]]},{“id”:”960110f5.be4d8″,”type”:”influxdb in”,”z”:”a4085cc4.caca4″,”influxdb”:”cd8575.dbb66a88″,”name”:”averagereturntemp2ND”,”query”:”select LAST(\”mean\”) FROM \”averagereturntemp2ND\””,”rawOutput”:false,”precision”:””,”retentionPolicy”:””,”x”:417,”y”:1221,”wires”:[[“e9263bad.ef66e8”]]},{“id”:”e9263bad.ef66e8″,”type”:”ui_text”,”z”:”a4085cc4.caca4″,”group”:”db5bf62e.561068″,”order”:1,”width”:0,”height”:0,”name”:””,”label”:”Retourtemp 2e”,”format”:”{{msg.payload[0].last | number:2}}”,”layout”:”row-center”,”x”:766.5,”y”:1212,”wires”:[]},{“id”:”c140acdc.98e2a”,”type”:”ui_text”,”z”:”a4085cc4.caca4″,”group”:”3d224515.ebe47a”,”order”:3,”width”:0,”height”:0,”name”:””,”label”:”CV Retourtemp”,”format”:”{{msg.payload[0].last | number:2}}”,”layout”:”row-center”,”x”:765,”y”:1174,”wires”:[]},{“id”:”442392f0.800d5c”,”type”:”comment”,”z”:”a4085cc4.caca4″,”name”:”2e Verdieping”,”info”:””,”x”:753,”y”:1135,”wires”:[]},{“id”:”d33359b3.a8f778″,”type”:”comment”,”z”:”a4085cc4.caca4″,”name”:”Begane Grond”,”info”:””,”x”:795,”y”:51,”wires”:[]},{“id”:”f51a2458.015af8″,”type”:”comment”,”z”:”a4085cc4.caca4″,”name”:”1e Verdieping”,”info”:””,”x”:798,”y”:683,”wires”:[]},{“id”:”a715febb.548f3″,”type”:”function”,”z”:”a4085cc4.caca4″,”name”:”MV+rnd”,”func”:”var temp = msg.payload[0].last.toFixed(2);\nmsg.payload = temp;\nmsg.topic = \”Retourtemp\”;\nreturn msg;”,”outputs”:1,”noerr”:0,”x”:603,”y”:127,”wires”:[[“93bd9e5a.44134″,”54dad0a.9637b3″,”c7f94b32.ee3258″,”6455f3a8.eaffec”,”ef739c5d.f76ba”,”3c7e0369.43ccfc”,”831ddb81.475ba8″,”5e07de28.8e958″,”ff79d64c.ddc058″,”f21cf75e.4c94b8″,”494d10f2.599c9″,”6d810fa5.de24a”,”7faea596.719d1c”]]},{“id”:”cd8575.dbb66a88″,”type”:”influxdb”,”z”:””,”hostname”:”pi3server.fritz.box”,”port”:”8086″,”protocol”:”http”,”database”:”testdb”,”name”:”InfluxDB”,”usetls”:false,”tls”:””},{“id”:”81a27fd9.1f5fe”,”type”:”ui_group”,”z”:””,”name”:”BG-Meters”,”tab”:”b8af07b9.78cd58″,”order”:1,”disp”:false,”width”:”6″},{“id”:”780aed60.895484″,”type”:”ui_group”,”z”:””,”name”:”BG-Grafieken”,”tab”:”b8af07b9.78cd58″,”order”:2,”disp”:false,”width”:”6″},{“id”:”843e7357.0b845″,”type”:”ui_group”,”z”:””,”name”:”1e-Meters”,”tab”:”2e3e88f7.c1dca8″,”order”:1,”disp”:false,”width”:”6″},{“id”:”3515892a.30f126″,”type”:”ui_group”,”z”:””,”name”:”1e-Grafieken”,”tab”:”2e3e88f7.c1dca8″,”order”:2,”disp”:false,”width”:”6″},{“id”:”3d224515.ebe47a”,”type”:”ui_group”,”z”:””,”name”:”2e-Meters”,”tab”:”53519d45.e5e8b4″,”order”:2,”disp”:false,”width”:”6″},{“id”:”db5bf62e.561068″,”type”:”ui_group”,”z”:””,”name”:”2e-Grafieken”,”tab”:”53519d45.e5e8b4″,”order”:2,”disp”:false,”width”:”6″},{“id”:”b8af07b9.78cd58″,”type”:”ui_tab”,”z”:””,”name”:” Begane grond”,”icon”:”dashboard”,”order”:1},{“id”:”2e3e88f7.c1dca8″,”type”:”ui_tab”,”z”:””,”name”:”1e verdieping”,”icon”:”dashboard”,”order”:2},{“id”:”53519d45.e5e8b4″,”type”:”ui_tab”,”z”:””,”name”:”2e verdieping”,”icon”:”dashboard”,”order”:3}]

Voordat je op OK klikt kies je bij Import to: voor de optie New flow. Je krijgt dan een flow te zien als onderstaand:

Screen Shot 2017-08-20 at 00.09.21

Dit is mijn complete flow voor alle verdiepingen. Je hoeft hier niets meer in te stellen en je kunt alles wat je niet nodig hebt weggooien. Druk daarna opnieuw op Deploy en surf dan naar http://:1880/ui/ en je ziet je dashboard in actie!

Opties

Om zuinig om te gaan met het aantal beschikbare writes op mijn SD kaart heb ik de Influx database inmiddels op een USB stick draaien. Ook heb ik een flow waarin ik via websockets de actuele status van de CV uitlees via otmonitor om zo geen data weg te hoeven schrijven als de CV niet actief is. Deze implementatie heb ik nog niet gedocumenteerd omdat de websocket implementatie waar Node-RED op leunt niet werkt met otmonitor zonder aanpassingen in Node-RED zelf. Verder sla ik ook andere informatie vanuit otmonitor op in Influx zodat ik de data ook in Grafana kan weergeven. Winter is coming…

Deliver liquidity, multiple ledgers at a time please

The low friction cost of Bitcoin is an appealing parts of its proposition. You can send bitcoins at a fraction of the cost of traditional payment platforms. Now that user interfaces are improving and supported by more secure technologies such as TEE the overall usability of Bitcoin as a payment platform begins to look more and more appealing.

But results are lagging. One of the main reasons that is grinding the Bitcoin dream to a halt is the volatility of the cryptocurrency. The lack of a fixed exchange rate with fiat currencies makes for an unattractive proposition where any user could suddenly pay x% more or less for a product or service. As a payment solution, Bitcoin is undoubtedly a great alternative. But since it’ll never be pegged to the Euro, Dollar or any other fiat currency it’s potential remains unfulfilled.

Distributed ledgers such as Ripple allow fiat currencies, backed by gateways, to exist on the ledger and be transacted as if it was a cryptocurrency. While this appears to be a great solutions the challenge now lies in how to transfer these fiat currencies from the Ripple ledger to another ledger, say the Ethereum blockchain. In short: You can’t. You’ll have to redeem the funds at the gateway where they were issued, wire them back to your bank account and deposit them with a different gateway.

For now the promise of frictionless payments via distributed ledgers can only be fulfilled when the funds reside on one distributed legder and remain there. This scenario is unlikely to sustain given the diversity of altcoins that already exist and the progress of many fintech companies to offer new services based on this frictionless promise. This is especially true for smart contract-based blockchains, whose utility accelerates as soon as both the funds and the contract can be stored and transacted.

If we want distributed ledgers to exchange value we’ll need to look beyond gateways that only transact value to and from a distributed ledger. Exchanges already fulfill a service where cryptocurrencies can be exchanged but when it comes to transacting with the real world, everything slows down to the same crawl we’re already used to. Ideally the right to redeem funds from a certain gateway can be transferred to another ledger (for example with a smart contract), otherwise gateways would have to act as a means of transfer and the cost of liquidity on a distributed ledger becomes as high as they are today.

Distributed ledgers hold a frictionless promise when it comes to volatile cryptocurrencies. Only once we’re able to transact fiat currency in between blockchains this promise can be fulfilled. If not we’ll just be stuck with a bunch of ledgers that can’t exchange real world value amongst each other, much like the system we use today.

The impact of Blockchain Technology on Financial Transaction Platforms

I recently finished my thesis with the above mentioned title. For those interested please have a look at it here: http://stamboom.vanloosbroek.com/Thesis_Sander_van_Loosbroek-Blockchain_Technology.pdf

Cisco VDSL config for ISP with RFC1483 bridging, DHCP and NAT

Telfort, a Dutch ISP, delivers VDSL connections using RFC1483 bridging. This is quite a different approach than the more common PPPoE setup. See below for an example.

First remove any ATM and Dialer interfaces you have defined, instead you use the Ethernet0 interface from the VDSL controller. Define a subinterface for the VLAN your ISP uses. In case of Telfort this is 34.

interface Ethernet0
no ip address
no shutdown
!
interface Ethernet0.34
encapsulation dot1Q 34
ip address dhcp
ip nat outside

On the subinterface you define that the IP address is requested through DHCP and with ip nat outside. Next apply the ip nat inside traffic on your internal interface, define your NAT rule and matching access list and you’re good to go. The default ip route is acquired via DHCP automatically.

interface Vlan1
ip address 192.168.1.1 255.255.255.0
ip nat inside
!
ip nat inside source list 101 interface Ethernet0.34 overload
!
access-list 101 permit ip 192.168.1.0 0.0.0.255 any

Trimming .m4v files in QuickTime X with subtitles

When you trim a .m4v video in QuickTime X that has subtitles embedded (by using Handbrake for instance) you’ll run into a problem that Quicktime X Player will no longer recognize the subtitle stream. When you copy the .m4v file to an iPad the subtitles will work again but do no longer indicate their correct language.

Fortunately there’s an easy fix as the problem lies in the metadata. The simple Subler application allows you to edit this metadata and restore your subtitles. Here’s how the metadata of a trimmed file will look:

You can see how all streams are set to an unknown language. The problem lies in the “Alternate group” flag which is set to none. If you set this flag to “2” and save your file, all will be good. When you’re at it, set the correct language for the audio and subtitle stream as well so Quicktime can display them properly.

Mac OS X 10.7 experiences and incompatibilities

I’m currently running the GM version of Mac OS X 10.7 Lion and ran into a few things that I wanted to share with you.

First of all, Little Snitch 2.3.6 and Cisco AnyConnect 3.0.2 don’t work correctly with Lion. Little Snitch keeps respawning and never actually launches, it can be easily uninstalled using the uninstall option in the installer. If you want you can download a nightly build that solves these issues here (UPDATE: Little Snitch 2.4.1 is Lion compatible and available here). Cisco AnyConnect will authenticate but is unable to establish a connection and will produce an error message. If your life/salary depends on AnyConnect, refrain from installing Lion for now (UPDATE: see below).

Another piece of software that doesn’t survive the upgrade is the e.dentifier2 software from ANB Amro, you can safely download and reinstall it (here) and it will work correctly.

I hoped the archive option in Apple Mail would be compatible with GMail but unfortunately it is not. Google simply removes the “Inbox” tag from a message so it will only appear in the “All messages” box. Apple Mail creates a separate mailbox called “Archive” on the server and copies all mail in this location. I’ll keep looking for a better solution but for now I don’t see it.

The biggest thing is the reversed scrolling, it behaves now like the iPad and iPhone but you’re not working on an iPad so you keep messing it up. This will take me a while to get used to.

UPDATE: Cisco has released version 3.0.3 of the AnyConnect Secure Mobility client. This update unfortunately does not work with all gateways as it holds a certificate validation error and will sometimes not connect. The bug is filed with Cisco under ID CSCtr64798 and has a severity 2 status. In my experience it works fine if your router uses its self signed certificates. When using certificated signed by a CA your mileage my vary. There is a workaround available by importing the certificates to your local certification store. As of today (the 29th of July) Cisco states on their twitter feed that a fix is coming soon.

UPDATE 2: Cisco has issued a new update to their AnyConnect client that effectively solved the problems mentioned above. If you have a valid Cisco support contract you can grab it here. As mentioned in the comments the e.dentifier2 software from ABN Amro only works when Java is installed on Mac OS X. You can download Java for Lion here.

Cisco router configuration for a Tele2 VDSL connection

I got myself a Cisco 887V-W to replace the Comtrend modem that Tele2 ships with their 50 Mbit VDSL connection, once called Fiber Speed. Thanks goes out to Glazenbakje for a basic VDSL config that I could tweak to get it to work with Tele2.

I’d advise to upgrade to IOS 15.1T as it holds a newer ADSL firmware that does a better job calculating the attainable rate. If you connect your router and execute the sh controllers vdsl 0 command you’ll see something like this that indicates you have a VDSL carrier signal:

Modem Status: TC Sync (Showtime!)
DSL Config Mode: AUTO
Trained Mode: G.993.2 (VDSL2) Profile 17a
TC Mode: PTM
Selftest Result: 0x00
DELT configuration: disabled
DELT state: not running
Trellis: ON  ON
Line Attenuation:  0.0 dB  0.0 dB
Signal Attenuation:  0.0 dB  0.0 dB
Noise Margin:  6.2 dB  5.8 dB
Attainable Rate: 44884 kbits/s 5535 kbits/s
Actual Power: 14.2 dBm  1.4 dBm

And now for the basic config lines to get this going:

interface Ethernet0
no ip address
!
interface Ethernet0.32
encapsulation dot1Q 32
pppoe-client dial-pool-number 10
!
interface Vlan1
ip address 10.1.1.34 255.255.255.0
ip nat inside
ip virtual-reassembly in
ip tcp adjust-mss 1452
!

interface Dialer 10
mtu 1492
ip address negotiated
no ip redirects
no ip unreachables
no ip proxy-arp
ip nat outside
no ip virtual-reassembly in
encapsulation ppp
ip route-cache policy
dialer pool 10
dialer string 555
dialer-group 10
ppp authentication chap callin
ppp chap hostname <username>@3p.versatel.nl
ppp chap password 0 <your decoded password>
no cdp enable
!
ip nat inside source list 101 interface Dialer10 overload
ip route 0.0.0.0 0.0.0.0 Dialer10
!
access-list 101 permit ip 10.1.1.0 0.0.0.255 any
dialer-list 10 protocol ip permit

Notes of interest: The VLAN ID that Tele2 uses for their internet connection is 32. They have different ID’s for i.e. the management connection to the modem but you don’t need those. They use CHAP for their PPPoE identification and I needed to use a dialer string with a random number to trigger the dial out.

In case you have any questions feel free to leave a comment and I’ll try to answer to the best of my ability.