Omdat ik ook OTMonitor gebruik en het afgeraden wordt om twee apps op die manier te verbinden. Anders had ik graag van de integratie gebruik gemaaktglaswerk schreef op zaterdag 10 december 2022 @ 23:12:
[...]
Toch even een vraag: waarom zou je de "omweg" van mqtt willen, terwijl er gewoon een native integratie in HA beschikbaar is? Ik mis vast iets, maar ik hoor graag wat.
Volgens mij kan het via mqtt publish topic. Moet nog even verder pielen.htca schreef op zaterdag 10 december 2022 @ 22:00:
[...]
Niet direct werkend, maar ik heb de OTGW sinds vandaag draaien en via MQTT geintegreerd in HA. Ik heb al wel even gezocht en kwam hier terecht. Het lijkt erop dat je met een CURL commando de temperatuur kan aanpassen:
code:
1 curl -X PUT http://otgw.local/api/v1/otgw/command/OT=<waarde>
Je moet in de settings van OTGW wel "MQTT OT msg Enable" aanzetten. Dan krijg mqtt "Toutside"
In HA dan zou je hem met een shell command oid moeten aansturen vanuit HA. Maar gevoelsmatig is dat allemaal wat omslachtig.... Je zou een MQTT service aanwillen roepen en Toutside willen updaten.
edit:
Ik heb het commando even vanaf een CLI uitgevoerd, de MQTT waarde volgt de met curl ingevoerde waarde, maar wel met vertraging. Ik denk dat dat ook de crux is van het probleem. MQTT volgt de interne sensor (als die aanwezig is). Je kunt hem updaten van buitenaf en daardoor de hardware implementatie gebruiken. MQTT volgt daarna en niet andersom.
Ik heb de volgende automation die de temp vanuit de home assistant temperature widget pakt en die naar de OTGW/thermostaat stuurt:Tomono schreef op zaterdag 10 december 2022 @ 23:53:
[...]
Volgens mij kan het via mqtt publish topic. Moet nog even verder pielen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
| alias: OTGW buitentemp description: "" trigger: - platform: time_pattern minutes: /5 condition: [] action: - service: mqtt.publish data: topic: OTGW/set/otgw-MACADDR/command payload_template: OT={{ state_attr("weather.home","temperature") }} mode: single |
Nu nog elke 5 minuten blijkbaar, ik dacht dat ik hem had aangepast zodat hij dat deed wanneer de temp aangepast was, dat kan ook nog
Just curious, waar gebruik je OTmonitor voor (en continue?)Tomono schreef op zaterdag 10 december 2022 @ 23:50:
[...]
Omdat ik ook OTMonitor gebruik en het afgeraden wordt om twee apps op die manier te verbinden. Anders had ik graag van de integratie gebruik gemaakt
Hier inmiddels via een automation en de uurwaarde van openweather wordt de temperatuur geupdate. Omdat ik zelf nogal heb gezocht.... hierbij de yaml...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| alias: Set external temperature otgw description: "" trigger: - platform: state entity_id: - sensor.openweathermap_temperature condition: [] action: - service: opentherm_gw.set_outside_temperature data: gateway_id: "1" temperature: "{{ states('sensor.openweathermap_temperature') }}" mode: single |
[Voor 43% gewijzigd door htca op 11-12-2022 16:29]
Echt heel fijn! Dankjewel!Luc45 schreef op zondag 11 december 2022 @ 12:51:
[...]
Ik heb de volgende automation die de temp vanuit de home assistant temperature widget pakt en die naar de OTGW/thermostaat stuurt:
code:
1 2 3 4 5 6 7 8 9 10 11 12 alias: OTGW buitentemp description: "" trigger: - platform: time_pattern minutes: /5 condition: [] action: - service: mqtt.publish data: topic: OTGW/set/otgw-MACADDR/command payload_template: OT={{ state_attr("weather.home","temperature") }} mode: single
Nu nog elke 5 minuten blijkbaar, ik dacht dat ik hem had aangepast zodat hij dat deed wanneer de temp aangepast was, dat kan ook nog
Voorlopig voor het loggen naar file en ik vind de log en interface voor de commando's erg fijn. Inmiddels heb ik verschillende automations obv de mqtt. Bijvoorbeeld het versturen van ketelcodes naar mijn telegram (druk te laag, ontluchtingsprogramma etc)htca schreef op zondag 11 december 2022 @ 16:24:
[...]
Just curious, waar gebruik je OTmonitor voor (en continue?)
Hier inmiddels via een automation en de uurwaarde van openweather wordt de temperatuur geupdate. Omdat ik zelf nogal heb gezocht.... hierbij de yaml...
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 alias: Set external temperature otgw description: "" trigger: - platform: state entity_id: - sensor.openweathermap_temperature condition: [] action: - service: opentherm_gw.set_outside_temperature data: gateway_id: "1" temperature: "{{ states('sensor.openweathermap_temperature') }}" mode: single
En als je dan connect met OTMonitor, doet die het dan wel meteen? Dat vind ik het rare dat die wel meteen connect.Appesteijn schreef op zaterdag 10 december 2022 @ 23:38:
[...]
Bij mij is het niet zo extreem, maar heb wel dagelijks een vergelijkbare 'vastloper' vanuit HA. Ik zie dit als de thermostaat op F200 staat, geen communicatie mogelijk met de buiten-temperatuurvoeler.
Ik draai OTGW firmware 4.3 en het lijkt erop dat op de een of andere manier HA de verbinding verliest en daarna de Telnet poort (die gebruik ik) niet meer toegankelijk is voor HA op te retry-en. OTGW kastje en Wifi module lijkt het wel gewoon nog te doen.
Volgens mij wel, maar dat zal ik de volgende keer even testen.Pimmeh schreef op zondag 11 december 2022 @ 22:32:
[...]
En als je dan connect met OTMonitor, doet die het dan wel meteen? Dat vind ik het rare dat die wel meteen connect.
Graag, dan hebben we op 2 devices een reproduceerbaar scenario, misschien kunnen we daar dan iets mee. (geen idee wat nog
)

Als je bedoelt dat je OT=X stuurt via MQTT; ja dat heb ik draaien ja. Wat voor vragen heb je erover?Tomono schreef op vrijdag 9 december 2022 @ 23:34:
[...]
Goed om te weten. Maar als iemand het via mqtt werkend heeft hoor ik het nog graag.
Kia E-Niro 64kWh DynamicPlusLine
Ben zelf bezig met mijn eerste koop huis en een verbouwing. Ik heb zelf airco's in diverse ruimtes geïnstalleerd, echter in de woonkamer heb ik zowel CV als een airco. Ik wil zelf het stook algoritme opzetten om zo efficiënt te stoken (icm met elektra prijs etc.). Nu ga ik mijn NS-panel als scherm gebruiken om de temperatuur in te stellen, en op de radiatoren in de woonkamer, hal en badkamer een pop zigbee thermostaatkraan.
Nu ligt tijdelijk voor de verbouwing de Nefit thermostaat op zolder, echter moet dit natuurlijk vervangen worden door een (draadloze) digitale aansturing. Echter tot mijn verbazing kan ik nergens een zigbee naar Nefit ketel aansturing vinden. Wat zou mijn beste optie zijn?
Nu ligt tijdelijk voor de verbouwing de Nefit thermostaat op zolder, echter moet dit natuurlijk vervangen worden door een (draadloze) digitale aansturing. Echter tot mijn verbazing kan ik nergens een zigbee naar Nefit ketel aansturing vinden. Wat zou mijn beste optie zijn?
Heb het inmiddels werkend obv iemands post hierboven. Maar thanks!Dutchess_Nicole schreef op maandag 12 december 2022 @ 09:47:
[...]
Als je bedoelt dat je OT=X stuurt via MQTT; ja dat heb ik draaien ja. Wat voor vragen heb je erover?
Nefit gebruikt volgens mij haar eigen protocol (althans toen ik een Nefit ketal had), er zijn wel OpenTherm naar Nefit converters (van Nefit zelf). Met die kan je elke draadloze thermostaat gebruiken, bv de Honeywell Round Wireless.jancoow schreef op maandag 12 december 2022 @ 19:42:
Ben zelf bezig met mijn eerste koop huis en een verbouwing. Ik heb zelf airco's in diverse ruimtes geïnstalleerd, echter in de woonkamer heb ik zowel CV als een airco. Ik wil zelf het stook algoritme opzetten om zo efficiënt te stoken (icm met elektra prijs etc.). Nu ga ik mijn NS-panel als scherm gebruiken om de temperatuur in te stellen, en op de radiatoren in de woonkamer, hal en badkamer een pop zigbee thermostaatkraan.
Nu ligt tijdelijk voor de verbouwing de Nefit thermostaat op zolder, echter moet dit natuurlijk vervangen worden door een (draadloze) digitale aansturing. Echter tot mijn verbazing kan ik nergens een zigbee naar Nefit ketel aansturing vinden. Wat zou mijn beste optie zijn?
Edit: deze https://www.warmteservice...herm-converter/p/37253001
[Voor 6% gewijzigd door bluewalk op 13-12-2022 06:44]
Ja, echter hoef ik geen thermostaat in de kamer. Er zijn al genoeg temperatuurmeters die de temperatuur daar meten dus lijkt mij onzin om die op te hangenbluewalk schreef op dinsdag 13 december 2022 @ 06:43:
[...]
Nefit gebruikt volgens mij haar eigen protocol (althans toen ik een Nefit ketal had), er zijn wel OpenTherm naar Nefit converters (van Nefit zelf). Met die kan je elke draadloze thermostaat gebruiken, bv de Honeywell Round Wireless.
Edit: deze https://www.warmteservice...herm-converter/p/37253001
Ik heb een Remeha Avanta ketel en wil met Home Assistant slim gaan stoken.
De bedoeling is dat ik door het hele huis deze (https://nl.aliexpress.com/item/4000427410383.html) temp sensors gaat hangen inclusief buiten, maar ik wil met Hass aan de hand van de buiten temperatuur de aanvoer temperatuur hoogte kunnen aanpassen. Ook binnen wil ik stoken aan de hand van deze sensors en dus me normale thermostaat omzeilen zolang Home Assistant draait.
Nou ben ik paar uur aan het uitzoeken gegaan, maar kon niet met zekerheid zeggen of dat met dit project kan. Kan namelijk geen enkel voorbeeld vinden hoe de OpenTherm Gateway werkt binnen Hass.
Kan iemand me vertellen of dit kan? Misschien dat iemand een video weet hoe dit er dan uit ziet en werk?
De bedoeling is dat ik door het hele huis deze (https://nl.aliexpress.com/item/4000427410383.html) temp sensors gaat hangen inclusief buiten, maar ik wil met Hass aan de hand van de buiten temperatuur de aanvoer temperatuur hoogte kunnen aanpassen. Ook binnen wil ik stoken aan de hand van deze sensors en dus me normale thermostaat omzeilen zolang Home Assistant draait.
Nou ben ik paar uur aan het uitzoeken gegaan, maar kon niet met zekerheid zeggen of dat met dit project kan. Kan namelijk geen enkel voorbeeld vinden hoe de OpenTherm Gateway werkt binnen Hass.
Kan iemand me vertellen of dit kan? Misschien dat iemand een video weet hoe dit er dan uit ziet en werk?
De aller simpelste manier is om MQTT te gebruiken en dan je OTGW (en daarmee de boiler) te bedienen.AndreStarTrek schreef op zaterdag 17 december 2022 @ 03:12:
Ik heb een Remeha Avanta ketel en wil met Home Assistant slim gaan stoken.
De bedoeling is dat ik door het hele huis deze (https://nl.aliexpress.com/item/4000427410383.html) temp sensors gaat hangen inclusief buiten, maar ik wil met Hass aan de hand van de buiten temperatuur de aanvoer temperatuur hoogte kunnen aanpassen. Ook binnen wil ik stoken aan de hand van deze sensors en dus me normale thermostaat omzeilen zolang Home Assistant draait.
Nou ben ik paar uur aan het uitzoeken gegaan, maar kon niet met zekerheid zeggen of dat met dit project kan. Kan namelijk geen enkel voorbeeld vinden hoe de OpenTherm Gateway werkt binnen Hass.
Kan iemand me vertellen of dit kan? Misschien dat iemand een video weet hoe dit er dan uit ziet en werk?
https://github.com/rvdbreemen/OTGW-firmware/wiki dit geeft je opties over wat je in zou kunnen stellen.
Qua bediening moet je maar even zien wat je in zou willen stellen: sommige mensen werken met een vaste control setpoint en dan gaan ze moduleren, sommige mensen gebruiken de modulatie niet maar werken direct met de control setpoint.
Er is een discord voor OTGW waar we nog wel eens discussies hebben over wat het beste werkt in een bepaalde situatie.
Persoonlijk werk ik op basis van 2 ruimtethermostaten die via een template sensor een control setpoint genereren.
Kia E-Niro 64kWh DynamicPlusLine
Bedankt voor je reactie, globaal haal ik er uit dat het dus kan wat ik wil?Dutchess_Nicole schreef op zaterdag 17 december 2022 @ 11:42:
[...]
De aller simpelste manier is om MQTT te gebruiken en dan je OTGW (en daarmee de boiler) te bedienen.
https://github.com/rvdbreemen/OTGW-firmware/wiki dit geeft je opties over wat je in zou kunnen stellen.
Qua bediening moet je maar even zien wat je in zou willen stellen: sommige mensen werken met een vaste control setpoint en dan gaan ze moduleren, sommige mensen gebruiken de modulatie niet maar werken direct met de control setpoint.
Er is een discord voor OTGW waar we nog wel eens discussies hebben over wat het beste werkt in een bepaalde situatie.
Persoonlijk werk ik op basis van 2 ruimtethermostaten die via een template sensor een control setpoint genereren.
Sorry ben nog niet heel erg op de hoogte van de werking van hass en de termen die daar bij gebruikt worden. Ooit een keer hass in een vm geinstalleerd om te kijken of het wat is, maar daarna niet meer. Nou ga ik voor het eerst me eigen in het diepe gooie om echt me huis daar mee te laten werken. Dus aan de eene kant heb ik gewoon hardware nodig waar ik van weet dat er mee werkt en doet wat ik er mee wil. Daarna is het gewoon proberen en er wat van leren met hopelijk met wat hulp van bijvoorbeeld hier.
Dus op dit moment heb ik even iemand nodig die even me handje vast houd en vertel of het mogelijk is met dit en de rest hoe het allemaal gaat dat is voor latere zorg

Graag verneem ik deze Discord gezien ik deze niet zo 123 kan vind op bijvoorbeeld TS.
Simpel antwoord: ja het kan. Ik gebruik het dus het kan zeker.AndreStarTrek schreef op zaterdag 17 december 2022 @ 12:12:
[...]
Bedankt voor je reactie, globaal haal ik er uit dat het dus kan wat ik wil?
Sorry ben nog niet heel erg op de hoogte van de werking van hass en de termen die daar bij gebruikt worden. Ooit een keer hass in een vm geinstalleerd om te kijken of het wat is, maar daarna niet meer. Nou ga ik voor het eerst me eigen in het diepe gooie om echt me huis daar mee te laten werken. Dus aan de eene kant heb ik gewoon hardware nodig waar ik van weet dat er mee werkt en doet wat ik er mee wil. Daarna is het gewoon proberen en er wat van leren met hopelijk met wat hulp van bijvoorbeeld hier.
Dus op dit moment heb ik even iemand nodig die even me handje vast houd en vertel of het mogelijk is met dit en de rest hoe het allemaal gaat dat is voor latere zorg
Graag verneem ik deze Discord gezien ik deze niet zo 123 kan vind op bijvoorbeeld TS.
HOE het kan is afhankelijk van jouw wensen en helaas komen vaktermen hier nogal in voor dus wat dat betreft zul je je een beetje moeten inlezen. Temeer daar je dit allemaal zelf wilt gaan opzetten dus uiteindelijk zul je het zelf moeten gaan begrijpen.
De discord is van @number3 en heet OTGW-Firmware. Uiteraard ben je welkom om daar over specifieke scenario's te komen babbelen. Groot voordeel is dat Schelte Bron zelf (de maker van de OTGW module) er ook aanwezig is dus als je eens de diepte in wilt kan dat ook nog!

Om te beginnen:
Installeer HAOS op een raspberry pi, of een NUC, of een VM, of ergens waar het kan
Installeer Mosquitto (in add-on vorm of los, maakt niet uit)
Installeer de OTGW module en stel MQTT in.
Dan heb je het begin al gehad.
Daarna is het spelen met entities in HA, leren automatiseren etc... maar dat is sowieso het proces.
Kia E-Niro 64kWh DynamicPlusLine
Top dat is het belangrijksteDutchess_Nicole schreef op zaterdag 17 december 2022 @ 12:41:
[...]
Simpel antwoord: ja het kan. Ik gebruik het dus het kan zeker.
Klopt en termen leer je vanzelf, maar er gewoon mee aan de slag gaan leer je snellen dan alleen lezen, want dan kan je vaak dingen niet helemaal plaatsen. Gaat vast goed komenHOE het kan is afhankelijk van jouw wensen en helaas komen vaktermen hier nogal in voor dus wat dat betreft zul je je een beetje moeten inlezen. Temeer daar je dit allemaal zelf wilt gaan opzetten dus uiteindelijk zul je het zelf moeten gaan begrijpen.

Dat is helemaal top, heb je daar misschien een invite van, of moet ik daar voor een uitnodiging vragen van @number3 zelf?De discord is van @number3 en heet OTGW-Firmware. Uiteraard ben je welkom om daar over specifieke scenario's te komen babbelen. Groot voordeel is dat Schelte Bron zelf (de maker van de OTGW module) er ook aanwezig is dus als je eens de diepte in wilt kan dat ook nog!
Heb een raspberry pi 4 4GB draaien met Hass, mosquitto en MQTT draait al voor de Zigbee spullenOm te beginnen:
Installeer HAOS op een raspberry pi, of een NUC, of een VM, of ergens waar het kan
Installeer Mosquitto (in add-on vorm of los, maakt niet uit)
Installeer de OTGW module en stel MQTT in.

Idd dat kost wat tijd maar ja als je wat wil dan hoort dat er bijDan heb je het begin al gehad.
Daarna is het spelen met entities in HA, leren automatiseren etc... maar dat is sowieso het proces.

De Discord over OTGW kan je via deze uitnodiging bereiken: https://discord.gg/zjW3ju7vGQ
Een losse sensor op je aanvoer en afvoer is de beste oplossing OpenTherm schrijft niet voor hoe vaak berichten worden verzonden. Je ben dan afhankelijk van ketel.
Hij komt hier beiden net zo vaak binnen (Remeha calenta). Ik heb ook een poosje sensoren op mijn aan en afvoer geplakt, Dat bleef altijd wel een beetje houtje touwtje (ds18b20 begaven het nog wel eens, kan ook aan de bedenkelijke kwaliteit van de doormij in China bestelde sensoren liggen of aan mijn soldeer skills...)TopdRob schreef op woensdag 21 december 2022 @ 07:52:
Ik zie dat mijn retourtemperatuur niet zo snel update als bijvoorbeeld de aanvoertemperatuur. Is daar iets aan te doen?[Afbeelding]
-- Ik heb het probleem al gevonden --
[Voor 94% gewijzigd door Mea011 op 21-12-2022 15:31. Reden: Probleem opgelost]
Net voor het eerst weer een HA 'vastloper' gehad. Home Assistant geeft aan niet meer te kunnen connecten naar de OTGW:Pimmeh schreef op zondag 11 december 2022 @ 22:32:
[...]
En als je dan connect met OTMonitor, doet die het dan wel meteen? Dat vind ik het rare dat die wel meteen connect.
code:
1
2
3
4
5
6
7
| Logger: pyotgw.pyotgw Source: runner.py:120 First occurred: 02:23:45 (2 occurrences) Last logged: 02:25:36 Timed out waiting for command: PS, value: 1. Timed out waiting for command: PR, value: I. |
Wat resulteert in:
code:
1
| RuntimeError: Overrun Error: The processor was busy and failed to process all received characters. |
Als ik nu met otmonitor.exe vanaf mijn windows mahcine connect dan lijkt er geen vuiltje aan de lucht.
Probleem lijkt dus in HA te zitten. Na een reboot van HA werkt het weer.
Waarom constante temperatuur?TopdRob schreef op vrijdag 23 december 2022 @ 06:56:
Mijn ketel doet dit bij een constante temperatuur van 18 graden en alleen vloerverwarming met de mengverdeler op 40. Is dit ok of doet hij iets geks?[Afbeelding]
Als de boer zijn koeien kust, zijn ze jarig wees gerust. Varkens op een landingsbaan, leiden nooit een lang bestaan. Als de boer zich met stront wast, zijn zijn hersens aangetast. Als het hooi is in de schuur, zit het wijf bij den gebuur.
Hmm, misschien dan toch eens een bugreport bij HASS indienen, zeker omdat we dat nu beide hebben waarbij otmonitor.exe wel happy is. Ik zal na de feestdagen eens kijken of ik wat in kan schieten daar, thanks voor het checken!Appesteijn schreef op vrijdag 23 december 2022 @ 08:35:
[...]
Net voor het eerst weer een HA 'vastloper' gehad. Home Assistant geeft aan niet meer te kunnen connecten naar de OTGW:
code:
1 2 3 4 5 6 7 Logger: pyotgw.pyotgw Source: runner.py:120 First occurred: 02:23:45 (2 occurrences) Last logged: 02:25:36 Timed out waiting for command: PS, value: 1. Timed out waiting for command: PR, value: I.
Wat resulteert in:
code:
1 RuntimeError: Overrun Error: The processor was busy and failed to process all received characters.
Als ik nu met otmonitor.exe vanaf mijn windows mahcine connect dan lijkt er geen vuiltje aan de lucht.
Probleem lijkt dus in HA te zitten. Na een reboot van HA werkt het weer.
Jij gebruikt firmware 4.3. Ik gebruik firmware 6.1 op een P16F1847. Je kan een upgrade overwegen om te testen. Als je een P16F88 hebt, dan kan je 5.6 testen.Appesteijn schreef op vrijdag 23 december 2022 @ 08:35:
[...]
Net voor het eerst weer een HA 'vastloper' gehad. Home Assistant geeft aan niet meer te kunnen connecten naar de OTGW:
code:
1 2 3 4 5 6 7 Logger: pyotgw.pyotgw Source: runner.py:120 First occurred: 02:23:45 (2 occurrences) Last logged: 02:25:36 Timed out waiting for command: PS, value: 1. Timed out waiting for command: PR, value: I.
Wat resulteert in:
code:
1 RuntimeError: Overrun Error: The processor was busy and failed to process all received characters.
Als ik nu met otmonitor.exe vanaf mijn windows mahcine connect dan lijkt er geen vuiltje aan de lucht.
Probleem lijkt dus in HA te zitten. Na een reboot van HA werkt het weer.
Yar har, wind in your back, lads, wherever you go!
Werkt die goed met HA dan? Ik was in de veronderstelling dat hier een breaking change in zat.The Zep Man schreef op zaterdag 24 december 2022 @ 08:56:
[...]
Jij gebruikt firmware 4.3. Ik gebruik firmware 6.1 op een P16F1847. Je kan een upgrade overwegen om te testen. Als je een P16F88 hebt, dan kan je 5.6 testen.
Mijn HA-installatie is vorige week geactualiseerd. Draaide daarvoor stabiel, en sinds die tijd ook. Je kan altijd testen, en een downgrade uitvoeren als het niet werkt.Appesteijn schreef op zaterdag 24 december 2022 @ 09:03:
Werkt die goed met HA dan? Ik was in de veronderstelling dat hier een breaking change in zat.
[edit]
Wat mogelijk een verschil maakt is dat ik een OTGW heb met Ethernet-aansluiting en niet draadloos.
[Voor 12% gewijzigd door The Zep Man op 24-12-2022 09:12]
Yar har, wind in your back, lads, wherever you go!
Ik heb HA 2022.10 draaien icm 6.2 en dat is rocksolid (draai niet nieuwer omdat HA iets anders gesloopt heeft waardoor mijn custom homescreen niet meer werktAppesteijn schreef op zaterdag 24 december 2022 @ 09:03:
[...]
Werkt die goed met HA dan? Ik was in de veronderstelling dat hier een breaking change in zat.

@Appesteijn @The Zep Man Ik heb 6.2 draaien ivm HASS 2022.10 en heb dus helaas dezelfde problemen (met de Wifi-module). 

[Voor 9% gewijzigd door Pimmeh op 24-12-2022 15:56]
Ik zie het even niet, beetje hulp nodig. Nieuwe Nodo OTGW aangesloten aan een Remeha Avanta met Isense, inclusief buitentemperatuur sensor. Via Wifi en MQTT naar Home Assistant. Alles werkt perfect, zie een hele hoop data. Met een automation in HA lukt het om via "climate: set temperature" een nieuwe "room temperature" op de Isense in te stellen. Nu wil ik graag de aanvoertemperatuur afhankelijk maken van de buitentemperatuur in HA. In OTmonitor kan ik de aanvoertemperatuur aanpassen, maar hoe doe ik dit met een automation in HA? Ik hoop dat dit de juiste plaats is voor deze vraag.
Dat kan via mqtt of via de otgw integratie en een automation, ik gebruik de temp van openweather in een automation en de otgw integratie, maar je kunt natuurlijk ook een andere sensor gebruiken. Via mqtt heb ik pas ook een voorbeeld voorbij zien komen, ik denk in het HA topic.markvd1962 schreef op zondag 25 december 2022 @ 00:36:
Ik zie het even niet, beetje hulp nodig. Nieuwe Nodo OTGW aangesloten aan een Remeha Avanta met Isense, inclusief buitentemperatuur sensor. Via Wifi en MQTT naar Home Assistant. Alles werkt perfect, zie een hele hoop data. Met een automation in HA lukt het om via "climate: set temperature" een nieuwe "room temperature" op de Isense in te stellen. Nu wil ik graag de aanvoertemperatuur afhankelijk maken van de buitentemperatuur in HA. In OTmonitor kan ik de aanvoertemperatuur aanpassen, maar hoe doe ik dit met een automation in HA? Ik hoop dat dit de juiste plaats is voor deze vraag.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| alias: Set external temperature otgw description: "" trigger: - platform: state entity_id: - sensor.openweathermap_temperature condition: [] action: - service: opentherm_gw.set_outside_temperature data: gateway_id: "1" temperature: "{{ states('sensor.openweathermap_temperature') }}" mode: single |
Ik doe iets soorgelijks alleen dan gelijk in MQTT:
Ik heb geen aparte service gemaakt voor het publishen van een OT, ik stuur het gewoon gelijk de MQTT topic in en de OTGW pakt het wel op
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
| alias: Set OT for boiler when outside temperature changes description: "" trigger: - platform: state entity_id: - sensor.garden_sensor_temperature condition: [] action: - service: mqtt.publish data: topic: OTGW/set/otgw-308398A2F389/command payload_template: OT={{ states('sensor.garden_sensor_temperature') | float(default=0.0) }} mode: restart |
Ik heb geen aparte service gemaakt voor het publishen van een OT, ik stuur het gewoon gelijk de MQTT topic in en de OTGW pakt het wel op
Kia E-Niro 64kWh DynamicPlusLine
Voor de zekerheid: heb je de desbetreffende instellingen in de iSense gebruikt? Ik gebruik RTC+LIMIET met een RT invloed van 8.markvd1962 schreef op zondag 25 december 2022 @ 00:36:
Ik zie het even niet, beetje hulp nodig. Nieuwe Nodo OTGW aangesloten aan een Remeha Avanta met Isense, inclusief buitentemperatuur sensor. Via Wifi en MQTT naar Home Assistant. Alles werkt perfect, zie een hele hoop data. Met een automation in HA lukt het om via "climate: set temperature" een nieuwe "room temperature" op de Isense in te stellen. Nu wil ik graag de aanvoertemperatuur afhankelijk maken van de buitentemperatuur in HA. In OTmonitor kan ik de aanvoertemperatuur aanpassen, maar hoe doe ik dit met een automation in HA? Ik hoop dat dit de juiste plaats is voor deze vraag.
PVOutput - East/West: 26 x QCELLS Q-peak G5 Duo 325Wp, SMA STP6.0-3AV-40, inclination 13°, az 101/281°; South: 14 x Yingly Panda YL260C-30b, SMA SB 3000-TL21, inclination: 23°; az: 101°
Bedankt voor alle reacties.
Ik gebruik niet "RTC + Limiet" maar gewoon RTC. Zojuist de RTC + Limiet geprobeerd, maar dit verandert blijkbaar niet de aanvoertemperatuur. Er is bijna niets te vinden op internet over RTC+Limiet, enkel wat in de handleiding van de Isense staat. 25 keer gelezen, maar het blijft allemaal erg onduidelijk, inclusief wat de RT invloed precies doet. En die "stooklijn" leeft ook nog niet.
Buitentemperatuur wordt netjes door de OTGW doorgegeven aan de Isense. Ik kan zelfs de max CH water setpoint (dus de aanvoertemperatuur) aanpassen in "developer tools". Maar omdat het een entity is lukt dat niet in een automation. Met MQTT topic aan de slag geweest, maar heb eigenlijk geen idee hoe die eruit exact uit moet zien. Ben ik nog mee aan de slag op basis van dit advies (zie heronder), maar zal eerst wat meer tijd in de service mqtt publish moeten steken:
action:
- service: mqtt.publish
data:
topic: OTGW/set/otgw-308398A2F389/command
payload_template: OT={{ states('sensor.garden_sensor_temperature') | float(default=0.0) }}
Ik gebruik niet "RTC + Limiet" maar gewoon RTC. Zojuist de RTC + Limiet geprobeerd, maar dit verandert blijkbaar niet de aanvoertemperatuur. Er is bijna niets te vinden op internet over RTC+Limiet, enkel wat in de handleiding van de Isense staat. 25 keer gelezen, maar het blijft allemaal erg onduidelijk, inclusief wat de RT invloed precies doet. En die "stooklijn" leeft ook nog niet.
Buitentemperatuur wordt netjes door de OTGW doorgegeven aan de Isense. Ik kan zelfs de max CH water setpoint (dus de aanvoertemperatuur) aanpassen in "developer tools". Maar omdat het een entity is lukt dat niet in een automation. Met MQTT topic aan de slag geweest, maar heb eigenlijk geen idee hoe die eruit exact uit moet zien. Ben ik nog mee aan de slag op basis van dit advies (zie heronder), maar zal eerst wat meer tijd in de service mqtt publish moeten steken:
action:
- service: mqtt.publish
data:
topic: OTGW/set/otgw-308398A2F389/command
payload_template: OT={{ states('sensor.garden_sensor_temperature') | float(default=0.0) }}
Ik zit er ook over te denken om de OpenTherm Gateway te gaan aanschaffen. In principe is de nodoshop versie de versie om aan te schaffen toch?
Zijn er mensen die de OpenTherm gateway gebruiken met poe? Heeft dat voordelen?
En heeft het nut om de behuizing erbij te kopen, of kan je net zo goed gewoon een standaard behuizing gebruiken? Voordeel van die van nodoshop is dat ie transparant is uiteraard, kun je nog wat zien.
En hoeveel draden zijn nodig om hem aan te sluiten? Ik heb namelijk 4 draden bij mijn thermostaat zitten, waarvan er op dit moment maar 2 zijn aangesloten. De andere 2 draadjes (het is een telefoonkabel, lijkt het) zijn heel kort afgeknipt.
De thermostaat die ik heb is de Remeha qSense. Ketel is de Remeha avanta 28c. Zou dat nog voor incompatibilities zorgen? Ik zie dat ik evt een Remeha iSense er aan kan hangen, maar ik zou eigenlijk willen switchen naar een modernere thermostaat.
En op termijn wil ik uiteraard naar de warmtepomp en van het gas af. Ik neem aan dat het dan de OpenTherm gateway aan de warmtepomp hangen betekent. En klaar is @Tanuki?
Zijn er mensen die de OpenTherm gateway gebruiken met poe? Heeft dat voordelen?
En heeft het nut om de behuizing erbij te kopen, of kan je net zo goed gewoon een standaard behuizing gebruiken? Voordeel van die van nodoshop is dat ie transparant is uiteraard, kun je nog wat zien.
En hoeveel draden zijn nodig om hem aan te sluiten? Ik heb namelijk 4 draden bij mijn thermostaat zitten, waarvan er op dit moment maar 2 zijn aangesloten. De andere 2 draadjes (het is een telefoonkabel, lijkt het) zijn heel kort afgeknipt.
De thermostaat die ik heb is de Remeha qSense. Ketel is de Remeha avanta 28c. Zou dat nog voor incompatibilities zorgen? Ik zie dat ik evt een Remeha iSense er aan kan hangen, maar ik zou eigenlijk willen switchen naar een modernere thermostaat.
En op termijn wil ik uiteraard naar de warmtepomp en van het gas af. Ik neem aan dat het dan de OpenTherm gateway aan de warmtepomp hangen betekent. En klaar is @Tanuki?

Hij hang hier naast de ketel met een wemos erop, gevoed met een usb kabel. Geen idee of je hem via poe kunt voeden.Tanuki schreef op zondag 25 december 2022 @ 20:29:
Ik zit er ook over te denken om de OpenTherm Gateway te gaan aanschaffen. In principe is de nodoshop versie de versie om aan te schaffen toch?
Zijn er mensen die de OpenTherm gateway gebruiken met poe? Heeft dat voordelen?
Transparant is leuk als je er naar wilt kijken. Op thingiverse kun je eventueel ook een behuizing vinden om te (laten) printen.En heeft het nut om de behuizing erbij te kopen, of kan je net zo goed gewoon een standaard behuizing gebruiken? Voordeel van die van nodoshop is dat ie transparant is uiteraard, kun je nog wat zien.
Lees even de documentatie van de otgw. De otgw komt tussen je thermostaat en je ketel. Er gaan 2 draden in en er komen er 2 uit.En hoeveel draden zijn nodig om hem aan te sluiten? Ik heb namelijk 4 draden bij mijn thermostaat zitten, waarvan er op dit moment maar 2 zijn aangesloten. De andere 2 draadjes (het is een telefoonkabel, lijkt het) zijn heel kort afgeknipt.
Zolang je ketel en de thermostaat opentherm spreken… hij zit hier tussen een toon en een calenta ace. Maar check de compatibility sheet op de website en je ziet wat kan….De thermostaat die ik heb is de Remeha qSense. Ketel is de Remeha avanta 28c. Zou dat nog voor incompatibilities zorgen? Ik zie dat ik evt een Remeha iSense er aan kan hangen, maar ik zou eigenlijk willen switchen naar een modernere thermostaat.
Ik ken geen voorbeelden van otgw en warmtepompen, maar wil niet zeggen dat die er niet zijn.En op termijn wil ik uiteraard naar de warmtepomp en van het gas af. Ik neem aan dat het dan de OpenTherm gateway aan de warmtepomp hangen betekent. En klaar is @Tanuki?
Beste mensen,
Zijn er binnen dit forum ervaringen met de Theben RAMSES 850 BLE OT, ook in relatie met de OTGW?
https://www.theben-nederl...Bedieningshandleiding.PDF
Zijn er binnen dit forum ervaringen met de Theben RAMSES 850 BLE OT, ook in relatie met de OTGW?
https://www.theben-nederl...Bedieningshandleiding.PDF
PS: Mijn probleem is opgelost: aanvoertemperatuur instellen op OTGW vanuit HA. Inderdaad een simpel MQTT berichtje. Uitzoeken koste echter een halve dag:
action:
- service: mqtt.publish
data:
topic: OTGW/set/otgw-BCFF4DF96743/command
payload: SH=55
action:
- service: mqtt.publish
data:
topic: OTGW/set/otgw-BCFF4DF96743/command
payload: SH=55
Ik zie dat er op de OTGW GPIO pinnen zijn die als output geschakeld kunnen worden (switch on/off). Misschien kan de pomp van de vloerverwarming hiermee geschakeld gaan worden. Iemand enige ervaring hiermee?
Zo hier afgelopen vrijdag ook een otgw setje mogen ontvangen. Bij in elkaar zetten van het setje, gelijk het ssid proberen ter configureren in de wemos esp. Via wifi accesspoint kon ik wel bij de esp en had het volgende plaatje (even gequote van Ruudsterje)
Kon ik wel op de knoppen drukken en werd er een nieuwe pagina geopend die leeg bleef.
(Volgende de rvanbreemen girhub page over otgw firmware page) met de esp direkt op de laptop los van de otgw.
Eerst de ESPEasy_R147_4096.bin geupload, dit leverde niet echt een goed resultaat op (de upload ging prima overgens)
Daarna OTGW-firmware.0.9.5+4eb7d24.mklittlefs.bin geupload en had ik weer het zelfde resultaat wel bedienbare knoppen die naar een lege pagina verwijzen.
Daarna OTGW-firmware.0.9.5+4eb7d24.ino.bin geladen en kon ik mijn ssid en pasword invoeren, en logde de esp in op het wifinetwerk. Via otmonitor.exe kan ik de otgw zien en wordt er contakt gemaakt.
Alleen op de webpage (esp eigen ip adres) werd er gevraag om FSexplorer.css en FSexplorer.html te uploaden. Dit gedaan, en op het esp ip addres is nog steeds het zelfde page te zien die vraagt om de FSexplores files.
Na instalatie tussen de ketel en termostaat (nefit nxt en nefid easy) kan ik nu de info aflezen.
Via domoticx op port 25265 heb ik contakt met de otgw, dit werkt dus gewoon. Alleen zijn eigen homepage doet het dus niet.
Iemand nog een goed idee om dit op te lossen?
Kon ik wel op de knoppen drukken en werd er een nieuwe pagina geopend die leeg bleef.
(Volgende de rvanbreemen girhub page over otgw firmware page) met de esp direkt op de laptop los van de otgw.
Eerst de ESPEasy_R147_4096.bin geupload, dit leverde niet echt een goed resultaat op (de upload ging prima overgens)
Daarna OTGW-firmware.0.9.5+4eb7d24.mklittlefs.bin geupload en had ik weer het zelfde resultaat wel bedienbare knoppen die naar een lege pagina verwijzen.
Daarna OTGW-firmware.0.9.5+4eb7d24.ino.bin geladen en kon ik mijn ssid en pasword invoeren, en logde de esp in op het wifinetwerk. Via otmonitor.exe kan ik de otgw zien en wordt er contakt gemaakt.
Alleen op de webpage (esp eigen ip adres) werd er gevraag om FSexplorer.css en FSexplorer.html te uploaden. Dit gedaan, en op het esp ip addres is nog steeds het zelfde page te zien die vraagt om de FSexplores files.
Na instalatie tussen de ketel en termostaat (nefit nxt en nefid easy) kan ik nu de info aflezen.
Via domoticx op port 25265 heb ik contakt met de otgw, dit werkt dus gewoon. Alleen zijn eigen homepage doet het dus niet.
Iemand nog een goed idee om dit op te lossen?
[Voor 22% gewijzigd door macheld op 29-12-2022 15:32]
20x47mm solarboiler in 200l vat met naverwarming via houtkachel en cv
@macheld het filesystem heb je niet geflashd.
Kijk hier voor instructies:
https://github.com/rvdbreemen/OTGW-firmware/wiki
Succes,
Robert
Kijk hier voor instructies:
https://github.com/rvdbreemen/OTGW-firmware/wiki
Succes,
Robert
Bedankt voor de tip vannavond even proberen.
tnx
tnx
20x47mm solarboiler in 200l vat met naverwarming via houtkachel en cv
CVILLE, misschien zie je dit berichtje. Je vertelde dat je RTC+LIMIET met een RT invloed van 8 gebruikt. Ik ben er mee aan de slag gegaan. Lijkt precies wat ik zoek. Wat zijn je stooklijn instellingen? (als leidraad).
Hier zijn al mijn instellingen:markvd1962 schreef op zaterdag 31 december 2022 @ 18:31:
CVILLE, misschien zie je dit berichtje. Je vertelde dat je RTC+LIMIET met een RT invloed van 8 gebruikt. Ik ben er mee aan de slag gegaan. Lijkt precies wat ik zoek. Wat zijn je stooklijn instellingen? (als leidraad).
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| # Parameter min max eenheid 2022-12-09 20:51 Itho Daalderop Base Cube Duo 24/35 CW5 CV temperatuur LT 30 90 °C 50 CV temperatuur HT 30 90 °C 60 Nadraaien CV 1 60 m 10 Laagbrandtijd 0 15 m 5 Acceleratietijd 0 10 m 5 Antipendeltijd 0 6 m 3 Ketelveiligheid 5 20 °C 10 CV LT bewaking 55 65 °C 55 HT prioriteit 0 100 % 25 HT cyclustijd 20 90 m 60 MAX CV vermogen 7 24 kW 24 Wilo Yonos Para RS Ku 15/6 RKA CM 130 3 stand ΔP-c: 6 Comap differentieel drukregelaar 872B bar 0.5 MAX Remeha iSense - woonkamer Nachtprogramma HH:MM 22:00-08:00 Setpoint dag °C 21.5 Setpoint nacht °C 19.0 Regelstrategie °C RTC+LIMIET RT-invloed 8.0 Voetpunt buiten 10.0 Voetpunt aanvoer 30.0 Klimaatpunt buiten -10.0 Klimaatpunt aanvoer 45.0 Kromming VV Comfort correctie UIT Pompsturing AAN Vermogensturing AAN Opwarmsnelheid EXTRA L Afkoelsnelheid LANGZST Maximale aanwarmtijd m 0.0 Minimale CV temperatuur °C 37 Maximale CV temperatuur °C 45 Warmwater Anti-L Warmhouden UIT Tapwatertemperatuur °C 60 Therminon Composite LTV verdeler - 11 groepen Wilo Yonos Para 15/6 1" 130 mm pomp ΔP-c: 5 nadraaien pomp 15.0 mengventiel verdeler open 1 keuken l/m 2.0 2 zitkamer west l/m 1.8 3 zitkamer west, midden l/m 1.5 4 zitkamer oost, midden l/m 1.5 5 zitkamer oost l/m 1.5 6 eetkamer l/m 1.0 7 wasruimte l/m 1.0 8 slaapkamer l/m 0.7 9 logeerkamer l/m 1.0 10 badkamer l/m 1.5 11 berging l/m 0.1 Badkamerradiator radiatorkraan slagen open GEEL = gewijzigde instelling |
Sorry voor de formatting; bij mij zijn het mooie Excel kolommen.
PVOutput - East/West: 26 x QCELLS Q-peak G5 Duo 325Wp, SMA STP6.0-3AV-40, inclination 13°, az 101/281°; South: 14 x Yingly Panda YL260C-30b, SMA SB 3000-TL21, inclination: 23°; az: 101°
Cville, precies wat ik zocht. In de Isense handleiding staat wel wat adviezen voor de stooklijn, maar dat werkte gewoon niet voor RTC+limiet. Ik ben al wat gaan proberen en zie nu dat ik in de goede richting zit. Ik begin door te krijgen hoe e.e.a. werkt. Bedankt!
Ik ben benieuwd of je de DIYLess gateway al via MQTT aan de praat heb gekregen? Mijn programmeer skills zijn niet optimaal en ik loop enorm te hannessen om de gateway voorbeelden om te bouwen tot iets werkbaars in HA. Zou jij je code willen delen indien het jou wel is gelukt?Lasoul schreef op vrijdag 9 september 2022 @ 20:03:
[...]
Okay ik heb de nieuwe gateway van Nodoshop binnen en deze geeft helaas hetzelfde probleem.![]()
Ik heb ook via Diyless ook een gateway besteld. Deze moet je dan wel zelf via Arduino programmeren. Deze heb ik vandaag binnen gekregen en die werkt gewoon.
Aankomend weekend maar even snel een programma in elkaar zetten zodat ik het kan gebruiken in Home Assistant via MQTT. Ik wil namelijk vanuit Home Assistant de CV temperatuur en het tapwater temperatuur kunnen zetten (zonneboiler).
hoe kan ik de esp flashen met een Macbook, ben al uren bezig maar ik kan alleen maar 1 file erin zetten.
Geen probleem.Toets schreef op maandag 2 januari 2023 @ 17:07:
[...]
Ik ben benieuwd of je de DIYLess gateway al via MQTT aan de praat heb gekregen? Mijn programmeer skills zijn niet optimaal en ik loop enorm te hannessen om de gateway voorbeelden om te bouwen tot iets werkbaars in HA. Zou jij je code willen delen indien het jou wel is gelukt?
Ik heb onderstaande gemaakt zodat ik de warmwater temperatuur en CV temperatuur van de thermostaat kan overriden in Home Assistant. Ik heb namelijk een zonneboiler en 's zomers wil ik de warmwater temperatuur dynamisch schakelen.
De code is helaas behoorlijk lang dus ik heb het in twee gedeeltes bijgevoegd, excuus voor de rest maar wellicht ook interessant voor anderen

Je moet alleen even je eigen WiFi en MQTT broker gegevens invullen
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 /* OpenTherm Gateway/Monitor MQTT control Boardsmanager https://arduino.esp8266.com/stable/package_esp8266com_index.json LOLIN(WEMOS) D1 R2 & mini Settings: Upload Speed: 921600 CPU Frequency: 80Mhz Flash Size: 4MB (FS:2MB OTA:~1019KB) lwIP Variant: v1.4 Higher bandwidth Debug Port: Serial / Remote lwIP variant: V2 lower memory Remote Debug Use v to set debuglevel to verbose Dependencies PubSubClient library RemoteDebug library Ticker library ArduinoOTA library OpenTherm library https://github.com/ihormelnyk/opentherm_library Boards: Version: 0.1 12-09-2022 Initial setup 0.2 30-09-2022 Fixed setting the hotwater temperature so that the thermostat can't override it 0.3 19-10-2022 Added the central heating return temperature, pressure and modulation level Fixed temperature setting and CV temperature setting which were swapped Reworked overriding the values; first complete request/response from thermostat than send new message 0.4 26-10-2022 Retry implemented when command fails 0.5 07-11-2022 Ignoring error responses to filter out random values 0.6 23-11-2022 Added ΔT calculation 0.61 11-12-2022 Fixed delta-t of 0, it was incorrectly reported as null */ #include <Arduino.h> #include <Ticker.h> #include <PubSubClient.h> #include <ArduinoOTA.h> #include <OpenTherm.h> #include <RemoteDebug.h> #include <RemoteDebugCfg.h> #include <RemoteDebugWS.h> #include <telnet.h> #define SW_VERSION "0.61" #define HOST_NAME "ESP-OpenThermGW" // Define the pins for the master thermostat #define PIN_MASTER_IN 4 #define PIN_MASTER_OUT 5 // Define the pins for the slave boiler #define PIN_SLAVE_IN 12 #define PIN_SLAVE_OUT 13 // Define the default for the hotwater temperature override #define DEFAULT_HOTWATER_TEMPERATURE_OVERRIDE 55.0 #define STEP_HOTWATER_TEMPERATURE_OVERRIDE 1.0 #define STEP_HOTWATER_TEMPERATURE_OVERRIDE_DOMINATOR 1.0 // The number of times the step fits in 1. This is used for rounding correctly #define MIN_HOTWATER_TEMPERATURE_OVERRIDE 35.0 #define MAX_HOTWATER_TEMPERATURE_OVERRIDE 65.0 // Define the default for the central heating temperature override #define DEFAULT_CENTRALHEATING_TEMPERATURE_OVERRIDE 50.0 #define STEP_CENTRALHEATING_TEMPERATURE_OVERRIDE 1.0 #define STEP_CENTRALHEATING_TEMPERATURE_OVERRIDE_DOMINATOR 1.0 // The number of times the step fits in 1. This is used for rounding correctly #define MIN_CENTRALHEATING_TEMPERATURE_OVERRIDE 35.0 #define MAX_CENTRALHEATING_TEMPERATURE_OVERRIDE 85.0 // Define the default and ranges for the sensor temperatures #define DEFAULT_SENSOR_TEMPERATURE 0.0 #define MIN_SENSOR_TEMPERATURE_BOUNDARY 1.0 #define MAX_SENSOR_TEMPERATURE_BOUNDARY 100.0 // Define the default for the pressure #define DEFAULT_PRESSURE 0.0 #define MIN_PRESSURE_BOUNDARY 0.0 #define MAX_PRESSURE_BOUNDARY 5.0 // Define the default for the modulation #define DEFAULT_MODULATION 0.0 #define MIN_MODULATION 0.0 #define MAX_MODULATION 100.0 #define MAX_COMMAND_RETRIES 5 // WiFi constants const char* WiFi_hostname = HOST_NAME; const char* WiFi_SSID = "*****"; // CHANGE ME const char* WiFi_password = "*****"; // CHANGE ME // MQTT constants const int MQTT_MAX_MESSAGE_SIZE = 650; // Do not reduce the size because it will trigger MQTT publish errors on publish discovery const char* MQTT_server = "mqttbroker"; // CHANGE ME const char* MQTT_username = "mqtt"; // CHANGE ME const char* MQTT_password = "*****"; // CHANGE ME // Unique identifiers for the device and the sensors/numbers etc. const char* MQTT_openthermgw_unique_id = "ESP-OpenThermGW"; const char* MQTT_openthermgw_number_temperature_hotwater_override_unique_id = "ESP-OpenThermGW-number-temperature-hotwater-override"; const char* MQTT_openthermgw_number_temperature_centralheating_override_unique_id = "ESP-OpenThermGW-number-temperature-centralheating-override"; const char* MQTT_openthermgw_sensor_temperature_set_hotwater_unique_id = "ESP-OpenThermGW-sensor-temperature-set-hotwater"; const char* MQTT_openthermgw_sensor_temperature_set_centralheating_unique_id = "ESP-OpenThermGW-sensor-temperature-set-centralheating"; const char* MQTT_openthermgw_sensor_temperature_hotwater_unique_id = "ESP-OpenThermGW-sensor-temperature-hotwater"; const char* MQTT_openthermgw_sensor_temperature_centralheating_unique_id = "ESP-OpenThermGW-sensor-temperature-centralheating"; const char* MQTT_openthermgw_sensor_temperature_return_unique_id = "ESP-OpenThermGW-sensor-temperature-return"; const char* MQTT_openthermgw_sensor_temperature_delta_t_unique_id = "ESP-OpenThermGW-sensor-temperature-delta-t"; const char* MQTT_openthermgw_sensor_pressure_unique_id = "ESP-OpenThermGW-sensor-pressure"; const char* MQTT_openthermgw_sensor_modulation_unique_id = "ESP-OpenThermGW-sensor-modulation"; const char* MQTT_command_topic_short = "~/set"; const char* MQTT_openthermgw_state_topic = "homeassistant/openthermgw/state"; const char* MQTT_openthermgw_number_temperature_hotwater_override_base_topic = "homeassistant/number/openthermgw/temperature-hotwater-override"; const char* MQTT_openthermgw_number_temperature_hotwater_override_config_topic = "homeassistant/number/openthermgw/temperature-hotwater-override/config"; const char* MQTT_openthermgw_number_temperature_hotwater_override_command_topic = "homeassistant/number/openthermgw/temperature-hotwater-override/set"; const char* MQTT_openthermgw_number_temperature_hotwater_override_config_topic_value = "{{ value_json.temperature_hotwater_override }}"; const char* MQTT_openthermgw_number_temperature_centralheating_override_base_topic = "homeassistant/number/openthermgw/temperature-centralheating-override"; const char* MQTT_openthermgw_number_temperature_centralheating_override_config_topic = "homeassistant/number/openthermgw/temperature-centralheating-override/config"; const char* MQTT_openthermgw_number_temperature_centralheating_override_command_topic = "homeassistant/number/openthermgw/temperature-centralheating-override/set"; const char* MQTT_openthermgw_number_temperature_centralheating_override_config_topic_value = "{{ value_json.temperature_centralheating_override }}"; const char* MQTT_openthermgw_sensor_temperature_set_hotwater_base_topic = "homeassistant/sensor/openthermgw/temperature-set-hotwater"; const char* MQTT_openthermgw_sensor_temperature_set_hotwater_config_topic = "homeassistant/sensor/openthermgw/temperature-set-hotwater/config"; const char* MQTT_openthermgw_sensor_temperature_set_hotwater_config_topic_name = "Hotwater set temperature"; const char* MQTT_openthermgw_sensor_temperature_set_hotwater_config_topic_value = "{{ value_json.temperature_set_hotwater }}"; const char* MQTT_openthermgw_sensor_temperature_set_centralheating_base_topic = "homeassistant/sensor/openthermgw/temperature-set-centralheating"; const char* MQTT_openthermgw_sensor_temperature_set_centralheating_config_topic = "homeassistant/sensor/openthermgw/temperature-set-centralheating/config"; const char* MQTT_openthermgw_sensor_temperature_set_centralheating_config_topic_name = "Central heating set temperature"; const char* MQTT_openthermgw_sensor_temperature_set_centralheating_config_topic_value = "{{ value_json.temperature_set_centralheating }}"; const char* MQTT_openthermgw_sensor_temperature_hotwater_base_topic = "homeassistant/sensor/openthermgw/temperature-hotwater"; const char* MQTT_openthermgw_sensor_temperature_hotwater_config_topic = "homeassistant/sensor/openthermgw/temperature-hotwater/config"; const char* MQTT_openthermgw_sensor_temperature_hotwater_config_topic_name = "Hotwater temperature"; const char* MQTT_openthermgw_sensor_temperature_hotwater_config_topic_value = "{{ value_json.temperature_hotwater }}"; const char* MQTT_openthermgw_sensor_temperature_centralheating_base_topic = "homeassistant/sensor/openthermgw/temperature-centralheating"; const char* MQTT_openthermgw_sensor_temperature_centralheating_config_topic = "homeassistant/sensor/openthermgw/temperature-centralheating/config"; const char* MQTT_openthermgw_sensor_temperature_centralheating_config_topic_name = "Central heating temperature"; const char* MQTT_openthermgw_sensor_temperature_centralheating_config_topic_value = "{{ value_json.temperature_centralheating }}"; const char* MQTT_openthermgw_sensor_temperature_return_base_topic = "homeassistant/sensor/openthermgw/temperature-return"; const char* MQTT_openthermgw_sensor_temperature_return_config_topic = "homeassistant/sensor/openthermgw/temperature-return/config"; const char* MQTT_openthermgw_sensor_temperature_return_config_topic_name = "Central heating return temperature"; const char* MQTT_openthermgw_sensor_temperature_return_config_topic_value = "{{ value_json.temperature_return }}"; const char* MQTT_openthermgw_sensor_temperature_delta_t_base_topic = "homeassistant/sensor/openthermgw/temperature-delta-t"; const char* MQTT_openthermgw_sensor_temperature_delta_t_config_topic = "homeassistant/sensor/openthermgw/temperature-delta-t/config"; const char* MQTT_openthermgw_sensor_temperature_delta_t_config_topic_name = "Central heating ΔT"; const char* MQTT_openthermgw_sensor_temperature_delta_t_config_topic_value = "{{ value_json.temperature_delta_t }}"; const char* MQTT_openthermgw_sensor_pressure_base_topic = "homeassistant/sensor/openthermgw/pressure"; const char* MQTT_openthermgw_sensor_pressure_config_topic = "homeassistant/sensor/openthermgw/pressure/config"; const char* MQTT_openthermgw_sensor_pressure_config_topic_name = "Central heating pressure"; const char* MQTT_openthermgw_sensor_pressure_config_topic_value = "{{ value_json.pressure }}"; const char* MQTT_openthermgw_sensor_modulation_base_topic = "homeassistant/sensor/openthermgw/modulation"; const char* MQTT_openthermgw_sensor_modulation_config_topic = "homeassistant/sensor/openthermgw/modulation/config"; const char* MQTT_openthermgw_sensor_modulation_config_topic_name = "Central heating modulation"; const char* MQTT_openthermgw_sensor_modulation_config_topic_value = "{{ value_json.modulation }}"; const char* MQTT_openthermgw_state_payload = "{\"temperature_hotwater_override\": %s," "\"temperature_centralheating_override\": %s," "\"temperature_set_hotwater\": %s," "\"temperature_set_centralheating\": %s," "\"temperature_hotwater\": %s," "\"temperature_centralheating\": %s," "\"temperature_return\": %s," "\"temperature_delta_t\": %s," "\"pressure\": %.1f," "\"modulation\": %.1f}"; const char* MQTT_config_openthermgw_number_temperature_hotwater_override_topic_payload = "{\"~\": \"%s\"," "\"name\": \"Hotwater temperature override\"," // name "\"uniq_id\": \"%s\"," // unique_id "\"ic\": \"mdi:numeric\"," // icon "\"cmd_t\": \"%s\"," // command_topic "\"stat_t\": \"%s\"," // state_topic "\"min\": %.1f," // min "\"max\": %.1f," // max "\"step\": %.1f," // step "\"unit_of_meas\": \"°C\"," // unit_of_measurement "\"val_tpl\": \"%s\"," // value_template "\"ret\": true," // retain "\"dev\": {" // device "\"name\": \"OpenTherm Gateway control\"," "\"mf\": \"Patrick Vorgers\"," // manufacturer "\"mdl\": \"OTGWC 1.0\"," // model "\"sw\": \""SW_VERSION"\"," // sw_version "\"ids\": [\"%s\"]" // identifiers "}" "}"; const char* MQTT_config_openthermgw_number_temperature_centralheating_override_topic_payload = "{\"~\": \"%s\"," "\"name\": \"Central heating temperature override\"," // name "\"uniq_id\": \"%s\"," // unique_id "\"ic\": \"mdi:numeric\"," // icon "\"cmd_t\": \"%s\"," // command_topic "\"stat_t\": \"%s\"," // state_topic "\"min\": %.1f," // min "\"max\": %.1f," // max "\"step\": %.1f," // step "\"unit_of_meas\": \"°C\"," // unit_of_measurement "\"val_tpl\": \"%s\"," // value_template "\"ret\": true," // retain "\"dev\": {" // device "\"name\": \"OpenTherm Gateway control\"," "\"mf\": \"Patrick Vorgers\"," // manufacturer "\"mdl\": \"OTGWC 1.0\"," // model "\"sw\": \""SW_VERSION"\"," // sw_version "\"ids\": [\"%s\"]" // identifiers "}" "}"; const char* MQTT_config_openthermgw_sensor_temperature_generic_topic_payload = "{\"~\": \"%s\"," "\"name\": \"%s\"," // name "\"uniq_id\": \"%s\"," // unique_id "\"ic\": \"mdi:thermometer\"," // icon "\"dev_cla\": \"temperature\"," // device_class "\"stat_t\": \"%s\"," // state_topic "\"unit_of_meas\": \"°C\"," // unit_of_measurement "\"val_tpl\": \"%s\"," // value_template "\"frc_upd\": true," // force_update (when value does not change still send update for history graphs) "\"stat_cla\": \"measurement\"," // state_class "\"dev\": {" // device "\"name\": \"OpenTherm Gateway control\"," "\"mf\": \"Patrick Vorgers\"," // manufacturer "\"mdl\": \"OTGWC 1.0\"," // model "\"sw\": \""SW_VERSION"\"," // sw_version "\"ids\": [\"%s\"]" // identifiers "}" "}"; const char* MQTT_config_openthermgw_sensor_pressure_topic_payload = "{\"~\": \"%s\"," "\"name\": \"%s\"," // name "\"uniq_id\": \"%s\"," // unique_id "\"dev_cla\": \"pressure\"," // device_class "\"stat_t\": \"%s\"," // state_topic "\"unit_of_meas\": \"bar\"," // unit_of_measurement "\"val_tpl\": \"%s\"," // value_template "\"frc_upd\": true," // force_update (when value does not change still send update for history graphs) "\"stat_cla\": \"measurement\"," // state_class "\"dev\": {" // device "\"name\": \"OpenTherm Gateway control\"," "\"mf\": \"Patrick Vorgers\"," // manufacturer "\"mdl\": \"OTGWC 1.0\"," // model "\"sw\": \""SW_VERSION"\"," // sw_version "\"ids\": [\"%s\"]" // identifiers "}" "}"; const char* MQTT_config_openthermgw_sensor_modulation_topic_payload = "{\"~\": \"%s\"," "\"name\": \"%s\"," // name "\"uniq_id\": \"%s\"," // unique_id "\"dev_cla\": \"power_factor\"," // device_class "\"stat_t\": \"%s\"," // state_topic "\"unit_of_meas\": \"%\"," // unit_of_measurement "\"val_tpl\": \"%s\"," // value_template "\"frc_upd\": true," // force_update (when value does not change still send update for history graphs) "\"stat_cla\": \"measurement\"," // state_class "\"dev\": {" // device "\"name\": \"OpenTherm Gateway control\"," "\"mf\": \"Patrick Vorgers\"," // manufacturer "\"mdl\": \"OTGWC 1.0\"," // model "\"sw\": \""SW_VERSION"\"," // sw_version "\"ids\": [\"%s\"]" // identifiers "}" "}"; const int Discovery_Update_Interval = 5 * 60; // In seconds const int State_Update_Interval = 30; // In seconds // Global variables WiFiClient espClient; PubSubClient client(espClient); Ticker discoveryPublishTimer, openthermgwStatePublishTimer; RemoteDebug Debug; bool discoveryUpdateFlag = false, openthermgwStateUpdateFlag = false; OpenTherm boilerOpenTherm(PIN_MASTER_IN, PIN_MASTER_OUT); OpenTherm thermostatOpenTherm(PIN_SLAVE_IN, PIN_SLAVE_OUT, true); float temperatureCentralheatingOverride = DEFAULT_CENTRALHEATING_TEMPERATURE_OVERRIDE; float temperatureHotwaterOverride = DEFAULT_HOTWATER_TEMPERATURE_OVERRIDE; float temperatureReturn = DEFAULT_SENSOR_TEMPERATURE; float temperatureSetCentralheating = DEFAULT_SENSOR_TEMPERATURE; float temperatureSetHotwater = DEFAULT_SENSOR_TEMPERATURE; float temperatureCentralheating = DEFAULT_SENSOR_TEMPERATURE; float temperatureHotwater = DEFAULT_SENSOR_TEMPERATURE; float boilerPressure = DEFAULT_PRESSURE; float boilerModulation = DEFAULT_MODULATION; // Convert the OpenTherm messageID to a string const char* openThermMessageIDToString(OpenThermMessageID messageID) { switch(messageID) { case OpenThermMessageID::Status: return("Status"); // flag8 / flag8 Master and Slave Status flags. case OpenThermMessageID::TSet: return("TSet"); // f8.8 Control setpoint ie CH water temperature setpoint (°C) case OpenThermMessageID::MConfigMMemberIDcode: return("MConfigMMemberIDcode"); // flag8 / u8 Master Configuration Flags / Master MemberID Code case OpenThermMessageID::SConfigSMemberIDcode: return("SConfigSMemberIDcode"); // flag8 / u8 Slave Configuration Flags / Slave MemberID Code case OpenThermMessageID::Command: return("Command"); // u8 / u8 Remote Command case OpenThermMessageID::ASFflags: return("ASFflags"); // / OEM-fault-code flag8 / u8 Application-specific fault flags and OEM fault code case OpenThermMessageID::RBPflags: return("RBPflags"); // flag8 / flag8 Remote boiler parameter transfer-enable & read/write flags case OpenThermMessageID::CoolingControl: return("CoolingControl"); // f8.8 Cooling control signal (%) case OpenThermMessageID::TsetCH2: return("TsetCH2"); // f8.8 Control setpoint for 2e CH circuit (°C) case OpenThermMessageID::TrOverride: return("TrOverride"); // f8.8 Remote override room setpoint case OpenThermMessageID::TSP: return("TSP"); // u8 / u8 Number of Transparent-Slave-Parameters supported by slave case OpenThermMessageID::TSPindexTSPvalue: return("TSPindexTSPvalue"); // u8 / u8 Index number / Value of referred-to transparent slave parameter. case OpenThermMessageID::FHBsize: return("FHBsize"); // u8 / u8 Size of Fault-History-Buffer supported by slave case OpenThermMessageID::FHBindexFHBvalue: return("FHBindexFHBvalue"); // u8 / u8 Index number / Value of referred-to fault-history buffer entry. case OpenThermMessageID::MaxRelModLevelSetting: return("MaxRelModLevelSetting"); // f8.8 Maximum relative modulation level setting (%) case OpenThermMessageID::MaxCapacityMinModLevel: return("MaxCapacityMinModLevel"); // u8 / u8 Maximum boiler capacity (kW) / Minimum boiler modulation level(%) case OpenThermMessageID::TrSet: return("TrSet"); // f8.8 Room Setpoint (°C) case OpenThermMessageID::RelModLevel: return("RelModLevel"); // f8.8 Relative Modulation Level (%) case OpenThermMessageID::CHPressure: return("CHPressure"); // f8.8 Water pressure in CH circuit (bar) case OpenThermMessageID::DHWFlowRate: return("DHWFlowRate"); // f8.8 Water flow rate in DHW circuit. (litres/minute) case OpenThermMessageID::DayTime: return("DayTime"); // special / u8 Day of Week and Time of Day case OpenThermMessageID::Date: return("Date"); // u8 / u8 Calendar date case OpenThermMessageID::Year: return("Year"); // u16 Calendar year case OpenThermMessageID::TrSetCH2: return("TrSetCH2"); // f8.8 Room Setpoint for 2nd CH circuit (°C) case OpenThermMessageID::Tr: return("Tr"); // f8.8 Room temperature (°C) case OpenThermMessageID::Tboiler: return("Tboiler"); // f8.8 Boiler flow water temperature (°C) case OpenThermMessageID::Tdhw: return("Tdhw"); // f8.8 DHW temperature (°C) case OpenThermMessageID::Toutside: return("Toutside"); // f8.8 Outside temperature (°C) case OpenThermMessageID::Tret: return("Tret"); // f8.8 Return water temperature (°C) case OpenThermMessageID::Tstorage: return("Tstorage"); // f8.8 Solar storage temperature (°C) case OpenThermMessageID::Tcollector: return("Tcollector"); // f8.8 Solar collector temperature (°C) case OpenThermMessageID::TflowCH2: return("TflowCH2"); // f8.8 Flow water temperature CH2 circuit (°C) case OpenThermMessageID::Tdhw2: return("Tdhw2"); // f8.8 Domestic hot water temperature 2 (°C) case OpenThermMessageID::Texhaust: return("Texhaust"); // s16 Boiler exhaust temperature (°C) case OpenThermMessageID::TdhwSetUBTdhwSetLB: return("TdhwSetUBTdhwSetLB"); // s8 / s8 DHW setpoint upper & lower bounds for adjustment (°C) case OpenThermMessageID::MaxTSetUBMaxTSetLB: return("MaxTSetUBMaxTSetLB"); // s8 / s8 Max CH water setpoint upper & lower bounds for adjustment (°C) case OpenThermMessageID::HcratioUBHcratioLB: return("HcratioUBHcratioLB"); // s8 / s8 OTC heat curve ratio upper & lower bounds for adjustment case OpenThermMessageID::TdhwSet: return("TdhwSet"); // f8.8 DHW setpoint (°C) (Remote parameter 1) case OpenThermMessageID::MaxTSet: return("MaxTSet"); // f8.8 Max CH water setpoint (°C) (Remote parameters 2) case OpenThermMessageID::Hcratio: return("Hcratio"); // f8.8 OTC heat curve ratio (°C) (Remote parameter 3) case OpenThermMessageID::RemoteOverrideFunction: return("RemoteOverrideFunction"); // flag8 / - Function of manual and program changes in master and remote room setpoint. case OpenThermMessageID::OEMDiagnosticCode: return("OEMDiagnosticCode"); // u16 OEM-specific diagnostic/service code case OpenThermMessageID::BurnerStarts: return("BurnerStarts"); // u16 Number of starts burner case OpenThermMessageID::CHPumpStarts: return("CHPumpStarts"); // u16 Number of starts CH pump case OpenThermMessageID::DHWPumpValveStarts: return("DHWPumpValveStarts"); // u16 Number of starts DHW pump/valve case OpenThermMessageID::DHWBurnerStarts: return("DHWBurnerStarts"); // u16 Number of starts burner during DHW mode case OpenThermMessageID::BurnerOperationHours: return("BurnerOperationHours"); // u16 Number of hours that burner is in operation (i.e. flame on) case OpenThermMessageID::CHPumpOperationHours: return("CHPumpOperationHours"); // u16 Number of hours that CH pump has been running case OpenThermMessageID::DHWPumpValveOperationHours: return("DHWPumpValveOperationHours"); // u16 Number of hours that DHW pump has been running or DHW valve has been opened case OpenThermMessageID::DHWBurnerOperationHours: return("DHWBurnerOperationHours"); // u16 Number of hours that burner is in operation during DHW mode case OpenThermMessageID::OpenThermVersionMaster: return("OpenThermVersionMaster"); // f8.8 The implemented version of the OpenTherm Protocol Specification in the master. case OpenThermMessageID::OpenThermVersionSlave: return("OpenThermVersionSlave"); // f8.8 The implemented version of the OpenTherm Protocol Specification in the slave. case OpenThermMessageID::MasterVersion: return("MasterVersion"); // u8 / u8 Master product version number and type case OpenThermMessageID::SlaveVersion: return("SlaveVersion"); // u8 / u8 Slave product version number and type } return("Unknown"); } void ICACHE_RAM_ATTR boilerHandleInterrupt() { boilerOpenTherm.handleInterrupt(); } void ICACHE_RAM_ATTR thermostatHandleInterrupt() { thermostatOpenTherm.handleInterrupt(); } // Process: Set boiler temperature void process_TSet(unsigned long request, unsigned long response, const char *responseStatus, const char *messageIDDescription) { float temperature = thermostatOpenTherm.getFloat(request); rdebugVln("T%08x B%08x - %s - Processed: Set central heating temperature - %.1f", request, response, messageIDDescription, temperature); // Check if we have to update the temperature by sending a new request to the boiler if (temperature > temperatureCentralheatingOverride) { // Update the boiler temperature unsigned long newRequest = boilerOpenTherm.buildSetBoilerTemperatureRequest(temperatureCentralheatingOverride); unsigned long newResponse = 0; int messageAttempt = 0; do { messageAttempt++; newResponse = boilerOpenTherm.sendRequest(newRequest); if (newResponse) { rdebugVln("T%08x B%08x - %s - %s - The central heating temperature has been overriden to: %.1f", newRequest, newResponse, responseStatus, messageIDDescription, temperatureCentralheatingOverride); temperatureSetCentralheating = temperatureCentralheatingOverride; } else { rdebugVln("T%08x B%08x - %s - %s - Attempt %d of %d: Could not override the central heating temperature to: %.1f", newRequest, newResponse, responseStatus, messageIDDescription, messageAttempt, MAX_COMMAND_RETRIES, temperatureCentralheatingOverride); } } while ((!newResponse) && (messageAttempt < MAX_COMMAND_RETRIES)); } else { temperatureSetCentralheating = temperature; } } // Process: Set hotwater temperature void Process_TdhwSet(unsigned long request, unsigned long response, const char *responseStatus, const char *messageIDDescription) { float temperature = thermostatOpenTherm.getFloat(request); rdebugVln("T%08x B%08x - %s - Processed: Set hotwater temperature - %.1f", request, response, messageIDDescription, temperature); // Check if we have to update the hotwater temperature by sending a new request to the boiler if ((temperature > MIN_HOTWATER_TEMPERATURE_OVERRIDE) && (temperature != temperatureHotwaterOverride)) { // Update the boiler temperature unsigned long newRequest = boilerOpenTherm.buildSetBoilerTemperatureRequest(temperatureHotwaterOverride); unsigned long newResponse = 0; int messageAttempt = 0; do { messageAttempt++; newResponse = boilerOpenTherm.sendRequest(newRequest); if (newResponse) { rdebugVln("T%08x B%08x - %s - %s - The hotwater temperature has been overriden to: %.1f", newRequest, newResponse, responseStatus, messageIDDescription, temperatureHotwaterOverride); temperatureSetHotwater = temperatureHotwaterOverride; } else { rdebugVln("T%08x B%08x - %s - %s - Attempt %d of %d: Could not override the hotwater temperature to: %.1f", newRequest, newResponse, responseStatus, messageIDDescription, messageAttempt, MAX_COMMAND_RETRIES, temperatureHotwaterOverride); } } while ((!newResponse) && (messageAttempt < MAX_COMMAND_RETRIES)); } else { temperatureSetHotwater = temperature; } } // Process: Get generic value void ProcessGenericValue(unsigned long request, unsigned long response, const char *responseStatus, const char *messageIDDescription, float *refValue, const char* text, const float minBoundary, const float maxBoundary) { float readValue = boilerOpenTherm.getFloat(response); // Check if we have a valid response if (boilerOpenTherm.isValidResponse(response)) { if ((readValue > minBoundary) && (readValue < maxBoundary)) { *refValue = readValue; rdebugVln("T%08x B%08x - %s - %s - Received %s - %.1f", request, response, responseStatus, messageIDDescription, text, readValue); } else { rdebugVln("T%08x B%08x - %s - %s - Ignoring out of bounds %s received - %.1f", request, response, responseStatus, messageIDDescription, text, readValue); } } else { rdebugVln("T%08x B%08x - %s - %s - Ignoring received error: %s", request, response, responseStatus, messageIDDescription, text); } } // Process: Get modulation void Process_RelModLevel(unsigned long request, unsigned long response, const char *responseStatus, const char *messageIDDescription) { float readValue = boilerOpenTherm.getFloat(response); // Check if we have a valid response if (boilerOpenTherm.isValidResponse(response)) { if ((readValue >= MIN_MODULATION) && (readValue <= MAX_MODULATION)) { boilerModulation = abs(readValue); // use abs to prevent -0.0 rdebugVln("T%08x B%08x - %s - %s - Received modulation - %.1f", request, response, responseStatus, messageIDDescription, readValue); } else { rdebugVln("T%08x B%08x - %s - %s - Ignoring out of bounds modulation received - %.1f", request, response, responseStatus, messageIDDescription, readValue); } } else { rdebugVln("T%08x B%08x - %s - %s - Ignoring received error: modulation", request, response, responseStatus, messageIDDescription); } } void processRequestResponse(unsigned long request, unsigned long response) { OpenThermMessageType messageType = thermostatOpenTherm.getMessageType(request); const char *responseStatus = boilerOpenTherm.isValidResponse(response) ? "success" : "error"; if ((messageType == OpenThermMessageType::READ_DATA) || (messageType == OpenThermMessageType::WRITE_DATA)) { OpenThermMessageID messageID = thermostatOpenTherm.getDataID(request); const char *messageIDDescription = openThermMessageIDToString(messageID); switch(messageID) { // Set centralheating temperature case OpenThermMessageID::TSet: { process_TSet(request, response, responseStatus, messageIDDescription); } break; // Set hotwater temperature case OpenThermMessageID::TdhwSet: { Process_TdhwSet(request, response, responseStatus, messageIDDescription); } break; // Get centralheating temperature case OpenThermMessageID::Tboiler: { ProcessGenericValue(request, response, responseStatus, messageIDDescription, &temperatureCentralheating, "central heating temperature", MIN_SENSOR_TEMPERATURE_BOUNDARY, MAX_SENSOR_TEMPERATURE_BOUNDARY); } break; // Get hotwater temperature case OpenThermMessageID::Tdhw: { ProcessGenericValue(request, response, responseStatus, messageIDDescription, &temperatureHotwater, "hotwater temperature", MIN_SENSOR_TEMPERATURE_BOUNDARY, MAX_SENSOR_TEMPERATURE_BOUNDARY); } break; // Get return temperature case OpenThermMessageID::Tret: { ProcessGenericValue(request, response, responseStatus, messageIDDescription, &temperatureReturn, "return temperature", MIN_SENSOR_TEMPERATURE_BOUNDARY, MAX_SENSOR_TEMPERATURE_BOUNDARY); } break; // Get centralheating pressure case OpenThermMessageID::CHPressure: { ProcessGenericValue(request, response, responseStatus, messageIDDescription, &boilerPressure, "pressure", MIN_PRESSURE_BOUNDARY, MAX_PRESSURE_BOUNDARY); } break; // Get centralheating modulation level case OpenThermMessageID::RelModLevel: { Process_RelModLevel(request, response, responseStatus, messageIDDescription); } break; default: { rdebugVln("T%08x B%08x - %s - %s", request, response, responseStatus, messageIDDescription); } } } else { rdebugVln("T%08x B%08x - %s", request, response, responseStatus); } } // Determine the response that has to be send to the thermostat. That could be response from boiler or response from gateway because of override unsigned long determineResponse(unsigned long request) { OpenThermMessageType messageType = thermostatOpenTherm.getMessageType(request); unsigned long overrideResponse = 0; if (messageType == OpenThermMessageType::WRITE_DATA) { OpenThermMessageID messageID = thermostatOpenTherm.getDataID(request); switch(messageID) { // Set centralheating temperature case OpenThermMessageID::TSet: { // Check if we are going to update the central heating temperature by sending a new request to the boiler // We first reply to the thermostat that the requested temperature has been set by the boiler than a new request is send to the boiler float temperature = thermostatOpenTherm.getFloat(request); if (temperature > temperatureCentralheatingOverride) { overrideResponse = boilerOpenTherm.buildResponse(OpenThermMessageType::WRITE_ACK, messageID, boilerOpenTherm.temperatureToData(temperature)); } } break; // Set hotwater temperature case OpenThermMessageID::TdhwSet: { // Check if we are going to update the hotwater temperature by sending a new request to the boiler // We first reply to the thermostat that the requested temperature has been set by the boiler than a new request is send to the boiler float temperature = thermostatOpenTherm.getFloat(request); if ((temperature > MIN_HOTWATER_TEMPERATURE_OVERRIDE) && (temperature != temperatureHotwaterOverride)) { overrideResponse = boilerOpenTherm.buildResponse(OpenThermMessageType::WRITE_ACK, messageID, boilerOpenTherm.temperatureToData(temperature)); } } } } // Check if a response was created by the gateway otherwise return the response from the boiler return (overrideResponse > 0) ? overrideResponse : boilerOpenTherm.sendRequest(request); } // Handle the request received from the thermostat. Command can be read/get or write/set. void processThermostatRequest(unsigned long request, OpenThermResponseStatus status) { // Determine the reponse for the thermostat unsigned long response = determineResponse(request); // Always send the response to the thermostat even if it is an error (we are in gateway mode) thermostatOpenTherm.sendResponse(response); // Process the request/response so we can determine whether we have to update information or take action processRequestResponse(request, response); } // Print the message received void mqttPrintMessage(char* topic, byte* payload, unsigned int len) { char receivedMessage[len + 1]; // Zero the array so that the string copied is 0 terminated memset(receivedMessage, 0, len + 1); strncpy(receivedMessage, (char *)payload, len); rdebugVln("Message arrived [%s] %s", topic, receivedMessage); } void mqttPublishPrintDebugMessage(const char* startMessage, const char* topic, const char* publishMessage) { rdebugVln("%s publish of message on topic (length: %d): %s", startMessage, strlen(topic), topic); rdebugVln("Published message (length: %d): %s", strlen(publishMessage), publishMessage); } // Publish a message void mqttPublishMessage(const char* topic, const char* message) { char* startMessage = ""; // Make sure that the WiFI is connected and that we are connected to the mqtt broker if ((WiFi.status() == WL_CONNECTED ) && (client.connected())) { // Once connected, publish the command (default is unretained) if (client.publish(topic, message)) { startMessage = "Succesfull"; } else { startMessage = "Failed"; } } else { // Fail safe; status will be out of sync startMessage = "Not connected to broker, failed"; } mqttPublishPrintDebugMessage(startMessage, topic, message); }
[Voor 0% gewijzigd door ThinkPad op 09-01-2023 07:31. Reden: Code even binnen quote tags gezet ivm lang moeten scrollen]
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 // Handle the temperature hotwater command MQTT message void mqttHandleCommandMessageTemperatureHotwaterOverride(byte* payload, unsigned int len) { char receivedCommand[len + 1]; // Zero the array so that the string copied is 0 terminated memset(receivedCommand, 0, len + 1); strncpy(receivedCommand, (char *)payload, len); // The conversion returns 0 if not a number has been specified. The MIN_HOTWATER_TEMPERATURE should be > 0 double newValue = round(strtod(receivedCommand, NULL) * STEP_HOTWATER_TEMPERATURE_OVERRIDE_DOMINATOR) / STEP_HOTWATER_TEMPERATURE_OVERRIDE_DOMINATOR; if ((newValue >= MIN_HOTWATER_TEMPERATURE_OVERRIDE) && (newValue <= MAX_HOTWATER_TEMPERATURE_OVERRIDE)) { // Set Hotwater Temperature in degrees C int messageAttempt = 0; bool messageSuccessfull = false; do { messageAttempt++; messageSuccessfull = boilerOpenTherm.setDHWSetpoint(newValue); if (messageSuccessfull) { temperatureHotwaterOverride = newValue; temperatureSetHotwater = newValue; rdebugVln("The hotwater temperature has been set to: %.1f", newValue); } else { rdebugVln("Attempt %d of %d: Could not set the hotwater temperature to: %.1f", messageAttempt, MAX_COMMAND_RETRIES, newValue); } } while ((!messageSuccessfull) && (messageAttempt < MAX_COMMAND_RETRIES)); } else { rdebugVln("Invalid value received: %s", receivedCommand); } } // Handle the temperature central heating command MQTT message void mqttHandleCommandMessageTemperatureCentralheatingOverride(byte* payload, unsigned int len) { char receivedCommand[len + 1]; // Zero the array so that the string copied is 0 terminated memset(receivedCommand, 0, len + 1); strncpy(receivedCommand, (char *)payload, len); // The conversion returns 0 if not a number has been specified. The MIN_CENTRALHEATING_TEMPERATURE should be > 0 double newValue = round(strtod(receivedCommand, NULL) * STEP_CENTRALHEATING_TEMPERATURE_OVERRIDE_DOMINATOR) / STEP_CENTRALHEATING_TEMPERATURE_OVERRIDE_DOMINATOR; if ((newValue >= MIN_CENTRALHEATING_TEMPERATURE_OVERRIDE) && (newValue <= MAX_CENTRALHEATING_TEMPERATURE_OVERRIDE)) { // Set Boiler Temperature in degrees C int messageAttempt = 0; bool messageSuccessfull = false; do { messageAttempt++; messageSuccessfull = boilerOpenTherm.setBoilerTemperature(newValue); if (messageSuccessfull) { temperatureCentralheatingOverride = newValue; temperatureSetCentralheating = newValue; rdebugVln("The central heating temperature has been set to: %.1f", newValue); } else { rdebugVln("Attempt %d of %d: Could not set the central heating temperature to: %.1f", messageAttempt, MAX_COMMAND_RETRIES, newValue); } } while ((!messageSuccessfull) && (messageAttempt < MAX_COMMAND_RETRIES)); } else { rdebugVln("Invalid value received: %s", receivedCommand); } } // Be sure that the temperature read is correct (positive) void convertTemperatureToJSONValue(const float temperature, char *outputBuffer) { if (temperature >= DEFAULT_SENSOR_TEMPERATURE) { sprintf(outputBuffer, "%.1f", temperature); } else { sprintf(outputBuffer, "%s", "null"); } } // Publish on the state of the OpenTherm Gateway void mqttPublishOpenthermgwState(void) { char statePublishMessage[MQTT_MAX_MESSAGE_SIZE]; char temperatureHotwaterOverrideJSONValue[8], temperatureCentralheatingOverrideJSONValue[8]; char temperatureSetHotwaterJSONValue[8], temperatureSetCentralheatingJSONValue[8]; char temperatureHotwaterJSONValue[8], temperatureCentralheatingJSONValue[8]; char temperatureReturnJSONValue[8], temperatureDeltaTJSONValue[8]; // Make sure that the WiFI is connected and that we are connected to the mqtt broker if ((WiFi.status() == WL_CONNECTED ) && (client.connected())) { float temperatureDeltaT = max(temperatureCentralheating - temperatureReturn, (float)0.0); // Convert values to a correct JSON value convertTemperatureToJSONValue(temperatureHotwaterOverride , temperatureHotwaterOverrideJSONValue); convertTemperatureToJSONValue(temperatureCentralheatingOverride, temperatureCentralheatingOverrideJSONValue); convertTemperatureToJSONValue(temperatureSetHotwater, temperatureSetHotwaterJSONValue); convertTemperatureToJSONValue(temperatureSetCentralheating, temperatureSetCentralheatingJSONValue); convertTemperatureToJSONValue(temperatureHotwater, temperatureHotwaterJSONValue); convertTemperatureToJSONValue(temperatureCentralheating, temperatureCentralheatingJSONValue); convertTemperatureToJSONValue(temperatureReturn, temperatureReturnJSONValue); convertTemperatureToJSONValue(temperatureDeltaT, temperatureDeltaTJSONValue); // Format the state payload sprintf(statePublishMessage, MQTT_openthermgw_state_payload, temperatureHotwaterOverrideJSONValue, temperatureCentralheatingOverrideJSONValue, temperatureSetHotwaterJSONValue, temperatureSetCentralheatingJSONValue, temperatureHotwaterJSONValue, temperatureCentralheatingJSONValue, temperatureReturnJSONValue, temperatureDeltaTJSONValue, boilerPressure, boilerModulation); // Publish the state of the valve mqttPublishMessage(MQTT_openthermgw_state_topic , statePublishMessage); } } // MQTT callback void mqttCallback(char* topic, byte* payload, unsigned int len) { mqttPrintMessage(topic, payload, len); // Check if we received a message on the command topic (OpenthermGW number temperature hotwater) if (strcmp(topic, MQTT_openthermgw_number_temperature_hotwater_override_command_topic) == 0) { mqttHandleCommandMessageTemperatureHotwaterOverride(payload, len); } // Check if we received a message on the command topic (OpenthermGW number central heating) if (strcmp(topic, MQTT_openthermgw_number_temperature_centralheating_override_command_topic) == 0) { mqttHandleCommandMessageTemperatureCentralheatingOverride(payload, len); } // Always force the update of the state openthermgwStateUpdateFlag = true; } // Publish on the device discovery topic the hotwater temperature override number void mqttPublishDiscoveryOpenthermgwTemperatureHotwaterOverrideNumber(void) { // Build up the config char discoveryPublishMessage[MQTT_MAX_MESSAGE_SIZE]; sprintf(discoveryPublishMessage, MQTT_config_openthermgw_number_temperature_hotwater_override_topic_payload, MQTT_openthermgw_number_temperature_hotwater_override_base_topic, MQTT_openthermgw_number_temperature_hotwater_override_unique_id, MQTT_command_topic_short, MQTT_openthermgw_state_topic, MIN_HOTWATER_TEMPERATURE_OVERRIDE, MAX_HOTWATER_TEMPERATURE_OVERRIDE, STEP_HOTWATER_TEMPERATURE_OVERRIDE, MQTT_openthermgw_number_temperature_hotwater_override_config_topic_value, MQTT_openthermgw_unique_id); // Publish the configuration mqttPublishMessage(MQTT_openthermgw_number_temperature_hotwater_override_config_topic, discoveryPublishMessage); } // Publish on the device discovery topic the centralheating temperature override number void mqttPublishDiscoveryOpenthermgwTemperatureCentralheatingOverrideNumber(void) { // Build up the config char discoveryPublishMessage[MQTT_MAX_MESSAGE_SIZE]; sprintf(discoveryPublishMessage, MQTT_config_openthermgw_number_temperature_centralheating_override_topic_payload, MQTT_openthermgw_number_temperature_centralheating_override_base_topic, MQTT_openthermgw_number_temperature_centralheating_override_unique_id, MQTT_command_topic_short, MQTT_openthermgw_state_topic, MIN_CENTRALHEATING_TEMPERATURE_OVERRIDE, MAX_CENTRALHEATING_TEMPERATURE_OVERRIDE, STEP_CENTRALHEATING_TEMPERATURE_OVERRIDE, MQTT_openthermgw_number_temperature_centralheating_override_config_topic_value, MQTT_openthermgw_unique_id); // Publish the configuration mqttPublishMessage(MQTT_openthermgw_number_temperature_centralheating_override_config_topic, discoveryPublishMessage); } // Publish on the device discovery topic of a sensor void mqttPublishDiscoveryOpenthermgwSensor(const char* configTopic, const char* topicPayload, const char* sensorName, const char* baseTopic, const char* uniqueId, const char* topicValue) { // Build up the config char discoveryPublishMessage[MQTT_MAX_MESSAGE_SIZE]; sprintf(discoveryPublishMessage, topicPayload, baseTopic, sensorName, uniqueId, MQTT_openthermgw_state_topic, topicValue, MQTT_openthermgw_unique_id); // Publish the configuration mqttPublishMessage(configTopic, discoveryPublishMessage); } // Publish on the device discovery topic for this device void mqttPublishDiscovery(void) { // Make sure that the WiFI is connected and that we are connected to the mqtt broker if ((WiFi.status() == WL_CONNECTED ) && (client.connected())) { // Publish the hotwater temperature number mqttPublishDiscoveryOpenthermgwTemperatureHotwaterOverrideNumber(); // Publish the centralheating temperature number mqttPublishDiscoveryOpenthermgwTemperatureCentralheatingOverrideNumber(); // Publish the set hotwater temperature mqttPublishDiscoveryOpenthermgwSensor( MQTT_openthermgw_sensor_temperature_set_hotwater_config_topic, MQTT_config_openthermgw_sensor_temperature_generic_topic_payload, MQTT_openthermgw_sensor_temperature_set_hotwater_config_topic_name, MQTT_openthermgw_sensor_temperature_set_hotwater_base_topic, MQTT_openthermgw_sensor_temperature_set_hotwater_unique_id, MQTT_openthermgw_sensor_temperature_set_hotwater_config_topic_value); // Publish the set centralheating temperature mqttPublishDiscoveryOpenthermgwSensor( MQTT_openthermgw_sensor_temperature_set_centralheating_config_topic, MQTT_config_openthermgw_sensor_temperature_generic_topic_payload, MQTT_openthermgw_sensor_temperature_set_centralheating_config_topic_name, MQTT_openthermgw_sensor_temperature_set_centralheating_base_topic, MQTT_openthermgw_sensor_temperature_set_centralheating_unique_id, MQTT_openthermgw_sensor_temperature_set_centralheating_config_topic_value); // Publish the hotwater temperature mqttPublishDiscoveryOpenthermgwSensor( MQTT_openthermgw_sensor_temperature_hotwater_config_topic, MQTT_config_openthermgw_sensor_temperature_generic_topic_payload, MQTT_openthermgw_sensor_temperature_hotwater_config_topic_name, MQTT_openthermgw_sensor_temperature_hotwater_base_topic, MQTT_openthermgw_sensor_temperature_hotwater_unique_id, MQTT_openthermgw_sensor_temperature_hotwater_config_topic_value); // Publish the centralheating temperature mqttPublishDiscoveryOpenthermgwSensor( MQTT_openthermgw_sensor_temperature_centralheating_config_topic, MQTT_config_openthermgw_sensor_temperature_generic_topic_payload, MQTT_openthermgw_sensor_temperature_centralheating_config_topic_name, MQTT_openthermgw_sensor_temperature_centralheating_base_topic, MQTT_openthermgw_sensor_temperature_centralheating_unique_id, MQTT_openthermgw_sensor_temperature_centralheating_config_topic_value); // Publish the centralheating return temperature mqttPublishDiscoveryOpenthermgwSensor( MQTT_openthermgw_sensor_temperature_return_config_topic, MQTT_config_openthermgw_sensor_temperature_generic_topic_payload, MQTT_openthermgw_sensor_temperature_return_config_topic_name, MQTT_openthermgw_sensor_temperature_return_base_topic, MQTT_openthermgw_sensor_temperature_return_unique_id, MQTT_openthermgw_sensor_temperature_return_config_topic_value); // Publish the centralheating ΔT mqttPublishDiscoveryOpenthermgwSensor( MQTT_openthermgw_sensor_temperature_delta_t_config_topic, MQTT_config_openthermgw_sensor_temperature_generic_topic_payload, MQTT_openthermgw_sensor_temperature_delta_t_config_topic_name, MQTT_openthermgw_sensor_temperature_delta_t_base_topic, MQTT_openthermgw_sensor_temperature_delta_t_unique_id, MQTT_openthermgw_sensor_temperature_delta_t_config_topic_value); // Publish the centralheating pressure mqttPublishDiscoveryOpenthermgwSensor( MQTT_openthermgw_sensor_pressure_config_topic, MQTT_config_openthermgw_sensor_pressure_topic_payload, MQTT_openthermgw_sensor_pressure_config_topic_name, MQTT_openthermgw_sensor_pressure_base_topic, MQTT_openthermgw_sensor_pressure_unique_id, MQTT_openthermgw_sensor_pressure_config_topic_value); // Publish the centralheating modulation level mqttPublishDiscoveryOpenthermgwSensor( MQTT_openthermgw_sensor_modulation_config_topic, MQTT_config_openthermgw_sensor_modulation_topic_payload, MQTT_openthermgw_sensor_modulation_config_topic_name, MQTT_openthermgw_sensor_modulation_base_topic, MQTT_openthermgw_sensor_modulation_unique_id, MQTT_openthermgw_sensor_modulation_config_topic_value); } } // To prevent software reset (WDT) because of IO/Network/Serial etc. in the ticker we use flags to handle the logic in the main loop void handleUpdateFlags(void) { // Check if we have to update MQTT valve state if (openthermgwStateUpdateFlag) { mqttPublishOpenthermgwState(); openthermgwStateUpdateFlag = false; } // Check if we have to update MQTT discovery if (discoveryUpdateFlag) { mqttPublishDiscovery(); discoveryUpdateFlag = false; } } // Subscribe to all the command topics void mqttSubscribeCommandTopics(void) { // Subscribe to the command topic (Openthem Gateway temperature hotwater) client.subscribe(MQTT_openthermgw_number_temperature_hotwater_override_command_topic); // Subscribe to the command topic (Openthem Gateway temperature central heating) client.subscribe(MQTT_openthermgw_number_temperature_centralheating_override_command_topic); } // MQTT reconnect void mqttReconnect(void) { // Disconnect from the timers discoveryPublishTimer.detach(); openthermgwStatePublishTimer.detach(); // Loop until we're reconnected while (!client.connected()) { rdebugVln("Attempting MQTT connection... "); // Create a random client ID String clientId = WiFi_hostname; clientId += String(random(0xffff), HEX); // Attempt to connect if (WiFi.status() == WL_CONNECTED ) { if (client.connect(clientId.c_str(), MQTT_username, MQTT_password)) { rdebugVln("MQTT connection established"); mqttSubscribeCommandTopics(); // Activate the discovery timer and publish the discovery information directly discoveryPublishTimer.attach(Discovery_Update_Interval, []() { // Set the flag that we have to send out the MQTT discovery discoveryUpdateFlag = true; }); mqttPublishDiscovery(); // Activate the state timer and publish the state information directly openthermgwStatePublishTimer.attach(State_Update_Interval, []() { // Set the flag that we have to send out the MQTT valve state openthermgwStateUpdateFlag = true; }); mqttPublishOpenthermgwState(); } else { rdebugVln("MQTT connection failed, rc = %d, trying again in 5 seconds", client.state()); // Wait 5 seconds before retrying delay(5000); } } else { rdebugVln("failed, WiFi disconnected, try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } // Setup the MQTT connection void setupMQTT(void) { client.setBufferSize(MQTT_MAX_MESSAGE_SIZE); client.setServer(MQTT_server, 1883); client.setCallback(mqttCallback); } // Setup the WiFi network connection void setupConnectWiFi(void){ // Delay of the retry to connect to WiFi unsigned int WiFi_connect_delay_try = 500; // Indicate to act as wifi_client only, defaults to act as both a wifi_client and an access-point. WiFi.mode(WIFI_STA); // Set the hostname of the board - Need to configure: v1.4 Higher bandwidth WiFi.hostname(WiFi_hostname); // Try to connect now WiFi.begin(WiFi_SSID, WiFi_password); Serial.print("Connecting to \"" + String(WiFi_SSID) + "\" with " + String(WiFi_connect_delay_try) + "ms interval with mode WIFI_STA"); Serial.printf("%s", WiFi.mode(WIFI_STA) ? "" : ", mode failed!!"); while(WiFi.status() != WL_CONNECTED) { // Note: if connection is established, and then lost for some reason, ESP will automatically reconnect. This will be done automatically by Wi-Fi library, without any user intervention. delay(WiFi_connect_delay_try); Serial.print("."); } Serial.print("\nConnected to " + String(WiFi_SSID) + " with IP Address: "); Serial.print(WiFi.localIP()); Serial.print("\n"); } // Setup the remote debugging capabilities void setupRemoteDebug(void) { // Initialize the WiFi server Debug.begin(HOST_NAME); // Enable the reset command Debug.setResetCmdEnabled(true); // Profiler (Good to measure times, to optimize codes) Debug.showProfiler(true); // Colors Debug.showColors(true); Debug.handle(); } // Setup Over-The-Air updates void setupOTA(void) { // Cannot use Debug because the telnet session will be terminated during OTA // Port defaults to 8266 // ArduinoOTA.setPort(8266); // Hostname defaults to esp8266-[ChipID] ArduinoOTA.setHostname(WiFi_hostname); // No authentication by default // ArduinoOTA.setPassword("admin"); ArduinoOTA.onStart([]() { String type = (ArduinoOTA.getCommand() == U_FLASH) ? "sketch" : "filesystem"; // NOTE: if updating FS this would be the place to unmount FS using FS.end() Serial.println("OTA: Start updating " + type); }); ArduinoOTA.onEnd([]() { Serial.println("\nOTA: End"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { char progressString[100]; sprintf(progressString, "OTA: Progress: %u%%\r", (progress / (total / 100))); Serial.print(progressString); }); ArduinoOTA.onError([](ota_error_t error) { char errorString[100]; sprintf(errorString, "OTA: Error[%u]: ", error); Serial.print(errorString); if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); } else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); } else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); } else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); } else if (error == OTA_END_ERROR) { Serial.println("End Failed"); } }); ArduinoOTA.begin(); } // Initialize the central heating temperature void initializeBiolerTemperature() { int messageAttempt = 0; do { messageAttempt++; temperatureCentralheating = boilerOpenTherm.getBoilerTemperature(); } while ((!temperatureCentralheating) && (messageAttempt < MAX_COMMAND_RETRIES)); } // Initialize the hotwater temperature void initializeHotwaterTemperature() { int attempt = 0; do { attempt++; temperatureHotwater = boilerOpenTherm.getDHWTemperature(); } while ((!temperatureHotwater) && (attempt < MAX_COMMAND_RETRIES)); } // Initialize the central heating return temperature void initializeReturnTemperature() { int attempt = 0; do { attempt++; temperatureReturn = boilerOpenTherm.getReturnTemperature(); } while ((!temperatureReturn) && (attempt < MAX_COMMAND_RETRIES)); } // Initialize the central heating pressure void initializeBoilerPressure() { int attempt = 0; do { attempt++; boilerPressure = boilerOpenTherm.getPressure(); } while ((!boilerPressure) && (attempt < MAX_COMMAND_RETRIES)); } // Initialize the central heating modulation void initializeBiolerModulation() { int attempt = 0; bool success = false; do { attempt++; unsigned long response = boilerOpenTherm.sendRequest(boilerOpenTherm.buildRequest(OpenThermRequestType::READ, OpenThermMessageID::RelModLevel, 0)); if (boilerOpenTherm.isValidResponse(response)) { success = true; boilerModulation = boilerOpenTherm.getFloat(response); } } while ((!success) && (attempt < MAX_COMMAND_RETRIES)); } // Setup the OpenTherm connection void setupOpenTherm() { boilerOpenTherm.begin(boilerHandleInterrupt); thermostatOpenTherm.begin(thermostatHandleInterrupt, processThermostatRequest); // Initialize the boiler status initializeBiolerTemperature(); initializeHotwaterTemperature(); initializeReturnTemperature(); initializeBoilerPressure(); initializeBiolerModulation(); } // The setup function runs once when you press reset or power the board void setup(void) { const int serial_baud_bit_rate = 115200; // Serial Baud Bit Rate Serial.begin(serial_baud_bit_rate); Serial.println("OpenTherm Gateway started"); // Setup the WiFi connection setupConnectWiFi(); // Setup the remote debug capabilities setupRemoteDebug(); // Setup Over-The-Air updates setupOTA(); // Setup OpenTherm control setupOpenTherm(); // Setup the MQTT connection and subscription setupMQTT(); // Connect to the broker and publish state mqttReconnect(); } void loop() { ArduinoOTA.handle(); if (!client.connected()) { mqttReconnect(); } client.loop(); // Handle any flags that have been set handleUpdateFlags(); // Handle any OpenTherm requests thermostatOpenTherm.process(); // Handle any debug information being created Debug.handle(); yield(); }
[Voor 1% gewijzigd door ThinkPad op 09-01-2023 07:31. Reden: Code even binnen quote tags gezet ivm lang moeten scrollen]
Na een stroomstoring bij Enexis waarbij de stroom er ‘s nachts 6 minuten af is geweest in het hele huis geeft mijn Nodo OTGW helemaal geen data meer door. Is aangesloten via een D1 mini. Die laatste is pingbaar en de website ervan doet t ook maar er komt helemaal geen data meer door. Iemand een idee hoe ik dit kan troubleshooten?
Doet je kachel het nog, lijkt of de Opentherm bus is verstoort.Tomba schreef op dinsdag 3 januari 2023 @ 10:36:
Na een stroomstoring bij Enexis waarbij de stroom er ‘s nachts 6 minuten af is geweest in het hele huis geeft mijn Nodo OTGW helemaal geen data meer door. Is aangesloten via een D1 mini. Die laatste is pingbaar en de website ervan doet t ook maar er komt helemaal geen data meer door. Iemand een idee hoe ik dit kan troubleshooten?
Yup die werkt prima, Toon2 stuurt m nog prima aan.Dapdodo schreef op dinsdag 3 januari 2023 @ 10:45:
[...]
Doet je kachel het nog, lijkt of de Opentherm bus is verstoort.
Aangezien de D1 nog pingbaar is en zijn webserver werkt, zou ik eerder het probleem zoeken in degene die de data moet ontvangen.Tomba schreef op dinsdag 3 januari 2023 @ 10:47:
[...]
Yup die werkt prima, Toon2 stuurt m nog prima aan.
Meekijken met otmonitor geeft geen data en ook via telnet mee koekeloeren geeft niets dus het ligt niet bij Home Assistant.Dapdodo schreef op dinsdag 3 januari 2023 @ 10:50:
[...]
Aangezien de D1 nog pingbaar is en zijn webserver werkt, zou ik eerder het probleem zoeken in degene die de data moet ontvangen.
Ledjes op het PCB die normaal flikkeren doen ook helemaal niets.
Dat van de dode LEDjes herken ik; heb dat ook een paar keer gehad nadat de stroom eraf was geweest. Na een aantal keren stekker eruit-erin kwam de OTGW weer tot leven. Misschien iets dat bij startup de OTGW veel stroom vraagt ofzo -- hoewel ik de door Nodo zelf aanbevolen adapter heb, juist om dat te ondervangen.Tomba schreef op dinsdag 3 januari 2023 @ 10:52:
[...]
Meekijken met otmonitor geeft geen data en ook via telnet mee koekeloeren geeft niets dus het ligt niet bij Home Assistant.
Ledjes op het PCB die normaal flikkeren doen ook helemaal niets.
Ah, kijk ik ben niet de enigeglaswerk schreef op dinsdag 3 januari 2023 @ 10:56:
[...]
Dat van de dode LEDjes herken ik; heb dat ook een paar keer gehad nadat de stroom eraf was geweest. Na een aantal keren stekker eruit-erin kwam de OTGW weer tot leven. Misschien iets dat bij startup de OTGW veel stroom vraagt ofzo -- hoewel ik de door Nodo zelf aanbevolen adapter heb, juist om dat te ondervangen.

Hmm update, restart werkt niet. Heb eens op de Reset knop gedrukt en dan krijg ik:
Iemand een idee hoe ik dat kan fixen? De Toon2 kan de ketel aansturen dus alles zou dan toch gewoon moeten werken?10:01:58.719353 ( 14304| 13584) processOT (1720): Detected PIC firmware version: 6.1
10:01:58.736086 ( 15168| 12288) processOT (1722): Not processed, received from OTGW => (Thermostat disconnected) [23]
[Voor 31% gewijzigd door Tomba op 03-01-2023 11:04]
Super! Bedankt!Lasoul schreef op dinsdag 3 januari 2023 @ 10:28:
[...]
Geen probleem.
Ik heb onderstaande gemaakt zodat ik de warmwater temperatuur en CV temperatuur van de thermostaat kan overriden in Home Assistant. Ik heb namelijk een zonneboiler en 's zomers wil ik de warmwater temperatuur dynamisch schakelen.
*Knip*

Ketel en Toon beiden van de stroom af gehad, melding blijft:Tomba schreef op dinsdag 3 januari 2023 @ 10:57:
[...]
Ah, kijk ik ben niet de enigeHeb m pas 2x herstart; zo meteen nog eens een paar keer doen dan! Bedankt voor je reactie. Heb de complete set behalve de D1 mini van Nodo dus ook de stroom adapter.
Hmm update, restart werkt niet. Heb eens op de Reset knop gedrukt en dan krijg ik:
[...]
Iemand een idee hoe ik dat kan fixen? De Toon2 kan de ketel aansturen dus alles zou dan toch gewoon moeten werken?
Oke, op de Toon OpenTherm een keer uit en aan gezet en hij werkt weer:10:09:24.296315 ( 15224| 13408) processOT (1720): Detected PIC firmware version: 6.1
10:09:24.318591 ( 13936| 12760) processOT (1722): Not processed, received from OTGW => (Thermostat disconnected) [23]
10:35:25.001507 ( 14968| 13624) processOT (1722): Not processed, received from OTGW => (Thermostat connected) [20]
Te vroeg gejuicht:
[quote]
10:35:47.048958 ( 11888| 10712) processOT (1722): Not processed, received from OTGW => (Low power) [9]
10:35:47.052988 ( 10544| 10064) processOT (1722): Not processed, received from OTGW => (Thermostat disconnected) [23]
[/quote]
Ok I am the idiot… Ik dacht dat het schuifje naar rechts moest…. En dan gaat ie juist van OpenTherm af

[Voor 37% gewijzigd door Tomba op 03-01-2023 12:06]
Iemand ervaring met dit product? https://www.tindie.com/products/jeroen88/opentherm-shield/
Als ik het goed begrijp geeft deze hetzelfde inzicht in wat de ketel aan het doen is als een gateway/sniffer? Ik heb nu een Nest thermostaat maar wil eigenlijk overstappen naar slimme radiatorknoppen zodat elke ruimte zijn eigen zone kan zijn. Dit wil ik graag besturen met Home Assistant, zodat ik voor een kamer bijvoorbeeld de verwarming uit kan doen als een deur of raam open staat.
Ik neig ernaar om over te stappen naar Tado, maar het staat mij tegen dat dit toch weer cloud based is, dat is een van de dingen waar ik mij bij de nest (heel licht) aan irriteer, het kan als je een wijzinging maakt via HA wel 20+ seconden duren voor je een reactie ziet + je bent afhankelijk van het reilen en zeilen van de cloud operator.
Dit ding is als ik het goed begrijp ook een thermostaat, maar bestaan er slimme radiatorknoppen die hiermee werken (c.q. via een open standaard / protocol)?
Als ik het goed begrijp geeft deze hetzelfde inzicht in wat de ketel aan het doen is als een gateway/sniffer? Ik heb nu een Nest thermostaat maar wil eigenlijk overstappen naar slimme radiatorknoppen zodat elke ruimte zijn eigen zone kan zijn. Dit wil ik graag besturen met Home Assistant, zodat ik voor een kamer bijvoorbeeld de verwarming uit kan doen als een deur of raam open staat.
Ik neig ernaar om over te stappen naar Tado, maar het staat mij tegen dat dit toch weer cloud based is, dat is een van de dingen waar ik mij bij de nest (heel licht) aan irriteer, het kan als je een wijzinging maakt via HA wel 20+ seconden duren voor je een reactie ziet + je bent afhankelijk van het reilen en zeilen van de cloud operator.
Dit ding is als ik het goed begrijp ook een thermostaat, maar bestaan er slimme radiatorknoppen die hiermee werken (c.q. via een open standaard / protocol)?
Aqara heeft ook smartknoppen. Volgens mij gebruikt Gizz die.
Beste forumleden,
Met druktoetsen op mijn ketel (Itho met Opentherm) kan ik de tapwaterfunctie uitzetten (‘Off’). Dit houdt dan in, dat als je een warmwaterkraan open zet, er wel water uit komt, maar altijd koud (ook al staat op de ketel voor het tapwater de andere setting op ‘Eco’ of op ‘Comfort’).
Weet iemand of binnen het Opentherm protocol er een MessageID is om tapwater op ‘Off’ of ‘On’ te zetten?
En zou je via de OTWG dat MessageID ook kunnen sturen naar de ketel?
Met druktoetsen op mijn ketel (Itho met Opentherm) kan ik de tapwaterfunctie uitzetten (‘Off’). Dit houdt dan in, dat als je een warmwaterkraan open zet, er wel water uit komt, maar altijd koud (ook al staat op de ketel voor het tapwater de andere setting op ‘Eco’ of op ‘Comfort’).
Weet iemand of binnen het Opentherm protocol er een MessageID is om tapwater op ‘Off’ of ‘On’ te zetten?
En zou je via de OTWG dat MessageID ook kunnen sturen naar de ketel?
Als alternatieve oplossing, heb ik nog een bijkomende vraag: mijn ketel heeft naast een simpel digitaal display (2x een 1 digit display), 3 druktoetsjes (‘Info’, ‘+’ en ‘-‘) voor de instellingen. Die 3 druktoetsjes gebruik je om alle settingen van de ketel in te stellen.
Heeft iemand hier op het forum wel eens geprobeerd dit soort drukcontacten parallel te bedienen met een potentiaalvrije contact van een relais (1 per drukknopje), die dan weer wordt gestuurd uit een domotica platform?
In mijn geval zou dat dan 3 kleine relais zijn, waarmee je alle ketel-settings remote zou kunnen bedienen via bijv Domoticz of Home Assistant.
Voor mijn ketel ziet dat er zo uit - idee is dus om 3x een relaiscontact parallel aan te sluiten aan de 3 drukknopjes:
Heeft iemand hier op het forum wel eens geprobeerd dit soort drukcontacten parallel te bedienen met een potentiaalvrije contact van een relais (1 per drukknopje), die dan weer wordt gestuurd uit een domotica platform?
In mijn geval zou dat dan 3 kleine relais zijn, waarmee je alle ketel-settings remote zou kunnen bedienen via bijv Domoticz of Home Assistant.
Voor mijn ketel ziet dat er zo uit - idee is dus om 3x een relaiscontact parallel aan te sluiten aan de 3 drukknopjes:
[Voor 23% gewijzigd door Marc_Sway op 08-01-2023 20:19]
De ketel zou via de status bits van MessageID 1 door moeten geven of de DHW aan of uit staat.
Lees de specificatie er even op na zou ik zeggen.
Lees de specificatie er even op na zou ik zeggen.
OK dank. Ik ga er eens naar kijken wat dat MsgID allemaal kan weergeven.
Het issue wat ik hier heb met mijn Itho ketel is dat als de ketel op ‘Eco’ staat (wat ik diverse malen goed gecheckt heb) en de kamerthermostaat ook op ‘Eco’ staat, de ketel toch elke ca 3 a 4 uur toch even gestart wordt voor ca 2 min, al is er totaal geen CV of tapwater vraag.
Ook als ik de kamerthermostaat helemaal loskoppel gebeurt dit.
Alleen als ik de tapwater-functie helemaal op ‘Off’ zet, dan verdwijnt dit issue.
Nog steeds heb ik geen enkel idee wat nu de oorzaak is van deze korte brander-starts om de ca 3-4 uur (24/7/365)
Het issue wat ik hier heb met mijn Itho ketel is dat als de ketel op ‘Eco’ staat (wat ik diverse malen goed gecheckt heb) en de kamerthermostaat ook op ‘Eco’ staat, de ketel toch elke ca 3 a 4 uur toch even gestart wordt voor ca 2 min, al is er totaal geen CV of tapwater vraag.
Ook als ik de kamerthermostaat helemaal loskoppel gebeurt dit.
Alleen als ik de tapwater-functie helemaal op ‘Off’ zet, dan verdwijnt dit issue.
Nog steeds heb ik geen enkel idee wat nu de oorzaak is van deze korte brander-starts om de ca 3-4 uur (24/7/365)
Sinds een paar weken werkt m'n OTGW sinds een upgrade nietmeer.
Ik krijg wel de boilertemperatuur etc van de ketel, maar als ik TADO koppel gaat de ketel niet aan, lijkt net alsof de ketel het signaal dan nietmeer ontvangt.
Iemand zo een idee toevallig?
Ik krijg wel de boilertemperatuur etc van de ketel, maar als ik TADO koppel gaat de ketel niet aan, lijkt net alsof de ketel het signaal dan nietmeer ontvangt.
Iemand zo een idee toevallig?
Meest voor de hand liggende vraag is, of de Tado wel op OpenTherm is ingesteld? Hier op het forum zijn meerdere topics te vinden over miscommunicatie tussen Tado en ketels, heb je die al bekeken?Baseje schreef op maandag 9 januari 2023 @ 15:46:
Sinds een paar weken werkt m'n OTGW sinds een upgrade nietmeer.
Ik krijg wel de boilertemperatuur etc van de ketel, maar als ik TADO koppel gaat de ketel niet aan, lijkt net alsof de ketel het signaal dan nietmeer ontvangt.
Iemand zo een idee toevallig?
Release your inner hooligan - With great power comes great responsibility, with horsepower comes no responsibility
Uiteraard heb ik dat bekeken, door het topic had ik nog niet goed gebladerd excuus...JanPedaal schreef op dinsdag 10 januari 2023 @ 09:19:
[...]
Meest voor de hand liggende vraag is, of de Tado wel op OpenTherm is ingesteld? Hier op het forum zijn meerdere topics te vinden over miscommunicatie tussen Tado en ketels, heb je die al bekeken?
Zal daar is mee beginnen!
Ik heb jaren vrij stabiel gebruik gemaakt van de Nodoshop OTGW v2.0 (+esp) icm Domoticz v2020 (native, inmiddels out-of-support) op mijn Synology.
Mijn Domoticz is helaas geruineerd, maar geeft mogelijkheden om ook de OTGW op te frissen. Ik zie dat er enorm actief is doorontwikkeld, geweldig!
Paar vragen:
1) momenteel draait espeasy built 147 op de esp8266 van de OTGW. Heeft het zin die te upgraden? Naar wat?
2) ik zie dat er een nieuwere PIC via nodoshop te bestellen is. Heeft dat voordelen?
3) Wat heeft qua homeautomation pakket de voorkeur: HomeAssistent of Domoticz? Dit komt in een docker op de Syno te draaien.
Mijn Domoticz is helaas geruineerd, maar geeft mogelijkheden om ook de OTGW op te frissen. Ik zie dat er enorm actief is doorontwikkeld, geweldig!
Paar vragen:
1) momenteel draait espeasy built 147 op de esp8266 van de OTGW. Heeft het zin die te upgraden? Naar wat?
2) ik zie dat er een nieuwere PIC via nodoshop te bestellen is. Heeft dat voordelen?
3) Wat heeft qua homeautomation pakket de voorkeur: HomeAssistent of Domoticz? Dit komt in een docker op de Syno te draaien.
Ik weet niet of je dit kunt gebruiken ?JPS schreef op dinsdag 17 januari 2023 @ 12:34:
1) momenteel draait espeasy built 147 op de esp8266 van de OTGW. Heeft het zin die te upgraden? Naar wat?
Ja ik liep er al tegenaan Als ik het goed zie een mooi alternatief en ook nog compatible met oudere Nodoshop HW (zoals mijn v2.0 met NodeMCU).
Nu eens uitzoeken hoe ik het beste kan flashen en ik ben er ook nog niet uit of ik bij mijn v2.0 versie gewoon die PIC kan wisselen. Voor die paar knaken lijkt het me wel fijn om ook weer even up-to-date te zijn ivm de doorontwikkeling.
Nu eens uitzoeken hoe ik het beste kan flashen en ik ben er ook nog niet uit of ik bij mijn v2.0 versie gewoon die PIC kan wisselen. Voor die paar knaken lijkt het me wel fijn om ook weer even up-to-date te zijn ivm de doorontwikkeling.
Hou er rekening mee dat firmware voor de oude PIC nog steeds ontwikkeld wordt, en dat de nieuwe PIC enkel nut heeft als je de nieuwe functionaliteit nodig hebt. Als je tevreden bent met waardes die nu ondersteund worden, heeft een upgrade waarschijnlijk weinig zin.JPS schreef op dinsdag 17 januari 2023 @ 22:39:
Nu eens uitzoeken hoe ik het beste kan flashen en ik ben er ook nog niet uit of ik bij mijn v2.0 versie gewoon die PIC kan wisselen. Voor die paar knaken lijkt het me wel fijn om ook weer even up-to-date te zijn ivm de doorontwikkeling.
Yar har, wind in your back, lads, wherever you go!
Hoi medetweakers. Deze vraag is vast al eens gesteld maar het zoeken in een 72 pagina's lang topic is zelfs voor de doorgewinterde zoeker niet eenvoudig.
Ik heb een ouder type OTGW van nodo (16F88) i.c.m. een NodeMCU (wifi) die ik altijd gebruikte met Domoticz. Dat werkte prima. Maar ik ben een maand of wat geleden overgestapt naar HomeAssistant (draaiend op een ubuntu NUC machine via Docker).
Ik krijg de OTGW niet gekoppeld aan HomeAssistant. Niet met de oude firmware in ieder geval, en ik heb nu nieuwere firmware maar ook daarmee krijg ik het niet werkend.
Of moet ik 'gewoon' een volledig nieuwe OTGW kopen? Zou jammer zijn omdat het dan vermoedelijk alleen ligt aan de communicatie tussen HA en OTGW...
Heeft iemand van jullie de juiste specs waarop ik de OTGW moet aanpassen zodat ik het werkend kan krijgen?
Heel veel dank en nogmaals mijn excuses voor het (vast en zeker) nogmaals plaatsen van deze vraag.
Ik heb een ouder type OTGW van nodo (16F88) i.c.m. een NodeMCU (wifi) die ik altijd gebruikte met Domoticz. Dat werkte prima. Maar ik ben een maand of wat geleden overgestapt naar HomeAssistant (draaiend op een ubuntu NUC machine via Docker).
Ik krijg de OTGW niet gekoppeld aan HomeAssistant. Niet met de oude firmware in ieder geval, en ik heb nu nieuwere firmware maar ook daarmee krijg ik het niet werkend.
Of moet ik 'gewoon' een volledig nieuwe OTGW kopen? Zou jammer zijn omdat het dan vermoedelijk alleen ligt aan de communicatie tussen HA en OTGW...
Heeft iemand van jullie de juiste specs waarop ik de OTGW moet aanpassen zodat ik het werkend kan krijgen?
Heel veel dank en nogmaals mijn excuses voor het (vast en zeker) nogmaals plaatsen van deze vraag.
Je hoeft nooit een volledig nieuwe OTGW te kopen, volgens mij. Als je de nieuwe functies van een nieuwere PIC wilt, dan kan je die los kopen en daarmee je oude PIC vervangen.boss-20 schreef op donderdag 26 januari 2023 @ 08:30:
Of moet ik 'gewoon' een volledig nieuwe OTGW kopen? Zou jammer zijn omdat het dan vermoedelijk alleen ligt aan de communicatie tussen HA en OTGW...
Ik heb zelf een andere (nieuwere) OTGW, nieuwe PIC, met de Ethernet-module. Dus iets anders. Wat ik begrijp van OTGW is dat slechts een enkel apparaat tegelijkertijd ermee verbonden mag zijn. Dat komt omdat het een seriële point-to-point verbinding betreft, die wordt omgezet naar een network socket. Heb je naast HA niet een ander apparaat dat over het netwerk met de OTGW verbindt/probeert te verbinden? Heb je wel eens het netwerkverkeer gesniffed om te kijken wat er op de lijn gebeurt?
[Voor 13% gewijzigd door The Zep Man op 26-01-2023 09:06]
Yar har, wind in your back, lads, wherever you go!
Hoe probeer je hem te koppelen? Is MQTT geen optie?boss-20 schreef op donderdag 26 januari 2023 @ 08:30:
Hoi medetweakers. Deze vraag is vast al eens gesteld maar het zoeken in een 72 pagina's lang topic is zelfs voor de doorgewinterde zoeker niet eenvoudig.
Ik heb een ouder type OTGW van nodo (16F88) i.c.m. een NodeMCU (wifi) die ik altijd gebruikte met Domoticz. Dat werkte prima. Maar ik ben een maand of wat geleden overgestapt naar HomeAssistant (draaiend op een ubuntu NUC machine via Docker).
Ik krijg de OTGW niet gekoppeld aan HomeAssistant. Niet met de oude firmware in ieder geval, en ik heb nu nieuwere firmware maar ook daarmee krijg ik het niet werkend.
Of moet ik 'gewoon' een volledig nieuwe OTGW kopen? Zou jammer zijn omdat het dan vermoedelijk alleen ligt aan de communicatie tussen HA en OTGW...
Heeft iemand van jullie de juiste specs waarop ik de OTGW moet aanpassen zodat ik het werkend kan krijgen?
Heel veel dank en nogmaals mijn excuses voor het (vast en zeker) nogmaals plaatsen van deze vraag.
@boss-20
Ik heb ook een ouder type Nodoshop OTGW (v2.0 uit 2018 meen ik). Dit heeft jaren gedraaid icm Domoticz en ik gebruik nu ook HA (op een Synology). HA draait als VM ivm de noodzakelijke supervisor voor de Mosquitto (MQTT broker) add-on, dat werkt anders niet icm Docker.
Afgelopen week heb ik op de NodeMCU esp zonder problemen de FW van Robert vd Breemen gezet: https://github.com/rvdbreemen/OTGW-firmware
Daarna eenvoudig (OTA) de PIC fw kunnen updaten en de OTGW werd via autodiscovery in HomeAssistant gevonden. Natuurlijk wel een MQTT broker draaien en instellingen goed zetten.
De eerste dag heb ik een of meerdere bootloops gehad, zonder duidelijke reden. Nu nog af en toe een reboot, allemaal getriggerd door de watchdog. Geen onderliggende reden gevonden helaas, maar het draait op zich weer ok.
Een paar dagen later kreeg ik de nieuwe versie PIC van Nodoshop binnen. Die omgewisseld met de oude en nu ben ik weer helemaal up-to-date.
Ik heb ook een ouder type Nodoshop OTGW (v2.0 uit 2018 meen ik). Dit heeft jaren gedraaid icm Domoticz en ik gebruik nu ook HA (op een Synology). HA draait als VM ivm de noodzakelijke supervisor voor de Mosquitto (MQTT broker) add-on, dat werkt anders niet icm Docker.
Afgelopen week heb ik op de NodeMCU esp zonder problemen de FW van Robert vd Breemen gezet: https://github.com/rvdbreemen/OTGW-firmware
Daarna eenvoudig (OTA) de PIC fw kunnen updaten en de OTGW werd via autodiscovery in HomeAssistant gevonden. Natuurlijk wel een MQTT broker draaien en instellingen goed zetten.
De eerste dag heb ik een of meerdere bootloops gehad, zonder duidelijke reden. Nu nog af en toe een reboot, allemaal getriggerd door de watchdog. Geen onderliggende reden gevonden helaas, maar het draait op zich weer ok.
Een paar dagen later kreeg ik de nieuwe versie PIC van Nodoshop binnen. Die omgewisseld met de oude en nu ben ik weer helemaal up-to-date.
Thanks voor je info. Ik zal het proberen!
Heb de MQTT broker wel draaien, hij haalt namelijk ook andere MQTT zaken binnen.
Heb de MQTT broker wel draaien, hij haalt namelijk ook andere MQTT zaken binnen.
JPS schreef op donderdag 26 januari 2023 @ 12:41:
@boss-20
Ik heb ook een ouder type Nodoshop OTGW (v2.0 uit 2018 meen ik). Dit heeft jaren gedraaid icm Domoticz en ik gebruik nu ook HA (op een Synology). HA draait als VM ivm de noodzakelijke supervisor voor de Mosquitto (MQTT broker) add-on, dat werkt anders niet icm Docker.
Afgelopen week heb ik op de NodeMCU esp zonder problemen de FW van Robert vd Breemen gezet: https://github.com/rvdbreemen/OTGW-firmware
Daarna eenvoudig (OTA) de PIC fw kunnen updaten en de OTGW werd via autodiscovery in HomeAssistant gevonden. Natuurlijk wel een MQTT broker draaien en instellingen goed zetten.
De eerste dag heb ik een of meerdere bootloops gehad, zonder duidelijke reden. Nu nog af en toe een reboot, allemaal getriggerd door de watchdog. Geen onderliggende reden gevonden helaas, maar het draait op zich weer ok.
Een paar dagen later kreeg ik de nieuwe versie PIC van Nodoshop binnen. Die omgewisseld met de oude en nu ben ik weer helemaal up-to-date.
Bijzonder dat t voor jou werkt, voor mij werkt het niet en ik ben niet de enige:JPS schreef op donderdag 26 januari 2023 @ 12:41:
@boss-20
Ik heb ook een ouder type Nodoshop OTGW (v2.0 uit 2018 meen ik). Dit heeft jaren gedraaid icm Domoticz en ik gebruik nu ook HA (op een Synology). HA draait als VM ivm de noodzakelijke supervisor voor de Mosquitto (MQTT broker) add-on, dat werkt anders niet icm Docker.
Afgelopen week heb ik op de NodeMCU esp zonder problemen de FW van Robert vd Breemen gezet: https://github.com/rvdbreemen/OTGW-firmware
Daarna eenvoudig (OTA) de PIC fw kunnen updaten
[...]
https://github.com/rvdbreemen/OTGW-firmware/issues/148
OK even voor duidelijkheid, de OTA flash deed ik met de oude PIC (PIC16F88) en dat ging goed naar FW v5.7
Pas daarna heb ik de PIC vervangen door de nieuwe (PIC16F1847) waarop FW v6.3 stond voorgeinstalleerd. Die heb ik nog niet proberen te updaten naar de laatste 6.4 en ben dus niet helemaal 'up-to-date'. En als ik het zo lees kan ik dat ook nog beter niet proberen...
Overigens heeft mijn OTGW versie een NodeMCU ipv Wemos D1, maar dat lijkt het verschil niet te maken.
Pas daarna heb ik de PIC vervangen door de nieuwe (PIC16F1847) waarop FW v6.3 stond voorgeinstalleerd. Die heb ik nog niet proberen te updaten naar de laatste 6.4 en ben dus niet helemaal 'up-to-date'. En als ik het zo lees kan ik dat ook nog beter niet proberen...
Overigens heeft mijn OTGW versie een NodeMCU ipv Wemos D1, maar dat lijkt het verschil niet te maken.
Ah dat verklaart het, dank voor de verheldering!JPS schreef op donderdag 26 januari 2023 @ 15:03:
OK even voor duidelijkheid, de OTA flash deed ik met de oude PIC (PIC16F88) en dat ging goed naar FW v5.7
Pas daarna heb ik de PIC vervangen door de nieuwe (PIC16F1847) waarop FW v6.3 stond voorgeinstalleerd. Die heb ik nog niet proberen te updaten naar de laatste 6.4 en ben due niet helemaal 'up-to-date'. En als ik het zo lees kan ik dat ook nog beter niet proberen...
Overigens heeft mijn OTGW versie een NodeMCU ipv Wemos D1, maar dat lijkt het verschil niet te maken.
Even een beginners vraagje. Hoe update je de pic. Ik heb een nieuwe pic met 6.3. Bij pic firmware heb ik na een refresh 6.4 staan. Hoe zet je deze op de PIC? Zie nl na een power off/on bij device info nog steeds 6.3
Dank voor het antwoord alvast
Dank voor het antwoord alvast

Dat zal niet zo lang meer duren; er is momenteel een nieuwe firmware versie in beta die het ook mogelijk maakt om de verschillende PICs allebei te updaten.JPS schreef op donderdag 26 januari 2023 @ 15:03:
OK even voor duidelijkheid, de OTA flash deed ik met de oude PIC (PIC16F88) en dat ging goed naar FW v5.7
Pas daarna heb ik de PIC vervangen door de nieuwe (PIC16F1847) waarop FW v6.3 stond voorgeinstalleerd. Die heb ik nog niet proberen te updaten naar de laatste 6.4 en ben dus niet helemaal 'up-to-date'. En als ik het zo lees kan ik dat ook nog beter niet proberen...
Overigens heeft mijn OTGW versie een NodeMCU ipv Wemos D1, maar dat lijkt het verschil niet te maken.
Er zijn al wat tests gedaan in de afgelopen week en het ziet er voorlopig goed uit. Verdere details worden bekend gemaakt als @number3 een officiele release doet.
De beta draait iig soepel!
Rene2716 schreef op donderdag 26 januari 2023 @ 17:04:
Even een beginners vraagje. Hoe update je de pic. Ik heb een nieuwe pic met 6.3. Bij pic firmware heb ik na een refresh 6.4 staan. Hoe zet je deze op de PIC? Zie nl na een power off/on bij device info nog steeds 6.3
Dank voor het antwoord alvast
In het PIC firmware scherm heb je een aantal opties staan die je kan flashen: standaard zou je de gateway.hex op de PIC willen zetten tenzij je iets heel specifieks wilt doen (debuggen oid).
De icoontjes zijn niet zo veelzeggend, maar het recycle icoontje is de update knop, die kan voor je checken of er een nieuwe versie is. Het tweede icoontje is de daadwerkelijke Flash Firmware knop. Daarmee kun je dus de nieuwe versie naar de PIC schrijven.
[Voor 34% gewijzigd door Dutchess_Nicole op 26-01-2023 17:22]
Kia E-Niro 64kWh DynamicPlusLine
Dank @Dutchess_Nicole , ik zag het idd ook op het discord channel. Mooi dat het stabiel draait en ik wacht de release rustig af.
Ik ben er alleen nog niet achter waar de reboots door komen. Het irritante is dat het programma van de iSense daarna weer begint als ingesteld (Bijv continue 17C) en een tijdelijke verhoging of verlaging dus ongedaan wordt gemaakt. Als ik dus voor het slapen handmatig naar 15C draait en de OTGW reset zichzelf, dan wordt het room setpoint ongewild weer 17C.
Ik ben er alleen nog niet achter waar de reboots door komen. Het irritante is dat het programma van de iSense daarna weer begint als ingesteld (Bijv continue 17C) en een tijdelijke verhoging of verlaging dus ongedaan wordt gemaakt. Als ik dus voor het slapen handmatig naar 15C draait en de OTGW reset zichzelf, dan wordt het room setpoint ongewild weer 17C.
@Appesteijn Ik heb een workaround bedacht waar ik zelf in control ben om dit op te lossen. Ik draai alles via docker op mijn server dus ik heb openthermmonitor nu ook in docker geconfigureerd. Ik heb een automation draaien die controleert of een waarde van de OpenTherm-integratie in HASS nog recent geupdate is. Zo niet, dan communiceert die naar de host dat die de openthermmonitor-docker opstart, 10 seconden wacht en weer de container killt. Zodra de container gestopt is, kan Home Assistant dus weer bij de OpenTherm-gateway. Een quick fix waarmee ik niet meer urenlang mijn kachel niet meer kan updaten.Pimmeh schreef op zaterdag 24 december 2022 @ 00:38:
[...]
Hmm, misschien dan toch eens een bugreport bij HASS indienen, zeker omdat we dat nu beide hebben waarbij otmonitor.exe wel happy is. Ik zal na de feestdagen eens kijken of ik wat in kan schieten daar, thanks voor het checken!

[TDLR]: Is er een voorbeeld cq handleiding, hoe je een "unkown msgID", kan doorkrijgen via restAPI. [/TDLR]
OTGW tussen een Inventum modul-AIR en Inventum EVA thermostaat gehangen. De communicatie is leesbaar en goed te begrijpen wat die doet. Er zijn een aantal onbekende msgID's. Echter na loggen met OTmonitor en kWh en temperaturen via raspPi, snap ik wel wat er wordt bedoeld.
Zoals dagen tot filterwissel en draaiuren (92, 93 ,94 en 206). De OTGW stuurt deze wel over de seriele poort, echter komen ze niet via de JSON restAPI naar buiten, maar op deze manier werkt ook de rest van mijn logging. Dus zou het handig zijn om deze te kunnen aanpassen.
Waar moet ik dit allemaal aanpassen?
- RestAPI.ino daar staat een routine.
- In de core lijkt ook een array te zitten.
Mijn eerste poging mislukte. Daarom maar even de oude fs.bin en ino.bin terug gezet. En werkt het als origineel.
Hoe benut je de clock functies van 30sec en 1 minuut enz.
OTGW tussen een Inventum modul-AIR en Inventum EVA thermostaat gehangen. De communicatie is leesbaar en goed te begrijpen wat die doet. Er zijn een aantal onbekende msgID's. Echter na loggen met OTmonitor en kWh en temperaturen via raspPi, snap ik wel wat er wordt bedoeld.
Zoals dagen tot filterwissel en draaiuren (92, 93 ,94 en 206). De OTGW stuurt deze wel over de seriele poort, echter komen ze niet via de JSON restAPI naar buiten, maar op deze manier werkt ook de rest van mijn logging. Dus zou het handig zijn om deze te kunnen aanpassen.
Waar moet ik dit allemaal aanpassen?
- RestAPI.ino daar staat een routine.
- In de core lijkt ook een array te zitten.
Mijn eerste poging mislukte. Daarom maar even de oude fs.bin en ino.bin terug gezet. En werkt het als origineel.
Hoe benut je de clock functies van 30sec en 1 minuut enz.
Hi @Dapdodo
Ik ben de ontwikkelaar van de esp firmware en zie je vragen stellen over het toevoegen van msgids. Ik wil met alle plezier zaken toevoegen om je unknown messagid te decoden.
Wat is exact je probleem en kan je logging en meer informatie met me delen dan goed ik het toe. Dan kunnen we deze nieuw ontdekte message IDs aan de firmware toevoegen.
Ik ben vooral te vinden in de Discord community, volg de link: https://discord.gg/m7cwv9aJGA
Groet
Robert
Ik ben de ontwikkelaar van de esp firmware en zie je vragen stellen over het toevoegen van msgids. Ik wil met alle plezier zaken toevoegen om je unknown messagid te decoden.
Wat is exact je probleem en kan je logging en meer informatie met me delen dan goed ik het toe. Dan kunnen we deze nieuw ontdekte message IDs aan de firmware toevoegen.
Ik ben vooral te vinden in de Discord community, volg de link: https://discord.gg/m7cwv9aJGA
Groet
Robert
[Voor 8% gewijzigd door number3 op 28-01-2023 07:46]
De 22ste release van de ESP8266 Nodoshop OTGW firmware is zojuist gereleased, v0.10.0.
Deze release bevat:
De release kan hier gevonden worden:
https://github.com/rvdbre...ware/releases/tag/v0.10.0
Veel plezier maar weer met deze nieuwe release!
Deze release bevat:
- Flashen van de pic16f1847 (6.x firmware) en de pic16f88 (5.x firmware)
- Een s0 pulse teller, om elektrisch vermogen van je warmtepomp te meten
- Diverse Web UI verbeteringen doorgevoerd
- Een reeks van kleine verbeteringen en bugfixes
De release kan hier gevonden worden:
https://github.com/rvdbre...ware/releases/tag/v0.10.0
Veel plezier maar weer met deze nieuwe release!
Is het flooden van MQTT bij deze release ook opgelost? Oftewel bij alleen wijzigingen een bericht naar de broker sturen i.p.v. bij elke ontvangst vanaf de gateway deze te sturen?number3 schreef op zaterdag 28 januari 2023 @ 22:29:
De 22ste release van de ESP8266 Nodoshop OTGW firmware is zojuist gereleased, v0.10.0.
Deze release bevat:Deze release was niet mogelijk geweest zonder hulp van de actieve discord community. Heb je een issue, wil je een specifieke feature, zoek je hulp, kom dan vooral even langs en stel je vragen in de Discord: https://discord.gg/ggkzcpfc7d
- Flashen van de pic16f1847 (6.x firmware) en de pic16f88 (5.x firmware)
- Een s0 pulse teller, om elektrisch vermogen van je warmtepomp te meten
- Diverse Web UI verbeteringen doorgevoerd
- Een reeks van kleine verbeteringen en bugfixes
De release kan hier gevonden worden:
https://github.com/rvdbre...ware/releases/tag/v0.10.0
Veel plezier maar weer met deze nieuwe release!
Ik weet niet wat je bedoelt met 'Flooden' maar de OTGW stuurt zoals het OT protocol voorschrijft gewoon elk bericht door. Ook als dat bericht hetzelfde bevat als de vorige met dat msgid. Het is aan de boiler en de thermostaat om af te spreken hoe vaak ze berichten heen en weer sturen.bluewalk schreef op zondag 29 januari 2023 @ 09:07:
[...]
Is het flooden van MQTT bij deze release ook opgelost? Oftewel bij alleen wijzigingen een bericht naar de broker sturen i.p.v. bij elke ontvangst vanaf de gateway deze te sturen?
Kia E-Niro 64kWh DynamicPlusLine
Dat was mijn vraag; nu stuurt hij elk bericht door; ik zou graag hebben dat die allen wijzigingen doorstuurt.Dutchess_Nicole schreef op zondag 29 januari 2023 @ 09:16:
[...]
Ik weet niet wat je bedoelt met 'Flooden' maar de OTGW stuurt zoals het OT protocol voorschrijft gewoon elk bericht door. Ook als dat bericht hetzelfde bevat als de vorige met dat msgid. Het is aan de boiler en de thermostaat om af te spreken hoe vaak ze berichten heen en weer sturen.
Nu komen er ellendig veel berichten binnen bij mijn domotica die ingesteld staat het bericht te negeren als deze dezelfde waarde heeft als dat ie al weet waardoor die dus onnodig bezig is met het rejecten.
Ik had het zelf al in een fork opgelost maar was benieuwd of het ook opgepakt was door jullie (eerder hier op got over gehad

Altijd eng om voor het eerst een device te flashen (zeker op afstand), maar ging prima! Thanks, het werkt hier prima incl de update naar 6.4!number3 schreef op zaterdag 28 januari 2023 @ 22:29:
De 22ste release van de ESP8266 Nodoshop OTGW firmware is zojuist gereleased, v0.10.0.
Deze release bevat:Deze release was niet mogelijk geweest zonder hulp van de actieve discord community. Heb je een issue, wil je een specifieke feature, zoek je hulp, kom dan vooral even langs en stel je vragen in de Discord: https://discord.gg/ggkzcpfc7d
- Flashen van de pic16f1847 (6.x firmware) en de pic16f88 (5.x firmware)
- Een s0 pulse teller, om elektrisch vermogen van je warmtepomp te meten
- Diverse Web UI verbeteringen doorgevoerd
- Een reeks van kleine verbeteringen en bugfixes
De release kan hier gevonden worden:
https://github.com/rvdbre...ware/releases/tag/v0.10.0
Veel plezier maar weer met deze nieuwe release!
Ik wil de een 2e otgw gebruiken om mn remeha Calente aan te sturen met een 2e otgw-app op de homey.
Met aparte ip adressen zou dat moeten kunnen.
Iemand ervaring hiermee?
Met aparte ip adressen zou dat moeten kunnen.
Iemand ervaring hiermee?
Nee, niet opgelost. Ik zou een PR van je fork wel waarderen. Samen maken we het project beter ;-).
Dat was mijn vraag; nu stuurt hij elk bericht door; ik zou graag hebben dat die allen wijzigingen doorstuurt.
Nu komen er ellendig veel berichten binnen bij mijn domotica die ingesteld staat het bericht te negeren als deze dezelfde waarde heeft als dat ie al weet waardoor die dus onnodig bezig is met het rejecten.
Ik had het zelf al in een fork opgelost maar was benieuwd of het ook opgepakt was door jullie (eerder hier op got over gehad)
Ik heb meerdere OTGW's draaien in mijn installatie, dus ja, het kan. Je kan simpelweg de hostname van elke OTGW anders instellen. Elke OTGW zal een eigen IP krijgen, door de hostname aan te passen heb zijn ze bereikbaar via otgw1.local en otgw2.local.amarkest schreef op zondag 29 januari 2023 @ 11:19:
Ik wil de een 2e otgw gebruiken om mn remeha Calente aan te sturen met een 2e otgw-app op de homey.
Met aparte ip adressen zou dat moeten kunnen.
Iemand ervaring hiermee?
Als je ook het MQTT topic aanpast, krijg je ook verschillende topics in MQTT, zodat je in je home automation beide OTGW's kan zien en bedienen indien nodig.
Gr.
Robert
Dat snap ik wel, vond ik de eerste keer ook eng. Het goede nieuws is dat deze manier van updaten direct van de ESP op de PCB naar de PIC gaat. Alles staat dus lokaal op de PCB, niets gaat over-the-air tijdens het updaten zelf.Altijd eng om voor het eerst een device te flashen (zeker op afstand), maar ging prima! Thanks, het werkt hier prima incl de update naar 6.4!
Daardoor heb je geen last van wifi storingen of andere issues die je dwars zouden zitten op afstand flashen.
Groet,
Robert