Im Grunde ist das alles eine simple Angelegenheit
Wie so oft wenn man sich auskennt
Teile von dem was jetzt kommt habe ich zwar oben schon beschrieben, aber ich denke alles an einem ist einfacher zu lesen als in den alten Posts noch mal suchen zu müssen.
Also, dann fange ich mal etwas mit dem Überblick an.
Die Heizung läuft wie jede andere Heizung autark. Sie verwendet zur Steuerung intern das ebus Protokoll. Dazu habe ich eine Platine gelötet ( Bauplan aus dem Netz ) welche per USB an einen RasPi angeschlossen ist und auf der anderen Seite am 2-Draht-Bus der Heizung hängt. Auf dem RasPi läuft das Programm ebusd ( Ebus-Dämon ) welches Daten vom Bus der Heizungssteuerung empfangen und senden kann. Den ebusd habe ich so konfiguriert, dass er alle empfangenen Daten auch per MQTT an meinen MQTT-Server sendet. Der MQTT-Server läuft auf der Synology-NAS in einer eigenen VM. Nur als Randnotiz, der MQTT-Server ist nicht nur für die Daten der Heizungssteuerung, sondern auch für die Daten zur Ladereglung meiner PV-Anlage, E-Auto, Druckersteuerung usw. zuständig.
Die Visualisierung und bei Bedarf steuerung des Ganzen übernimmt der IoBroker in einer eigenen VM auf der NAS.
Noch eine Randnotiz, Paralell zu dem ebusd der Heizungssteuerung läuft das ganze noch einmal für die Solarsteuerung und Lüftungsanlage. Es sind also insgesammt 3 Platinen und 3 ebusd-Instanzen, aber das nur nebenbei ;-)
Ich denke das ist ein ganz guter Überblick über den Aufbau. Wenn noch was fehlt oder unklar ist einfach fragen.
Jetzt mal so zur Grundidee.
Da Energiesparen ja nichts schlechtes ist, wollte ich das Ganze mal visualisieren was ich für andere Projekte schon in IoBroker gemacht habe.
Wie immer braucht man dazu natürlich Daten ;-)
Da die Heizungssteuerung nur die Daten über den Bus schickt welch sie gerade benötigt, sind manche Daten veraltet. Manche Daten werden scheinbar auch nicht ohne weiteres über den Bus gesendet sonder irgendwie nur intern verarbeitet. Das schönste Beispiel ist die Zirkulationspumpe, welche man über einen potentialfreien Eingang ansteuern kann und dann 5min. läuft, das Signal aber nicht auf dem Bus übertragen wird. Man kann nur überwachen ob die Pumpe läuft oder nicht.
Um nicht mit alten Daten zu arbeiten bin ich auf die Idee gekommen, alle Daten nach einer gewissen Zeit abzufragen. Je nach Daten mit unterschiedlichem Intervall. Meine erste Lösung dazu war einfach stumpf alles abzufragen was ich mit dem Skript Abruf-heat.sh realisiert habe ( im Anhang )
Damit war ich zuerst mal zufrieden und das funktioniert auch so weit. Dann habe ich im Log vom ebusd entdeckt dass alle paar Sekunden die Fehlermeldung
ERR: arbitration lost, retry kommt, was man im Betrieb nicht merkt aber meinen inneren Monk getriggert hat.
Dann bin ich auf die Idee gekommen den Bus dadurch zu entlasten, dass ich nur noch die Daten abfrage die nach einer gewissen Zeit nicht aktualisiert sind.
Dazu habe ich mir eine Konfigurationsdatei erstellt die im Prinzip für jeden Datenpunkt eine Zeilen und drei Spalten hat. Erste Spalte ist das Topic welches von MQTT kommt ohne die Daten dahinter also das was auch per
mosquitto_sub -h 192.168.1.41 -t ebusd-heat/# -v -u admin -P admin -F "%t" empfangen wird. Die zweite Spalt ist der Zeitintervall nach dem ein Wert spätestens aktualisiert sein soll. In der dritten Spalte ist der Befehl um die Daten per ebusd abzurufen. ( Abrufdaten.txt )
Jetzt zum eigentlichen Skript.
Um es für mich leichter zu machen habe ich ein Array erstellt, dass die Felder nummeriert. Mit der ersten Zahl wird die Zeile und mit der zweiten Zahl die Spalte bezeichnet, also ist 123 die dritte Spalte in der zwölften Zeile.. Beim einlesen der Abrufdaten.txt habe ich eine vierte Spalte generiert in der ich die aktuelle Zeit+Abrufzeit im epoch-Format gespeichert habe. Bis dahin hat alles funktioniert.
Da der mosquitto-Client ja den Programmablauf blockiert, wollte ich den auslagern und eine Datei als "Puffer" verwende in die mosquitto alle empfangenen Nachrichten reinschreibt. Im Programmablauf sollte die erste Zeile aus dem Puffer ausgelesen werden, die Zeile im Array gefunden werden und dann die aktuelle Zeit + Abrufzeit aus Spalte 2 in Spalte 4 geschrieben werden. Ist der Puffer leer läuft das Programm durch Spalte 4 und schaut welche zeit abgelaufen ist, also der Wert kleiner der aktuellen Zeit ist. Wenn ein Wert in Spalte 4 gefunden wurde, wird der Befehl aus Spalte 3 mit ebusd ausgeführt.
Was daraus geworden ist kennt ihr ja
Ich hoffe das war halbwegs verständlich.
=> Gräfin Klara: Auf jeden Vall möchte ich mich schon mal für deine Arbeit die Du dir hier machst bedanken!!!
LG
Thomas