Danfoss thermostaat slim maken

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.

Bovenstaand schema beschrijft de huidige situatie, waarbij in mijn geval de kamerthermostaten bedraad zijn aangesloten.

Logica

Voor de software-matige aansturing van het geheel onderscheidt ik de volgende componenten:

  1. EspEasy als besturingsysteem voor de Wemos D1 mini’s
  2. MQTT broker voor het versturen van berichten tussen de verschillende componenten
  3. Node Red voor de workflow en logica
  4. MariaDB RDMBS voor de opslag van actuele en gewenste temperaturen
  5. 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:

LabelWaardeToelichting
Unit naamThermostaatZinvolle naam
Unit Number13Uniek unit nummer
Append Unit Number to hostnameaangevinktZorgt 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:

LabelWaardeToelichting
ProtocolDomoticz MQTTPrima selectie icm met Domoticz en Node Red
Controller IP192.168.2.29ip-address van je MQTT broker
Controller Subscribethermo/out/%unit%Niet echt relevant, want we sturen niets terug naar de Wemos, toch maar wel ingevuld
Controller Publishthermo/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
EnabledaangevinktEnabled de connectie met de MQTT broker


Vervolgens op een breakout board de volgende componenten aangesloten op de Thermostaat Wemos D1 mini:

Wemos D1ComponentPinToelichting
3.3vBMP280VCC
GNDGND
SCLD1I2C
SDAD2I2C
3.3vCSBselect I2C
GNDSDOselect slave address 0x76
D0<Display button>Zit niets fysiek op aangesloten, wordt in de software gebruikt om het display aan te zetten
D6Omhoog schakelaarGND
D7Omlaag schakelaarGND
3.3vOLEDVCC
GNDGND
SCLD1I2C
SDAD2I2C

Bovenstaande componenten toegevoegd als devices:

Per device de configuratie met een toelichting:

BMP280 sensor

Toelichting op non-default waarden:

LabelWaardeToelichting
DeviceBMP280Had nog een BMP280 liggen, qua formaat mooi kleine sensor
NameTempZinvolle naam
EnabledAangevinkt
I2C Address0x76SDO aangesloten op GND, dus address = 0x76
Send to ControlleraangevinktZorgt ervoor dat de gemeten waarden als MQTT bericht via de MQTT broker worden verzonden
IDX13997Als 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:

LabelWaardeToelichting
DeviceOLED SSD13061.3″ Oled Module
NameDisplayZinvolle naam
EnabledAangevinkt
Display Size128×32Gaf het grootste lettertype
Line 1%systime%Geeft de tijd weer (gesynchroniseerd vanuit de NTP-server)
Line 2 Temp: [Temp#Temperature] °CGeeft de actuele temperatuur gemeten door de BMP280 weer
Line 3 Set : [Setpoint#temp] °CGeeft de ingestelde Setpoint waarde weer
Display buttonGPIO-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 Timeout60Na 60 seconden gaat het display uit als er geen activiteit is
Interval1Iedere seconde wordt het scherm ververst

Knop “Omlaag”

Toelichting op non-default waarden:

LabelWaardeToelichting
DeviceSwitch input – SwitchSchakelaar
NameOmlaagZinvolle naam
EnabledAangevinkt
Internal PullUpAangevinktActiveert 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 LogicaangevinktAls 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.
GPIOGPIO-13 (D7)GPIO waarop ik de omlaag schakelaar aangesloten heb
Send to ControllerAangevinktZorgt ervoor dat de gemeten waarden als MQTT bericht via de MQTT broker worden verzonden
IDX13999Als 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:

LabelWaardeToelichting
DeviceSwitch input – SwitchSchakelaar
NameOmhoogZinvolle naam
EnabledAangevinkt
Internal PullUpAangevinktActiveert 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 LogicaangevinktAls 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.
GPIOGPIO-12 (D6)GPIO waarop ik de omlaag schakelaar aangesloten heb
Send to ControllerAangevinktZorgt ervoor dat de gemeten waarden als MQTT bericht via de MQTT broker worden verzonden
IDX13998Als 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:

LabelWaardeToelichting
DeviceGeneric – Dummy DeviceVirtueel dummy device
NameSetpointZinvolle naam
EnabledAangevinkt
Output Data TypeSingleEr behoeft maar 1 waarde opgeslagen te worden
Values 1TempZinvolle naam

Tot slot onder Tools, Advanced nog de volgende settings gezet:

Toelichting op non-default waarden:

LabelWaardeToelichting
RulesAangevinktTabblad Rules geactiveerd
Use NTP:AangevinktGebruik de NTP server om de tijd te synchroniseren
NTP Hostname192.168.2.29IP-address van mijn lokale NTP server, ipv. zou je ook bijv. time1.google.com kunnen gebruiken
DSTAangevinktHou rekening met Zomer en Wintertijd
TimeZone Offset (UTC +)60Amsterdam = UTC +1
Syslog IP192.168.2.29IP-address van mijn Syslog server
Syslog Log LevelErrorStuurt alle error meldingen door naar mijn Syslog server

De volgende Rule toegevoegd op het tabblad Rules:

Toelichting op de non-default waarden:

LabelWaardeToelichting
Rules Set 1On 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:

LabelWaardeToelichting
Unit naamVloerverwarmingZinvolle naam
Unit Number14Uniek unit nummer
Append Unit Number to hostnameUitgevinkt

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 D1ComponentPinToelichting
5vRelais5v
GndGnd
D6 (GPIO 12)IN1Wordt aangestuurd door Thermostaat_13
K1-NOGND-UIT Danfoss bedieningsaandrijving Fitnessruimte
K1-COMGND-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:

LabelWaardeToelichting
Use NTP:AangevinktGebruik de NTP server om de tijd te synchroniseren
NTP Hostname192.168.2.29IP-address van mijn lokale NTP server, ipv. zou je ook bijv. time1.google.com kunnen gebruiken
Syslog IP192.168.2.29IP-address van mijn Syslog server
Syslog Log LevelErrorStuurt 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 TABLE thermo (
unit int(11) NOT NULL,
desired_temp float DEFAULT NULL,
actual_temp float DEFAULT NULL,
PRIMARY KEY (unit)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Toelichting:

AttrbuutTypeToelichting
unitintUnitnummer corresponderend met EspEasy unitnummer thermostaat
desired_tempfloatGewenste temperatuur
actual_tempfloatActuele 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:

NodeToelichting
Thermostaat_??Leest topic thermo/in/# uit van de MQTT broker 192.168.2.29
UnitLeest 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.
SwitchOp basis van de IDX wordt de vervolgflow ingezet
Build SQL omlaagIDX999: De knop “Omlaag” is ingedrukt, bouw een SQL-statement op die desired_temp met een halve graad (0.5) verlaagd
Build SQL omhoogIDX998: De knop “Omhoog” is ingedrukt, bouw een SQL-statement op die desired_temp met een halve graad (0.5) verhoogd
jsonZet msg.payload om in een JSON-object
Build SQL actual tempIDX997: 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.
mysqlDe update statements opgebouwd in de ‘Build SQL*’ nodes wordt verwerkt in de MariaDB tabel thermo.thermo
Build SQL selectBouw een SQL statement op die de net weggeschreven waarden ophaalt
mysqlVoer het SQL-statement uit en zet het resultaat in msg.payload
toStringHaalt de disered_temp uit msg.payload en slaat dit op in een string
switchOp basis van Unitnummer wordt het juiste Setpoint Device in Domoticz bijgewerkt met de gewenste temperatuur.
Sync Domoticz SetpointStuur een JSON bericht naar Domoticz met de ingestelde gewenste temperatuur
Sync Thermostaat SetpointGeef het dummy device Setpoint (5) van betreffende thermostaat de waarde van het Setpoint
toStringHaalt de actual_temp uit msg.payload en slaat dit op in een string
switchOp basis van Unitnummer wordt het juiste Temperatuur Device in Domoticz bijgewerkt met de actuele temperatuur.
Sync Domoticz tempStuur een JSON bericht naar Domoticz met de actuele temperatuur
Verwarming aan/uitEerst 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/uitZet de juiste relais op Vloerverwarming aan of uit

Tabel met unitnummers en corresponderende GPIO’s op Vloerverwarming

UnitGPIORelaisnummer
1312 (D6)K1
16 (D0)K2
14 (D5)K3
13 (D7)K4
5 (D1)K5

Flow Domoticz

Toelichting:

NodeToelichting
DomoticzLees topic domoticz/out op MQTT-broker 192.168.2.29 uit
SwitchAls 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
jsonZet msg.payload om naar een JSON-object
Build SQL Desired tempOp basis van IDX-nummer wordt het corresponderende unitnummer bepaald en een sql statement opgebouwd met de ingestelde gewenste temperatuur
mysqlHet 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&param=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&param=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:

  1. Knop Omlaag ingedrukt
  2. Knop Omhoog ingedrukt
  3. Sensor BMP180 iedere 60 seconden zijn actuele temperatuur door laten geven
  4. 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

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *