Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Blockly
  5. Blockly: Zeitextrapolation

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    11
    1
    353

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.6k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.5k

Blockly: Zeitextrapolation

Geplant Angeheftet Gesperrt Verschoben Blockly
5 Beiträge 3 Kommentatoren 440 Aufrufe 2 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • N Offline
    N Offline
    nureinbenutzer
    schrieb am zuletzt editiert von nureinbenutzer
    #1

    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:

    210201_blockly_prognose_ww_bereitung.PNG

    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 :)

    AsgothianA paul53P 3 Antworten Letzte Antwort
    0
    • N nureinbenutzer

      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:

      210201_blockly_prognose_ww_bereitung.PNG

      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 :)

      AsgothianA Offline
      AsgothianA Offline
      Asgothian
      Developer
      schrieb am zuletzt editiert von
      #2

      @nureinbenutzer

      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.

      ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
      "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

      1 Antwort Letzte Antwort
      0
      • N nureinbenutzer

        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:

        210201_blockly_prognose_ww_bereitung.PNG

        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 :)

        paul53P Offline
        paul53P Offline
        paul53
        schrieb am zuletzt editiert von
        #3

        @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"

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

        1 Antwort Letzte Antwort
        1
        • N nureinbenutzer

          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:

          210201_blockly_prognose_ww_bereitung.PNG

          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 :)

          paul53P Offline
          paul53P Offline
          paul53
          schrieb am zuletzt editiert von paul53
          #4

          @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):

          Bild_2021-02-02_133317.png

          <xml xmlns="https://developers.google.com/blockly/xml">
           <variables>
             <variable type="timeout" id="timeout">timeout</variable>
             <variable id="5fs8cC0rgvo}RnPh1:Zz">freigabe_restzeit</variable>
             <variable id="k/e8u)/|8ZJtwTNlmyHg">gradient</variable>
             <variable id="F;pi=YCjAt(J2F(ruz6o">restzeit</variable>
           </variables>
           <block type="on_ext" id=";em9_OJ?oq,2wXKXG]F/" x="88" y="87">
             <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation>
             <field name="CONDITION">ne</field>
             <field name="ACK_CONDITION"></field>
             <value name="OID0">
               <shadow type="field_oid" id="AI3RBHW.}jcRT@UBiDF2">
                 <field name="oid">default</field>
               </shadow>
             </value>
             <statement name="STATEMENT">
               <block type="controls_if" id=":scJqnklkc!RCoazwTY,">
                 <mutation else="1"></mutation>
                 <value name="IF0">
                   <block type="on_source" id="binMon22@$^prN/sONgT">
                     <field name="ATTR">state.val</field>
                   </block>
                 </value>
                 <statement name="DO0">
                   <block type="timeouts_settimeout" id="5b:2vJL%N?5L3z5f*a6K">
                     <field name="NAME">timeout</field>
                     <field name="DELAY">10</field>
                     <field name="UNIT">min</field>
                     <statement name="STATEMENT">
                       <block type="variables_set" id="j53pgOEF52MKX9dSPoX`">
                         <field name="VAR" id="5fs8cC0rgvo}RnPh1:Zz">freigabe_restzeit</field>
                         <value name="VALUE">
                           <block type="logic_boolean" id="(vnrnaj/zQ-EYZ=4JH?1">
                             <field name="BOOL">TRUE</field>
                           </block>
                         </value>
                       </block>
                     </statement>
                   </block>
                 </statement>
                 <statement name="ELSE">
                   <block type="timeouts_cleartimeout" id="}iYe]E$I^sDxE+E2f0Yg">
                     <field name="NAME">timeout</field>
                     <next>
                       <block type="variables_set" id="0ql};U!~S4V6g0l9yYeg">
                         <field name="VAR" id="5fs8cC0rgvo}RnPh1:Zz">freigabe_restzeit</field>
                         <value name="VALUE">
                           <block type="logic_boolean" id="MVUqbz?/bW2!fT9)$RGU">
                             <field name="BOOL">FALSE</field>
                           </block>
                         </value>
                         <next>
                           <block type="update" id="?pR/-^eST}/s#z?0g*39">
                             <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                             <field name="OID">Object ID</field>
                             <field name="WITH_DELAY">FALSE</field>
                             <value name="VALUE">
                               <block type="math_number" id="u]D[|peunM}+aj[?5el6">
                                 <field name="NUM">0</field>
                               </block>
                             </value>
                           </block>
                         </next>
                       </block>
                     </next>
                   </block>
                 </statement>
               </block>
             </statement>
             <next>
               <block type="on_ext" id="yPTd3Fm-[NbVt{oiw+F3">
                 <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation>
                 <field name="CONDITION">ne</field>
                 <field name="ACK_CONDITION"></field>
                 <value name="OID0">
                   <shadow type="field_oid" id="?}1IXJhxKg(qQO4)%iI]">
                     <field name="oid">default</field>
                   </shadow>
                 </value>
                 <statement name="STATEMENT">
                   <block type="controls_if" id="RL@aM.#2?a_@g_1{PwS:">
                     <value name="IF0">
                       <block type="variables_get" id="_wW/joY3I,TOx5!x$+-#">
                         <field name="VAR" id="5fs8cC0rgvo}RnPh1:Zz">freigabe_restzeit</field>
                       </block>
                     </value>
                     <statement name="DO0">
                       <block type="comment" id="KhB8:I0E5+wJ$W0iD9XL">
                         <field name="COMMENT">K / min</field>
                         <next>
                           <block type="variables_set" id=":Xbl`,?18VSD;`tRG[-:">
                             <field name="VAR" id="k/e8u)/|8ZJtwTNlmyHg">gradient</field>
                             <value name="VALUE">
                               <block type="math_arithmetic" id="9{C2DihT:4@/*dCil9P`">
                                 <field name="OP">MULTIPLY</field>
                                 <value name="A">
                                   <shadow type="math_number" id="xb!9E^Sx2}pSL`18j5C8">
                                     <field name="NUM">60000</field>
                                   </shadow>
                                 </value>
                                 <value name="B">
                                   <shadow type="math_number" id="Cg[-*;}u3,d{Ab%ni(l|">
                                     <field name="NUM">1</field>
                                   </shadow>
                                   <block type="math_arithmetic" id="tj*:;M;O,a/[#Dio5:h}">
                                     <field name="OP">DIVIDE</field>
                                     <value name="A">
                                       <shadow type="math_number" id="k18i=gsIw3cm$py}eQRx">
                                         <field name="NUM">1</field>
                                       </shadow>
                                       <block type="math_arithmetic" id="Hp?rzgdGcVsfwoqn=@A1">
                                         <field name="OP">MINUS</field>
                                         <value name="A">
                                           <shadow type="math_number" id=".cS^%mVTvZJzWQc94Ao/">
                                             <field name="NUM">1</field>
                                           </shadow>
                                           <block type="on_source" id="l`-0%Y2TC{TYX+=*EHw}">
                                             <field name="ATTR">state.val</field>
                                           </block>
                                         </value>
                                         <value name="B">
                                           <shadow type="math_number" id=")}4H_y88c[RfPP$%rYrc">
                                             <field name="NUM">1</field>
                                           </shadow>
                                           <block type="on_source" id="EX1uSRt(:%*DBa~-`v%g">
                                             <field name="ATTR">oldState.val</field>
                                           </block>
                                         </value>
                                       </block>
                                     </value>
                                     <value name="B">
                                       <shadow type="math_number" id="WcOrdE@6y^w11`?1sujv">
                                         <field name="NUM">1</field>
                                       </shadow>
                                       <block type="math_arithmetic" id=":~@)R`mI74As[F)+|N51">
                                         <field name="OP">MINUS</field>
                                         <value name="A">
                                           <shadow type="math_number">
                                             <field name="NUM">1</field>
                                           </shadow>
                                           <block type="on_source" id="DAtOdQ?GQ^D#_`BfS~jH">
                                             <field name="ATTR">state.lc</field>
                                           </block>
                                         </value>
                                         <value name="B">
                                           <shadow type="math_number">
                                             <field name="NUM">1</field>
                                           </shadow>
                                           <block type="on_source" id="v,u0~*oypF2kw3Kx~Yqw">
                                             <field name="ATTR">oldState.lc</field>
                                           </block>
                                         </value>
                                       </block>
                                     </value>
                                   </block>
                                 </value>
                               </block>
                             </value>
                             <next>
                               <block type="variables_set" id="PRnW6A`s0FjK**./BQ,z">
                                 <field name="VAR" id="F;pi=YCjAt(J2F(ruz6o">restzeit</field>
                                 <value name="VALUE">
                                   <block type="math_arithmetic" id="W*bK$`Cf{?GwJPgp:Sf2">
                                     <field name="OP">DIVIDE</field>
                                     <value name="A">
                                       <shadow type="math_number" id="Xt@s=@e2TJIO7~*fj~K~">
                                         <field name="NUM">1</field>
                                       </shadow>
                                       <block type="math_arithmetic" id="}2USQ1b-2]}U;o;viTry">
                                         <field name="OP">MINUS</field>
                                         <value name="A">
                                           <shadow type="math_number" id="BoQ_s8,O9[e.TN34@as,">
                                             <field name="NUM">1</field>
                                           </shadow>
                                           <block type="get_value" id="U[bhZd)x5/-@Sb4Z_nE9">
                                             <field name="ATTR">val</field>
                                             <field name="OID">ID auswählen</field>
                                           </block>
                                         </value>
                                         <value name="B">
                                           <shadow type="math_number" id="`H3;co*,sK/4!u;MW(M~">
                                             <field name="NUM">1</field>
                                           </shadow>
                                           <block type="on_source" id="5^*W@$Z}2cir]Cw|_V$F">
                                             <field name="ATTR">state.val</field>
                                           </block>
                                         </value>
                                       </block>
                                     </value>
                                     <value name="B">
                                       <shadow type="math_number" id="`v{j3ByMpEg.%}(S=?K5">
                                         <field name="NUM">1</field>
                                       </shadow>
                                       <block type="variables_get" id="h#DAMp0-r)-*(]$*4zDc">
                                         <field name="VAR" id="k/e8u)/|8ZJtwTNlmyHg">gradient</field>
                                       </block>
                                     </value>
                                   </block>
                                 </value>
                                 <next>
                                   <block type="update" id="M$}:nhp,zk*UW^4ymv=#">
                                     <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                                     <field name="OID">Object ID</field>
                                     <field name="WITH_DELAY">FALSE</field>
                                     <value name="VALUE">
                                       <block type="math_round" id="o9;R?/w7[]#EinKF}2]b">
                                         <field name="OP">ROUND</field>
                                         <value name="NUM">
                                           <shadow type="math_number" id="yoq3?}`7)EWO[t@Jx0g~">
                                             <field name="NUM">3.1</field>
                                           </shadow>
                                           <block type="variables_get" id="79:}h1nd$Z-f%7}.?6wX">
                                             <field name="VAR" id="F;pi=YCjAt(J2F(ruz6o">restzeit</field>
                                           </block>
                                         </value>
                                       </block>
                                     </value>
                                   </block>
                                 </next>
                               </block>
                             </next>
                           </block>
                         </next>
                       </block>
                     </statement>
                   </block>
                 </statement>
               </block>
             </next>
           </block>
           <block type="comment" id=".!VeuCn/7]}iTkw#wC2|" x="337" y="87">
             <field name="COMMENT">WW-Bereitung</field>
           </block>
           <block type="comment" id="qO0.U#^WIO`BzpX0@,Kj" x="337" y="412">
             <field name="COMMENT">WW Temperatur</field>
           </block>
           <block type="comment" id=";)oE:{7P0(v`WleD6]K5" x="513" y="613">
             <field name="COMMENT">WW_SOLL_MAX</field>
           </block>
          </xml>
          

          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

          1 Antwort Letzte Antwort
          2
          • N Offline
            N Offline
            nureinbenutzer
            schrieb am zuletzt editiert von
            #5

            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 :)

            1 Antwort Letzte Antwort
            1
            Antworten
            • In einem neuen Thema antworten
            Anmelden zum Antworten
            • Älteste zuerst
            • Neuste zuerst
            • Meiste Stimmen


            Support us

            ioBroker
            Community Adapters
            Donate

            399

            Online

            32.5k

            Benutzer

            81.8k

            Themen

            1.3m

            Beiträge
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
            ioBroker Community 2014-2025
            logo
            • Anmelden

            • Du hast noch kein Konto? Registrieren

            • Anmelden oder registrieren, um zu suchen
            • Erster Beitrag
              Letzter Beitrag
            0
            • Home
            • Aktuell
            • Tags
            • Ungelesen 0
            • Kategorien
            • Unreplied
            • Beliebt
            • GitHub
            • Docu
            • Hilfe