NEWS
Adapter für Buderus KM200 (und eventuell auch anderen KMxxx)
-
@jmeister79
Hallo Nils, das sieht ja interessant aus. Ich würde mich freuen, wenn du das Skript / Vis View zur Verfügung stellen könntest.Zu den Recordings:
Ich benutze den km200 Adapter schon lange und hatte eine Menge Probleme damit, dass die States z.T. neu angelegt wurden und dann unter anderen ID's in der SQL-Datenbank auftauchten. Auch war mir der minimale Aktualisierungszeitraum zu groß. Also nutze ich seit über einem Jahr eigene Skripts und eine eigene Datenstruktur mit den für mich wichtigen Daten.So auch bei den Recordings:
Die Recordings liefern Verbrauchsdaten für den Verbrauch (Gesamt / Warmwasseraufbereitung) für Stunden je Tag, Tag je Monat und Monat je Jahr. Also kannst Du z.B. auch die Monatsdaten der Vergangenheit lesen. Z.B. die Monatsverbräuche des letzten Jahres. Im Adapter gab es dabei leichte Unstimmigkeiten bei der Umrechnung auf die Anzahl der Tage pro Monat - Ist vielleicht behoben, dass weiss ich nicht.Der Vorteil keine eigene Fortschreibung zu implementieren ist es, dass die Verbrauchsdaten auch stimmen, wenn ioBroker down ist bzw. upgedated wird und dass die Daten mit denen des Portals übereinstimmen.
Bei mir stimmen die Daten mit ca. 1% Abweichung mit dem gemessenen Gasverbrauch überein (Logano Plus KB192i mit IP intern).Ich hatte vor der Installation des Buderus Kessels die Heizungssteuerung selbst programmiert und in VIS dargestellt. Nun mit dem Buderus-Kessel habe ich die Darstellung nahezu 1:1 übernommen und versucht die Regelungsparameter und die Heizungspumpen zu optimieren. Dazu lese ich ca. 10 Werte alle 30 Sekunden aus.
So sieht das dann aus mit den Eingabewerten:Grüße Thomas
-
@tom57
krass, wie genial ist denn bitte diese Visualisierung.
Daran scheitert es bei mir immer, ich hab jede menge ideen der Asuwertung aber die Darstellung: da fehlt mir kreativität.Das Programm der grafischen auswertung sit n JS. ziemlich wirr noch ich würde es gerne noch optimieren und anpassbar machen.
kann den Code aber gerne schonmal posten
Nils
-
Hi,
kurze zwischenfrage:
was beudeutet das denn jetzt?
habe ich bei einigen datenpunkten
km200.0 2019-11-13 10:02:50.315 info Update { 'recordings.heatSources.actualCHPower._Hours':{ type: 'state',id: 'recordings.heatSources.actualCHPower._Hours',common:{ id: 'recordings.heatSources.actualCHPower._Hours',name: 'recordings.h km200.0 2019-11-13 10:02:49.987 info Update { 'recordings.heatSources.actualCHPower._Hours':{ type: 'state',id: 'recordings.heatSources.actualCHPower._Hours',common:{ id: 'recordings.heatSources.actualCHPower._Hours',name: 'recordings.h km200.0 2019-11-13 10:02:49.465 warn Set KM200 err: 'request for http://192.168.178.35/recordings/heatSources/actualDHWPower/_Hours had status 404/Not Found other than supported 200,204' km200.0 2019-11-13 10:02:49.159 info Update { 'recordings.dhwCircuits.dhw1.actualTemp._Hours':{ type: 'state',id: 'recordings.dhwCircuits.dhw1.actualTemp._Hours',common:{ id: 'recordings.dhwCircuits.dhw1.actualTemp._Hours',name: 'record
-
@jmeister79
Nils, das ist leider beim IP-Adapter eine der Schwächen. Der Adapter macht regelmäßig bei Netzwerkabfragen zu, d.h. er beantwortet http-requests mit 404er Fehlern. Bei meinen Scripts versuche ich das bis zu 3 Mal hintereinander - trotzdem funktioniert dies 2 bis 3 Mal am Tag nicht und ich bekomme 404er Fehler zurück . Da ich alle 30 Sekunden abfrage ist das nicht so relevant, bei minimal 5 Minuten für fast-refresh meim km200-Adapter schon. Das war für mich das KO-Kriterium für den Adapter und ich bin auf JS-Skripts umgestiegen.Auf meiner Longlist steht das direkte Lesen der RS485 Schnittstelle analog der RC310 Bedieneinheit.....
Grüße Thomas
-
@tom57 danke für die antwort.
nochmal zum vebrauch. die letzten werte des array sind die aktuellsten. warum auch immer. kommt man mit slice gut ran
Mal so unter uns: die Umsetzung von Buderus was die datenpunkte, und datenverwaltung usw angeht ist gruselig...
Nils
-
@tom57 jetzt weiß ich was du mit den updates meinst.
ich hatte schon ne ahnung, dass sich ständig was ändert.
die recordings waren im Format [Wert,Wert,wert]
wobei das letzte immer das aktuellese war.
hab daraufhin mit string.replace die klammern und eventuelle leerzeichen entfernt. seit 16:00 sind die klammern weg und string replace führt zu nem Fehler, da es ja nun ein array of number ist.
kopfschüttel
-
so das klingt ja alles sehr spannend....aber muss nochmal fragen...wie kann ich den Gasverbrauch berechnen bzw. direkt aus dem Adapter entnehmen und eventuell nach NodeRed senden.
-
@fisch ich hätte jetzt erwartet, dass du die Gesamtleistung aufzeichnest und mithilfe von Brennwert und Zustandszahl auf den m³ Verbrauch kommst
Gasmenge (m³) * Brennwert * Zustandszahl = Arbeit (kWh).
Die Werte kriegst Du vom Versorger, bzw stehen auf der Rechnung
Nils -
ok, danke... für deine Antwort !!!
Aber so ganz klar ist mir das nicht, auf welche Werte ich in IoBroker zurückgreifen soll...
sorry für meine doofen Fragen ...
-
@fisch dafür sind Foren doch da
ich hab es ganz anders gemacht wie tom:
ich habe für den aktuellen Tag jeweils das letzte Element des Arrays
km200.0.recordings.heatSources.actualPower._Days
genommen und das kannst Du umrechnen.
Wie Tom es gemacht hat kannst Du ende April lesen
-
ok - was bedeutet der letzte wert genau?
Un wenn ich stündlich will, nehme ich da auch den letzten Wert?
-
@fisch
Das ist Buderus' Interpretation eines Arrays, die fügen jeden Tag (ich schätze um 0:00) einen neuen Tageswert hinten an.
Somit ist der letzte der aktuellste:
[15.2,17.3,14.5,17.0] 1z ist hier der jüngste.var temp = getState('km200.0.recordings.heatSources.actualPower._Days').val; temp = temp.toString().replace(/[/g, ""); //[ löschen wenn vorhanden temp = temp.toString().replace(/]/g, ""); //] löschen wenn vohanden temp = temp.toString().replace(/\ /g, ""); //leerzeichen löschen wenn vorhanden var tempArray = temp.split(","); //komischen pseudokram zu einem ordentlichen array machen var value1 = Math.round(100*tempArray.slice(-1))/100; //letztes element: heute setState('javascript.0.Heizung.Verbrauch.Energie.Daily', value1, true);// wegschreiben
Wenn Du es für alle drei Verbrauchswerte haben willst:
//verbrauch heizung var powertype =['actualCHPower','actualDHWPower','actualPower'] for(var n=0; n<3; n++){ var temp = getState('km200.0.recordings.heatSources.'+powertype[n]+'._Days').val; temp = temp.toString().replace(/[/g, ""); temp = temp.toString().replace(/]/g, ""); temp = temp.toString().replace(/\ /g, ""); var tempArray = temp.split(","); var value1 = Math.round(100*tempArray.slice(-1))/100; //letztes element: heute var value2 = Math.round(100*tempArray.slice(-2)[0])/100; //vorletztes element: gestern setState('javascript.0.Heizung.Verbrauch.'+powertype[n]+'.Daily', value1, true); setState('javascript.0.Heizung.Verbrauch.'+powertype[n]+'.Yesterday', value2, true); var temp = getState('km200.0.recordings.heatSources.'+powertype[n]+'._Months').val; temp = temp.toString().replace(/[/g, ""); temp = temp.toString().replace(/]/g, ""); temp = temp.toString().replace(/\ /g, ""); var tempArray = temp.split(","); setState('javascript.0.Heizung.Verbrauch.'+powertype[n]+'.Monthly', parseFloat(tempArray[0]), true); }
-
super erstmal vielen dank für deine Hilfe!!!
letze Frage , kann ich das Script einfach von hier übernehmen und in javascript adapter einfügen..oder muss nochmal etwas beachtet werden?
-
@fisch du brauchst noch die datenpunkte und musst schauen ob die bei dir so heißen.
-
so super skripte laufen... aber es sind lediglich diese zwei Datenpunkte angelegt. Kommt das andere dann noch?
-
das muss noch in das zweite script:
createState("javascript.0.Heizung.Verbrauch.actualCHPower.Daily", 0.0, {name: "Verbrauch Heizkreise heute", type: 'number', unit: 'kWh'}); createState("javascript.0.Heizung.Verbrauch.actualCHPower.Yesterday", 0.0, {name: "Verbrauch Heizkreise gestern ", type: 'number', unit: 'kWh'}); createState("javascript.0.Heizung.Verbrauch.actualDHWPower.Daily", 0.0, {name: "Verbrauch Warmwasser heute", type: 'number', unit: 'kWh'}); createState("javascript.0.Heizung.Verbrauch.actualDHWPower.Yesterday", 0.0, {name: "Verbrauch Warmwasser gestern", type: 'number', unit: 'kWh'}); createState("javascript.0.Heizung.Verbrauch.actualPower.Daily", 0.0, {name: "Verbrauch Gesamtsystem heute", type: 'number', unit: 'kWh'}); createState("javascript.0.Heizung.Verbrauch.actualPower.Yesterday", 0.0, {name: "Verbrauch Gesamtsystem gestern", type: 'number', unit: 'kWh'});
du brauchst nur eines der scripte btw
-
alos so dann ? Bzw. so habe ich es angelegt, States kommen aber keine ... mmm .
//verbrauch heizung var powertype =['actualCHPower','actualDHWPower','actualPower'] for(var n=0; n<3; n++){ var temp = getState('km200.0.recordings.system.heatSources.'+powertype[n]+'._Days').val; temp = temp.toString().replace(/[/g, ""); temp = temp.toString().replace(/]/g, ""); temp = temp.toString().replace(/\ /g, ""); var tempArray = temp.split(","); var value1 = Math.round(100*tempArray.slice(-1))/100; //letztes element: heute var value2 = Math.round(100*tempArray.slice(-2)[0])/100; //vorletztes element: gestern setState('javascript.0.Heizung.Verbrauch.'+powertype[n]+'.Daily', value1, true); setState('javascript.0.Heizung.Verbrauch.'+powertype[n]+'.Yesterday', value2, true); var temp = getState('km200.0.recordings.heatSources.'+powertype[n]+'._Months').val; temp = temp.toString().replace(/[/g, ""); temp = temp.toString().replace(/]/g, ""); temp = temp.toString().replace(/\ /g, ""); var tempArray = temp.split(","); setState('javascript.0.Heizung.Verbrauch.'+powertype[n]+'.Monthly', parseFloat(tempArray[0]), true); createState("javascript.0.Heizung.Verbrauch.actualCHPower.Daily", 0.0, {name: "Verbrauch Heizkreise heute", type: 'number', unit: 'kWh'}); createState("javascript.0.Heizung.Verbrauch.actualCHPower.Yesterday", 0.0, {name: "Verbrauch Heizkreise gestern ", type: 'number', unit: 'kWh'}); createState("javascript.0.Heizung.Verbrauch.actualDHWPower.Daily", 0.0, {name: "Verbrauch Warmwasser heute", type: 'number', unit: 'kWh'}); createState("javascript.0.Heizung.Verbrauch.actualDHWPower.Yesterday", 0.0, {name: "Verbrauch Warmwasser gestern", type: 'number', unit: 'kWh'}); createState("javascript.0.Heizung.Verbrauch.actualPower.Daily", 0.0, {name: "Verbrauch Gesamtsystem heute", type: 'number', unit: 'kWh'}); createState("javascript.0.Heizung.Verbrauch.actualPower.Yesterday", 0.0, {name: "Verbrauch Gesamtsystem gestern", type: 'number', unit: 'kWh'}); }
-
@fisch said in Adapter für Buderus KM200 (und eventuell auch anderen KMxxx):
//verbrauch heizung var powertype =['actualCHPower','actualDHWPower','actualPower'] for(var n=0; n<3; n++){ var temp = getState('km200.0.recordings.system.heatSources.'+powertype[n]+'._Days').val; temp = temp.toString().replace(/[/g, ""); temp = temp.toString().replace(/]/g, ""); temp = temp.toString().replace(/\ /g, ""); var tempArray = temp.split(","); var value1 = Math.round(100*tempArray.slice(-1))/100; //letztes element: heute var value2 = Math.round(100*tempArray.slice(-2)[0])/100; //vorletztes element: gestern setState('javascript.0.Heizung.Verbrauch.'+powertype[n]+'.Daily', value1, true); setState('javascript.0.Heizung.Verbrauch.'+powertype[n]+'.Yesterday', value2, true); var temp = getState('km200.0.recordings.heatSources.'+powertype[n]+'._Months').val; temp = temp.toString().replace(/[/g, ""); temp = temp.toString().replace(/]/g, ""); temp = temp.toString().replace(/\ /g, ""); var tempArray = temp.split(","); setState('javascript.0.Heizung.Verbrauch.'+powertype[n]+'.Monthly', parseFloat(tempArray[0]), true); createState("javascript.0.Heizung.Verbrauch.actualCHPower.Daily", 0.0, {name: "Verbrauch Heizkreise heute", type: 'number', unit: 'kWh'}); createState("javascript.0.Heizung.Verbrauch.actualCHPower.Yesterday", 0.0, {name: "Verbrauch Heizkreise gestern ", type: 'number', unit: 'kWh'}); createState("javascript.0.Heizung.Verbrauch.actualDHWPower.Daily", 0.0, {name: "Verbrauch Warmwasser heute", type: 'number', unit: 'kWh'}); createState("javascript.0.Heizung.Verbrauch.actualDHWPower.Yesterday", 0.0, {name: "Verbrauch Warmwasser gestern", type: 'number', unit: 'kWh'}); createState("javascript.0.Heizung.Verbrauch.actualPower.Daily", 0.0, {name: "Verbrauch Gesamtsystem heute", type: 'number', unit: 'kWh'}); createState("javascript.0.Heizung.Verbrauch.actualPower.Yesterday", 0.0, {name: "Verbrauch Gesamtsystem gestern", type: 'number', unit: 'kWh'}); }
bekomme error:
javascript.0 (21539) script.js.Heizung.Verbrauch compile failed:
at script.js.Heizung.Verbrauch:6 -
mmmm leider meldet das Skript bei mir in Zeile 6 Fehler...übrigens habe ich doch keine Pfade ändern müssen..genauso wie in deinem Skript...
Hast du vielleicht noch eine Idee?
-
natürlich müssen die createstate am anfang sein. Sonst hast du ja keinerlei states.
auch brauchst du n trigger, sonst wird da garnichts ausgeführt.ichs chick dir dann mal das ganze programm, dies war ja nur der teil der die berechnung asuführt, das ist bei mir in einem riesen programm drin, dass alle meine verbrauchsberechnungen ausführt