Last Updated on 30 oktober 2021 by Syds
Mijn vloerverwarming is per ruimte qua temperatuur te regelen, zo is mijn woning in 5 zones ingedeeld waarbij per zone de temperatuur geregeld wordt met een Danfoss RT51 kamerthermostaat. Deze kamerthermostaat werkt op 2 AA-batterijen. Nu is helaas bij één van die kamerthermostaten één van de batterijen gaan lekken waarbij het zuur de printplaat onherstelbaar heeft beschadigt.
Dit levert weer een leuk DiY-projectje op. Plan is om de behuizing van de Danfoss kamerthermostaat in stand te houden, in de behuizing een Wemos D1 mini onder te brengen (in het batterijen compartiment), een BMP280 voor het meten van de temperatuur in de ruimte, een nieuw OLED of LED schermpje in de behuizing te plaatsen en de 2 soft-touch knopjes waarmee je de temperatuur instelt te hergebruiken.
Voeding
Voor de stroomvoorziening van de Wemos D1 mini in de kamerthermostaat gebruik ik een oude 5v telefoonadapter waar ik de stekker van af geknipt heb. In de huidige situatie loopt de plus (+) draad vanaf de adapter die de kleppen van stroom voorziet rechtstreeks naar de (+) klem van de kleppen. De min (-) draad loopt middels een 2-aderige draad naar de kamerthermostaat. Een relais in de kamerthermostaat sluit zodra de actuele temperatuur onder de gewenste, ingestelde, temperatuur daalt. In de nieuwe situatie sluit ik zowel de (+) als een (-) van de 5v telefoonadapter aan op de 2-aderige draad die naar de kamerthermostaat loopt en voedt op die manier de Wemos D1 mini ca. Ook de Wemos D1 mini nabij de verdeler van de vloerverwarming wordt via dezelfde 5v telefoonadapter gevoed.
Aansturing kleppen
De kleppen op de verdeler van de vloerverwarming ga ik vervolgens aansturen met een Wemos D1 mini i.c.m. een 6-voudig relais. De plus (+) draad vanaf de 24v adapter gaat wederom rechtstreeks naar de (+) klem van de klep, en de (-) loopt via één van de poorten van het 6-voudig relais naar de (-) klem van de klep.
Logica
Voor de software-matige aansturing van het geheel onderscheidt ik de volgende componenten:
- EspEasy als besturingsysteem voor de Wemos D1 mini’s
- MQTT broker voor het versturen van berichten tussen de verschillende componenten
- Node Red voor de workflow en logica
- MariaDB RDMBS voor de opslag van actuele en gewenste temperaturen
- Domoticz en Domoticz app als user interface
Hieronder wordt stap voor stap uitgelegd hoe ik te werk ben gegaan:
Benodigdheden:
- Schroevendraaiers
- Kniptang
- Soldeerbout + tin
- Desoldeerpomp
- Boormachine + 2 mm boortje
- Jumperkabeltjes
- Isolatietape
- Wemos D1 mini (2x)
- BMP280 (of DHT11/22)
- 5v Relais (6-kanaals, afhankelijk van je zones)
- OLED Display 1.3″
- Kroonsteentjes
- 2-aderig snoer/kabel
Reeds up-and-running:
- MQTT broker
- Node Red
- MariaDB
- Domoticz met MQTT plugin
- Laptop/Desktop met Esp.Easy.Flasher tool + EspEasy Mega binaries
Stap 1. Danfoss kamerthermostaat slopen
Als eerste heb ik de kamerthermostaat uit elkaar gehaald. Dat wil zeggen de printplaat losgeschroefd uit de behuizing, en het LCD scherm losgeschroefd van de printplaat. Dit leverde mij het volgende inzicht op:
- dat er een Wemos D1 mini en BMP280 in het vrijkomende batterijen compartiment past;
- de huidige printplaat deels hergebruikt kan worden, dit voor de twee soft-touch knopjes waarmee de temperatuur ingesteld kan worden en de aansluitpinnen op de 2-aderige draad voor de voeding;
- tussen de printplaat en het transparante venster in de behuizing voldoende ruimte is voor het plaatsen van een OLED display;
Stap 2. Proefopstelling gemaakt
Als eerste 2 Wemos D1 mini’s geflashed met de laatste versie EspEasy Mega (20210802).
De Wemos D1 voor in de kamerthermostaat heb ik Thermostaat gedoopt, de Wemos voor de aansturing van de verdeler van de vloerverwarming heb ik Vloerverwarming genoemd.
De Wemos D1 mini Thermostaat heb ik als volgt geconfigureerd:
Toelichting op non-default waarden:
Label | Waarde | Toelichting |
Unit naam | Thermostaat | Zinvolle naam |
Unit Number | 13 | Uniek unit nummer |
Append Unit Number to hostname | aangevinkt | Zorgt ervoor dat het unieke unitnummer toegevoegd wordt aan de hostnaam, die wordt dus Thermostaat-13.sydspost.nl. Ik gebruik dit verderop in de Node Red flow om de verschillende thermostaten te identificeren. |
Vervolgens de MQTT-broker geconfigureerd onder het tab ‘Controllers’
Toelichting op non-default waarden:
Label | Waarde | Toelichting |
Protocol | Domoticz MQTT | Prima selectie icm met Domoticz en Node Red |
Controller IP | 192.168.2.29 | ip-address van je MQTT broker |
Controller Subscribe | thermo/out/%unit% | Niet echt relevant, want we sturen niets terug naar de Wemos, toch maar wel ingevuld |
Controller Publish | thermo/in/%unit% | thermo/in is het topic waar Node Red naar luistert, %unit% is het unitnummer van de thermostaat en identificeert binnen Node Red de juiste thermostaat |
Enabled | aangevinkt | Enabled de connectie met de MQTT broker |
Vervolgens op een breakout board de volgende componenten aangesloten op de Thermostaat Wemos D1 mini:
Wemos D1 | Component | Pin | Toelichting |
3.3v | BMP280 | VCC | |
GND | GND | ||
SCL | D1 | I2C | |
SDA | D2 | I2C | |
3.3v | CSB | select I2C | |
GND | SDO | select slave address 0x76 | |
D0 | <Display button> | Zit niets fysiek op aangesloten, wordt in de software gebruikt om het display aan te zetten | |
D6 | Omhoog schakelaar | GND | |
D7 | Omlaag schakelaar | GND | |
3.3v | OLED | VCC | |
GND | GND | ||
SCL | D1 | I2C | |
SDA | D2 | I2C |
Bovenstaande componenten toegevoegd als devices:
Per device de configuratie met een toelichting:
BMP280 sensor
Toelichting op non-default waarden:
Label | Waarde | Toelichting |
Device | BMP280 | Had nog een BMP280 liggen, qua formaat mooi kleine sensor |
Name | Temp | Zinvolle naam |
Enabled | Aangevinkt | |
I2C Address | 0x76 | SDO aangesloten op GND, dus address = 0x76 |
Send to Controller | aangevinkt | Zorgt ervoor dat de gemeten waarden als MQTT bericht via de MQTT broker worden verzonden |
IDX | 13997 | Als prefix het unitnummer 13 gebruikt. Plan is om de sensors van de kamerthermostaten allemaal dezelfde IDX’en te geven met daarvoor het unitnummer, dus bijv. BMP280 is altijd IDX <unitnummer>997. |
OLED Display
Toelichting op non-default waarden:
Label | Waarde | Toelichting |
Device | OLED SSD1306 | 1.3″ Oled Module |
Name | Display | Zinvolle naam |
Enabled | Aangevinkt | |
Display Size | 128×32 | Gaf het grootste lettertype |
Line 1 | %systime% | Geeft de tijd weer (gesynchroniseerd vanuit de NTP-server) |
Line 2 | Temp: [Temp#Temperature] °C | Geeft de actuele temperatuur gemeten door de BMP280 weer |
Line 3 | Set : [Setpoint#temp] °C | Geeft de ingestelde Setpoint waarde weer |
Display button | GPIO-16 (D0) | Virtuele button om het display aan te zetten als deze uit gegaan is door het verstrijken van de Display Timeout, wordt door de software geactiveerd als op Omhoog of Omlaag wordt gedrukt |
Display Timeout | 60 | Na 60 seconden gaat het display uit als er geen activiteit is |
Interval | 1 | Iedere seconde wordt het scherm ververst |
Knop “Omlaag”
Toelichting op non-default waarden:
Label | Waarde | Toelichting |
Device | Switch input – Switch | Schakelaar |
Name | Omlaag | Zinvolle naam |
Enabled | Aangevinkt | |
Internal PullUp | Aangevinkt | Activeert de interne 10k ohm weerstand in de Wemos D1 en voorziet de pin van 3.3v, dit zorgt ervoor dat de state in 1 (on) veranderd wanneer deze niet met Gnd verbonden is. |
Inversed Logic | aangevinkt | Als de pin dmv de schakelaar met de Gnd verbonden wordt, dan veranderd de state dus in 0 (off), dat wil je juist niet, vandaar de inversed logic waarbij de 0 (off) en 1 (on) omgedraaid worden. |
GPIO | GPIO-13 (D7) | GPIO waarop ik de omlaag schakelaar aangesloten heb |
Send to Controller | Aangevinkt | Zorgt ervoor dat de gemeten waarden als MQTT bericht via de MQTT broker worden verzonden |
IDX | 13999 | Als prefix het unitnummer 13 gebruikt. Plan is om de knoppen van de kamerthermostaten allemaal dezelfde IDX’en te geven met daarvoor het unitnummer, dus bijv. Omlaag is altijd IDX <unitnummer>999. |
Knop “Omhoog”
Toelichting op non-default waarden:
Label | Waarde | Toelichting |
Device | Switch input – Switch | Schakelaar |
Name | Omhoog | Zinvolle naam |
Enabled | Aangevinkt | |
Internal PullUp | Aangevinkt | Activeert de interne 10k ohm weerstand in de Wemos D1 en voorziet de pin van 3.3v, dit zorgt ervoor dat de state in 1 (on) veranderd wanneer deze niet met Gnd verbonden is. |
Inversed Logic | aangevinkt | Als de pin dmv de schakelaar met de Gnd verbonden wordt, dan veranderd de state dus in 0 (off), dat wil je juist niet, vandaar de inversed logic waarbij de 0 (off) en 1 (on) omgedraaid worden. |
GPIO | GPIO-12 (D6) | GPIO waarop ik de omlaag schakelaar aangesloten heb |
Send to Controller | Aangevinkt | Zorgt ervoor dat de gemeten waarden als MQTT bericht via de MQTT broker worden verzonden |
IDX | 13998 | Als prefix het unitnummer 13 gebruikt. Plan is om de knoppen van de kamerthermostaten allemaal dezelfde IDX’en te geven met daarvoor het unitnummer, dus bijv. Omhoog is altijd IDX <unitnummer>998. |
Dummy device
Dummy device Setpoint om het met behulp van de Omhoog en Omlaag knoppen of in Domoticz ingestelde Setpoint op te slaan
Toelichting op non-default waarden:
Label | Waarde | Toelichting |
Device | Generic – Dummy Device | Virtueel dummy device |
Name | Setpoint | Zinvolle naam |
Enabled | Aangevinkt | |
Output Data Type | Single | Er behoeft maar 1 waarde opgeslagen te worden |
Values 1 | Temp | Zinvolle naam |
Tot slot onder Tools, Advanced nog de volgende settings gezet:
Toelichting op non-default waarden:
Label | Waarde | Toelichting |
Rules | Aangevinkt | Tabblad Rules geactiveerd |
Use NTP: | Aangevinkt | Gebruik de NTP server om de tijd te synchroniseren |
NTP Hostname | 192.168.2.29 | IP-address van mijn lokale NTP server, ipv. zou je ook bijv. time1.google.com kunnen gebruiken |
DST | Aangevinkt | Hou rekening met Zomer en Wintertijd |
TimeZone Offset (UTC +) | 60 | Amsterdam = UTC +1 |
Syslog IP | 192.168.2.29 | IP-address van mijn Syslog server |
Syslog Log Level | Error | Stuurt alle error meldingen door naar mijn Syslog server |
De volgende Rule toegevoegd op het tabblad Rules:
Toelichting op de non-default waarden:
Label | Waarde | Toelichting |
Rules Set 1 | On Setpoint do // On event Setpoint, zet dummy device (device 5), value Temp (1) op eventvalue TaskValueSet 5,1,%eventvalue% endon On Omlaag#state do // Activeer DisplayButton gpio,16,0 // Wacht 5 seconden timerSet,1,5 endon On Omhoog#state do // Activeer DisplayButton gpio,16,0 // Wacht 5 seconden timerSet,1,5 endon On Rules#Timer=1 do // Deactiveer DisplayButton gpio,16,1 endon | Zie comment bij commando’s |
De Wemos D1 mini Vloerverwarming heb ik als volgt geconfigureerd:
Toelichting op non-default waarden:
Label | Waarde | Toelichting |
Unit naam | Vloerverwarming | Zinvolle naam |
Unit Number | 14 | Uniek unit nummer |
Append Unit Number to hostname | Uitgevinkt |
Configuratie van een MQTT-broker is niet nodig, tevens behoeft een relais geen verdere configuratie onder Devices.
Ik had geen tweede breakout board, dus de Wemos D1 mini Vloerverwarming gewoon met jumper kabeltjes gekoppeld aan 6-kanaals relais. Dit als volgt bekabelt:
Wemos D1 | Component | Pin | Toelichting |
5v | Relais | 5v | |
Gnd | Gnd | ||
D6 (GPIO 12) | IN1 | Wordt aangestuurd door Thermostaat_13 | |
K1-NO | GND-UIT Danfoss bedieningsaandrijving Fitnessruimte | ||
K1-COM | GND-IN Danfoss bedieningsaandrijving Fitnessruimte | ||
D0 (GPIO 16) | IN2 | ||
K2-NO | |||
K2-COM | |||
D5 (GPIO 14) | IN3 | ||
K3-NO | |||
K3-COM | |||
D7 (GPIO 13) | IN4 | ||
K4-NO | |||
K4-COM | |||
D1 (GPIO 5) | IN5 | ||
K5-NO | |||
K5-COM |
Tot slot onder Tools, Advanced nog de volgende settings gezet:
Toelichting op non-default waarden:
Label | Waarde | Toelichting |
Use NTP: | Aangevinkt | Gebruik de NTP server om de tijd te synchroniseren |
NTP Hostname | 192.168.2.29 | IP-address van mijn lokale NTP server, ipv. zou je ook bijv. time1.google.com kunnen gebruiken |
Syslog IP | 192.168.2.29 | IP-address van mijn Syslog server |
Syslog Log Level | Error | Stuurt alle error meldingen door naar mijn Syslog server |
Stap 3. Domoticz
In Domoticz heb ik een Setpoint device en een Temperatuur device aangemaakt. Met het Setpoint device kan de gewenste temperatuur ingesteld worden, met het Temperatuur device kan de actuele temperatuur in de ruimte waar de kamerthermostaat hangt afgelezen worden.
Setpoint device als volgt aangemaakt. Kies voor Instellingen, Hardware en klik op “Maak virtuele sensoren” op de regel “Virtuele devices”. Het volgende scherm verschijnt:
Klik op OK en het device wordt aangemaakt. Ga naar Instellingen, Apparaten om het device te activeren. Klik op het groene knopje achter het device om dat te bewerkstelligen:
Het device wordt nu toegevoegd aan het tabblad “Overige”:
Als je er op klikt, kun je de gewenste temperatuur instellen:
Vervolgens een device aangemaakt om de actuele temperatuur in de ruimte waar de kamerthermostaat hangt weer te geven.
Setpoint device als volgt aangemaakt. Kies voor Instellingen, Hardware en klik op “Maak virtuele sensoren” op de regel “Virtuele devices”. Het volgende scherm verschijnt:
Klik op OK en het device wordt aangemaakt. Ga naar Instellingen, Apparaten om het device te activeren. Klik op het groene knopje achter het device om dat te bewerkstelligen:
Het device wordt nu toegevoegd aan het tabblad “Overige”:
Het bijwerken van de temperatuur, of het instellen van de gewenste temperatuur laat ik Node Red doen, zoals in de volgende stap wordt uitgelegd.
Stap 4. Schema + tabel aangemaakt in MariaDB
Voor het bewaren van de ingestelde temperatuur, en ampersand ook de actuele temperatuur heb ik een schema Thermo en table Thermo aangemaakt in MariaDB.
CREATE SCHEMA thermo DEFAULT CHARACTER SET utf8mb4;
CREATE TABLEthermo
(unit
int(11) NOT NULL,desired_temp
float DEFAULT NULL,actual_temp
float DEFAULT NULL,
PRIMARY KEY (unit
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Toelichting:
Attrbuut | Type | Toelichting |
unit | int | Unitnummer corresponderend met EspEasy unitnummer thermostaat |
desired_temp | float | Gewenste temperatuur |
actual_temp | float | Actuele temperatuur |
Vervolgens een record toegevoegd voor Unit 13:
INSERT INTO `thermo`.`thermo` (`unit`, `desired_temp`, `actual_temp`) VALUES (13, 21, 0);
Stap 5. Node-red flows gemaakt
Ik heb in Node-red twee flows gemaakt, namelijk een flow die ervoor zorgt dat de actuele temperatuur en de “Omlaag” en “Omhoog” commando’s van de thermostaat uitgelezen wordt uit de MQTT-broker, en vervolgens daarop allerlei acties onderneemt. En een flow die datzelfde doet, maar dan geïnitieerd vanuit Domoticz of de Domoticz app.
Flow MQTT
Toelichting:
Node | Toelichting |
Thermostaat_?? | Leest topic thermo/in/# uit van de MQTT broker 192.168.2.29 |
Unit | Leest het unitnummer uit de MQTT topic thermo/in/<unitnummer> en slaat dit op in de flow context. Tevens wordt het unitnummer, prefix van de IDX, uit het bericht gehaald. Bijv. IDX 13997 wordt aangepast naar IDX 997. |
Switch | Op basis van de IDX wordt de vervolgflow ingezet |
Build SQL omlaag | IDX999: De knop “Omlaag” is ingedrukt, bouw een SQL-statement op die desired_temp met een halve graad (0.5) verlaagd |
Build SQL omhoog | IDX998: De knop “Omhoog” is ingedrukt, bouw een SQL-statement op die desired_temp met een halve graad (0.5) verhoogd |
json | Zet msg.payload om in een JSON-object |
Build SQL actual temp | IDX997: De BMP180 sensor ververst de gemeten temperatuur om de 60 seconden en zend dit bericht naar de MQTT-broker. Deze node bouwt een SQL-statement op om de actuele temperatuur up te daten. |
mysql | De update statements opgebouwd in de ‘Build SQL*’ nodes wordt verwerkt in de MariaDB tabel thermo.thermo |
Build SQL select | Bouw een SQL statement op die de net weggeschreven waarden ophaalt |
mysql | Voer het SQL-statement uit en zet het resultaat in msg.payload |
toString | Haalt de disered_temp uit msg.payload en slaat dit op in een string |
switch | Op basis van Unitnummer wordt het juiste Setpoint Device in Domoticz bijgewerkt met de gewenste temperatuur. |
Sync Domoticz Setpoint | Stuur een JSON bericht naar Domoticz met de ingestelde gewenste temperatuur |
Sync Thermostaat Setpoint | Geef het dummy device Setpoint (5) van betreffende thermostaat de waarde van het Setpoint |
toString | Haalt de actual_temp uit msg.payload en slaat dit op in een string |
switch | Op basis van Unitnummer wordt het juiste Temperatuur Device in Domoticz bijgewerkt met de actuele temperatuur. |
Sync Domoticz temp | Stuur een JSON bericht naar Domoticz met de actuele temperatuur |
Verwarming aan/uit | Eerst wordt op basis van het Unitnummer de juiste GPIO vastgesteld van corresponderend relais. Zie ook onderstaand tabel. Daarna wordt desired_temp van actual_temp afgetrokken. Als dit een waarde oplevert van gelijk aan of minder dan -1, dan wordt de relais gesloten, en gaat de verwarming aan. Is de waarde groter dan -1, dan gaat de verwarming uit. Door de waarde -1 wordt voorkomen dat een temperatuurwisseling van 0.01 graden er al voor zorgt dat de verwarming aangezet wordt. Dus stel dat de gewenste temperatuur op 21 staat, dan dient de temperatuur tot 20 te dalen voordat de verwarming aanslaat. De verwarming gaat pas weer uit als de ingestelde temperatuur van 21 graden wordt bereikt. |
Bedieningsaandrijving aan/uit | Zet de juiste relais op Vloerverwarming aan of uit |
Tabel met unitnummers en corresponderende GPIO’s op Vloerverwarming
Unit | GPIO | Relaisnummer |
13 | 12 (D6) | K1 |
16 (D0) | K2 | |
14 (D5) | K3 | |
13 (D7) | K4 | |
5 (D1) | K5 |
Flow Domoticz
Toelichting:
Node | Toelichting |
Domoticz | Lees topic domoticz/out op MQTT-broker 192.168.2.29 uit |
Switch | Als inkomend bericht het IDX bevat in de condities van Switch, dan wordt de vervolg flow uitgevoerd. Deze Switch voorkomt dat ieder bericht op het topic domoticz/out door de flow heengaat |
json | Zet msg.payload om naar een JSON-object |
Build SQL Desired temp | Op basis van IDX-nummer wordt het corresponderende unitnummer bepaald en een sql statement opgebouwd met de ingestelde gewenste temperatuur |
mysql | Het update-statement wordt verwerkt in de tabel thermo.thermo |
Export van de flows:
[{"id":"ae3ffaae.4157e8","type":"mqtt in","z":"59aa0d81.f7cf74","name":"Thermostaat_??","topic":"thermo/in/#","qos":"2","datatype":"auto","broker":"af6d966d.374b78","x":140,"y":140,"wires":[["4ed7b9f9.8b8178"]]},{"id":"b56e3bee.ad72b8","type":"switch","z":"59aa0d81.f7cf74","name":"","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"\"idx\":999","vt":"str"},{"t":"cont","v":"\"idx\":998","vt":"str"},{"t":"cont","v":"\"idx\":997","vt":"str"}],"checkall":"true","repair":false,"outputs":3,"x":510,"y":140,"wires":[["e9a66b0.1b29198"],["26bcd0ce.910e8"],["58122cc.b8b39d4"]]},{"id":"e9a66b0.1b29198","type":"function","z":"59aa0d81.f7cf74","name":"Build SQL Omlaag","func":"// {\"idx\":999,\"RSSI\":6,\"Battery\":43,\"command\":\"switchlight\",\"switchcmd\":\"On\"}\"\nvar sql = \"UPDATE thermo.thermo SET desired_temp = desired_temp - 0.5 WHERE unit = \" + flow.get(\"unit\") + \" AND desired_temp >= 0.5\";\n\nif (msg.payload.includes('\"switchcmd\":\"On\"')) \n{\n msg.topic=sql;\n return msg;\n} else {\n return null;\n}\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":830,"y":80,"wires":[["4efd73ea.c3e92c"]]},{"id":"4efd73ea.c3e92c","type":"mysql","z":"59aa0d81.f7cf74","mydb":"57a5db43.6cd1e4","name":"","x":1010,"y":140,"wires":[["a97ae3d4.88f7"]]},{"id":"26bcd0ce.910e8","type":"function","z":"59aa0d81.f7cf74","name":"Build SQL Omhoog","func":"// {\"idx\":999,\"RSSI\":6,\"Battery\":43,\"command\":\"switchlight\",\"switchcmd\":\"On\"}\"\nvar sql = \"UPDATE thermo.thermo SET desired_temp = desired_temp + 0.5 WHERE unit = \" + flow.get(\"unit\") + \" AND desired_temp <= 29.5\";\n\nif (msg.payload.includes('\"switchcmd\":\"On\"')) \n{\n msg.topic=sql;\n return msg;\n} else {\n return null;\n}\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":830,"y":140,"wires":[["4efd73ea.c3e92c"]]},{"id":"46e2d85d.ffbbc8","type":"function","z":"59aa0d81.f7cf74","name":"Build SQL Actual temp","func":"// {\"idx\":999,\"RSSI\":6,\"Battery\":43,\"command\":\"switchlight\",\"switchcmd\":\"On\"}\"\nvar sql = \"UPDATE thermo.thermo SET actual_temp = \" + msg.payload.svalue.split(\";\")[0] + \" WHERE unit = \" + flow.get(\"unit\");\n\nmsg.topic=sql;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":840,"y":200,"wires":[["4efd73ea.c3e92c"]]},{"id":"58122cc.b8b39d4","type":"json","z":"59aa0d81.f7cf74","name":"","property":"payload","action":"obj","pretty":false,"x":650,"y":200,"wires":[["46e2d85d.ffbbc8"]]},{"id":"a97ae3d4.88f7","type":"function","z":"59aa0d81.f7cf74","name":"Build SQL Select","func":"var sql = \"SELECT * FROM thermo.thermo WHERE unit = \" + flow.get(\"unit\")\n\nmsg.topic=sql;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":390,"y":380,"wires":[["7d497ba3.e89054"]]},{"id":"7d497ba3.e89054","type":"mysql","z":"59aa0d81.f7cf74","mydb":"57a5db43.6cd1e4","name":"","x":590,"y":380,"wires":[["5528cab7.c05264","5d68ab61.6564e4","ee4015ba.b640a8"]]},{"id":"65ffd564.324e4c","type":"http request","z":"59aa0d81.f7cf74","name":"Sync Domoticz Setpoint","method":"GET","ret":"txt","paytoqs":"ignore","url":"http://192.168.2.29:8080/json.htm?type=command¶m=setsetpoint&idx=247&setpoint={{{payload}}}","tls":"","persist":false,"proxy":"","authType":"","x":1070,"y":360,"wires":[[]]},{"id":"b821718c.852fd","type":"http request","z":"59aa0d81.f7cf74","name":"Sync Domoticz Temp","method":"GET","ret":"txt","paytoqs":"ignore","url":"http://192.168.2.29:8080/json.htm?type=command¶m=udevice&idx=248&nvalue=0&svalue={{{payload}}}","tls":"","persist":false,"proxy":"","authType":"","x":1060,"y":440,"wires":[[]]},{"id":"5528cab7.c05264","type":"change","z":"59aa0d81.f7cf74","name":"toString","rules":[{"t":"move","p":"payload[0].actual_temp","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":730,"y":440,"wires":[["e739510.4debdb"]]},{"id":"5d68ab61.6564e4","type":"function","z":"59aa0d81.f7cf74","name":"Verwarming aan/uit","func":"var desired_temp = msg.payload[0].desired_temp;\nvar actual_temp = msg.payload[0].actual_temp;\n\nswitch(flow.get(\"unit\")) {\n case \"13\":\n msg.payload=\"12,\";\n break;\n}\n\nif (actual_temp - desired_temp <= -1) {\n msg.payload=msg.payload + \"0\";\n} else {\n msg.payload=msg.payload + \"1\";\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":770,"y":500,"wires":[["f06b53f0.6600d"]]},{"id":"f06b53f0.6600d","type":"http request","z":"59aa0d81.f7cf74","name":"Bedieningsaandrijving aan/uit","method":"GET","ret":"txt","paytoqs":"ignore","url":"http://vloerverwarming.sydspost.nl/control?cmd=GPIO,{{{payload}}}","tls":"","persist":false,"proxy":"","authType":"","x":1080,"y":500,"wires":[[]]},{"id":"4ed7b9f9.8b8178","type":"function","z":"59aa0d81.f7cf74","name":"Unit","func":"var unit = msg.topic.split(\"/\")[2];\nflow.set(\"unit\",unit);\n\nvar temp = msg.payload.replace('\"idx\":'+unit,'\"idx\":');\n\nmsg.payload = temp;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":350,"y":140,"wires":[["b56e3bee.ad72b8"]]},{"id":"c70a4796.51c4f8","type":"switch","z":"59aa0d81.f7cf74","name":"","property":"unit","propertyType":"flow","rules":[{"t":"eq","v":"13","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":870,"y":380,"wires":[["65ffd564.324e4c","c5891836.761af8"]]},{"id":"e739510.4debdb","type":"switch","z":"59aa0d81.f7cf74","name":"","property":"unit","propertyType":"flow","rules":[{"t":"eq","v":"13","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":870,"y":440,"wires":[["b821718c.852fd"]]},{"id":"c5891836.761af8","type":"http request","z":"59aa0d81.f7cf74","name":"Sync Thermostaat Setpoint","method":"GET","ret":"txt","paytoqs":"ignore","url":"http://Thermostaat-13.sydspost.nl/control?cmd=event,setpoint={{{payload}}}","tls":"","persist":false,"proxy":"","authType":"","x":1080,"y":400,"wires":[[]]},{"id":"ee4015ba.b640a8","type":"change","z":"59aa0d81.f7cf74","name":"toString","rules":[{"t":"move","p":"payload[0].desired_temp","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":730,"y":380,"wires":[["c70a4796.51c4f8"]]},{"id":"af6d966d.374b78","type":"mqtt-broker","z":"","name":"pi","broker":"192.168.2.29","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"57a5db43.6cd1e4","type":"MySQLdatabase","z":"","name":"mysql","host":"localhost","port":"3306","db":"energy","tz":"","charset":"UTF8"}]
[{"id":"780bec2e.9d8ab4","type":"mqtt in","z":"59aa0d81.f7cf74","name":"Domoticz","topic":"domoticz/out","qos":"2","datatype":"auto","broker":"af6d966d.374b78","x":120,"y":600,"wires":[["bbc67ad9.0ec5c8"]]},{"id":"bbc67ad9.0ec5c8","type":"switch","z":"59aa0d81.f7cf74","name":"","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"\"idx\" : 247","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":290,"y":600,"wires":[["c8bce7c8.34a788"]]},{"id":"90843aa7.0316f8","type":"function","z":"59aa0d81.f7cf74","name":"Build SQL Desired temp","func":"var sql = \"UPDATE thermo.thermo SET desired_temp = \" + parseFloat(msg.payload.svalue1) + \" WHERE unit = \"\n\nswitch(msg.payload.idx) {\n case 247:\n sql = sql + \"13\";\n break;\n}\n\nmsg.topic=sql;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":670,"y":600,"wires":[["b68301dd.c15e2"]]},{"id":"c8bce7c8.34a788","type":"json","z":"59aa0d81.f7cf74","name":"","property":"payload","action":"","pretty":false,"x":450,"y":600,"wires":[["90843aa7.0316f8"]]},{"id":"b68301dd.c15e2","type":"mysql","z":"59aa0d81.f7cf74","mydb":"57a5db43.6cd1e4","name":"","x":910,"y":600,"wires":[[]]},{"id":"af6d966d.374b78","type":"mqtt-broker","z":"","name":"pi","broker":"192.168.2.29","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"57a5db43.6cd1e4","type":"MySQLdatabase","z":"","name":"mysql","host":"localhost","port":"3306","db":"energy","tz":"","charset":"UTF8"}]
Stap 6. Proefopstelling + Node Red flows testen
De volgende testen uitgevoerd:
- Knop Omlaag ingedrukt
- Knop Omhoog ingedrukt
- Sensor BMP180 iedere 60 seconden zijn actuele temperatuur door laten geven
- Domoticz Setpoint aangepast
Bij het testen gechecked dat:
- De juiste waarden werden weggeschreven in de MariaDb tabel thermo.thermo
- De relais in- en uitgeschakeld werd als de ingestelde gewenste temperatuur verhoogd of verlaagd werd
- De Domoticz Setpoint gesynchroniseerd werd
- Het Domoticz temperatuur device gesynchroniseerd werd
- Correcte waarden op het OLED display worden weergegeven
Stap 7. Ombouwen Danfoss kamerthermostaat
De volgende “ombouwactiviteiten” moeten uitgevoerd worden:
- De Wemos D1 mini past ruim in het batterijencompartiment. Om te voorkomen dat deze ooit kortsluiting gaat maken door de koperen klemmen waar normaal de AA-baterijen door vastgeklemd waren, verwijder ik die. Dit zowel uit het batterijencompartiment als van de printplaat. De koperen klemmen in het batterijencompartiment kun je simpelweg met een tangetje of schroevendraaier er uit schuiven. De koperen klemmen van de printplaat heb ik met een kniptang afgeknipt.
- Ik ga 2 van de 3 pinnen waarmee de voorkant van de behuizing met de printplaat aangesloten worden op de achterkant van de behuizing hergebruiken voor het voeden van de Wemos. Deze drie pinnen zitten aangesloten op de relais van de kamerthermostaat. Door het relais los te solderen van de printplaat wordt de verbinding tussen de pinnen en de printplaat verbroken. Dit voorkomt ongewenste storingen van de Wemos. Vervolgens een stukje 2-aderig draad aan de 2 buitenste pinnen gesoldeerd, en één bevestigd aan de Gnd van de Wemos en de andere aan de 5v ingang van de Wemos. Later er wel goed opletten dat de (+) en (-) van de 5v telefoonadapter goed aangesloten wordt op de 2-aderige draad naar de achterkant van de behuizing.
De Wemos komt zo netjes onder het klepje van het batterijencompartiment te zitten, zodat je eventueel er makkelijk bij kan om er nieuwe software op te zetten of een reset te geven.
- Vervolgens de twee soft-touch knopjes voor het omhoog of omlaag brengen van de temperatuur aansluiten op de Wemos. Hiervoor maak ik gebruik van de oude printplaat. Met een klein boortje heb ik gaatjes in de printplaat geboord, precies op die plekken waar de koperen geleidingen lopen. Die worden op die manier verbroken zodat er geen interferentie kan ontstaan met elektronische componenten op de printplaat. Door de gaatjes steek ik jumperkabeltjes en soldeer die vast op de koperen geleidingen waarop de soft-touch knopjes drukken. Vervolgens de oude printplaat weer vastgeschroefd in de voorkant van de behuizing. De jumperkabeltjes voer ik door een opening in het batterijencompartiment en soldeer ze daar vast op de Wemos poorten D6 en D7.
- Daarna de BMP280 met jumperkabeltjes verbonden met de Wemos D1 mini conform de pinout beschrijving eerder in dit document. De Gnd kabeltjes van de soft-touch knopjes, BMP280 en Wemos heb ik aan elkaar gesoldeerd en afgedekt met een stukje krimpkous. Vervolgens de gesoldeerde delen van de BMP280 omwikkeld met een stukje isolatietape om te voorkomen dat die ongewenst contact maken met de Wemos.
- Vervolgens de 1.3″ OLED display in het “glaasje” van de Danfoss thermostaat ingebouwd. Helaas was de OLED display die ik besteld had net een paar millimeter te hoog voor het glaasje. Geluk bij ongeluk was dat aan de bovenkant van de printplaat van de OLED display geen electronica zat, dus simpelweg met een kniptang een paar millimeter van de bovenkant geknipt om hem passend te maken voor het glaasje. Omdat de OLED display kleiner is dan het glaasje van een stukje zwart karton een passe partout gemaakt en in het glaasje gelegd. (De afmetingen van het passe partout zijn 24mm x 49mm, en de uitsnede is 18mm x 33mm. Dit gecentreerd in de passe partout levert een boven- en onderrand op van 3mm, en een linker en rechter rand van 8mm) Daarna in de oude printplaat met een kniptang een kleine inkeping gemaakt om ruimte te maken voor de aansluiting van de OLED display en jumperkabeltjes. Daarna het geheel in elkaar gezet en vastgeschroefd.
- Tot slot de 1.3″ OLED display met jumperkabeltjes verbonden met de Wemos D1 mini conform de pinout beschrijving eerder in dit document.
- Finishing touch is het wegwerken van de Wemos D1 mini en BMP280 in het batterijencompartiment
Stap 8. In werking stellen
- De Danfoss kamerthermostaat op zijn basis geplaatst. (Eerst de CV, Pomp en 24v adapter voor de kleppen voor de zekerheid uit het stopcontact gehaald)
- Daarna de bedrading voor het aansturen van de klep van de Fitnessruimte aangepast conform bovenstaande beschrijving en de Wemos D1 met het 6-voudige relais voor de aansturing van de kleppen in een montagedoos geplaatst en aangesloten op de bedrading.
- De stroom weer op de CV, Pomp, 24v adapter gezet en tevens de 5v telefoonadapter in het stopcontact gedaan en de boel helemaal weer doorgetest (zie ook Stap 6.).
Stap 9. Temperatuur kalibreren
Tijdens het testen bleek dat de temperatuur die de BMP280 meet waarschijnlijk beïnvloed wordt door de behuizing en/of warmte van de Wemos en/of een afwijking vertoond. Dit laatste heb ik eerder gezien bij deze sensor. Daarom een correctie uitgevoerd ten aanzien van de gemeten temperatuur.
Gemeten door BMP280: 30.15, gemeten met klassieke thermometer: 20, verschil: ~ -10.2 graden
- In de instellingen van de BMP280 de temperature offset ingesteld op -102 (* 0.1c = -10.2 graden)
- Blijf de komende dagen de temperatuur volgen. Als de metingen van de BMP280 blijken beinvloed te worden door de warmteproductie van de Wemos D1, dan is het nog te overwegen om de BMP280 verder van de Wemos D1 te plaatsen, bijv. in een uitsparing in de out printplaat. Stay tuned