NEWS
Blockly: Zeitextrapolation
-
Hallo zusammen
Vielen Dank erstmal an alle, die so tatkräftig hier im Forum mitarbeiten - ich lese schon eine ganze Weile mit, bin aber (als Anfänger) an meine Grenzen gestoßen und hoffe auf Eure Hilfe.
Situation:
Ich betreibe eine Wärmepumpe (Stiebel Eltron), die neben dem Heizbetrieb auch Warmwasser erzeugt.Für die WP gibt es in iobroker einen entsprechenden Adapter, entsprechende Objekte zum Abprüfen des jeweiligen Betriebsstatus (z.B. WARMWASSERBEREITUNG) stehen mir zur Verfügung.
An anderer Stelle werte ich diese auch aus, und habe mir damit auch schon Visualisierungen gebaut.
Das klappt alles wunderbar.
Die WP produziert warmes Wasser, aber es kann immer einmal sein, dass nach einen Bad oder einer Dusche nicht ausreichend warmes Wasser zur Verfügung steht, damit dieses dann für einen zweiten Duschvorgang reicht (am Ende wird es kalt )
Ich habe mir daher eine Visualisierung gebaut, auf der ich gerne anzeigen würde, wie lange es dauert, bis die vorgegebene WW-SOLL-Temperatur erreicht wird (quasi eine Extrapolation aus Werten, die ich von der WP bekomme (da diese das nicht selber berechnen kann)).
Da die WP nicht ständig WW produziert, habe ich mir eigene Userobjekte in iobroker angelegt (numerische Werte, Booleans), mit denen ich die Zustandsänderungen abprüfen kann.
Gegeben sind:
PROGNOSE_DAUER_WARMWASSERBEREITUNG (numerisch, Userobjekt):
Das Userobjekt wird im Moment nur von mir "missbraucht", um dort einen Wert (Sekunden) abzuspeichern, mit dem ich dann weiterrechnen werde. Letztlich ist das der Wert in Sekunden, der extrapoliert wurde.SEKUNDEN_AB_START (Variable in Blockly)
Ich habe in Blockly diese Variable geschaffen, damit ich hier rein die Sekunden ausgehend vom Start der Warmwasserbereitung zwischenspeichern kann.WW_SOLL_MAX (numerisch, Userobjekt)):
Zielwert in °C für die WW-Bereitung (der Wert errechnet sich aus der vorgegebenen WW-SOLL-Temperatur in der WP und der Hysterese (2 K). Hier wird einfach WW-SOLL + Hysterese gerechnet, was dann WW_SOLL_MAX ergibt.TEST_BOOL (boolean, Userobjekt):
Repräsentiert den Schalter, welcher bei der WW-Produktion der WP auf TRUE steht; ich simuliere das durch manuelles Setzen des Schalters; im fertigen Script wird der Schalter dann auf den "echten" gesetzt.TEST_WERT (numerisch, Userobjekt).
Repräsentiert den Wert der aktuellen WW-IST-TEMPERATUR.
Zu erwähnen ist, dass das Script noch lange nicht fertig ist, ich aber hier nun nicht mehr weiterkomme.Aufgabenstellung:
Das Script soll die Änderung der Variablen TEST_BOOL abfangen und prüfen, ob diese WAHR ist (dann befindet sich die WP im Betriebsmodus WARMWASSERBEREITUNG.Ist der Zustand WAHR, soll eine Schleife ausgeführt werden, die jede Sekunde den Wert der Variablen SEKUNDEN_AB_START um 1 erhöht.
Damit sollen dann die Sekunden für die Extrapolation ermittelt werden.
Ziel ist, dass ich aus einem zu ermittelnden Temperaturhub pro Zeiteinheit dann ermitteln kann per Dreisatz, wie viele Sekunden es dauern wird, bis WW_SOLL_MAX erreicht werden (das lässt sich quasi nur dynamisch "schätzen").
Die Ermittlung des Temperaturhubs ist hier noch nicht enthalten - das kommt noch (eins nach dem anderen )
Die Schleife soll jede Sekunde solange ausgeführt werden, bis TEST_WERT gleich oder größer WW_SOLL_MAX ist (dann hört die WP mit der Produktion von Warmwasser auf).
Danach soll der Wert der Variablen SEKUNDEN_AB_START in das Objekt PROGNOSE_DAUER_WARMWASSERBEREITUNG geschrieben werden.
Und hier steckt irgendwo der Fehler.
Ich habe hier schon mehrere Varianten versucht, und auch PROGNOSE_DAUER_WARMWASSERBEREITUNG beim Start mit 0 initialisiert; nichts will funktionieren.
Das Ergebnis ist immer, dass der Trigger (quasi der Start der WW-Produktion) nicht erkannt wird und nichts passiert, oder aber, dass dieser erkannt wird und PROGNOSE_DAUER_WARMWASSERBEREITUNG zwar 1 x Sekunde aktualisiert wird (man sieht den Wert "aktualisieren", aber immer nur 0 beinhaltet.
Ich befürchte, es ist ein Anfängerfehler ... aber ich bin mit meinem Latein am Ende.
Vielleicht kann jemand von Euch helfen?
Einen Screenshot des Blockly-Aufbaus gibt es hier:
Der Code schaut so aus:
var SEKUNDEN_AB_START, Intervall; setState("0_userdata.0.LWZ.PROGNOSE_DAUER_WARMWASSERBEREITUNG"/*PROGNOSE_DAUER_WARMWASSERBEREITUNG*/, 0, true); SEKUNDEN_AB_START = 0; on({id: '0_userdata.0.LWZ.TEST_BOOL', change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (true) { Intervall = setInterval(function () { while (!(getState("0_userdata.0.LWZ.TEST_WERT").val > getState("0_userdata.0.LWZ.WW_SOLL_MAX").val)) { SEKUNDEN_AB_START = (typeof SEKUNDEN_AB_START == 'number' ? SEKUNDEN_AB_START : 0) + 1; setState("0_userdata.0.LWZ.PROGNOSE_DAUER_WARMWASSERBEREITUNG"/*PROGNOSE_DAUER_WARMWASSERBEREITUNG*/, SEKUNDEN_AB_START, true); } }, 1000); } }); //JTNDeG1sJTIweG1sbnMlM0QlMjJodHRwcyUzQSUyRiUyRmRldmVsb3BlcnMuZ29vZ2xlLmNvbSUyRmJsb2NrbHklMkZ4bWwlMjIlM0UlM0N2YXJpYWJsZXMlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIya3hHQmNUdXY2ISU0ME8lM0ZZYTElN0MlMkNGfiUyMiUzRVNFS1VOREVOX0FCX1NUQVJUJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMHR5cGUlM0QlMjJpbnRlcnZhbCUyMiUyMGlkJTNEJTIySW50ZXJ2YWxsJTIyJTNFSW50ZXJ2YWxsJTNDJTJGdmFyaWFibGUlM0UlM0MlMkZ2YXJpYWJsZXMlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJ1cGRhdGUlMjIlMjBpZCUzRCUyMkFyJTI1bTclM0JpKS5lVlolNURRRVglMjUoTnklMjIlMjB4JTNEJTIyLTMzOCUyMiUyMHklM0QlMjItNDYyJTIyJTNFJTNDbXV0YXRpb24lMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhodG1sJTIyJTIwZGVsYXlfaW5wdXQlM0QlMjJmYWxzZSUyMiUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyT0lEJTIyJTNFMF91c2VyZGF0YS4wLkxXWi5QUk9HTk9TRV9EQVVFUl9XQVJNV0FTU0VSQkVSRUlUVU5HJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJXSVRIX0RFTEFZJTIyJTNFRkFMU0UlM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlZBTFVFJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIybWF0aF9udW1iZXIlMjIlMjBpZCUzRCUyMiFkRFJmWS1lMiUyNCFLJTdDeiU1QipTJTQwTXolMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOVU0lMjIlM0UwJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19zZXQlMjIlMjBpZCUzRCUyMkEhdCU1QnVsaHQ3RyUzQm9hJTI0JTNCViUyNE8uNyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIya3hHQmNUdXY2ISU0ME8lM0ZZYTElN0MlMkNGfiUyMiUzRVNFS1VOREVOX0FCX1NUQVJUJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJWQUxVRSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMm1hdGhfbnVtYmVyJTIyJTIwaWQlM0QlMjIocSlzRDQlN0NnTUFINWhiRSU3RCUyQlZsJTNGJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTlVNJTIyJTNFMCUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIyb25fZXh0JTIyJTIwaWQlM0QlMjIqbiU3RHhvbFglNUVIJTVEUCU0MFQ3ZllsKVMyJTIyJTIweCUzRCUyMjg3JTIyJTIweSUzRCUyMi0yODglMjIlM0UlM0NtdXRhdGlvbiUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYxOTk5JTJGeGh0bWwlMjIlMjBpdGVtcyUzRCUyMjElMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkNPTkRJVElPTiUyMiUzRW5lJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJBQ0tfQ09ORElUSU9OJTIyJTNFJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJPSUQwJTIyJTNFJTNDc2hhZG93JTIwdHlwZSUzRCUyMmZpZWxkX29pZCUyMiUyMGlkJTNEJTIyJTVES0MuNWo1ekNHIXlzJTdDJTdDQyUyNE5qbyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMm9pZCUyMiUzRTBfdXNlcmRhdGEuMC5MV1ouVEVTVF9CT09MJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0MlMkZ2YWx1ZSUzRSUzQ3N0YXRlbWVudCUyMG5hbWUlM0QlMjJTVEFURU1FTlQlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJjb250cm9sc19pZiUyMiUyMGlkJTNEJTIySXBjeCU1QmRzWSU3Q2l2dmVwJTNEN00lNUUzRCUyMiUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMklGMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2Jvb2xlYW4lMjIlMjBpZCUzRCUyMnZmWi54aDFGR18yUSlfdCU0MHglN0M0QSUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkJPT0wlMjIlM0VUUlVFJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMkRPMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnRpbWVvdXRzX3NldGludGVydmFsJTIyJTIwaWQlM0QlMjIpY0dNJTNGSlglNUJXJTdDJTdETDQlNUJrcSklM0ZRLiUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VJbnRlcnZhbGwlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMklOVEVSVkFMJTIyJTNFMSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVU5JVCUyMiUzRXNlYyUzQyUyRmZpZWxkJTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMlNUQVRFTUVOVCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmNvbnRyb2xzX3doaWxlVW50aWwlMjIlMjBpZCUzRCUyMkZ1KkRYbG44JTI0R3olNDB1dGYuaW9DSyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk1PREUlMjIlM0VVTlRJTCUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQk9PTCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2NvbXBhcmUlMjIlMjBpZCUzRCUyMmFYQyU3Q3ZpZV9oIWdvbzgzR044dTElMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJPUCUyMiUzRUdUJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIyZ2V0X3ZhbHVlJTIyJTIwaWQlM0QlMjJMJTJGd3liOG4lM0RUM3kqa1RCNzBCZVMlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJBVFRSJTIyJTNFdmFsJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJPSUQlMjIlM0UwX3VzZXJkYXRhLjAuTFdaLlRFU1RfV0VSVCUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMkIlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJnZXRfdmFsdWUlMjIlMjBpZCUzRCUyMiU2MCU3RF9qIS12WC4ybGpUdyU3Q0pXQiUyM2clMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJBVFRSJTIyJTNFdmFsJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJPSUQlMjIlM0UwX3VzZXJkYXRhLjAuTFdaLldXX1NPTExfTUFYJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQ3N0YXRlbWVudCUyMG5hbWUlM0QlMjJETyUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMm1hdGhfY2hhbmdlJTIyJTIwaWQlM0QlMjIlNDAuWnQlMjMlNUQublp6JTVFUUlFJTdEZ21qelklMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMmt4R0JjVHV2NiElNDBPJTNGWWExJTdDJTJDRn4lMjIlM0VTRUtVTkRFTl9BQl9TVEFSVCUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyREVMVEElMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIybWF0aF9udW1iZXIlMjIlMjBpZCUzRCUyMldYWHp6eWdJamlMUXAlNURXbCUyM1NyJTQwJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTlVNJTIyJTNFMSUzQyUyRmZpZWxkJTNFJTNDJTJGc2hhZG93JTNFJTNDJTJGdmFsdWUlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydXBkYXRlJTIyJTIwaWQlM0QlMjI0aCU3RFhuKXU0VERULVUlM0ElM0QlM0JGJTdDWiolMjIlM0UlM0NtdXRhdGlvbiUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYxOTk5JTJGeGh0bWwlMjIlMjBkZWxheV9pbnB1dCUzRCUyMmZhbHNlJTIyJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJPSUQlMjIlM0UwX3VzZXJkYXRhLjAuTFdaLlBST0dOT1NFX0RBVUVSX1dBUk1XQVNTRVJCRVJFSVRVTkclM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMldJVEhfREVMQVklMjIlM0VGQUxTRSUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVkFMVUUlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJ2YXJpYWJsZXNfZ2V0JTIyJTIwaWQlM0QlMjIxS1dHJTdDMEUlMjMlN0JCJTVEJTdDNU5DJTI1JTNCQU53JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVkFSJTIyJTIwaWQlM0QlMjJreEdCY1R1djYhJTQwTyUzRllhMSU3QyUyQ0Z+JTIyJTNFU0VLVU5ERU5fQUJfU1RBUlQlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnN0YXRlbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGc3RhdGVtZW50JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZzdGF0ZW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnN0YXRlbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGeG1sJTNF
Ich würde mich sehr freuen, wenn mir jemand einen Tipp geben könnte ...
Vielen Dank
-
Ich denke die Logik ist insgesamt unsauber.
Ich würde wie Folgt vorgehen:
-
im Trigger TEST_BOOL:
-- Variable "startZeitpunkt" auf "sekunden seit Tagesanfang" setzen -
neuen Trigger auf "TEST_WERT", ist grösser als vorher:
-- vergleich: Test_Wert > WW_SOLL_MAX und test_bool = wahr, dann aus aktuellem sekunden seit Tagesanfang und startZeitpunkt die vergangene Zeit bestimmen, TEST_BOOL auf falsch setzen
A.
-
-
@nureinbenutzer sagte: jemand einen Tipp geben könnte ...
- "wiederhole bis" erzeugt eine Endlosschleife
- "falls wahr" führt immer den mache-Zweig aus, da wahr eine Konstante ist
- Sekunden-Intervalle sind für thermische Prozesse "Overkill"
-
@nureinbenutzer sagte: Ziel ist, dass ich aus einem zu ermittelnden Temperaturhub pro Zeiteinheit dann ermitteln kann per Dreisatz, wie viele Sekunden es dauern wird, bis WW_SOLL_MAX erreicht werden (das lässt sich quasi nur dynamisch "schätzen").
Vorschlag für eine "Schätzung" in Minuten (nicht getestet):
-
Danke Euch beiden für die wertvollen Tipps und die Lösungsvorschläge
Man lernt nie aus und ich gerade viel dazu.
Ich werde mal versuchen, das Ganze zu adaptieren bzw. dann in mein (komplett) fertiges Script zu übernehmen.
Dazu gibt es dann natürlich ein Feedback