abbrechen
Suchergebnisse werden angezeigt für 
Anzeigen  nur  | Stattdessen suchen nach 
Meintest du: 

Anwendungsbeispiel: Was man mit dem Viessmann API an Dashboard hinbekommen kann

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.

THampp_0-1651252330120.png

 

16 ANTWORTEN 16

Nachdem ich den Beitrag abgeschickt habe kann ich jetzt sehen dass man den Screenshot nicht gut lesen kann. Also nochmal in Einzelbildern:THampp_0-1651253346739.pngTHampp_1-1651253416540.png

THampp_2-1651253475099.png

THampp_3-1651253521764.png

THampp_4-1651253553409.png

THampp_5-1651253593364.png

THampp_6-1651253624944.png

 

 

 

 

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.

HackyJ_0-1651560622551.png

Die Anlage liefert jetzt Solar auch an Regentagen, das Rote sind die Brennerzeiten

Liebe Grüße, HackyJ

Hallo @HackyJ 

 

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

HackyJ_0-1651576712755.png

 

Hallo @HackyJ 

 

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

HackyJ_0-1651871298055.png

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).

Screenshot 2022-05-18 at 20.58.05.png

Screenshot 2022-05-18 at 20.59.40.png

 

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.

https://github.com/thampp/smarthome

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 koeber_2-1663273836590.png

 

Heizung

koeber_7-1663275108091.pngkoeber_8-1663275136091.png

 

Lüftung

koeber_5-1663273966040.png

 

Kostet aber viel Schweiß und Tränen koeber_4-1663273836590.png

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:
koeber_6-1663274778535.png


Viele Grüße

---------------------------------------------------------------------------------------------------------------------------------------------------------------

Vitocal 333-G BWT 331.B08 / Vitovent 300-F H32S B280 / Vitocom 100 LAN1 / Vitoconnect 100 OPTO1 / Vitocomfort 200

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.

Top-Lösungsautoren