NEWS
Adapterwerte und Script synchronisieren
-
Ich will mich mal wieder einen Schritt weiter in JS einarbeiten.
Vieles weiß ich schon, traue mich aber noch nicht so richtig, zumal Blockly (erst recht mit den zukünftigen neuen Bausteinen) eine fast vollwertige und einfachere Alternative ist.Mein jetziges Problem ist, dass ich zwei "geklaute" Skripte/Adapter miteinander kombinieren muss, was mir bisher nicht wirklich geggückt ist. Es ist zwar mit viel try and error immer besser geworden, daber nicht korrekt.
Es geht um die Berechnung des effektiven Stromverbrauchs aus Daten vom Smartmeter-Adapters (Momentanwert Gesamtwirkleistung (Total) ist +/- je nach Leistung der Solaranlage) und dem Wert der AC-Leistung des Wechselrichters nach Auslesen desselben über ein Skript.
Diese Werte kommen nicht synchron. Insbesondere bei stark wolkigem Wetter und schnell wechselndem Solarertrag ist eine Berechnung alle 10 Sekunden oft nicht korrekt, da die Werte so nicht synchronisiert sind.
Ich denke, dass es funktionieren würde, wenn ich das Auslese skript nicht per schedule
schedule("*/11 * 5-23 * * *", Piko);
sondern irgendwo zu Beginn auf die Änderung des Wertes des smartmeteradapters synchronisieren würde.
Wenn ich inzwischen richtig aufgepasst habe muss da irgendetwas mit
ON...smartmeter.0.1-0:16_7_0_255.value.. not equal
rein.
Aber wo und wie genau?
Danke für jede Hilfe
-
Hallo Rainer,
versuch es mal so:
on({id: "smartmeter.0.1-0:16_7_0_255.value", change: "ne"}, function (obj) { // Ausleseskript Wechselrichter Kostal Piko ab Firmware v05.31 (12.10.2015) //Variable //Leistungswerte ID_DCEingangGesamt = 33556736; // in W ID_Ausgangsleistung = 67109120; // in W ID_Eigenverbrauch = 83888128; // in W //Status ID_Status = 16780032; // 0:Off //Statistik - Tag ID_Ertrag_d = 251658754; // in Wh ID_Hausverbrauch_d = 251659010; // in Wh ID_Eigenverbrauch_d = 251659266; // in Wh ID_Eigenverbrauchsquote_d = 251659278; // in % ID_Autarkiegrad_d = 251659279; // in % //Statistik - Gesamt ID_Ertrag_G = 251658753; // in kWh ID_Hausverbrauch_G = 251659009; // in kWh ID_Eigenverbrauch_G = 251659265; // in kWh ID_Eigenverbrauchsquote_G = 251659280; // in % ID_Autarkiegrad_G = 251659281; // in % ID_Betriebszeit = 251658496; // in h //Momentanwerte - PV Genertor ID_DC1Spannung = 33555202; // in V ID_DC1Strom = 33555201; // in A ID_DC1Leistung = 33555203; // in W ID_DC2Spannung = 33555458; // in V ID_DC2Strom = 33555457; // in A ID_DC2Leistung = 33555459; // in W //Momentanwerte Haus ID_HausverbrauchSolar = 83886336; // in W ID_HausverbrauchBatterie = 83886592; // in W ID_HausverbrauchNetz = 83886848; // in W ID_HausverbrauchPhase1 = 83887106; // in W ID_HausverbrauchPhase2 = 83887362; // in W ID_HausverbrauchPhase3 = 83887618; // in W //Netz Netzparameter ID_NetzAusgangLeistung = 67109120; // in W ID_NetzFrequenz = 67110400; // in Hz ID_NetzCosPhi = 67110656; //Netz Phase 1 ID_P1Spannung = 67109378; // in V ID_P1Strom = 67109377; // in A ID_P1Leistung = 67109379; // in W //Netz Phase 2 ID_P2Spannung = 67109634; // in V ID_P2Strom = 67109633; // in A ID_P2Leistung = 67109635; // in W //Netz Phase 3 ID_P3Spannung = 67109890; // in V ID_P3Strom = 67109889; // in A ID_P3Leistung = 67109891; // in W var IPAnlage = '192.168.138.103/api/dxs.json'; // IP der Photovoltaik-Anlage createState('Messwerte.0.Solaranlage.Momentanwerte.Leistung_AC_aktuell', 0); createState('Messwerte.0.Solaranlage.Summenwerte.Autarkiegrad_d',0); createState('Messwerte.0.Solaranlage.Summenwerte.Autarkiegrad_G',0); createState('Messwerte.0.Solaranlage.Summenwerte.Betriebszeit',0); createState('Messwerte.0.Solaranlage.Momentanwerte.Leistung_DC_aktuell',0); createState('Messwerte.0.Solaranlage.Momentanwerte.Eigenverbrauch',0); createState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauch_d'); createState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauch_G', 0); createState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauchsquote_d', 0); createState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauchsquote_G', 0); createState('Messwerte.0.Solaranlage.Summenwerte.Tagesertrag', 0); createState('Messwerte.0.Solaranlage.Summenwerte.Gesamtertrag', 0); createState('Messwerte.0.Solaranlage.Summenwerte.Hausverbrauch_d', 0); createState('Messwerte.0.Solaranlage.Summenwerte.Hausverbrauch_G', 0); createState('Messwerte.0.Solaranlage.Momentanwerte.P1Spannung'); createState('Messwerte.0.Solaranlage.Momentanwerte.P2Spannung'); createState('Messwerte.0.Solaranlage.Momentanwerte.P1Strom'); createState('Messwerte.0.Solaranlage.Momentanwerte.P2Strom'); createState('Messwerte.0.Solaranlage.Momentanwerte.P1Leistung'); createState('Messwerte.0.Solaranlage.Momentanwerte.P2Leistung'); var logging = false; var request = require('request'); function Piko() { if (logging) log("Piko 5.5 auslesen"); request('http://' + IPAnlage + '?dxsEntries=' + ID_DCEingangGesamt + '&dxsEntries=' + ID_Ausgangsleistung + '&dxsEntries=' + ID_Eigenverbrauch + '&dxsEntries=' + ID_Eigenverbrauch_d + '&dxsEntries=' + ID_Eigenverbrauch_G + '&dxsEntries=' + ID_Eigenverbrauchsquote_d + '&dxsEntries=' + ID_Eigenverbrauchsquote_G + '&dxsEntries=' + ID_Ertrag_d + '&dxsEntries=' + ID_Ertrag_G + '&dxsEntries=' + ID_Hausverbrauch_d + '&dxsEntries=' + ID_Hausverbrauch_G + '&dxsEntries=' + ID_Autarkiegrad_G + '&dxsEntries=' + ID_Autarkiegrad_d + '&dxsEntries=' + ID_Betriebszeit + '&dxsEntries=' + ID_P1Spannung + '&dxsEntries=' + ID_P2Spannung + '&dxsEntries=' + ID_P1Strom + '&dxsEntries=' + ID_P2Strom + '&dxsEntries=' + ID_P1Leistung + '&dxsEntries=' + ID_P2Leistung + '&dxsEntries=' + ID_Status + '&dxsEntries=' + ID_DC1Leistung + '&dxsEntries=' + ID_DC2Leistung, function (error, response, body) { if(!error && response.statusCode ==200) { if(logging) log(body); var result = JSON.parse(body).dxsEntries; setState('Messwerte.0.Solaranlage.Momentanwerte.Leistung_DC_aktuell', result[0].value || 0, true); setState('Messwerte.0.Solaranlage.Momentanwerte.Leistung_AC_aktuell', result[1].value || 0, true); setState('Messwerte.0.Solaranlage.Momentanwerte.Eigenverbrauch', result[2].value || 0, true); setState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauch_d', result[3].value || 0, true); setState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauch_G', result[4].value || 0, true); setState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauchsquote_d', result[5].value || 0, true); setState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauchsquote_G', result[6].value || 0, true); setState('Messwerte.0.Solaranlage.Summenwerte.Tagesertrag', result[7].value || 0, true); setState('Messwerte.0.Solaranlage.Summenwerte.Gesamtertrag', result[8].value || 0, true); setState('Messwerte.0.Solaranlage.Summenwerte.Hausverbrauch_d', result[9].value || 0, true); setState('Messwerte.0.Solaranlage.Summenwerte.Hausverbrauch_G', result[10].value || 0, true); setState('Messwerte.0.Solaranlage.Summenwerte.Autarkiegrad_G', result[11].value || 0, true); setState('Messwerte.0.Solaranlage.Summenwerte.Autarkiegrad_d', result[12].value || 0, true); setState('Messwerte.0.Solaranlage.Summenwerte.Betriebszeit', result[13].value || 0, true); setState('Messwerte.0.Solaranlage.Momentanwerte.P1Spannung', result[14].value || 0, true); setState('Messwerte.0.Solaranlage.Momentanwerte.P2Spannung', result[15].value || 0, true); setState('Messwerte.0.Solaranlage.Momentanwerte.P1Strom', result[16].value || 0, true); setState('Messwerte.0.Solaranlage.Momentanwerte.P2Strom', result[17].value || 0, true); setState('Messwerte.0.Solaranlage.Momentanwerte.P1Leistung', result[18].value || 0, true); setState('Messwerte.0.Solaranlage.Momentanwerte.P2Leistung', result[19].value || 0, true); setState('Messwerte.0.Solaranlage.Momentanwerte.Status', result[20].value || 0, true); setState('Messwerte.0.Solaranlage.Momentanwerte.Leistung_String1', result[21].value || 0, true); setState('Messwerte.0.Solaranlage.Momentanwerte.Leistung_String2', result[22].value || 0, true); } else { log("Fehler: " + error + " bei Abfrage von: " + url, "warn"); } }); } });
Wenn der Wert von "smartmeter.0.1-0:16_7_0_255.value" sich ändert und ungleich dem vorherigen Wert ist, wird getriggert.
Viele Grüße
Christian -
@Homoran Anstelle des schedule() am Skriptende ein on() als Trigger auf den Smartmeter-Datenpunkt.
on('smartmeter.0.1-0:16_7_0_255.value', Piko); // triggert bei Wertänderung
Hoffentlich erfolgt die Wertänderung nicht zu schnell.
-
Danke Paul!
@paul53 sagte in Adapterwerte und Script synchronisieren:
am Skriptende
Das erschien mir auch am logischsten, aber ich dachte das muss immer (ziemlich weit) oben stehen.
@paul53 sagte in Adapterwerte und Script synchronisieren:
Hoffentlich erfolgt die Wertänderung nicht zu schnell.
Im MOment alle 10 Sekunden - was wäre deiner Meinung denn ein "sicheres" Intervall?
-
@Homoran sagte:
ich dachte das muss immer (ziemlich weit) oben stehen.
Nein, in der Regel weit unten, denn die Deklaration der im Trigger verwendeten Variablen und Funktionen sollte vorher erfolgen (damit der Parser/Compiler nicht mehrere Durchläufe benötigt).
@Homoran sagte:
alle 10 Sekunden
Das sollte problemlos funktionieren, denn die Laufzeit der Funktion Piko() wird wohl erheblich geringer sein.
-
@paul53
Danke!
Dann trau ich mich mal