openWB, Wärmepumpe, Shelly

Fragen zur Nutzung, Features, usw..
Flocki
Beiträge: 468
Registriert: Fr Aug 28, 2020 12:43 pm

Re: openWB, Wärmepumpe, Shelly

Beitrag von Flocki »

Wenn die Werte in der OpenWB per Modbus TCP verfügbar sind, sollte es nicht allzu schwierig sein, das Programm entsprechend umzuschreiben, dass die Werte so entgegengenommen werden.

Ich war mit der Vitoconnect enorm unzufrieden, daher habe ich den Lesekopf dann auch einfach direkt an den Raspberry Pi angeschlossen und lese ihn per openv aus.
skyload
Beiträge: 47
Registriert: Di Nov 10, 2020 12:25 pm

Re: openWB, Wärmepumpe, Shelly

Beitrag von skyload »

Hi,

hier habt ihr ja eine interessante Diskussion losgetreten. Also wie bekannt folgt die Eigenstrommessung der Viessmann-Heizungen nicht dem gängigen Standard am EVU-Übergabepunkt sondern vor der Heizung. Sie setzt also voraus, dass sie der letzte Stromabnehmer vor dem Hausanschluss ist. Hier das entsprechende Viessmann-Schema dazu:

Original.png

Eine Messung hinter der Heizung (was einer Messung am EVU-Übergabepunkt gleichkommen würde) ist so nicht vorgesehen:

image.png

Jetzt wäre doch die Lösung den originalen Viessmann Energiezähler zu nutzen, um den Verbrauch der Wärmepumpe zu messen und die Daten mit einem Microcontroller (oder Raspberry Pi) per Modbus abzufragen. Gleichzeitig wird auch der Bezug am EVU-Übergabepunkt ermittelt. Der Verbrauch der Wärmepumpe wird jetzt der Energiemessung am EVU-Übergabepunkt hinzuaddiert und über die Modbusleitung B im Registerformat eines sbc ALE3D5F an den Wärmepumpe ausgegeben:

Loesung.png

Wir simulieren somit, dass die Wärmepumpe hinter der Energiemessung sitzt (wie im ersten Bild zu sehen) und erfüllen die Vorgaben von Viessmann. Dies gibt uns die möglicher weiterer Unterverteilungen im Hause (oder der Garage) und löst uns von den einschränkenden Vorgaben der Viessmann.

Dadurch, dass wir die Werte an die Viessmann-Wärmepumpe manipulieren können, wäre auch die Möglichkeit einer Vorrangschaltung gegeben. Je nachdem wie viel Überschuss wir auf Modbusleitung B angeben, kann dem Haus-Akku oder den EVs Vorrang gegeben werden.

Was sagt ihr dazu? Klingt das logisch und machbar oder habe ich hier einen Gedankenfehler gemacht. Hat das praktisch schon mal einer so umgesetzt?

Vielen Dank,
Timo
Flocki
Beiträge: 468
Registriert: Fr Aug 28, 2020 12:43 pm

Re: openWB, Wärmepumpe, Shelly

Beitrag von Flocki »

Hi,

im Prinzip habe ich das bei mir so umgesetzt (die Wärmepumpe hängt bei mir an einem S0-Zähler, aber das macht vom Prinzip ja keinen Unterschied)
Auch die Vorrangschaltung zwischen Batterie und Wärmepumpe (und demnächst dann auch der OpenWB) habe ich so umgesetzt.

Gruß Florian
skyload
Beiträge: 47
Registriert: Di Nov 10, 2020 12:25 pm

Re: openWB, Wärmepumpe, Shelly

Beitrag von skyload »

Hey Florian,

das klingt aber cool! Dann habe ich deinen Programm-Code wohl noch nicht recht verstanden. Wo werden dort die Modbus-Daten für die Vitocal 200-A geschrieben? Also in meinem Beispiel die Modbus B Leitung. Ich muss da wohl noch etwas tiefer einsteigen und bin sehr froh euch hier für den Austausch gefunden zu haben. Daher an dieser Stelle schon mal vielen Dank!

LG, Timo
Flocki
Beiträge: 468
Registriert: Fr Aug 28, 2020 12:43 pm

Re: openWB, Wärmepumpe, Shelly

Beitrag von Flocki »

Hi,

wieviel Strom für die Wärmepumpe zur Verfügung steht, berechne ich mir ein einem externen Skript (das den "EVU"-Zähler, den S0-Zähler der Wärmepumpe und das Batteriemodul ausliest und dann alles in eine Formel packt.)
Das hier gepostet Programm nimmt diesen Wert dann via TCP/IP entgegen und lädt ihn in die Register des "virtuellen" Viessmannzählers, der bei dir mit Modbus B beschrieben ist. Das Proramm hört dann als virtueller Zähler ein einem USB-RS485-Stick, der bei mir am Port "/dev/ttyUSB0" hängt.

Der Zähler hält als Slave die Daten ja nur passiv zur Abfrage bereit und die Wärmepumpe als Master fragt die Werte dann aktiv ab.

Gruß,
Florian
skyload
Beiträge: 47
Registriert: Di Nov 10, 2020 12:25 pm

Re: openWB, Wärmepumpe, Shelly

Beitrag von skyload »

So cool Florian!

Genau das brauche ich. Bei dir läuft das C-Programm auf nem NAS? Reichen würde aber auch ein simpler Mikrocontroller mit nem Netwerkanschluss, den ich über die Arduino IDE programmiere. Was ist der Grund, weshalb es bei dir auf ner NAS läuft? Hast du da auch noch OpenV dort drauf?

Vor meinem inneren Auge sehe ich jetzt ein Device, dass die Heizungsdaten über OpenV abfragt, die die Kontakte 216.1 (A) und 216.4 (B) potentialfrei auf X3.1 schaltet (und somit die Smart Grid Funktionen nutzt) und ausserdem wie hier angesprochen den Viessmann-Stromzähler emuliert.

Jedoch zurück zum Thema. Deine Register

Code: Alles auswählen

mapping->tab_registers[0] = 10; //Firmware
mapping->tab_registers[21] = 0; //Comm ok
mapping->tab_registers[24] = 0; //Metering ok
mapping->tab_registers[27] = 0; //Counter 1 Total high (in 10 Wh)
mapping->tab_registers[28] = 0; //Counter 1 Total low (in 10 Wh)
mapping->tab_registers[29] = 0; //Counter 1 Partial high (in 10 Wh)
mapping->tab_registers[30] = 0; //Counter 1 Partial low (in 10 Wh)
mapping->tab_registers[31] = 0; //Counter 2 Total high (in 10 Wh)
mapping->tab_registers[32] = 0; //Counter 2 Total low (in 10 Wh)
mapping->tab_registers[33] = 0; //Counter 2 Partial high (in 10 Wh)
mapping->tab_registers[34] = 0; //Counter 2 Partial low (in 10 Wh)
mapping->tab_registers[37] = 0; //Power Phase 1 (in 10W)
mapping->tab_registers[42] = 0; //Power Phase 2 (in 10W)
mapping->tab_registers[47] = 0; //Power Phase 3 (in 10W)
sind somit die einzigen Werte, die von der Viessmann-Heizung abgefragt werden? Die Differenz von -1 zwischen ALE3-Datenblatt und deinem Mapping ist dem geschuldet, dass die Registerzählung bei 0 (null) beginnt. Das ist soweit verstanden.

Du belässt auch alle Register bei dem gemappten Standardwert und veränderst nur die Leistung der drei Phasen:

Code: Alles auswählen

mapping->tab_registers[37] = iPower / 30; //Power Phase 1 (in 10W)
mapping->tab_registers[42] = iPower / 30; //Power Phase 2 (in 10W)
mapping->tab_registers[47] = iPower / 30; //Power Phase 3 (in 10W)
Das reicht der Heizung zum fehlerfreien Betrieb? Hierbei ist deine Phasenlast auch immer ausgewogen (iPower). Mit einer Schieflast könnte die Heizung auch sicher nichts anfangen.

Die Bereitstellung der Modbus-Daten als Slave habe ich noch nicht ganz durchdrungen. Das liegt vor allem daran, dass ich mich noch nicht mit der modbus.h Library beschäftigt habe. Ist für mich schon ein umfangreiches Projekt.

Naja, man wächst mit seinen Aufgaben!

Vielen Dank für die Unterstützung,
Timo
Flocki
Beiträge: 468
Registriert: Fr Aug 28, 2020 12:43 pm

Re: openWB, Wärmepumpe, Shelly

Beitrag von Flocki »

Am Anfang lief alles auf dem NAS, weil er eh rund um die Uhr lief und VMs unterstützt hat. Inzwischen ist fast alles auf einen Raspberry umgezogen (Das C-Programm genauso wie OpenV).

Den SG-ready-Anschluss kannst du dir sparen, das bringt keinen Mehrwert, wenn die Modbus-Lösung läuft.

Der Rest ist genauso wie du es geschrieben hast, damit läuft die Wärmepumpe bei mir einwandfrei und fährt genau den PV-Überschuss ab (Sie bildet allerdings vorher noch einen 10-Minuten-Mittelwert)

Die Dokumentation zur Modbus-Library ist hier zu finden: https://libmodbus.org/
skyload
Beiträge: 47
Registriert: Di Nov 10, 2020 12:25 pm

Re: openWB, Wärmepumpe, Shelly

Beitrag von skyload »

Das klingt ja richtig gut! Das will ich auch! Darf ich fragen, welche Hardware-Lösung du für OpenV gewählt hast?
Flocki
Beiträge: 468
Registriert: Fr Aug 28, 2020 12:43 pm

Re: openWB, Wärmepumpe, Shelly

Beitrag von Flocki »

Ich habe den mit der Vitoconnect gelieferten Lesekopf direkt per USB an den Raspberry gehängt, das hat mir den Eigenbau erspart.
mabe
Beiträge: 48
Registriert: Mi Feb 27, 2019 1:22 pm

Re: openWB, Wärmepumpe, Shelly

Beitrag von mabe »

Hallo Flocki,

C - Programm habe ich kompiliert bekommen.
In welchem Format erwartet der Socket die aktuelle Leistung ?

Mein Python Script bringt kein Ergebnis

s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host ="192.168.3.73"
port =1502

s2.connect((host,port))
raspwatt = str(watt)
s2.send(raspwatt.encode())
s2.close()

Eine Idee woran es liegen könnte ?


Gruß
Markus
Antworten