NEWS
Frage zu einem Script und dem genutzten Datenpunkt
-
@opöl sagte in Frage zu einem Script und dem genutzten Datenpunkt:
Wie kann ich verhindern, dass 16,7 W als 16.Juli interpretiert werden? In den Admin Systemeinstellungen ist als Trennzeichen "Komma" angegeben, die csv liefert aber einen Punkt als Trennzeichen.
Einfache Lösung: Verwende kein Excel, um Dir CSV-Dateien anzusehen.
Da schlägt dann die eingebaute "Microsoft-Logik" zu.Ich bin ja immer schon dafür, Excel zu verbieten. Aber wer hört schon auf mich?
-
on('sonoff.0.Stromzähler.SENSOR..Power',function (obj) { var einspeisung=0; // Standardwert für die Einspeisung ist 0 var gesamtleistung=obj.state.val; // Aktueller Wert der Gesamtleistung // Wenn die Gesamtleistung negativ ist, wird ins Netz eingespeist if (gesamtleistung<0) { einspeisung=Math.abs(gesamtleistung); // Einspeisung ist der Betrag der negativen Gesamtleistung } // Schreibe den Wert in den neuen Datenpunkt "Einspeisung" // setState('sonoff.0.Stromzähler.SENSOR.Einspeisung', einspeisung); setState('0_userdata.0.Einspeisung.PV-Einspeisung',einspeisung,true); // Eingespeiste Leistung / Energie berechnen Einheit: Wm (Wattminuten), da 1 Wert / Minute // Hole aktuelle Einspeisung in (W) const ideinspeisung='0_userdata.0.Einspeisung.PV-Einspeisung'; var einspeisung=getState(ideinspeisung).val; // Hole alten Zählerstand (Wm) const idenergie='0_userdata.0.Einspeisung.PV-Einspeisung-Power'; var energie=getState(idenergie).val; // Addiere aktuelle Leistung (W * 1 Minute) zur alten eingespeisten Energie (Wm) und schreibe Wert energie_neu=energie+einspeisung; setState('0_userdata.0.Einspeisung.PV-Einspeisung-Power',energie_neu,true); });
wenn das ordentlich formatiert ist sieht man den Fehler Für was genau sind zeile 16 und 17 gut... und geht das überhaupt so schnell wieder lesen?
Davon abgesehen ist in der ersten id ein
..
das "darf" eigentlich nicht sein. -
@ticaki sagte: Für was genau sind zeile 16 und 17 gut... und geht das überhaupt so schnell wieder lesen?
Diese Zeilen sind wegen der asynchronen Ausführung von setState() kontraproduktiv.
-
-
@opöl
Desweiteren istenergie_neu
nicht deklariert -const energie_neu =
-
@paul53 @Codierknecht
Doch das geht:setState('0_userdata.0.Test', 4); let test = getState('0_userdata.0.Test').val*2 setState('0_userdata.0.Test', test); test = getState('0_userdata.0.Test').val*2 setState('0_userdata.0.Test', test); log(`getState: ${getState('0_userdata.0.Test').val} should be: ${test}`);
script.js.Test.Skript_1: getState: 16 should be: 16
hab nicht im Code geschaut, aber ich denke der JS schreibt das direkt in seinen Cache und ruft eine async funktion auf die es weiter durchreicht. Das war mal anders. Denke wurde wegen Blockly geändert, da benutze die Leute nicht wirklich variablen.
solltest 16 und 17 trotzdem löschen weil du die daten ja schon hast, macht keinen Sinn die nochmal anzufragen.
-
@ticaki sagte in Frage zu einem Script und dem genutzten Datenpunkt:
Das war mal anders
Hängt dann natürlich auch davon ab, welche Version des JS-Controllers @opöl am Start hat.
Könnte man das mit
await setStateAsync()
umgehen?
Natürlich nur interessehalber.
Das wird ja hier eigentlich gar nicht benötigt. -
@codierknecht,
eigentlich bin ich ein Freund von Excel und hatte die Hoffnung, dass man iobroker dazu überreden könnte, Kommata zu verwenden. Naja, ist ja erst einmal nur zur manuellen Kontrolle der Werte. Ich schaue mal, was sich da so anbietet.@ticaki und @paul53 ,
ich hatte mal gelesen, dass Variablen außerhalb einer Funktion nicht mehr aktuell sind bzw. sein können. Wenn ich die Variable direkt weiter verwerten kann, probiere ich es ohne die beiden Zeilen.Vielen Dank für die Tipps bisher. Die werden so umgesetzt.
Hat jemand eine Idee zu der 1. Frage?
Die neuen Werte verschwinden nach 30-40 Sekunden wieder.Danke und Gruß
-
@opöl sagte in Frage zu einem Script und dem genutzten Datenpunkt:
@ticaki und @paul53 ,
ich hatte mal gelesen, dass Variablen außerhalb einer Funktion nicht mehr aktuell sind bzw. sein können. Wenn ich die Variable direkt weiter verwerten kann, probiere ich es ohne die beiden Zeilen.Aber das ist doch alles nur 1 Funktion? Zu deiner Frage muß ich nochmal schauen ob ich was überlesen habe.
EDIT: In dem Code gibt es keinen Grund warum der Wert auf 0 gesetzt werden sollte.
-
@ticaki,
der Wert wird standardmäßig auf „0“ gesetzt und im Falle der Einspeisung durch den errechneten Wert ersetzt.In meinem Fall gibt es tatsächlich einen namenlosen Ordner in den Objekten unterhalb „Sensor“. Wie der dahin kommt, ist mir auch schleierhaft. Daher die beiden „..“. Steht ganz oben im Kommentar meines Scripts.
Gruß
-
@opöl sagte in Frage zu einem Script und dem genutzten Datenpunkt:
der Wert wird standardmäßig auf „0“ gesetzt und im Falle der Einspeisung durch den errechneten Wert ersetzt.
Und dann in Zeile 14 weggeschrieben.
Dann braucht man den in Zeile 19 ja nicht wieder einzulesen.
Ineinspeisung
steht ja dann noch immer der gleiche Wert. -
-
@opöl sagte in Frage zu einem Script und dem genutzten Datenpunkt:
@ticaki,
der Wert wird standardmäßig auf „0“ gesetzt und im Falle der Einspeisung durch den errechneten Wert ersetzt.Ich meinte damit:
Neu geschriebene Werte (energie_neu) werden im iobroker kurz angezeigt, verschwinden aber wieder.
werte verschwinden nicht. Daher bin ich davon ausgegangen das irgendwas die überschreibt.
-
@ticaki ,
ich habe es gerade noch einmal überprüft.
Ein neuer Eintrag (der alte Wert, da ja im Moment keine Einspeisung erfolgt) wird im Datenpunkt „0_userdata.0.Einspeisung.PV-Einspeisung-Power“ für < 1 Minute angezeigt, verschwindet aber dann. Dann wird der neue Wert genau so lange angezeigt, bis auch der „verschwindet“. Die alten Werte aus der Testphase bleiben erhalten. Auch der Datenexport zeigt ein identisches Ergebnis.Wenn ein anderes Script den DP überschreiben würde, wäre doch unter dem Zeitstempel etwas abgelegt?
Adapter schreiben doch in dem Bereich eh nicht?Ich gehe morgen nochmal meine Scripte durch.
Vielleicht ist ja auch was quer mit einem Alias?Gruß
-
Kurzes Update:
Einer Eingebung folgend, habe ich meiner Windows Erfahrung geschuldet mal den Raspberry neu gestartet.
Nach einem kurzen Moment der Freude, weil der Wert von 22:26 Uhr erhalten blieb, folgte prompt die Ernüchterung.
Die nachfolgend geschriebenen Werte verschwinden wieder…..Gruß
-
verwende einen
on()
auf den datenpunkt und lass dirobj.state.from
ins log schreiben. -
@opöl sagte in Frage zu einem Script und dem genutzten Datenpunkt:
In meinem Fall gibt es tatsächlich einen namenlosen Ordner in den Objekten unterhalb „Sensor“. Wie der dahin kommt, ist mir auch schleierhaft. Daher die beiden „..“. Steht ganz oben im Kommentar meines Scripts.
Der "Geister-Ordner" wird möglicherweise gar nicht existieren, wenn der DP mit genau diesem Tippfehler per Script erzeugt wurde.
Das solltest Du noch korrigieren und eine saubere Struktur erzeugen.
Früher oder später könnte (wird) Dir sowas auf die Füße fallen.
Ich zitiere mal Brian W. Kernighan: “Don’t comment bad code—rewrite it.”
Spart dann übrigens auch eine Zeile Code ... #2 -
@codierknecht ,
der „Geisterordner“ sonoff.0.Stromzähler.SENSOR..Power wurde nicht manuell sondern vom Sonoff Adapter angelegt. Bis ich mit dem Script begonnen habe, ist mir das garnicht aufgefallen.@ticaki ,
leider muss ich zugeben, dass ich die ersten Gehversuche mit Java Scripts mache. Wärst Du so freundlich, mir das mit dem Log Eintrag in die Feder zu diktieren? -
die id mußte selbst eintragen.
on('sonoff.0.Stromzähler.SENSOR..Power', function (obj) { log(obj.state.from); });
-
@ticaki ,
ich habe mal Deinen Tipp umgesetzt. PV-Einspeisung-Power ist ja der Datenpunkt, um den es hier geht. Das Script sieht dann so aus:
// Abonniere den Datenpunkt, der die Gesamtleistung misst //Zwischen Sensor und Power liegt noch ein Ordner ohne Name. Daher die 2 ".." on('sonoff.0.Stromzähler.SENSOR..Power', function (obj) { var einspeisung = 0; // Standardwert für die Einspeisung ist 0 var gesamtleistung = obj.state.val; // Aktueller Wert der Gesamtleistung // Wenn die Gesamtleistung negativ ist, wird ins Netz eingespeist if (gesamtleistung < 0) { einspeisung = Math.abs(gesamtleistung); // Einspeisung ist der Betrag der negativen Gesamtleistung } // Schreibe den Wert in den neuen Datenpunkt "Einspeisung" // setState('sonoff.0.Stromzähler.SENSOR.Einspeisung', einspeisung); setState('0_userdata.0.Einspeisung.PV-Einspeisung', einspeisung, true); // Eingespeiste Leistung / Energie berechnen Einheit: Wm (Wattminuten), da 1 Wert / Minute // Hole aktuelle Einspeisung in (W) //const ideinspeisung = '0_userdata.0.Einspeisung.PV-Einspeisung'; //var einspeisung = getState(ideinspeisung).val; // Hole alten Zählerstand (Wm) const idenergie = '0_userdata.0.Einspeisung.PV-Einspeisung-Power'; var energie = getState(idenergie).val; // Addiere aktuelle Leistung (W * 1 Minute) zur alten eingespeisten Energie (Wm) und schreibe Wert //var energie_neu = 0; var energie_neu = energie + einspeisung; setState('0_userdata.0.Einspeisung.PV-Einspeisung-Power', energie_neu, true); }); on('0_userdata.0.Einspeisung.PV-Einspeisung-Power', function (obj) { log(obj.state.from); });
Im Log finde ich alle paar Minuten dieses:
javascript.0 2023-12-18 20:45:00.468 info script.js.common.Zählerauswertung.Einspeisung_Zähler: registered 2 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
so sehen die Datenpunkte unterhalb Sonoff aus:
Du siehst den unbenannten Ordner, der automatisch angelegt wurde, Daher die beiden ".." in meinem Script.
Und jetzt @all. Der Knaller:
Seit gerade werden die unter 0_userdata.0.Einspeisung.PV-Einspeisung-Power geschriebenen Werte im iobroker dauerhaft angezeigt:
Was habe ich gemacht?
Den Alias dieses Wertes (Einspeisung-Zählerstand) habe ich mal testweise auf einen kürzeren Namen umgestellt. Grund dafür war, dass auf der Kommandozeile des Raspberry im influx Client ein "select * from Einspeisung-Zählerstand" einen Fehler hervorruft.
Der influx Client stolpert offensichtlich über den Bindestrich.Interessanterweise kommt der influx Client Fehler aber auch bei einem "select * from Strom-Zählerstand", also dem Alias des physischen Stromzählers. Der wiederum verhält sich im iobroker völlig normal. Das konnte also nicht der Grund sein, warum die Werte des Einspeisung-Zählerstands im iobroker "verschwinden.
Also habe ich den Alias wieder auf den alten Namen "Einspeisung-Zählerstand" geändert und seitdem bleiben die geschriebenen Werte erhalten.
Ich kann jetzt nur vermuten, aber es sieht so aus, als ob beim erstmaligen Einrichten des Alias etwas schief gegangen ist.
Lesson learned:
Keine zu langen Aliase und keine Sonderzeichen benutzen, sonst hat der influx Client Probleme bei der Abfrage der Werte.2nd Lesson learned:
Ich werde das Script noch um das Speichern des Eigenverbrauchs erweitern. Das errechnen des Eigenverbrauchs mittels Math in Grafana erscheint nicht zielführend:Aber vielleicht hat dazu ja auch noch jemand eine Idee.
Vielen Dank für die Anregungen und Eure Unterstützung.
Und Sorry für den geringen Ertrag heuteGruß
Horst