NEWS
Rechnen mit Datenpunkte und/oder Variablen
-
gemischte Rechnungen
Macht es einen Unterschied, ob ich direkt mit den Datenpunkten rechne oder deren Wert vorher in Variablen schreibe und dann mit diesen rechne?
Kann es passieren, dass bei "gemischten Rechnungen", also wo beides verwendet wird, noch mit dem alten Datenpunktwert gerechnet wird, weil der neue Wert noch nicht gespeichert wurde (da asynchron gespeichert wird)?Variablenwert merken
Was passiert mit Variablen bei einem Script, das z. B. stündlich wiederholt wird. Merkt sich blockly den letzten Wert oder muss ich den Wert der Variablen jedesmal neu definieren? -
@judisi sagte in Rechnen mit Datenpunkte und/oder Variablen:
Variablenwert merken
Was passiert mit Variablen bei einem Script, das z. B. stündlich wiederholt wird. Merkt sich blockly den letzten Wert oder muss ich den Wert der Variablen jedesmal neu definieren?Ein Script wird nicht in diesem Sinne "wiederholt".
Es läuft ja permanent. Was sich wiederholt (oder besser formuliert: Mehrfach aufgerufen wird), ist der Code innerhalb einer Ereignisbehandlung (Trigger/Zeitplan).
Variablen gelten für die gesamte Laufzeit eines Script. Solange das Script nicht neu gestartet wird, behalten sie ihren Wert.
Darum setzt man Variablen beim Start eines Script üblicherweise auch auf einen definierten Wert, falls man mit ihnen zu arbeiten gedenkt.gemischte Rechnungen
Macht es einen Unterschied, ob ich direkt mit den Datenpunkten rechne oder deren Wert vorher in Variablen schreibe und dann mit diesen rechne?
Kann es passieren, dass bei "gemischten Rechnungen", also wo beides verwendet wird, noch mit dem alten Datenpunktwert gerechnet wird, weil der neue Wert noch nicht gespeichert wurde (da asynchron gespeichert wird)?Von der reinen Berechnung macht es keinen Unterschied.
Man sollte Variablen dort einsetzen, wo man einen Wert ansonsten mehrfach aus einem DP lesen müsste.
Und was man auf keinen Fall machen sollte: In einem DP-Trigger nimmt man aus dem Bereich "Trigger" den Block "Objekt ID" und ändert den auf "Wert", wenn man mit dem Wert des triggernden DP rechnen möchte.
Man liest in diesem Fall nicht den Wert nochmals mit "Wert von" ein. -
@codierknecht
Hallo,
ich bin neue hier, begrüße alle und habe eine Frage.
Kann es sein, dass wenn man im Script einen Wert in einen Datenpunkt schreibt und in der nächsren Zeile den Wert dieses Dantenpunktes in einer Rechnung wieder ausliest, dass dieser noch gar nicht geänedert wurde, dass die Zeit dafür zu kurz war.
Grüße Reinhard -
@reini-0
Ja - ist so. Die sogenannte "Asynchron-Falle".Aber warum willst Du den in der nächste Zeile lesen, wenn Du den Wert bereits kennst?
Also: Zeigen!
https://forum.iobroker.net/topic/51555/hinweise-für-gute-forenbeiträge -
@codierknecht
Sorry, wusste nicht, dass ich einen neuen Beitrag hätte eröffnen sollen. Werde ich in Zukunft machen.
Danke für die Antwort. Hilft mir. Werde eine Pause einbauen. Vielleicht auch besser mit Variablen statt Dtenpunkten zu arbeiten. -
@reini-0 sagte in Rechnen mit Datenpunkte und/oder Variablen:
Werde eine Pause einbauen. Vielleicht auch besser mit Variablen statt Dtenpunkten zu arbeiten
Pause ist eher suboptimal. Also besser mit Variablen arbeiten.
Erstens weißt Du nicht, wann der Wert tatsächlich in den DP geschrieben wurde. Das können 10 ms oder auch 20 Sekunden sein.
Und zweitens verbrätst Du damit unnötig Ressourcen.Und nochmal: ZEIGEN!
-
Danke. Ich habe es verstanden. Werde mit Variablen arbeiten.
Ich habe eine zusätzliche kleine PV Anlage die mein Meerwasseraquarium versorgt. Mit dem Script ermittle ich den Tagesverbrauch. Gleichzeitig ermittle ich wie viel die kleine Anlage Ertrag hat (Differenz PV-in zu PV-out). Der Gesamtzählerstand witd von Shellys ausgelesen und die Differenz aktuell zum Vortag berechnet. Die Beleuchtung ist extra und nicht an die kleine PV Anlage angeschlossen. (Steckdose_Aquarium) Der Gesamtverbrauch wird dann ermittel, Hier hatte ich das Problem, dass der Wert des Datenpunktes nicht aktualisiert war. Dewshalb habe ich die Pause eingebaut. Das ist nicht die Lösung. Ich mache es neu mit Variablen.schedule('{"time":{"exactTime":true,"start":"23:56"},"period":{"days":1}}', async () => {
setState('0_userdata.0.PVin_Tag' /* PVin_Tag /, (getState('shelly.2.shellyplus1pm#08b61fd7afe0#1.Relay0.Energy').val - getState('0_userdata.0.PVin_gestern').val), true);
setState('0_userdata.0.PVout_Tag' / PVout_Tag /, (getState('shelly.2.shellyplus1pm#a8032abbfe18#1.Relay0.Energy').val - getState('0_userdata.0.PVout_gestern').val), true);
await wait(200);
setState('0_userdata.0.PV_Tag' / PV_Tag /, (getState('0_userdata.0.PVin_Tag').val - getState('0_userdata.0.PVout_Tag').val), true);
setStateDelayed('0_userdata.0.Steckdose_Aquarium_Tag' / Steckdose_Aquarium_Tag /, (getState('shelly.2.shellyplusplugs#d4d4daed6068#1.Relay0.Energy').val - getState('0_userdata.0.Steckdose_Aquarium_gestern').val), true, 200, false);
await wait(200);
setState('0_userdata.0.Aquarium_Tag' / Aquarium_Tag /, (getState('0_userdata.0.PVin_Tag').val + getState('0_userdata.0.Steckdose_Aquarium_Tag').val), true);
setState('0_userdata.0.PVin_gestern' / PVin_gestern /, getState('shelly.2.shellyplus1pm#08b61fd7afe0#1.Relay0.Energy').val, true);
setState('0_userdata.0.PVout_gestern' / PVout_gestern /, getState('shelly.2.shellyplus1pm#a8032abbfe18#1.Relay0.Energy').val, true);
setState('0_userdata.0.Steckdose_Aquarium_gestern' / Steckdose_Aquarium_gestern */, getState('shelly.2.shellyplusplugs#d4d4daed6068#1.Relay0.Energy').val, true);
});