NEWS
Stromverbrauch messen und dann optimieren
-
@homoran sagte in Stromverbrauch messen und dann optimieren:
ich überlege die Synology abzuschalten, die ich nur noch für Backitup meiner zwei ioBroker und sporadische Spiegel de PCs nutze und dafür externe USB Laufwerke/ Sticks zu nehmen.
Mein QNAP läuft auch nicht mehr durch sondern wird per Skript vor den Backups hochgefahren und der letzte Job fährt es wieder runter. So läuft es nur noch 4h am Tag statt 24h (dient aber auch wirklich nur für Backups)
-
@bananajoe sagte in Stromverbrauch messen und dann optimieren:
So läuft es nur noch 4h am Tag statt 24h (dient aber auch wirklich nur für Backups)
der Serverschrank (braun) mit der Syno zieht während des Backups und während vermutlich Reorganisation/ Indizierung den Strom mehr, den die Platten verbrauchen. Der Rest ist eigentlich (hoffentlich) nicht viel. Ist aber eine DS 916+ MIT 4 WD Red und eine Expansion Unit mit 2 WD Red (hier gehen die Backups drauf, deswegen da meht Verbrauch).
Aber fast immer wenn ein PC angeschaltet wird, oder das nvidia shield tv, springt sie auch noch mal an
-
@homoran sagte in Stromverbrauch messen und dann optimieren:
Kann es sein, dass die APC USV es700 einen hortenden Eigenverbrauch haben? Die Summe der Geräteverbräuche passt überhaupt nicht zum gesamtverbrauch!
Ja, kann sein. Wobei die von Modell zu Modell recht unterschiedlich sein können. Musst du halt mal eine Meßsteckdose davor und eine dahinter packen. Und dann entscheiden ob sich ein Wechsel lohnt.
Ich hab damals eine CyberPower 900 genommen weil es in anderen Foren hies das die extrem sparsamen Eigenverbrauch hat. Steckdose davor sagt 164W, USV sagt 152W, also 12W bei dieser Last. Ob das Sparsam ist?
Mein alter PoE Switch brauchte 0 Watt im Leerlauf wenn nichts dran hängt, mein neuer 7W.
Trotzdem braucht der neue in Summe nur 52W und der alte 78W ...
Es ist nicht so einfach ... -
@bananajoe sagte in Stromverbrauch messen und dann optimieren:
Ja, kann sein. Wobei die von Modell zu Modell recht unterschiedlich sein können
Danke!
nach meiner Rechnung/ Schätzung muss der Eigenbedarf/Wirkungsgradverlust erwa bei 20W liegen.
bei zwei Geräten sind dss gut 300kWh/a@bananajoe sagte in Stromverbrauch messen und dann optimieren:
Musst du halt mal eine Meßsteckdose davor und eine dahinter packen
hab ich bisher noch vermeiden wollen.
@bananajoe sagte in Stromverbrauch messen und dann optimieren:
ob sich ein Wechsel lohnt.
das wäre bei mir kein Wechsel mehr, sondern ein ersatzloses Streichen.
Auch wenn ich bisher immer für USVs plädiert habe -
@bananajoe sagte in Stromverbrauch messen und dann optimieren:
Musst du halt mal eine Meßsteckdose davor und eine dahinter packen.
Hab es eben geschafft den Hauptstecker zu ziehen, als ich meine Kabelführung rekonstruieren wollte
Jedenfalls kann ich jetzt sagen, dass die ES700 anscheinend gerademal 6W zieht.
Dann frage ich mich ernsthaft, was die restlichen 41W schluckt.- Tinkerboard
- pi4 2GB
- NUC6i3 mitvProxmox für iob und unifi, quasi im Schlafmodus
- D-link 8port
- zyxel 16 Port
für mich eher 25-30W
-
@bananajoe Hallo, wegen meines Problems mit der Strommessung per Shelly 1pm hab ich mich gerade hier registriert und nach meiner Sucheingabe diesen Thread gefunden.
Ich suche gerade einen Elektriker, der mir einen neuen Verteilerkasten anschließt, weil ich ebenfalls jeden Stromkreis messen möchte.
Aber nun zu meinem Problem: mein iobroker erkannte den Shelly, der an der Balkonanlage hängt, nicht mehr. Ich habe dann den raspi neu gestartet und anschließend war der power Wert im Shelly wieder da. (Der Direktzugriff über die IP des Browsers zeigte durchgehend den Powerwert an.) Das Problem war also grundsätzlich behoben.
Meine Skripte, mit denen ich ua den stündlichen Ertrag ermittle, funktionierten auch wieder - fast. Mein gestriger Tagesertrag lag bei -30 kW. Durch den Neustart des raspi samt iobroker war der energy Wert (also der aufaddierte Gesamtwert) auf null gesetzt. Da ich vom Gesamtwert den gestrigen Tageswert abgezogen habe, kam ein Negativwert heraus. Wie und wo kann/ muss ich was ändern, damit der Wert, den der iobroker aus dem Shelly liest, bei einem Neustart des Rechners nicht verloren geht?
(Wenn ich jetzt im falschen Thread bin - sorry - ich war so positiv angetan von Deinen Beispielen. (Als nächstes versuche ich, meine WD ebenfalls nur noch für den Backup hochzufahren.) -
@satan also, ich habe ja meine Shelly 1PM alle mit Tasmota geflasht ... da merken die sich die Werte selbst, auch nach einem Neustart/Stromausfall. Zudem könnte ich - bei einem Austausch - die Werte selbst setzen (das das neue Gerät mit dem Zählerstand vom alten weitermacht.)
Ich habe seit gestern einen Shelly EM im Einsatz (Der 1PM war mit dem Backofen + Grill überfordert), ich habe noch gar nicht geschaut ob der nach einem Stromausfall seine Werte verliert. Ich meine das mein Shelly 3EM sich das merkt (hatte aber auch schon sehr lange keinen Stromausfall mehr)
Hilft dir aber vermutlich nichts.
Du müsstest ggf. den Wert in ioBroker mit einem Skript triggern welcher dann die Werte prüft und übernimmt und seinen eigenen Zähler hochzählt.
Eventuell liegt der Fehler auch in deinem Skript? Merkst du dir deine Tages-Startwerte? Ich schreibe mit immer um Mitternacht den Zählerstand weg und rechne den Rest des Tages mit der Differenz des aktuellen Wertes gegen den gespeicherten.
Wenn dein Skript neu startet, macht es dann brav mit den Werten bis zum Neustart weiter? Das müsstest du sicherstellen. -
@bananajoe
Ich schreibe mit immer um Mitternacht den Zählerstand weg und rechne den Rest des Tages mit der Differenz des aktuellen Wertes gegen den gespeicherten.So hab ich‘s auch gemacht. Gestriger Wert z.B. 34 kw, aktueller Wert 4 kw. Ergo Tagesertrag -30 kw.
-
@satan ich habe da nur hochzählende Werte - also einen Wert seit dem ersten Start des Shellys der immer weiter hochzählt?
-
@bananajoe
Wenn dein Skript neu startet, macht es dann brav mit den Werten bis zum Neustart weiter? Das müsstest du sicherstellen.Ich habe Datenpunkte für Stunden-, Tages- und Monatsverbräuche (Ertrag) und jeweils Gesamtstände gespeichert und errechne dann immer die jeweilige Stunden, Tages und Monatsdifferenz aus dem aktuellen Wert des Shellys abzgl. des gespeicherten vorherigen Werts.
-
@bananajoe Weil ich den Stundenertrag der Balkon PV errechne, speichere ich ihn in einen Datenpunkt. Der Datenpunkt wird dann in eine Tabelle. Des SQL Server geschrieben. So kann ich - irgendwann mal - ne übersichtliche Ausgabe hinbekommen.
-
@satan ok, was genau läuft nun falsch? Welcher Datenpunkt liefert wann falsche Werte? Bitte genauen Datenpunkt mit vollständigen Pfad, ggf. anonymisiert
-
@bananajoe Der Shelly liefert zwei Werte: Energy und Power. Power gibt den aktuellen Ertrag an und liegt jetzt in den Abendstunden z.B. bei ungefähr 60 Watt (Paneele sind noch im Schatten). Energy gibt immer den gesamten Ertrag/ Verbrauch über alle Zeiten an. Da ich die Anlage erst ein paar Tage habe, lag der Wert bei ca. 34 kw. Erst da habe ich gemerkt, dass der Power Wert des Shelly im iobroker immer bei 0 bleibt und nicht aktualisiert wird. Wenn ich in der Shelly App nachsehe oder per IP auf die Weboberfläche des Shelly zugreife, sehe ich den tatsächlichen Wert. Das bedeutete für mich, dass der Shelly heile ist, aber der iobroker nicht mehr richtig den Power Wert aktualisiert. Deshalb habe ich den raspi incl. Iobroker neu gestartet. Nach dem Neustar lief zwar wieder alles korrekt - der Power Wert stimmte wieder mit den Werten der App überein. Allerdings wurde (warum?) der Energy Wert des shelly im iobroker auf 0 gesetzt und zeigte nicht mehr den Gesamtertrag an.
Warum das so geschieht, weiß ich nicht. Ich möchte nur eine Wiederholung vermeiden. Vielleicht sollte ich den Shally mit Tasmota flashen? Dann kann ich den Gesamtwert korrigieren, wenn der Fehler noch einmal passiert. -
-
@satan zeig mal die Konfiguration des Shelly Adapters. Eventuell machst du dazu ein neues Thema auf, passt hier ja eigentlich nicht rein
-
@bananajoe Sorry für den falschen Thread - hast recht. Kann man hier auch PNs verschicken? Hab Angst, dass ich Einige mit Anfängerfragen nerve. Ich kann mich leider auch nicht täglich melden
-
@satan sagte in Stromverbrauch messen und dann optimieren:
Kann man hier auch PNs verschicken? Hab Angst, dass ich Einige mit Anfängerfragen nerve.
ja kann man, aber dann nervst du
hier wirst du geholfen, in einem eigenen Thread
-
Schaue dir mal den Adapter sourceanalytix an, der macht das alles für dich
-
Entschuldige das ich mich hier einklinke, aber an genau dieser Art der Visualisierung scheitere ich gerade. Ich mache gerade meine ersten Schritte mit ioBroker und trotz vielen gelesenen Beiträgen und YT Videos stehe ich auf dem Schlauch. Ich habe 10 Tasmota Messdosen deren relevanten Werte in einer influxdb landen.
Die Wattstunden für heute und gestern habe ich ja bereits in den Objekten. Ich nehme an, das du für Woche, Monat, Vormonat, Quartal und Jahr eigene Datenpunkte erzeugst? Wie muss ich da vorgehen? Wie bekomme ich zu guter Letzt alles in eine so saubere Tabelle?Vielen Dank
-
@sonnenheim ich nutze den SourceAnalytix Adapter, den habe ich auf den Energy-Total Datenpunkten aktiviert.
Per Skript erzeuge ich aus der aktuellen Leistung und den SourceAnalytix Datenpunkten eine JSON Tabelle. Diese stelle ich mit dem JSON-Table Widget aus dem Inventwo-Adapter dar.
Ich könnte das JavaScript für das JSON hier posten ... es müsste aber ziemlich angepasst werden da es natürlich auf meine Umgebung und meine Quellen zugeschnitten ist. Ich definiere die Quelldatenpunkte im Skript und per Ersetzen baut er sich darauf den Pfad für die Source Analytix-Datenpunkte.
Ok, ich poste es hier, sind ein paar Sonderlocken drin (für Stromzähler und zum einfärben bestimmter Datenpunkte).
An den Tasmota-Pfad hängt er die notwendigen Endungen automatisch dran, wenn nicht angegeben versucht er den SourceAnalytix Pfad durch Suchen und Ersetzen zu erstellen// Changelog: // ---------- // 08.07.2002 Erste Version // Beschreibung: // ------------- // Dem Skript wir wird ein Array übergeben mit Datenpunkten von Geräten die den Stromverbrauch messen // Daraus wird eine JSON Tabelle aufbereitet mit Werten direkt von den Geräten + den Daten vom Source-Analytics Adapter // Die JSON-Tabelle kann dann per Widget in VIS dargestellt werden, ist scroll- und sortierbar, die Reihenfolge der Spalten lässt sich ändern oder ausblenden // Setup: // ------ // Zieldatenpunkt const s_TargetDatapoint = "0_userdata.0.Verbrauch.VIS.StromverbrauchJSON"; // [ Anzeigename, Datenpunkt, "Phase L1, L2 oder L3", "sourceanalytix Datenpunkt" ], let a_SourceDatapoints = [ [ "Stromzähler 3EM", "3EM", "L1", "sourceanalytix.0.0_userdata__0__shellies__3EM-Stromzaehler__Total-kWh" ], [ "Stromzähler", "Stadtwerke", "L1", "sourceanalytix.0.mqtt__0__esp32__esp32strom__zaehlerstand" ], [ "Handtuchtrocker", "0_userdata.0.tasmota.Blitzwolf099-Handtuchtrocker", "L1", "" ], [ "Weihnachten Schlafzimmer", "0_userdata.0.tasmota.Blitzwolf180-Weihnachten-Schlafzimmer", "L1", ""], [ "Lötstation Arbeitszimmer", "0_userdata.0.tasmota.Blitzwolf182-Loetstation", "L1", ""], [ "Brotbackautomat", "0_userdata.0.tasmota.Gosund186-Brotbackautomat", "L1", "" ], [ "Backofen", "0_userdata.0.shellies.EM181", "L1", "" ], [ "Datenschrank", "0_userdata.0.tasmota.Gosund187-Datenschrank", "L1", "" ], [ "Drucker", "0_userdata.0.tasmota.Gosund188-Drucker", "L1", "" ], [ "USB-5fach", "0_userdata.0.tasmota.Gosund190-Datenschrank-USB-5fach", "L1", "" ], [ "Kühlbox", "0_userdata.0.tasmota.Gosund191-Kuehlbox", "L1", "" ], [ "Fritz!Boxen", "0_userdata.0.tasmota.Plug101", "L1", "" ], [ "Lautsprecher PC", "0_userdata.0.tasmota.Nous078", "L1", "" ], [ "Tablett Keller", "0_userdata.0.tasmota.Nous093-WinPAD", "L1", "" ], [ "PoE Switch", "0_userdata.0.tasmota.Nous095-PoE-Switch", "L1", "" ], [ "Heizung", "0_userdata.0.tasmota.Nous096-Heizung", "L1", "" ], [ "BareMetal Server", "0_userdata.0.tasmota.Nous097-DCNEW", "L1", "" ], [ "Maschine", "0_userdata.0.tasmota.Nous196", "L1", "" ], [ "Garten + Terrasse", "0_userdata.0.tasmota.PM071-Garten-2F16", "L1", "" ], [ "Reinigungs steckdosen EG", "0_userdata.0.tasmota.PM072-Steck-2F7", "L1", "" ], [ "Heizungsraum", "0_userdata.0.tasmota.PM073-HeizSteck-1F5", "L1", "" ], [ "Treppenhaus 1", "0_userdata.0.tasmota.PM074-Treppe1-1F7", "L1", "" ], [ "Treppenhaus 2", "0_userdata.0.tasmota.PM075-Treppe2-1F8", "L1", "" ], [ "Kellerausgang + Verteiler", "0_userdata.0.tasmota.PM076-Ausgang-1F17", "L1", "" ], [ "Yasmin", "0_userdata.0.tasmota.PM110-Yasmin-1F13", "L1", "" ], [ "Lasse", "0_userdata.0.tasmota.PM112-Lasse-2F11", "L1", "" ], [ "Kühlschrank", "0_userdata.0.tasmota.PM116-Kuehlsch-2F5", "L1", "" ], [ "Schlafzimmer", "0_userdata.0.tasmota.PM117-Schlaf-1F14", "L1", "" ], [ "Spielzimmer", "0_userdata.0.tasmota.PM120-Spiel-2F13", "L1", "" ], [ "Weihnachten 1", "0_userdata.0.tasmota.PM122-Weihn-1F16", "L1", "" ], [ "Wohnzimmer", "0_userdata.0.tasmota.PM125-WoZi-2F9", "L1", "" ], [ "Weihnachten 2", "0_userdata.0.tasmota.PM126-Weihn-2F15", "L1", "" ], [ "Garage", "0_userdata.0.tasmota.PM130-Garage-1F2", "L1", "" ], [ "Spühlmaschine", "0_userdata.0.tasmota.PM131-Spuelma-2F2", "L1", "" ], [ "Küche", "0_userdata.0.tasmota.PM135-Kueche-1F10", "L1", "" ], [ "Außen vorne", "0_userdata.0.tasmota.PM145-Aussen-1F15", "L1", "" ], [ "Büro", "0_userdata.0.tasmota.PM208-Buero-2F17", "L1", "" ], [ "Trockner", "0_userdata.0.tasmota.Trockner169", "L1", "" ], [ "Waschmaschine", "0_userdata.0.tasmota.Waschmaschine168", "L1", "" ] ]; // #################################################################################################################################################### // http://www.network-science.de/ascii/ Font: big // __ __ _ _ _ // \ \ / / (_) | | | | // \ \ / /_ _ _ __ _ __ _| |__ | | ___ _ __ // \ \/ / _` | '__| |/ _` | '_ \| |/ _ \ '_ \ // \ / (_| | | | | (_| | |_) | | __/ | | | // \/ \__,_|_| |_|\__,_|_.__/|_|\___|_| |_| // #################################################################################################################################################### // #################################################################################################################################################### // Logging aktivieren für das Debuggen in die JavaScript-Console und in das ioBroker Log (true oder false): const b_logging = false; // und der erste Log-Eintrag DebugWarning("Startup: Setze Variablen ..."); // Stromkosten pro kWh für Tageskosten const i_costs = 0.3; var s_JSON = "["; // #################################################################################################################################################### // #################################################################################################################################################### // ______ _ _ _ // | ____| | | | | (_) // | |__ _ _ _ __ | | _| |_ _ ___ _ __ ___ _ __ // | __| | | | '_ \| |/ / __| |/ _ \| '_ \ / _ \ '_ \ // | | | |_| | | | | <| |_| | (_) | | | | __/ | | | // |_| \__,_|_| |_|_|\_\\__|_|\___/|_| |_|\___|_| |_| // #################################################################################################################################################### // #################################################################################################################################################### // DebugWarning gibt in der Console eine Warnmeldung aus wenn b_logging auf true steht /* accepts parameters * s_debugmessage = Print this text to console via warn */ function DebugWarning(s_debugmessage) { if (b_logging == true) { console.warn(s_debugmessage); } } // #################################################################################################################################################### // Ersetzt alle Vorkommen eines Zeichens, nicht nur das erste function ReplaceAll(string, search, replace) { return string.split(search).join(replace); } // #################################################################################################################################################### // Rundet die übergebende Zahl auf 2 Nachkommastellen // Quelle: https://www.delftstack.com/de/howto/javascript/javascript-round-to-2-decimal-places/ function RoundToTwo(i_number) { return + ( Math.round(i_number + "e+2") + "e-2" ); } // #################################################################################################################################################### function CreateJSON() { s_JSON = "[" for (var i = 0; i < a_SourceDatapoints.length; i++) { let s_currentName = a_SourceDatapoints[i][0]; let s_currentDevice = a_SourceDatapoints[i][1]; let s_currentPhase = a_SourceDatapoints[i][2]; let s_currentSourceAnalytix = ""; if ( a_SourceDatapoints[i][3] === '' ) { s_currentSourceAnalytix = "sourceanalytix.0." + ReplaceAll(a_SourceDatapoints[i][1], ".", "__") + "__Energy-Total"; } else { s_currentSourceAnalytix = a_SourceDatapoints[i][3]; }; DebugWarning("s_currentName .........: " + s_currentName); DebugWarning("s_currentDevice .......: " + s_currentDevice); DebugWarning("s_currentPhase: .......: " + s_currentPhase); DebugWarning("s_currentSourceAnalytix: " + s_currentSourceAnalytix); s_JSON = s_JSON + "{"; if ( s_currentDevice == '3EM') { s_JSON = s_JSON + '"name":"<p style=\\"color:red;\\">' + s_currentName + '</p>",' // s_JSON = s_JSON + '"name":"' + s_currentName + '",' s_JSON = s_JSON + '"phase":"' + s_currentPhase + '",' s_JSON = s_JSON + '"power-W":' + getState( "0_userdata.0.shellies.3EM-Stromzaehler.Total-Power" ).val + ',' s_JSON = s_JSON + '"today-kWh":' + getState( "0_userdata.0.Verbrauch.Haus.Energy-Today" ).val + ',' s_JSON = s_JSON + '"today-costs-euro":' + getState( "0_userdata.0.Verbrauch.Haus.Kosten-Today" ).val + ',' s_JSON = s_JSON + '"yesterday-kWh":' + getState( "0_userdata.0.Verbrauch.Haus.Energy-Yesterday" ).val + ',' } else if ( s_currentDevice == 'Stadtwerke' ) { s_JSON = s_JSON + '"name":"<p style=\\"color:red;\\">' + s_currentName + '</p>",' // s_JSON = s_JSON + '"name":"' + s_currentName + '",' s_JSON = s_JSON + '"phase":"' + s_currentPhase + '",' s_JSON = s_JSON + '"power-W":' + getState( "0_userdata.0.shellies.3EM-Stromzaehler.Total-Power" ).val + ',' s_JSON = s_JSON + '"today-kWh":' + getState( "0_userdata.0.Verbrauch.stromzaehler-today" ).val + ',' s_JSON = s_JSON + '"today-costs-euro":' + getState( "0_userdata.0.Verbrauch.stromzaehler-today-cost" ).val + ',' s_JSON = s_JSON + '"yesterday-kWh":' + getState( "0_userdata.0.Verbrauch.stromzaehler-yesterday" ).val + ',' } else { if ( s_currentName == 'Datenschrank') { s_JSON = s_JSON + '"name":"<p style=\\"color:#4444FF;\\">' + s_currentName + '</p>",' //s_JSON = s_JSON + '"name":"' + s_currentName + '",' } else if ( s_currentName == 'PoE Switch') { s_JSON = s_JSON + '"name":"<p style=\\"color:lightblue;\\">' + s_currentName + '</p>",' } else if ( s_currentName == 'Fritz!Boxen') { s_JSON = s_JSON + '"name":"<p style=\\"color:lightblue;\\">' + s_currentName + '</p>",' } else if ( s_currentName == 'BareMetal Server') { s_JSON = s_JSON + '"name":"<p style=\\"color:lightblue;\\">' + s_currentName + '</p>",' } else if ( s_currentName == 'USB-5fach') { s_JSON = s_JSON + '"name":"<p style=\\"color:lightblue;\\">' + s_currentName + '</p>",' } else if ( s_currentName == 'USB-5fach') { s_JSON = s_JSON + '"name":"<p style=\\"color:lightblue;\\">' + s_currentName + '</p>",' } else { s_JSON = s_JSON + '"name":"' + s_currentName + '",' } s_JSON = s_JSON + '"phase":"' + s_currentPhase + '",' s_JSON = s_JSON + '"power-W":' + getState( s_currentDevice + ".Energy-Power" ).val + ',' s_JSON = s_JSON + '"today-kWh":' + getState( s_currentDevice + ".Energy-Today" ).val + ',' s_JSON = s_JSON + '"today-costs-euro":' + ( getState( s_currentDevice + ".Energy-Today" ).val * i_costs ) + ',' s_JSON = s_JSON + '"yesterday-kWh":' + getState( s_currentDevice + ".Energy-Yesterday" ).val + ',' } s_JSON = s_JSON + '"yesterday-costs":' + getState( s_currentSourceAnalytix + ".currentYear.costs.01_previousDay" ).val + ',' s_JSON = s_JSON + '"currentWeek-kWh":' + getState( s_currentSourceAnalytix + ".currentYear.consumed.02_currentWeek" ).val + ',' s_JSON = s_JSON + '"currentWeek-cost":' + getState( s_currentSourceAnalytix + ".currentYear.costs.02_currentWeek" ).val + ',' s_JSON = s_JSON + '"currentMonth-kWh":' + getState( s_currentSourceAnalytix + ".currentYear.consumed.03_currentMonth" ).val + ',' s_JSON = s_JSON + '"currentMonth-cost":' + getState( s_currentSourceAnalytix + ".currentYear.costs.03_currentMonth" ).val + ',' s_JSON = s_JSON + '"previousMonth-kWh":' + getState( s_currentSourceAnalytix + ".currentYear.consumed.03_previousMonth" ).val + ',' s_JSON = s_JSON + '"previousMonth-cost":' + getState( s_currentSourceAnalytix + ".currentYear.costs.03_previousMonth" ).val + ',' s_JSON = s_JSON + '"currentQuarter-kWh":' + getState( s_currentSourceAnalytix + ".currentYear.consumed.04_currentQuarter" ).val + ',' s_JSON = s_JSON + '"currentQuarter-cost":' + getState( s_currentSourceAnalytix + ".currentYear.costs.04_currentQuarter" ).val + ',' s_JSON = s_JSON + '"previousQuarter-kWh":' + getState( s_currentSourceAnalytix + ".currentYear.consumed.04_previousQuarter" ).val + ',' s_JSON = s_JSON + '"previousQuarter-cost":' + getState( s_currentSourceAnalytix + ".currentYear.costs.04_previousQuarter" ).val + ',' s_JSON = s_JSON + '"currentYear-kWh":' + getState( s_currentSourceAnalytix + ".currentYear.consumed.05_currentYear" ).val + ',' s_JSON = s_JSON + '"currentYear-cost":' + getState( s_currentSourceAnalytix + ".currentYear.costs.05_currentYear" ).val + ',' s_JSON = s_JSON + '"previousYear-kWh":' + getState( s_currentSourceAnalytix + ".currentYear.consumed.05_previousYear" ).val + ',' s_JSON = s_JSON + '"previousYear-cost":' + getState( s_currentSourceAnalytix + ".currentYear.costs.05_previousYear" ).val + ',' s_JSON = s_JSON.replace(/,\s*$/, ""); // letztes Komma entfernen falls vorhanden s_JSON = s_JSON + "},"; } // letztes Komma entfernen https://stackoverflow.com/questions/17720264/remove-last-comma-from-a-string s_JSON = s_JSON.replace(/,\s*$/, ""); s_JSON = s_JSON + "]"; DebugWarning(s_JSON); setState(s_TargetDatapoint , s_JSON, true); } // #################################################################################################################################################### // #################################################################################################################################################### // _____ _ _ // / ____| | | | // | (___ | |_ __ _ _ __| |_ _ _ _ __ // \___ \| __/ _` | '__| __| | | | '_ \ // ____) | || (_| | | | |_| |_| | |_) | // |_____/ \__\__,_|_| \__|\__,_| .__/ // | | // |_| // #################################################################################################################################################### // #################################################################################################################################################### DebugWarning("Anzahl Datenpunkte: " + a_SourceDatapoints.length); // Beim Start einmal alle Daten erstellen CreateJSON(); // #################################################################################################################################################### // #################################################################################################################################################### // _____ _ _ _ _ // / ____| | | (_) | | (_) // | (___ _ _| |__ ___ ___ _ __ _ _ __ | |_ _ ___ _ __ ___ // \___ \| | | | '_ \/ __|/ __| '__| | '_ \| __| |/ _ \| '_ \/ __| // ____) | |_| | |_) \__ \ (__| | | | |_) | |_| | (_) | | | \__ \ // |_____/ \__,_|_.__/|___/\___|_| |_| .__/ \__|_|\___/|_| |_|___/ // | | // |_| // #################################################################################################################################################### // #################################################################################################################################################### // #################################################################################################################################################### // #################################################################################################################################################### // _____ _ _ _ // / ____| | | | | | | // | (___ ___| |__ ___ __| |_ _| | ___ // \___ \ / __| '_ \ / _ \/ _` | | | | |/ _ \ // ____) | (__| | | | __/ (_| | |_| | | __/ // |_____/ \___|_| |_|\___|\__,_|\__,_|_|\___| // #################################################################################################################################################### // alle 15 Sekunden schedule("*/15 * * * * *", async function () { CreateJSON(); });