Inhalt
Solarthermie: Ertrag ohne Wärmemengenmesser ausrechnen
Obwohl die Viessmann API in der Lage ist, den Solarertrag anzuzeigen, ist das entsprechende API Feature heating.solar.power.cumulativeProduced in machem (leider auch in meinem) Fall leer.
Das liegt daran, dass die Solarinstallation mit einem Wärmemengenmesser ausgerüstet sein muss. Dieses Gerät vergleicht die Solar-Vorlauftemperatur mit der Solar-Rücklauftemperatur und misst zusätzlich den Durchfluss. Bei moderneren Wohnungen wird über solche Geräte die Heizkostenabrechnung gemacht.
Wie finde ich nun heraus, wieviel Energie von meinen Solarthermiepanels erzeugt wird wenn ich kein Calorimeter habe?
Angewandte Physik als Workaround
Unser Heißwasserspeicher (Puffer/Boiler) ist normalerweise am oberen Ende (top) heißer als am unteren Ende (bottom). Für unseren Workaround verwenden wir einfach den Durchschnitt (avg für average) zwischen beiden Werten.
Beispiel: nehmen wir an, dein Puffer hat 80°C oben und 25°C unten. Die durchschnittliche Temperatur ist (80+25) / 2 = 52,5°C
Das ist alles, was wir brauchen, um den Solarertrag auszurechnen: Wir berechnen die den Unterschied der Durchschnittstemperatur zwischen zwei unterschiedlichen Messungen (nachher – vorher), multiplizieren das mit dem Faktor 1,1628Wh und multiplizieren nochmal mit der Menge des erwärmten Wassers (Boilerinhalt).
Yield ist der Ertrag in Wh, t1 ist die spätere Messung, t2 die vorherige.
Einen schönen Rechner dafür gibt es bei: https://gettopics.com/de/calc/wasser-erhitzen-energie-rechner
Fallstricke
Physiklehrer und andere werden jetzt die Stirn runzeln. Ja, ich vereinfache hier bei einigen Punkten. Nicht berücksichtigt sind Wärmeverluste in Rohren, Isolation, Puffer etc. Wir berechnen auch nur die gespeicherte Energie und nicht die in den Panels produzierte Energie.
Auch kann die Wärmeverteilung in Schichtladespeichern anders sein. Dem kann man mit entsprechend mehr Sensoren und einer Durchschnittsberechnung zwischen den Sensoren begegnen. Aus den Durchschnitten wird dann ein Gesamt Durchschnitt errechnet.
Zusätzliche Energiequellen z.B Heißwasserbereitung durch Heizgeräte, welche den Puffer gleichzeitig aufladen, sind nicht berücksichtigt, da der jeweilige Energiebeitrag schwer zuzuordnen ist.
Ebenso wird die Menge an Energie nicht berücksichtigt, die gespeichert wird während gleichzeitig Energie aus dem Puffer abgezogen wird d.h. durch einen Warmwasserhahn oder den Heizungsvorlauf.
Da diese Zustände normalerweise nur von kurzer Dauer sind, reicht der hier präsentierte Ansatz für eine halbwegs genaue Schätzung aus. Im Sommer ist sie sicher genauer als im Winter.
Ein praktisches Beispiel
Meine Installation besteht neben anderem Kram aus einem Viessmann (Italia) Solarcell HSK 1000 Kombispeicher (Warmwasser und Heizung) mit 842 Litern Nettovolumen.
Er ist von Haus aus mit 4 Sensoren mit der Vitotronic 200 verbunden, um die Warmwasserbereitung zu steuern und das Umschalten von Gas auf festen Brennstoff. Wenn Du Glück hast, findest du die entsprechenden Sensorwerte in der API unter:
heating.dhw.sensors.temperature.hotWaterStorage.top
heating.dhw.sensors.temperature.hotWaterStorage.middle
heating.dhw.sensors.temperature.hotWaterStorage.midBottom
heating.dhw.sensors.temperature.hotWaterStorage.bottom
Leider liefert die API bei mir diese Werte nicht. Ich habe mir deshalb mit zusätzlichen 1 Wire Sensoren (DS18B20) beholfen, die ich zu den Viessmann Sensoren oder in freie Sensoröffnungen gesteckt und an meinen Raspberry Pi angeschlossen habe.
Alternativ kann man auch die Werte für
WWSolar = unten: heating.solar.sensors.temperature.dhw und
WW Temperatur = oben: heating.dhw.sensors.temperature.hotWaterStorage
heranziehen. Ist allerdings ungenauer.
Nehmen wir an, die erste Messung beträgt 41,5°C und die zweite 41.7°C. Die Differenz ist also 0,2°C. Das Ergebnis ist wie folgt:
195,8 Wh ist also die Energie, welche während der Messdauer in den Speicher geladen wurde. Um diesen Rohertrag besser verständlich zu machen, können wir den Ertrag mittels Dreisatz auf eine Stunde hochrechnen. Nehmen wir an, wir messen alle 4 Minuten bzw. 240 Sekunden:
Das ist natürlich nur ein theoretischer Wert der voraussetzt, dass die Sonneneinstrahlung über eine Stunde konstant ist.
Wenn wir das programmieren, sollten wir folgende Einschränkungen beachten:
- Berechnung nur, wenn die Temperatur gestiegen ist.
- Berechnung nur wenn die Solarumwälzpumpe läuft
heating.solar.pumps.circuit = “on”
Ertrag pro Tag
Wenn wir ausrechnen wollen, welchen Tagesertrag wir erreicht haben, müssen wir lediglich den Rohertrag aufsummieren. Dies berücksichtigt, dass die Sonneneinstrahlung über den Tag schwankt. Eine Auflösung von 240 Sekunden ist meines Erachtens ausreichend. Klein genug um Schwankungen der Wassertemperatur durch Entnahme zu berücksichtigen, groß genug um der Trägheit des Mediums Wasser Rechnung zu tragen.
Node-Red
Nachfolgend noch der JSON Code. Er basiert u.a. auf meinen One Wire Sensoren aber das kannst du selber anpassen. Zusätzlich schreibe ich den Rohertrag in Influx. Kurz vor Mitternacht wird der Tageswert genullt. Der Status der Solarpumpe steckt bei mir in einer Variablen.
1 |
[{"id":"172753b11ffc7d4e","type":"comment","z":"5e6df7c6e68579b2","name":"","info":"Aufaddieren wenn Pumpe läuft\nAufaddieren nur wenn T1 > T2\n0,979 kWh pro Grad Erwärmung bei 842 Litern Volumen\nWert aus https://gettopics.com/de/calc/wasser-erhitzen-energie-rechner\nZeitdifferenz aus 2 Messungen per t1/t2 ausrechnen","x":1400,"y":200,"wires":[]},{"id":"e8fbc371fe2b9b7e","type":"inject","z":"5e6df7c6e68579b2","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"240","crontab":"","once":true,"onceDelay":"1","topic":"","payload":"","payloadType":"date","x":70,"y":260,"wires":[["2a43237773d5ccb2","4efc160c0f9c9d6d"]]},{"id":"2a43237773d5ccb2","type":"change","z":"5e6df7c6e68579b2","name":"pufferOben","rules":[{"t":"set","p":"payload","pt":"msg","to":"pufferOben","tot":"global"},{"t":"set","p":"topic","pt":"msg","to":"oben","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":250,"y":200,"wires":[["d51aa88fb6544e73"]]},{"id":"d51aa88fb6544e73","type":"change","z":"5e6df7c6e68579b2","name":"","rules":[{"t":"set","p":"upper","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":460,"y":200,"wires":[["d11c34e13703d472"]]},{"id":"4efc160c0f9c9d6d","type":"change","z":"5e6df7c6e68579b2","name":"pufferUnten","rules":[{"t":"set","p":"payload","pt":"msg","to":"pufferUnten","tot":"global"},{"t":"set","p":"topic","pt":"msg","to":"unten","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":250,"y":320,"wires":[["cec9dd3414b78008"]]},{"id":"cec9dd3414b78008","type":"change","z":"5e6df7c6e68579b2","name":"","rules":[{"t":"set","p":"lower","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":460,"y":320,"wires":[["d11c34e13703d472"]]},{"id":"d11c34e13703d472","type":"join","z":"5e6df7c6e68579b2","name":"","mode":"custom","build":"array","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":630,"y":260,"wires":[["c5fd3295e64f87a8"]]},{"id":"c5fd3295e64f87a8","type":"function","z":"5e6df7c6e68579b2","name":"avgTemperature","func":"msg.payload = (flow.get('upper') + flow.get('lower')) / 2;\nmsg.topic = \"Durchschnitt\"\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":800,"y":260,"wires":[["ed7734e3f0662e82","812fccc511606230"]]},{"id":"812fccc511606230","type":"simpletime","z":"5e6df7c6e68579b2","name":"","mydate":false,"myymd":false,"myyear":false,"mymonth":false,"mymonthn":false,"mydom":false,"mydoy":false,"myday":false,"myhourpm":false,"myhour":false,"mytime":false,"mytimes":false,"myminute":false,"myminutes":false,"mysecond":false,"mymillis":false,"myepoch":true,"myrawdate":false,"mypm":false,"x":1010,"y":260,"wires":[["aa9b3c0ad9c64c07"]]},{"id":"ed7734e3f0662e82","type":"debug","z":"5e6df7c6e68579b2","name":"checker","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":940,"y":340,"wires":[]},{"id":"aa9b3c0ad9c64c07","type":"change","z":"5e6df7c6e68579b2","name":"","rules":[{"t":"set","p":"T2","pt":"flow","to":"T1","tot":"flow"},{"t":"set","p":"T1","pt":"flow","to":"payload","tot":"msg"},{"t":"set","p":"2nd","pt":"flow","to":"1st","tot":"flow"},{"t":"set","p":"1st","pt":"flow","to":"myepoch","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1210,"y":260,"wires":[["059d995f1652c033"]]},{"id":"b12de433e6b323d2","type":"ui_gauge","z":"5e6df7c6e68579b2","name":"akt. Solarertrag","group":"eab89139.d34dd","order":5,"width":3,"height":2,"gtype":"gage","title":"akt. Solarertrag","label":"kWh","format":"{{value|number:1}}","min":0,"max":10,"colors":["#c0c0c0","#ff8000","#ca3838"],"seg1":"","seg2":"","className":"","x":1700,"y":260,"wires":[]},{"id":"84b875c8182241b9","type":"debug","z":"5e6df7c6e68579b2","name":"Ertrag","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"rawyield","targetType":"msg","statusVal":"","statusType":"auto","x":1670,"y":300,"wires":[]},{"id":"9ddda787d56c290a","type":"ui_text","z":"5e6df7c6e68579b2","group":"eab89139.d34dd","order":6,"width":5,"height":1,"name":"","label":"Solarertrag heute:","format":"{{msg.yield|number:1}} kWh","layout":"row-left","className":"","x":1710,"y":340,"wires":[]},{"id":"059d995f1652c033","type":"function","z":"5e6df7c6e68579b2","name":"Aktueller Solarertrag","func":"var sPump = global.get(\"solPump\");\nvar timeBetween = (flow.get(\"1st\") - flow.get(\"2nd\")) / 1000;\nvar tempDiff = Math.abs(flow.get(\"T1\") - flow.get(\"T2\"));\nif (isNaN(flow.get('solarYield'))) {\n flow.set('solarYield', 0);\n}\nvar kyield = flow.get(\"solarYield\");\nmsg.payload = 0;\nmsg.rawyield = 0;\n\nif (tempDiff >= 0){ \n if (sPump == \"on\") {\n kyield = kyield + tempDiff * 0.979; //Faktor für '842 Liter um 1°C erwärmen'\n flow.set('solarYield',kyield);\n // Temperaturdiff in 240 Sekunden, hochgerechnet auf 1 Stunde * Energiebedarf f. 1 °C bei 842 L Volumen\n msg.payload = tempDiff / timeBetween * 3600 * 0.979;\n msg.rawyield = tempDiff * 0.979;\n };\n \n};\nmsg.yield = kyield;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1440,"y":260,"wires":[["84b875c8182241b9","b12de433e6b323d2","9ddda787d56c290a","abb6262b7752db98"]]},{"id":"abb6262b7752db98","type":"switch","z":"5e6df7c6e68579b2","name":"","property":"solPump","propertyType":"global","rules":[{"t":"eq","v":"on","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":1370,"y":440,"wires":[["01705aa44d9925bb"],[]]},{"id":"01705aa44d9925bb","type":"change","z":"5e6df7c6e68579b2","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"rawyield","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1550,"y":440,"wires":[["c7096cdffe9af329"]]},{"id":"c7096cdffe9af329","type":"influxdb out","z":"5e6df7c6e68579b2","influxdb":"f0eb6285.91715","name":"rawYield","measurement":"rawYield","precision":"","retentionPolicy":"","database":"apidata","precisionV18FluxV20":"s","retentionPolicyV18Flux":"","org":"organisation","bucket":"bucket","x":1740,"y":440,"wires":[]},{"id":"dccf7e2c0c4c28c2","type":"inject","z":"5e6df7c6e68579b2","name":"End of day","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"55 23 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":970,"y":160,"wires":[["045620495ef5f211"]]},{"id":"045620495ef5f211","type":"change","z":"5e6df7c6e68579b2","name":"Reset value solarYield","rules":[{"t":"set","p":"solarYield","pt":"flow","to":"0","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":1200,"y":160,"wires":[[]]},{"id":"eab89139.d34dd","type":"ui_group","name":"Verlauf","tab":"7e5ee24d.2d5ae4","order":3,"disp":true,"width":"12","collapse":false,"className":""},{"id":"f0eb6285.91715","type":"influxdb","hostname":"127.0.0.1","port":"8086","protocol":"http","database":"apidata","name":"","usetls":false,"tls":"","influxdbVersion":"1.x","url":"http://localhost:8086","rejectUnauthorized":true},{"id":"7e5ee24d.2d5ae4","type":"ui_tab","name":"Solar/Heizung","icon":"dashboard","order":3,"disabled":false,"hidden":false}] |
ich freue mich über Kommentare, entdeckte Fehler und natürlich auch Lob.