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). 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>
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>
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>
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 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"}
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
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
Im Ergebnis sieht es dann so aus:
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