Projektbeschreibung Heizungssteuerung Viessmann Vitodens 200

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
nw378
Beiträge: 199
Registriert: 22. Sep 2018 10:38
Answers: 4

Projektbeschreibung Heizungssteuerung Viessmann Vitodens 200

Beitrag von nw378 »

Hallo Gemeinde,

ich beschreibe hier mein wahrscheinlich langwierigstes Projekt. Falls jemand ähnliches umsetzen möchte, hilft es evtl. einige Arbeitsstunden zu sparen.
Langwierig war es, weil:
* zum einen der Lesekopf der Heizung per USB an den Raspi angeschlossen ist, neben weiteren USB Geräten. Beim (Neu-)Start wird manchmal die Zuweisung der USB vertauscht. Damit sind die Geräte dann nicht erreichbar.
* zum anderen wird zum Auslesen der Heizung der Daemon vcontrold eingesetzt. Die Konfigurationsdateien (die man im Netz recherchieren muss), sind entweder unvollständig, auf andere Geräte ausgelegt oder fehlerhaft (??). Insbesondere waren 2 Bits zum Senden von Steuerbefehlen nicht richtig.

Ziele der ganzen Mission sollten sein:

1) Auslesen der Heizungsdaten, Speichern in einer influxdb Datenbank, aufgehübschte Darstellung mittels Grafana.
2) Fernsteuerung der Heizung per App. Zum Beispiel 2 Tage vor Urlaubs-Heimkehr bereits die Fussbodenheizung befeuern.
3) Meldung bei Störung aufs Handy senden. In der Gaszuleitung ist ein Sicherheitsventil, dass bei starker Erschütterung (Baumaschinen in der Nachbarschaft genügen) schließt. Blöd, wenn man dies erst Stunden später unter der Dusche feststellt.

Also, folgendes habe ich gemacht:

* den Daemon vcontrold installiert (nach dieser Anleitung: https://openhabdoc.readthedocs.io/de/latest/Viessmann/)

* mit der folgenden Anleitung die USB Port den Geräten entsprechende feste Namen zugewiesen:
https://www.freva.com/assign-fixed-usb- ... pberry-pi/

* die Steuerungsdateien vcontrold.xml und vito.xml angepasst (siehe Anhang).
vcontrold.zip
Hierbei ist insbesondere wichtig, auf die neue Portbezeichung zu verlinken, bei mir "ttyUSB_vito" und die IP des Raspis, also:

Code: Alles auswählen

<?xml version="1.0"?>
<V-Control xmlns:vcontrol="http://www.openv.de/vcontrol">
  <unix>
     <config>
	<serial>
		<tty>/dev/ttyUSB_vito</tty>
	</serial>
	<net>
		<port>3002</port>
		<allow ip='192.168.178.60'/>
		<allow ip='192.168.178.0/24'/>
	</net>
Die Kommands zur Wahl der Betriebsart ergänzt:

Code: Alles auswählen

<command name='setBetriebsartTo1' protocmd='setaddrTo1'>
             		<addr>3323</addr>
             		<len>1</len>
             		<unit>ST</unit>
             		<description>Setze Betriebsart</description>
        	</command>
		<command name='setBetriebsartTo2' protocmd='setaddrTo2'>
             		<addr>3323</addr>
             		<len>1</len>
             		<unit>ST</unit>
             		<description>Setze Betriebsart</description>
        	</command>
		<command name='setBetriebsartTo3' protocmd='setaddrTo3'>
             		<addr>3323</addr>
             		<len>1</len>
             		<unit>ST</unit>
             		<description>Setze Betriebsart</description>
        	</command>
und die Adressen zum Senden von Befehlen angepasst (hinter SEND):

Code: Alles auswählen

</units>
  <protocols>
      <protocol name='P300'>
	  <pid>41</pid>
	  <macros>
		<macro name='GETADDR'>
		    <command>SEND 00 01</command>
		</macro>
		<macro name='SETADDR'>
		    <command>SEND 00 02</command>
		</macro>
	  </macros>
Dann das EXEC Binding installiert, und folgende Things angelegt:

Code: Alles auswählen

Thing exec:command:getBetriebArtM2  [command="vclient -h 192.168.178.60:3002 -c getBetriebArtM2", interval=600, timeout=5] 

//getSolarLeistung
Thing exec:command:getSolarLeistung  [command="vclient -h 192.168.178.60:3002 -c getSolarLeistung", interval=600, timeout=5] 

Thing exec:command:Heizung_AUS     [command="vclient -h 192.168.178.60:3002 -c setBetriebsartTo0"]
Thing exec:command:Heizung_WW      [command="vclient -h 192.168.178.60:3002 -c setBetriebsartTo1"]
Thing exec:command:Heizung_HWW     [command="vclient -h 192.168.178.60:3002 -c setBetriebsartTo2"]

Thing exec:command:Heizung_Error_Ind [command="vclient -h 192.168.178.60:3002 -c getStatusStoerung", interval=605, timeout=5]
Thing exec:command:Heizung_Errormsg  [command="vclient -h 192.168.178.60:3002 -c getError0", interval=300, timeout=5]
Die Befehle müssen in die Whitelist: /etc/openhab/misc/exec.whitelist

Die Items sehen so aus:

Code: Alles auswählen

String    BetriebArtM2                                                      {channel="exec:command:getBetriebArtM2:output"}
String    Betriebsart      "Betriebsart [MAP(vito.map):%s]"  <selfheating>

String    Heizung_Error_Msg                                                 {channel="exec:command:Heizung_Errormsg:output"}
String    Heizung_Error                                                     {channel="exec:command:Heizung_Error_Ind:output"}
String    Heizung_Error_kurz

String    getSolarGesamt                                                    {channel="exec:command:getSolarLeistung:output"}
Number    SolarGesamt      "Solarleistung gesamt [%.0f kWh]" <solarheat>
String    Betriebsartwahl                                    <selfheating>

Switch BW_WW  {channel="exec:command:Heizung_WW:run", autoupdate="false"}
Switch BW_HWW {channel="exec:command:Heizung_HWW:run", autoupdate="false"}
Switch BW_AUS {channel="exec:command:Heizung_AUS:run", autoupdate="false"}
und folgende Regeln habe ich erstellt, um die Betriebsart zu wählen, selbige auszulesen (eigentlich inzw. überflüssig), die Solarleistung auszulesen (weiteres erfolgt über influxdb und garafana), und im Fehlerfall die Fehlerart mit Datum/Uhrzeit per Sendnotification aufs Handy zu senden:

Code: Alles auswählen

rule "Vitodens getBetriebsart"
  when Item BetriebArtM2 received update
    then val vito = BetriebArtM2.state.toString.split("\n")
    Betriebsart.postUpdate(vito.get(1))
    
end    

rule "Vitodens getSolar"
  when Item  getSolarGesamt received update
    then val vito2 = getSolarGesamt.state.toString.split("\n")
    SolarGesamt.postUpdate(vito2.get(1))
    
end

rule "Heizung WW"
  when Item Betriebsartwahl received command "WW"
   then
   	logInfo("Heizungg", "Änderung Betriebsart auf Warmwasser")
    BW_WW.sendCommand(ON)
end 

rule "Heizung H+WW"
  when Item Betriebsartwahl received command "HWW"
   then
   	logInfo("Heizungg", "Änderung Betriebsart auf Heizen+Warmwasser")
    BW_HWW.sendCommand(ON)
end 

rule "Heizung aus"
  when Item Betriebsartwahl received command "AUS"
   then
   	logInfo("Heizungg", "Änderung Betriebsart auf Abschaltbetrieb")
    BW_AUS.sendCommand(ON)
end 

rule "Heizung Fehlerüberwachung"
  when Item Heizung_Error received update 
    then {
    Heizung_Error_kurz.postUpdate(Heizung_Error_Msg.state.toString.split("\n").get(1))  
    if (Heizung_Error.state.toString.split("\n").get(1) == "1") sendBroadcastNotification("Störung Heizung!" +"\n"+ Heizung_Error_kurz.state)   
    }
end 
In der Sitemap sieht es wie folgt aus:

Code: Alles auswählen

   Text label="Heizung" icon="selfheating2"{
        Frame {    
            //Text item=Betriebsart 
            Switch item=Betriebsartwahl mappings=[AUS="Aus", WW="WW", HWW="H+WW"] 
            Webview icon=energy url="http://192.168.178.60:3000/d-solo/0L9FYfiRz/heizung?orgId=1&panelId=4&tab=axes&from=now-7d" height=6
            Webview icon=energy url="http://192.168.178.60:3000/d-solo/0L9FYfiRz/heizung?panelId=2&orgId=1" height=3 
            Webview icon=energy url="http://192.168.178.60:3000/d-solo/0L9FYfiRz/heizung?orgId=1&panelId=8&tab=axes&from=now-3h" height=6
            Webview icon=energy url="http://192.168.178.60:3000/d-solo/0L9FYfiRz/heizung?orgId=1&panelId=10&tab=axes&from=now-3h" height=6
Das Auslesen / Speichern der Betriebsdaten erfolgt mittels vitocollect (Anleitung: https://github-wiki-see.page/m/openv/op ... d-InfluxDB)

Im Ergebnis sieht es dann so aus:
heizung.jpg
Mit Sicherheit kann man das an der einen oder anderen Stelle schlanker und eleganter gestalten, aber so funktioniert alles und läuft stabil.

Gruß
Nico
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB 4.1.0 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Projektbeschreibung Heizungssteuerung Viessmann Vitodens 200

Beitrag von udo1toni »

nw378 hat geschrieben: 31. Okt 2021 17:06 * zum einen der Lesekopf der Heizung per USB an den Raspi angeschlossen ist, neben weiteren USB Geräten. Beim (Neu-)Start wird manchmal die Zuweisung der USB vertauscht. Damit sind die Geräte dann nicht erreichbar.
Das Stichwort heißt hier udev.

Kurz gesagt kann man udev Rules anlegen, die dafür sorgen, dass ein per USB angeschlossenes Device immer mit dem gleichen Namen im System angelegt wird.
Dabei kann die Rule allgemein gehalten werden - alle Sticks eines bestimmten Typs erscheinen immer unter dem gleichen Namen - oder auch ganz exakt definiert werden - zwei Sticks des gleichen Typs werden zuverlässig immer dem entsprechenden Namen zugeordnet.
Letzteres ist sinnvoll, wenn man z.B. mehrere USB2serial Adapter des selben Typs verwendet.

Du musst also nur pro USB-Stick eine udev Rule anlegen und Dir einen eindeutigen Namen für das Gerät überlegen. Ab sofort taucht der Stick immer unter diesem Namen auf, egal an welchem Port er angeschlossen wird. Natürlich muss die Konfiguration von openHAB dann auch auf diesen Namen angepasst werden. :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

nw378
Beiträge: 199
Registriert: 22. Sep 2018 10:38
Answers: 4

Re: Projektbeschreibung Heizungssteuerung Viessmann Vitodens 200

Beitrag von nw378 »

udo1toni hat geschrieben: 31. Okt 2021 19:16 Das Stichwort heißt hier udev.

Kurz gesagt kann man udev Rules anlegen, die dafür sorgen, dass ein per USB angeschlossenes Device immer mit dem gleichen Namen im System angelegt wird.
Dabei kann die Rule allgemein gehalten werden - alle Sticks eines bestimmten Typs erscheinen immer unter dem gleichen Namen - oder auch ganz exakt definiert werden - zwei Sticks des gleichen Typs werden zuverlässig immer dem entsprechenden Namen zugeordnet.
Letzteres ist sinnvoll, wenn man z.B. mehrere USB2serial Adapter des selben Typs verwendet.

Du musst also nur pro USB-Stick eine udev Rule anlegen und Dir einen eindeutigen Namen für das Gerät überlegen. Ab sofort taucht der Stick immer unter diesem Namen auf, egal an welchem Port er angeschlossen wird. Natürlich muss die Konfiguration von openHAB dann auch auf diesen Namen angepasst werden. :)
Ja, so habe ich es auch umgesetzt (und oben der Übersichtlichkeit halber nur mit einem Verweis zur Anleitung erwähnt.)

Mittels

Code: Alles auswählen

dmesg | grep ttyUSB
habe ich die angeschlossenen Geräte gefunden,
mit

Code: Alles auswählen

udevadm info --name=/dev/ttyUSB0 --attribute-walk
die eindeutigen Attribute herausgepickt und diese wie auch von Dir beschrieben

mit

Code: Alles auswählen

sudo nano /etc/udev/rules.d/10-usb-serial.rules
"verankert", in meinem Fall ein Emlog Lesekopf für den Stromzähler und der Optolink für die Heizung:

Code: Alles auswählen

SUBSYSTEM=="tty", ATTRS{idProduct}=="6015", ATTRS{idVendor}=="0403", SYMLINK+="ttyUSB_emlog"
SUBSYSTEM=="tty", ATTRS{idProduct}=="ea60", ATTRS{idVendor}=="10c4", SYMLINK+="ttyUSB_vito"
Als Lesekopf kann man bspw. diesen nehmen: https://www.wolf-online-shop.de/Viessma ... 59899.html .
Es gibt aber auch im Netz Bastelanleitungen zum Eigenbau oder kostengünstiges bei ebay.
Eingebaut sieht das so aus:
IMG_9828.jpg
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB 4.1.0 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Projektbeschreibung Heizungssteuerung Viessmann Vitodens 200

Beitrag von udo1toni »

Super, prima, dass Du das hier noch mal ergänzt hast.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten