NEWS
Programmablauf in Blockly sequenziell oder parallel?
-
Guten Morgen, habe mir für meine PV Anlage einen Skript zur Berechnung verschiedener Werte geschrieben.
Die Berechnung des Eigenverbrauchs, läuft aber irgendwie nicht rund. Im Trackingadapter laufen mir die Werte des Monats und Gesamtverbrauchs auseinander, obwohl sie eigentlich nur um einen Betrag x sich parallel ändern dürften. Mein Verdacht ist, dass Blockly Schritt 2 vor 1 macht und so die Werte auseinander driften. Soll ich evtl. eine Verzögerung von je 1 ms in die Programmabschnitte einbauen?
Die feste Werte im Programm sind alte Zählerstände.
-
@axmlm INNERHALB eines Blocks ist der Ablauf erstmal generell sequenziell (außer man nutzt Timer o. Ä.)
Auf die Reproduzierbarkeit der Reihenfolge, in denen die beiden Trigger auf den gleichen Datenpunkt ausgelöst werden würde ich mich nicht verlassen ...
Wieso nutzt Du überhaupt zwei Trigger auf denselben Datenpunkt?
-
@axmlm sagte in Programmablauf in Blockly sequenziell oder parallel?:
Mein Verdacht ist, dass Blockly Schritt 2 vor 1 macht und so die Werte auseinander driften.
Wenn Du zwei Trigger auf den gleichen Datenpunkt registrierst, ist es Zufall welcher zuerst ausgeführt wird. Wenn das voneinander abhängig ist, dann die Logik in einen Trigger.
PS: Warum musst Du überhaupt so oft "nach Zahl" konvertieren? Liegen die Daten nicht im richtigen Format vor? Was ist der Datentyp der Datenpunkte?
-
@axmlm
Zusätzlich zu dem was @MartinP und @haus-automatisierung geschrieben haben:- In einem Trigger muss man den Wert des triggernden State nicht nochmal lesen. Dazu gibt's den Block "Wert"
- Ich würde die Zwischenwerte in Variablen ablegen und mit denen weiterarbeiten. Spart dann auch mehrfaches Lesen des gleichen State. Außerdem liest sich das besser.
https://forum.iobroker.net/topic/70481/blockly-for-dummies-starthilfe-und-tipps
-
@martinp said in Programmablauf in Blockly sequenziell oder parallel?:
Wieso nutzt Du überhaupt zwei Trigger auf denselben Datenpunkt?
Das ist eine gute Frage, ist historisch so gewachsen. Hab's tatsächlich nicht gemerkt. Ist jetzt geändert, Danke!
Habe jetzt die Zählerauswertung und PV Auswertung in ein Blockly eingefügt (deshalb mal "steuere" und mal "aktualisiere") was denkst Du klappt das so, dass erst der Zähler ausgewertet wird und dann die Berechnung läuft? Ich wollte die Berechnung nicht nach Verbrauch triggern, dann dann aktualisiert es sich dauernd. Der Trigger nach dem Zählerstand, ist da etwas langsamer.
![0_1730197386581_chrome_X3a3Suoqjv.png](Uploading 0%)
-
Internet war kurz weg, jetzt ist alles was ich zuvor geschrieben habe weg.
Konvertiert, habe ich nur für alle Fälle, falls die Werte nicht als Zahl kommen. Kann man eigentlich weg lassen. Variable wollte ich nicht nutzen, da dann diese nur im Skript intern verwendbar ist und der Wert von Zwischenergebnis (mit meinen Kenntnissen) nicht sichtbar ist.
Habe jetzt zwei Skripte zusammengefügt und den doppelten Trigger gelöscht. Die Berechnung möchte ich dennoch nicht nach aktuellem Zählerwert starten, sondern nach Zählerstand. Das ist deutlich seltener als der aktuelle Verbrauch.
Melde mich wieder wenn Internet sich stabilisiert hat.
-
Internet war kurz weg, jetzt ist alles was ich zuvor geschrieben habe weg.
Konvertiert, habe ich nur für alle Fälle, falls die Werte nicht als Zahl kommen. Kann man eigentlich weg lassen. Variable wollte ich nicht nutzen, da dann diese nur im Skript intern verwendbar ist und der Wert von Zwischenergebnis (mit meinen Kenntnissen) nicht sichtbar ist.
Habe jetzt zwei Skripte zusammengefügt und den doppelten Trigger gelöscht. Die Berechnung möchte ich dennoch nicht nach aktuellem Zählerwert starten, sondern nach Zählerstand. Das ist deutlich seltener als der aktuelle Verbrauch.
Melde mich wieder wenn Internet sich stabilisiert hat.
-
@axmlm sagte in Programmablauf in Blockly sequenziell oder parallel?:
der Wert von Zwischenergebnis (mit meinen Kenntnissen) nicht sichtbar ist
Oder etwas ausführlicher:Für sowas Datenpunkte zu verbraten ist ineffizient.
Es sei denn, man braucht die an anderer Stelle wirklich mal. -
oh je, jetzt sind 2 Posts doppelt und einer unvollständig.
-
So, jetzt mit dem Screenshot:
Konvertiert, habe ich nur für alle Fälle, falls die Werte nicht als Zahl kommen. Kann man eigentlich weg lassen. Variable wollte ich nicht nutzen, da dann diese nur im Skript intern verwendbar ist und der Wert von Zwischenergebnis (mit meinen Kenntnissen) nicht sichtbar ist.
Habe jetzt zwei Skripte zusammengefügt und den doppelten Trigger gelöscht. Die Berechnung möchte ich dennoch nicht nach aktuellem Zählerwert starten, sondern nach Zählerstand. Das ist deutlich seltener als der aktuelle Verbrauch.
auch habe ich Zählerauswertung und PV-Berechnungen in einen Skript reinkopiert. Deshalb der Mix aus "steuere" und "aktualisiere". Steuere hat bei der Zählerauswerrtung nicht funktioniert.
-
@axmlm sagte in Programmablauf in Blockly sequenziell oder parallel?:
Deshalb der Mix aus "steuere" und "aktualisiere". Steuere hat bei der Berechnung nicht funktioniert.
Das ergibt keinen Sinn und kann nicht sein. Du weißt schon wie ioBroker arbeitet und was es mit dem „bestätigt“-Flag auf sich hat?
-
@haus-automatisierung said in Programmablauf in Blockly sequenziell oder parallel?:
@axmlm sagte in Programmablauf in Blockly sequenziell oder parallel?:
Deshalb der Mix aus "steuere" und "aktualisiere". Steuere hat bei der Berechnung nicht funktioniert.
Das ergibt keinen Sinn und kann nicht sein. Du weißt schon wie ioBroker arbeitet und was es mit dem „bestätigt“-Flag auf sich hat?
Das weiß ich tatsächlich nicht. Fakt ist, das Steuere nicht funktioniert hat, und aktualisiere schon. Bin natürlich bei der Recherche auf "Flags" und "betätigt" gestoßen, habe es aber nicht verstanden.
EDIT: habe mein Post oben aktualisiert Steuere hat bei Auswertung des Zählers nicht funktioniert.
-
@axmlm aktualisieren schreibt den Wert (in eigene Datenpunkte) bestätigt.
Damit ist alles fertig.steuere schreibt den Wert unbestätigt.
Das sagt dem Adapter der das Gerät steuert, dass es was zu tun gibt.
Wenn der mit der Steuerung fertig ist, setzt er drn Flag auf bestätigt.
Damit ist alles fertig -
@axmlm sagte in Programmablauf in Blockly sequenziell oder parallel?:
Fakt ist, das Steuere nicht funktioniert hat, und aktualisiere schon.
Fakt ist, dass beide Trigger auf "egal" stehen und somit die Logik in jedem Fall ausgeführt wird.
Ist das nicht so, bitte ich um eine genaue Fehlerbeschreibung mit einem reproduzierbaren Beispiel, damit das gelöst werden kann.
-
@homoran said in Programmablauf in Blockly sequenziell oder parallel?:
@axmlm aktualisieren schreibt den Wert (in eigene Datenpunkte) bestätigt.
Damit ist alles fertig.steuere schreibt den Wert unbestätigt.
Das sagt dem Adapter der das Gerät steuert, dass es was zu tun gibt.
Wenn der mit der Steuerung fertig ist, setzt er drn Flag auf bestätigt.
Damit ist alles fertigDanke für die Erklärung, diese habe ich schon bei der Erstellung von meinem Skript so gelesen und nicht verstanden. Habe sie jetzt langsam gelesen, aber sorry verstanden habe ich es immer noch nicht. Bzw. den Sinn dieser Unterscheidung.
Bin aus der Mechaniker Ecke. Wenn Schraube fest ist, ist sie fest. Ich brauche keine Rückmeldung von der Schraube dass der Drehmomentschlüssel geklickt hat. Mir reicht, dass der Drehmomentschlüssel klickt. In der Programmierung ist es etwas anders, dort ist man viel detaillierter in den Schritten und prüft vieles nach.
-
@axmlm said in Programmablauf in Blockly sequenziell oder parallel?:
@haus-automatisierung said in Programmablauf in Blockly sequenziell oder parallel?:
@axmlm sagte in Programmablauf in Blockly sequenziell oder parallel?:
Deshalb der Mix aus "steuere" und "aktualisiere". Steuere hat bei der Berechnung nicht funktioniert.
Das ergibt keinen Sinn und kann nicht sein. Du weißt schon wie ioBroker arbeitet und was es mit dem „bestätigt“-Flag auf sich hat?
Das weiß ich tatsächlich nicht. Fakt ist, das Steuere nicht funktioniert hat, und aktualisiere schon. Bin natürlich bei der Recherche auf "Flags" und "betätigt" gestoßen, habe es aber nicht verstanden.
EDIT: habe mein Post oben aktualisiert Steuere hat bei Auswertung des Zählers nicht funktioniert.
alles gut, Logik wird ausgeführt. wie gesagt, mir laufen die berechnete Werte auseinander, aber ich weiß noch nicht warum. Mein erster Verdacht war, dass die Berechnung der Werte nach zufallsreihenfolge erfolgt. Wir haben jetzt geklärt, dass die Abarbeitung der Sequenzen innerhalb eines Triggers sequentiell erfolgt. Skript ist jetzt zusammengeführt und optimiert.
Als nächstes muss ich herausfinden, ob der Fehler im Skript, oder in der Berechnung liegt, oder ich einen Gedankenfehler habe.
-
Ich verstehe nicht, warum meine Berechnung die historische Werte ins negative verschiebt.
der Richtige Wert ist 113€ das ist der Totale input an Geld über die gesamte laufzeit der Anlage.
aber der Adapter schreibt bei Jahreswert und bei Monatswert 99€ und Start bei -13€. Die -13€ gehen weiter nach unten. Vor 3 Tagen standen da -5€ und das verstehe ich nicht.
-
Hier ist das Problem sichtbar
Total ist kleiner als MOnat
-
@axmlm sagte in Programmablauf in Blockly sequenziell oder parallel?:
Wenn Schraube fest ist, ist sie fest. Ich brauche keine Rückmeldung von der Schraube dass der Drehmomentschlüssel geklickt hat.
wenn aber nur dein Kollege einen Drehmomentschlüssel hat, kannst du nur unkritische Schrauben festzurren.
und du entscheidest selber alles ist fertig (ack=true)Bei kritischen Befestigungen rufst du den Kollegen (ack=false)
Der nimmt den Drehmomentschlüssel bis es klickt
Dann sagt er: alles ist fertig (ack=true) -
@axmlm sagte:läuft aber irgendwie nicht rund.
Kann es auch nicht, da Werte, die man in Datenpunkte schreibt, nicht gleich wieder eingelesen werden können, denn steuere / aktualisiere werden asynchron ausgeführt, sind also zum Zeitpunkt des Einlesens noch nicht fertig. Deshalb verwendet man Variablen.