Hallo zusammen,
Nach der Installation meiner Vitoconnect an meiner Vitoligno 300 P habe in den letzten Wochen an einer Dashboard-Lösung gebastelt. Die holt alle 2 Minuten die Daten via API von der Heizung, schreibt sie in InfluxDB und das wird dann angezeigt in Grafana.
Mit ein wenig Fummelei geht da einiges. Status, Temperaturen, Prognosen, Alerts. Den Pelletsverbrauch hole ich aktuell ein paar mal die Woche manuell aus der App weil der im kostenlosen API Plan nicht enthalten ist und der professionelle API Plan absurd überteuert ist (verglichen mit der Konkurrenz oder auch dem "Comfort & Savings" Abo in der App). Dank Interpolation sind die Verbräuche trotzdem ganz OK im Dashboard.
Ich habe dann von Hand noch Pelletsbefüllung hinzugefügt und Prognosen über den Verbrauch (und wie lange die Pellets im Bunker wohl noch halten nach der letzten Füllung). Ähnliches für die Leerung der Ascheschublade und die Prognose wann sie wieder voll sein sollte.
Die Solarthermie kommt nicht von Viessmann. Die ist von Sonnenkraft mit einem Resol KM Modul und dessen API (aber gleicher Ansatz).
Nachdem ich jetzt die "gläserne Heizung" habe, muss ich nur noch rausfinden wie ich die Einsichten in Ersparnisse umsetze 🙂
Ich hoffe man kann den Screenhot unten halbwegs gut lesen in der Vergrößerung.
Wenn Interesse besteht, kann ich gerne den Nod Red flow und das Grana Dashboard teilen.
Nachdem ich den Beitrag abgeschickt habe kann ich jetzt sehen dass man den Screenshot nicht gut lesen kann. Also nochmal in Einzelbildern:
Hallo THampp,
nette Arbeit, gefällt mir. Ich bin auf der gleichen Schiene unterwegs mit einer Vitolignio 300C.
Wie kommst Du an die Pufferdaten?
Hier ein Beispiel von mir, ich habe etwas Optimierung betrieben indem ich Solar früh anlaufen lasse.
>35°C.
Die Anlage liefert jetzt Solar auch an Regentagen, das Rote sind die Brennerzeiten
Liebe Grüße, HackyJ
Hallo @Konto wurde gelöscht
Danke für die Antwort - es freut doch immer sich ein bisschen auszutauschen 🙂
Was die Frage nach den Pufferdaten angeht:
Per Viessmann API bekomme ich bei meiner Anlage diese beiden Werte in Bezug auf Speichertemperaturen
heating.dhw.sensors.temperature.hotWaterStorage
heating.buffer.sensors.temperature.top
Die sind ja hier dokumentiert: https://documentation.viessmann.com/static/iot/data-points
Der Wert Speicher unten kommt von meinem Resol KM2. Der untere Sensor ist wohl mit dem Solarregler verbunden.
Gegenfrage:
Wo bekommst du denn deinen Kesselstatus hbop? Der entspricht ja dem was man auch an der Anlage selbst im Display sehen kann ("Ausbrandphase" etc.). Da habe ich erst mal nichts gefunden im Viessmann API das danach aussieht.
Und noch ne Frage: Du schreibst du lässt die Solaranlage jetzt früh (>35) anlaufen. Aber das heisst doch auch dass zu dem Zeitpunkt das Wasser unten im Speicher kälter als 35 Grad sein muss - sonst kann die Wärme ja nicht abgegeben werden. Bei mir ist das aktuell praktisch nie der Fall. Die aktuelle Regelung schaltet die Pumpen für die Solarthermie ein, wenn die Paneltemperatur größer als die Speichertemperatur ist (plu hysterese Differenz). Da weiss ich erst mal nicht was ich da ändern könnte/sollte. Aber ich bin auch Neuling in dem Thema.
Details
Ich habe am Anfang alle Werte abgefragt die das Viessmann API bei mir liefern kann. Für alle einen Eintrag mit Übersetzung und Metrik angelegt und dann die auskommentiert bei denen ich fand die sind nicht so interessant.
Meine Logik in NodeRed geht dann durch die Datenstruktur unten und holt sich die Messwerte die nicht auskommentiert sind.
{name: "Temperatur Kessel-Ist", id: "heating.boiler.sensors.temperature.main", metric: "℃"},
{name: "Temperatur Kessel-Soll", id: "heating.boiler.temperature", metric: "℃"},
{name: "Temperatur Puffer Oben", id: "heating.buffer.sensors.temperature.top", metric: "℃"},
//{name: "heating.burners.0", id: "heating.burners.0"},
{name: "Brenner Betriebstunden", id: "heating.burners.0.statistics", subid: ".hours", val: "properties.hours.value", metric: "Stunden"},
{name: "Brenner Starts", id: "heating.burners.0.statistics", subid: ".starts", val: "properties.starts.value", metric: "Starts"},
//{name: "heating.circuits", id: "heating.circuits"},
//{name: "heating.circuits.0", id: "heating.circuits.0"},
{name: "Heizkreis Umwälzpumpe", id: "heating.circuits.0.circulation.pump", val: "properties.status.value", metric: "Status"},
{name: "Vorlauftemperatur", id: "heating.circuits.0.sensors.temperature.supply", metric: "℃"},
//{name: "heating.circuits.0.dhw.pumps.circulation.schedule", id: "heating.circuits.0.dhw.pumps.circulation.schedule"},
//{name: "heating.circuits.0.dhw.schedule", id: "heating.circuits.0.dhw.schedule"},
{name: "Frostschutz", id: "heating.circuits.0.frostprotection", val: "properties.status.value", metric: "Status"},
//{name: "heating.circuits.0.heating.curve", id: "heating.circuits.0.heating.curve"},
{name: "RoomInfluenceFactor", id: "heating.circuits.0.heating.roomInfluenceFactor", metric: "Integer"},
//{name: "heating.circuits.0.heating.schedule", id: "heating.circuits.0.heating.schedule"},
//{name: "Name", id: "heating.circuits.0.name", val: "properties.name.value"},
{name: "Modus", id: "heating.circuits.0.operating.modes.active", metric: "String"},
/*
{name: "heating.circuits.0.operating.modes.dhw", id: "heating.circuits.0.operating.modes.dhw", val: "properties.active.value"},
{name: "heating.circuits.0.operating.modes.dhwAndHeating", id: "heating.circuits.0.operating.modes.dhwAndHeating", val: "properties.active.value"},
{name: "heating.circuits.0.operating.modes.standby", id: "heating.circuits.0.operating.modes.standby", val: "properties.active.value"},
//{name: "heating.circuits.0.operating.modes.heating", id: "heating.circuits.0.operating.modes.heating", val: "properties.active.value"},
*/
{name: "Programm", id: "heating.circuits.0.operating.programs.active", metric: "String"},
/*
{name: "heating.circuits.0.operating.programs.comfort", id: "heating.circuits.0.operating.programs.comfort", val: "properties.active.value"},
{name: "heating.circuits.0.operating.programs.eco", id: "heating.circuits.0.operating.programs.eco", val: "properties.active.value"},
{name: "heating.circuits.0.operating.programs.external", id: "heating.circuits.0.operating.programs.external", val: "properties.active.value"},
//{name: "heating.circuits.0.operating.programs.holiday", id: "heating.circuits.0.operating.programs.holiday", val: "properties.active.value"},
{name: "heating.circuits.0.operating.programs.normal", id: "heating.circuits.0.operating.programs.normal", val: "properties.active.value"},
{name: "heating.circuits.0.operating.programs.reduced", id: "heating.circuits.0.operating.programs.reduced", val: "properties.active.value"},
{name: "heating.circuits.0.operating.programs.standby", id: "heating.circuits.0.operating.programs.standby", val: "properties.active.value"},
{name: "heating.operating.programs.holiday", id: "heating.operating.programs.holiday", val: "properties.active.value"},
*/
//{name: "heating.circuits.0.sensors.temperature.room", id: "heating.circuits.0.sensors.temperature.room"},
/*
//{name: "heating.circuits.1", id: "heating.circuits.1"},
//{name: "heating.circuits.1.circulation.pump", id: "heating.circuits.1.circulation.pump"},
//{name: "heating.circuits.1.dhw.pumps.circulation.schedule", id: "heating.circuits.1.dhw.pumps.circulation.schedule"},
//{name: "heating.circuits.1.dhw.schedule", id: "heating.circuits.1.dhw.schedule"},
//{name: "heating.circuits.1.frostprotection", id: "heating.circuits.1.frostprotection"},
//{name: "heating.circuits.1.heating.curve", id: "heating.circuits.1.heating.curve"},
//{name: "heating.circuits.1.heating.roomInfluenceFactor", id: "heating.circuits.1.heating.roomInfluenceFactor"},
//{name: "heating.circuits.1.heating.schedule", id: "heating.circuits.1.heating.schedule"},
{name: "heating.circuits.1.name", id: "heating.circuits.1.name", val: "properties.name.value"},
//{name: "heating.circuits.1.operating.modes.active", id: "heating.circuits.1.operating.modes.active"},
//{name: "heating.circuits.1.operating.modes.dhw", id: "heating.circuits.1.operating.modes.dhw"},
//{name: "heating.circuits.1.operating.modes.dhwAndHeating", id: "heating.circuits.1.operating.modes.dhwAndHeating"},
{name: "heating.circuits.1.operating.modes.heating", id: "heating.circuits.1.operating.modes.heating"},
{name: "heating.circuits.1.operating.modes.standby", id: "heating.circuits.1.operating.modes.standby"},
{name: "heating.circuits.1.operating.programs.active", id: "heating.circuits.1.operating.programs.active"},
{name: "heating.circuits.1.operating.programs.comfort", id: "heating.circuits.1.operating.programs.comfort"},
{name: "heating.circuits.1.operating.programs.eco", id: "heating.circuits.1.operating.programs.eco"},
{name: "heating.circuits.1.operating.programs.external", id: "heating.circuits.1.operating.programs.external"},
{name: "heating.circuits.1.operating.programs.holiday", id: "heating.circuits.1.operating.programs.holiday"},
{name: "heating.circuits.1.operating.programs.normal", id: "heating.circuits.1.operating.programs.normal"},
{name: "heating.circuits.1.operating.programs.reduced", id: "heating.circuits.1.operating.programs.reduced"},
{name: "heating.circuits.1.operating.programs.standby", id: "heating.circuits.1.operating.programs.standby"},
{name: "heating.circuits.1.sensors.temperature.room", id: "heating.circuits.1.sensors.temperature.room"},
//{name: "heating.circuits.1.sensors.temperature.supply", id: "heating.circuits.1.sensors.temperature.supply"},
*/
//{name: "Konfiguration für Mehrfamilienhaus", id: "heating.configuration.multiFamilyHouse", val: "properties.active.value"},
//{name: "Zeit Offset", id: "heating.device.time.offset"},
//{name: "Warmwasser Status", id: "heating.dhw", val: "properties.active.value", metric: "Boolean"},
{name: "Warmwasser Status", id: "heating.dhw", val: "properties.status.value", metric: "Status"},
{name: "Warmwasser Aktiv", id: "heating.dhw.charging", val: "properties.active.value", metric: "Status"},
{name: "Warmwasser Zirkulationspumpe", id: "heating.dhw.pumps.circulation", val: "properties.status.value", metric: "Status"},
//{name: "heating.dhw.pumps.circulation.schedule", id: "heating.dhw.pumps.circulation.schedule"},
{name: "Warmwasser Speicherladepumpe", id: "heating.dhw.pumps.primary", val: "properties.status.value", metric: "Status"},
//{name: "heating.dhw.schedule", id: "heating.dhw.schedule"},
{name: "Warmwasser Speicher Temperatur", id: "heating.dhw.sensors.temperature.hotWaterStorage", metric: "℃"},
{name: "Warmwasser Soll-Temperatur", id: "heating.dhw.temperature.main", metric: "℃"},
{name: "Aussentemperatur", id: "heating.sensors.temperature.outside", metric: "℃"}
/*
{name: "heating.solar", id: "heating.solar"}
{name: "heating.solar.pumps.circuit", id: "heating.solar.pumps.circuit"},
{name: "heating.solar.sensors.temperature.collector", id: "heating.solar.sensors.temperature.collector"},
{name: "heating.solar.sensors.temperature.dhw", id: "heating.solar.sensors.temperature.dhw"}
*/
Hallo THampp,
ich lese alle Features und zerlege sie mit Datum in eine xxxSQL Datenbank.
Alle xxx.1., xxx.2., xxx.3., xxx.DHW. Datensätze lösche ich weil ich die Komponenten nicht habe.
Nun habe ich also: DateTime, FeatureName, FeatureValue, FeatureJson
Heating.Burner.Operating-Phase ist ein Enum Type den ich mir erarbeitet habe.
Ich setze jedem Begriff eine Zahl gleich, siehe rotes Feld in der Grafik.
Meine Vorlauf Temperatur ist nie größer 35°C. Also kann ich da unabhängig von der unteren Puffertemperatur Solar einspeichern. Da morgens geduscht wird zieht die Familie aus dem Puffer warmes wasser, kalt strömt nach und kühlt unten ab. Das passt schon.
Ich habe seit Januar, der Umstellung im Normalfall 3 Brennerphasen. Im Sommer keine.
HIer noch die Rohdaten zu HBOP
Hallo @Konto wurde gelöscht
OK - dann bekommst du also von API Werte zurück von heating.boiler.operating.phase und ich leider nicht.
Tja, das ist wohl ein Geheimnis von Viessman warum das bei einer Vitolignio 300C geliefert wird aber bei einer Vitolignio 300P nicht. Vielleicht kann ja jemand vom Viessman Support etwas dazu schreiben.
Das mit der Vorlauf Temperatur verstehe noch nicht ganz. Hast du auch einen Pufferspeicher? Bei mir sind das 1000L und die Solarthermie bringt ihre Wärme unten ein. In dem Fall sollte doch die Temperatur unten im Speicher relevant sein und nicht die Vorlauftemperatur. Oder blicke da was nicht? Bin wie gesagt Neuling in dem Thema.
P.S.: Ich habe meine Werte ja nicht in einer SQL Datenbank sondern in InfluxDB einer Timeseries DB. Kannte ich alles bis vor 6 Wochen auch noch nicht. Ist aber ziemlich cool für diese Art. von IoT Daten. Und Grafana kann direkt damit umgehen. Da ist dann das ganze Zeit-basierte interpolieren, Nullwert ausgleichen, Zeit-basierte Mittelwerte errechnen etc. recht einfach. Es hat bei mir nur ein bisschen gedauert bis ich ein Gefühl für die proprietäre Query Sprache Flux bekommen habe. Ist halt kein SQL sonder was ganz eigenes.
Aber ich finde jetzt im Nachhinein es war den Einlernaufwand wert.
Ich bin über dieses Video eingestiegen und von da aus war der Start gut möglich:
https://haus-automatisierung.com/nodered/2021/12/14/node-red-daten-in-influxdb2.html
Hallo THampp,
jeder so wie er mag. Ist fast egal. Die Sache mit den Daten die fehlen kläre ich direkt über meinen Handwerker mit dem Viessmann Kundendienst. Als Feature Request an @MichaelHanna
Daten des Pufferspeichers, der Pelletbefüllung in der API wäre super nett.
Mein Puffer ist Multivalent..
die unteren 25% sind Solar
25-50% der Heizung vorbehalten
50-75% lädt der Kessel
75-99% Warmwasser, das aber über die gesamte Länge eine Spirale besitzt die bei 100% zapft. Da das kalte Wasser stets nach unten sinkt .... aber genau dieses Verhalten würde ich gerne an den 4 Kesselsensoren sehen wollen.
Wenn wir bei "wünsch dir was" an @MichaelHanna sind dann käme von meiner Seite noch die Anfrage um Unterstützung von heating.boiler.operating.phase bei der Vitoligno 300-P dazu.
Und natürlich ein dickes +1 für Unterstützung der Pelletsbefüllung (das ist ja heating.configuration.fuel.need) in der Free/Basic API ... aber das Thema Pricing hatten wir ja schon in einem anderen Thread.
Unbekanntes ENUM in heating.boiler.operating.phase
Kann mir jemand sagen was zeroAirVents für eine Bewandnis hat un wo es im regelablauf liegt?
LG HackyJ
Hallo zusammen, ich nutze Home Assistant, welches ebenfalls die Daten in eine InfluxDB schiebt, welche dann wiederum per Grafana ausgelesen werden kann.
Dank Home Assistant und der diversen Möglichkeiten Dashboards zu bauen, kann man das ganze auch immer schön vom Mobiltelefon ablesen als einfache Alternative zu Grafana (wenn man eher nur einen Überblick haben möchte).
Hallo THampp,
seit dem 25.05.22 bin ich Besitzer einer Viessmann PT2.
Ich habe deinen Beitrag gelesen, mittels Node Red und der Viessmann API die Betriebsdaten abgreifen. Da ich ein absoluter Neuling auf dem Gebiet bin, würde ich gern den Node Red Flow, mit dem das bewerkstelligt werden kann, erhalten/einsehen.
LG RaFr
Hallo, ich hätte wohl auch Interesse an dem Flow, vielleicht komme ich damit ja zurecht und kann mir auch
etwas zusammen bauen.
Gruß Gerd
Hallo Gerd, Hallo RaFr
entschuldigt die späte Antwort (war unterwegs gewesen).
Ich teile den Flow (und das Grafana Dashboard) ja gerne, aber ich kann hier keine .json Dateien anhängen.
Ich habe deswegen ein Github repo angelegt, da sind beide drin.
Dokumentation ist noch spärlich, aber ich hoffe ihr kommt zurecht.
Ich nutze mittlerweile an meiner Vitocal 333-G BWT 331.B08 mit Vitotronic 200 (Typ WO1C) Regelung die Vitoconnect 100 mit viessmannapi Adapter für ioBroker.
Schreiben tue ich die Daten in eine InfluxDB und visualisiere das mit Grafana.
Der Adapter geht für folgende
Regelungen für Wand- oder Kompaktgeräte
Vitotronic 200, Typ HO1, HO1A, HO1B, HO1D, HO2B, HO2C Vitotronic 200 RF, Typ HO1C, HO1E
Regelungen für bodenstehende Heizkessel
Vitotronic 200, Typ KO1B, KO2B, KW6, KW6A, KW6B, KW1, KW2, KW4, KW5 Vitotronic 300, Typ KW3
Regelungen für Wärmepumpen und Hybridgeräte
Vitotronic 200, Typ WO1A, WO1B, WO1C
Regelungen für Festbrennstoffkessel
Vitoligno 200-S mit Ecotronic (ab Softwarestand 2.03) Vitoligno 250-S mit Ecotronic (ab Softwarestand 2.00) Vitoligno 300-C mit Ecotronic (ab Softwarestand 2.12) Vitoligno 300-P mit Vitotronic 200 FO1 Vitoligno 300-S mit Ecotronic (ab Softwarestand 2.04)
Am Ende sieht es bei mir so überladen aus
Heizung
Lüftung
Kostet aber viel Schweiß und Tränen
Bei meiner Vitovent 300-F Lüftung würde ich mir gerne noch mehr public Datenpunkt wünschen für:
* (7D0F) Mindest Zuluft-Temperatur : 5 °C
Betriebsprogramm : Lüftungsautomatik
Betriebsstatus : Reduzierte Lüftung
Aussenlufttemperatur : 6,8 °C
Elektrisches Vorheizregister : 0 %
Fortlufttemperatur : 9 °C
Volumenstrom Fortluft : 125 m³/h
CO2 : 47,2 %
(7D18) CO2 Grenzwert (ppm) : 800 ppm
Feuchte : 35 %
(7D19) Feuchte Grenzwert (%) : 65 %
Zulufttemperatur : 27,9 °C
Volumenstrom Zuluft : 125 m³/h
Ablufttemperatur : 21,2 °C
Differenzdruck Aussenluftfilter P1 : 0
Differenzdruck Abluftfilter P3 : 0
Intensivbetrieb : Aus
Grundbetrieb : Aus
Filterstandzeit Tage : 346 Tage
Raumtemperatur-Sollwert T-ABL-Soll : 20 °C
Differenzdruckfühler Raum : 0
Drehzahl Zuluft : 0
Drehzahl Fortluft : 0
Filterstandzeit Tage : 346 Tage
Also mind. all das, was man auch in der Lüftungsübersicht sehen kann:
Viele Grüße
Hallo THampp,
freut mich außerordentlich, dass du mein Node-Red Tutorial "How to visualize ViCare Data..." weiterverwenden konntest, um die Features deiner Viessmann Heizung abzufragen. Danke auch für das "Thumbs Up".
Falls du es noch nicht gesehen hast... Hier ist noch das Prequel dazu, d.h. eine Node-Red Lösung, wie du das Access Token und die anderen statischen Parameter automatisch erzeugen und nach 180 Tagen erneuern kannst. Alles was der User dazu braucht ist die Client ID.
Viel Spaß noch und viele Grüße
Chris
In der Tat: Dein Beitrag gab mir die Starthilfe bei der Node Red programmierung. Vor allem der automatische token refresh ist hilfreich. Vielen Dank nochmal.
Das ganze noch komplett mittels deines "Prequels" durch zu automatisieren ist etwas bei dem ich ca. alle 180 denke "vor dem nächsten mal muss das aber dringend machen". Ich hab das ja erst sein April und die ersten 180 Tage ware prompt während unseres Urlaubs vorbei und jetzt fehlen mir sogar 5 Tage Heizungsdaten in der Influx. Ich hatte mir das ja sogar so eingerichtet, dass Node Red mir eine Fehler Email schickt, aber aus dem Urlaub konnte ich das Token nicht erneuern. Kein Drama aber den Pedanten in mir ärgert es ein wenig 🙂
Also etwas für einen Winterabend bevor die nächsten 180 Tage vorbei sind.
Hallo koeber,
ich stehe vor den gleichen Herausforderungen. Ich nutze die Vitocal 333-g mit Natural Cooling und die Vitovent 300f.
Da ich nun die VitoComfort 200 ablöse, stelle ich wieder das System von VControld auf die ViessmannApi um. Dein Dashboard gefällt mir ausgesprochen gut. Könntest du mir evtl. von deiner Grafana ein Export schicken?
Danke und Gruß
Martin
Hallo Martin,
Grafana ist der @GerdF, siehe weiter oben.
ich bin Purist und arbeite mit PHP und LabBVIEW Community for linux
liebe Grüße
Hacky
Danke dir für die Auskunft.
Hallo! Interessant. Hast du evtl. eine Doku der API für die Vitotronic 200 W01A?
Hallo, ich habe die Vitotronic 200 W01C. Die Anleitung und die Datenpunkte lagen als Doku dabei. Die Doku der API findest du im Viessmann Developer Forum.
Ach Ihr Lieben, die Viessmann Software ist nicht schlecht, Spezialfälle muss man aber mit Viessmann noch diskutueren. Ich kann bei 180m² Hausfläche mit 2.5to pellets und Solar ein Jahr überstehen. Dazu muss man aber die Heizungs Regelung im Auge haben.
Ein Beispiel hier, heute 13. Januar auf 680m Höhe im Süden Deutschlands.
Was auffällt ist der Brennerstart trotz Solar, so ein Unsinn.
@Konto wurde gelöscht
Die "Ansicht" sieht gut aus. Mit welchem System hast du sie erstellt?
Hi Martin,
sorry war länger nicht mehr da und habe deine Nachricht erst jetzt gelesen 🙈.
Anbei die Exports aus Grafana
Heizungs-Dashboard.json
Lueftungs-Dashboard.json
Mittlerweile habe ich noch auf Einzelraumsteuerung mit ViCare Fußbodenthermostat und Klimasensoren für die Räume erweitert:
Die Kohlenstoffdioxid Werte bei der Lüftung hole ich mir über Shelly UNI und die ADC Voltage Messung. (Signalabgreifung / Orange = GND & Weiß = CO2 bzw. Feuchte)
Der ADC.Power Wert wird dann *200 im Grafana gerechnet und das entspricht dann etwa dem in der Lüftungsansicht angezeigten Wert.
Bei Fragen gerne Fragen ✌