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. JavaScript
  5. await is only valid in async functions ...

NEWS

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.1k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    2.8k

await is only valid in async functions ...

Geplant Angeheftet Gesperrt Verschoben JavaScript
26 Beiträge 5 Kommentatoren 1.1k Aufrufe 4 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.
  • AsgothianA Asgothian

    @warhammer73 sagte in await is only valid in async functions ...:

    Nachtrag:
    Das einfach "if" hilft mir aber auch nicht weiter. Im Endeffekt soll ja der 5min Schlaf beendet werden wenn jemand von ausserhalb des Scriptes Thermostat.SET verändert hat und dann für eine Stunde das Script schlagen gelegt werden damit der manuelle Eingriff sich aus auswirkt.

    An dieser Stelle hast du ein Problem.

    Sleep ist per definition nicht unterbrechbar.
    Du musst also das tun was wir Dir oben vorgeschlagen haben - an Stelle eines Sleep muss da eine Block-Variable rein, die die (in deinem Beispielskripts ausgesparten) Aktionen die nicht stattfinden sollen für 5 Minuten unterbindet ohne das Skript in Sleep zu versetzen.

    A.

    W Offline
    W Offline
    warhammer73
    schrieb am zuletzt editiert von
    #11

    @asgothian
    Ich versuchs mal mit Worten, weil der relevante Teil im Script ja nicht so will wie ich und es da eher ein grundlegendes Problem gibt.

    Es gibt diverse Eingangsparameter die eine Solltemperatur im Raum definieren.
    Es gibt ein Thermometer das die Ist Temperatur angibt.
    Mit diversen Sachen versucht jetzt das Script am Thermometer die Ist Temperatur zu erreichen.
    Das klappt alles soweit.
    Das ist momentan der Teil der in der Schleife läuft (Ja, kann man auch als Trigger auf die Ist Temperatur machen).
    Damit sich das Thermostat aber keinen Wolf dreht und das Script ständig Last erzeugt, soll die Regelung zwischen Ist und Soll nur zyklisch passieren (Daher der 5min Timeout)
    Das würde mit dem Script Ausschnitt auch funktionieren.

    Aber:
    Wenn jemand manuell über das Thermostat oder über die Visualisierung die Temperatur ändert soll natürlich das Script NICHT nach spätestens 5min die Einstellung wieder überschreiben. Deswegen die Idee mit dem Trigger und dem Timeout von 60min.

    Zusammengefasst also:
    Script regelt zyklisch das Thermostat und soll die Füsse für eine Stunde stillhalten wenn jemand manuell eingreift.

    An der Stelle komme ich jetzt nicht weiter wie ich die beiden Timeouts oder welche Mechanismen auch immer für die zyklische Bearbeitung und das Sperren der Bearbeitung zusammen bekomme.

    Und um es noch etwas komplizierter zu machen:
    Es gibt auch noch einen Fenster offen Sensor auf dessen Trigger natürlich das Thermostat auf min gehen soll und wenn Fester zu wieder auf den alten Wert.

    Und jetzt habe ich keine Idee wie ich diese (Im Zweifel ja drei) Trigger jetzt synchronisiert und sich gegenseitig beeinflussend bekomme.

    B paul53P AsgothianA CodierknechtC 5 Antworten Letzte Antwort
    0
    • W warhammer73

      @asgothian
      Ich versuchs mal mit Worten, weil der relevante Teil im Script ja nicht so will wie ich und es da eher ein grundlegendes Problem gibt.

      Es gibt diverse Eingangsparameter die eine Solltemperatur im Raum definieren.
      Es gibt ein Thermometer das die Ist Temperatur angibt.
      Mit diversen Sachen versucht jetzt das Script am Thermometer die Ist Temperatur zu erreichen.
      Das klappt alles soweit.
      Das ist momentan der Teil der in der Schleife läuft (Ja, kann man auch als Trigger auf die Ist Temperatur machen).
      Damit sich das Thermostat aber keinen Wolf dreht und das Script ständig Last erzeugt, soll die Regelung zwischen Ist und Soll nur zyklisch passieren (Daher der 5min Timeout)
      Das würde mit dem Script Ausschnitt auch funktionieren.

      Aber:
      Wenn jemand manuell über das Thermostat oder über die Visualisierung die Temperatur ändert soll natürlich das Script NICHT nach spätestens 5min die Einstellung wieder überschreiben. Deswegen die Idee mit dem Trigger und dem Timeout von 60min.

      Zusammengefasst also:
      Script regelt zyklisch das Thermostat und soll die Füsse für eine Stunde stillhalten wenn jemand manuell eingreift.

      An der Stelle komme ich jetzt nicht weiter wie ich die beiden Timeouts oder welche Mechanismen auch immer für die zyklische Bearbeitung und das Sperren der Bearbeitung zusammen bekomme.

      Und um es noch etwas komplizierter zu machen:
      Es gibt auch noch einen Fenster offen Sensor auf dessen Trigger natürlich das Thermostat auf min gehen soll und wenn Fester zu wieder auf den alten Wert.

      Und jetzt habe ich keine Idee wie ich diese (Im Zweifel ja drei) Trigger jetzt synchronisiert und sich gegenseitig beeinflussend bekomme.

      B Offline
      B Offline
      Blockmove
      schrieb am zuletzt editiert von
      #12

      @warhammer73

      Mach's doch nicht komplexer als es ist:
      Du hast:

      • Solltemperatur Thermostat
      • Solltemperatur Visu
      • Isttemperatur
      • Fenstersensor

      Auf jede dieser Variablen kannst du doch einen Trigger legen.
      Und zwar auf Wertänderung.
      Ändert jemand an der Visu, dann nimmst du eben diese Basis,
      ändert jemand dirket am Thermostat, dann ist das eben die Basis.
      Macht jemand das Fenster auf, dann speichert du dir die aktuelle Solltemp in einer Hilfsvariable und setzt die Fenster-Auf-Solltemperatur.
      Macht jemand das Fenster zu, dann nimmst du den Wert der Hilfsvariable.
      Beim Scriptstart nimmst du die Thermostat-Solltemperatur
      Sollte eigentlich im Prinzip ohne irgendein Timeout funktionieren.

      The difference beetween Man and Boys:
      The price of their toys 😀

      1 Antwort Letzte Antwort
      0
      • W warhammer73

        @asgothian
        Ich versuchs mal mit Worten, weil der relevante Teil im Script ja nicht so will wie ich und es da eher ein grundlegendes Problem gibt.

        Es gibt diverse Eingangsparameter die eine Solltemperatur im Raum definieren.
        Es gibt ein Thermometer das die Ist Temperatur angibt.
        Mit diversen Sachen versucht jetzt das Script am Thermometer die Ist Temperatur zu erreichen.
        Das klappt alles soweit.
        Das ist momentan der Teil der in der Schleife läuft (Ja, kann man auch als Trigger auf die Ist Temperatur machen).
        Damit sich das Thermostat aber keinen Wolf dreht und das Script ständig Last erzeugt, soll die Regelung zwischen Ist und Soll nur zyklisch passieren (Daher der 5min Timeout)
        Das würde mit dem Script Ausschnitt auch funktionieren.

        Aber:
        Wenn jemand manuell über das Thermostat oder über die Visualisierung die Temperatur ändert soll natürlich das Script NICHT nach spätestens 5min die Einstellung wieder überschreiben. Deswegen die Idee mit dem Trigger und dem Timeout von 60min.

        Zusammengefasst also:
        Script regelt zyklisch das Thermostat und soll die Füsse für eine Stunde stillhalten wenn jemand manuell eingreift.

        An der Stelle komme ich jetzt nicht weiter wie ich die beiden Timeouts oder welche Mechanismen auch immer für die zyklische Bearbeitung und das Sperren der Bearbeitung zusammen bekomme.

        Und um es noch etwas komplizierter zu machen:
        Es gibt auch noch einen Fenster offen Sensor auf dessen Trigger natürlich das Thermostat auf min gehen soll und wenn Fester zu wieder auf den alten Wert.

        Und jetzt habe ich keine Idee wie ich diese (Im Zweifel ja drei) Trigger jetzt synchronisiert und sich gegenseitig beeinflussend bekomme.

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

        @warhammer73 sagte: drei) Trigger jetzt synchronisiert und sich gegenseitig beeinflussend bekomme.

        Mittels globaler Variablen. Prinzip:

        const id1 = '...';
        const id2 = '...';
        const id3 = '...';
        
        var v1 = getState(id1).val;
        var v2 = getState(id2).val;
        var v3 = getState(id3).val;
        
        function auswertung() {
            // Hier die Variablen auswerten
        }
        
        auswertung(); // Skriptstart
        on(id1, function(dp) {
            v1 = dp.state.val;
            auswertung();
        });
        on(id2, function(dp) {
            v2 = dp.state.val;
            auswertung();
        });
        on(id3, function(dp) {
            v3 = dp.state.val;
            auswertung();
        }); 
        

        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

        W 1 Antwort Letzte Antwort
        0
        • W warhammer73

          @asgothian
          Ich versuchs mal mit Worten, weil der relevante Teil im Script ja nicht so will wie ich und es da eher ein grundlegendes Problem gibt.

          Es gibt diverse Eingangsparameter die eine Solltemperatur im Raum definieren.
          Es gibt ein Thermometer das die Ist Temperatur angibt.
          Mit diversen Sachen versucht jetzt das Script am Thermometer die Ist Temperatur zu erreichen.
          Das klappt alles soweit.
          Das ist momentan der Teil der in der Schleife läuft (Ja, kann man auch als Trigger auf die Ist Temperatur machen).
          Damit sich das Thermostat aber keinen Wolf dreht und das Script ständig Last erzeugt, soll die Regelung zwischen Ist und Soll nur zyklisch passieren (Daher der 5min Timeout)
          Das würde mit dem Script Ausschnitt auch funktionieren.

          Aber:
          Wenn jemand manuell über das Thermostat oder über die Visualisierung die Temperatur ändert soll natürlich das Script NICHT nach spätestens 5min die Einstellung wieder überschreiben. Deswegen die Idee mit dem Trigger und dem Timeout von 60min.

          Zusammengefasst also:
          Script regelt zyklisch das Thermostat und soll die Füsse für eine Stunde stillhalten wenn jemand manuell eingreift.

          An der Stelle komme ich jetzt nicht weiter wie ich die beiden Timeouts oder welche Mechanismen auch immer für die zyklische Bearbeitung und das Sperren der Bearbeitung zusammen bekomme.

          Und um es noch etwas komplizierter zu machen:
          Es gibt auch noch einen Fenster offen Sensor auf dessen Trigger natürlich das Thermostat auf min gehen soll und wenn Fester zu wieder auf den alten Wert.

          Und jetzt habe ich keine Idee wie ich diese (Im Zweifel ja drei) Trigger jetzt synchronisiert und sich gegenseitig beeinflussend bekomme.

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

          @warhammer73 sagte in await is only valid in async functions ...:

          Aber:
          Wenn jemand manuell über das Thermostat oder über die Visualisierung die Temperatur ändert soll natürlich das Script NICHT nach spätestens 5min die Einstellung wieder überschreiben. Deswegen die Idee mit dem Trigger und dem Timeout von 60min.
          Zusammengefasst also:
          Script regelt zyklisch das Thermostat und soll die Füsse für eine Stunde stillhalten wenn jemand manuell eingreift.
          An der Stelle komme ich jetzt nicht weiter wie ich die beiden Timeouts oder welche Mechanismen auch immer für die zyklische Bearbeitung und das Sperren der Bearbeitung zusammen bekomme.
          Und um es noch etwas komplizierter zu machen:
          Es gibt auch noch einen Fenster offen Sensor auf dessen Trigger natürlich das Thermostat auf min gehen soll und wenn Fester zu wieder auf den alten Wert.
          Und jetzt habe ich keine Idee wie ich diese (Im Zweifel ja drei) Trigger jetzt synchronisiert und sich gegenseitig beeinflussend bekomme.

          Das ist doch nicht so schwer:

          Du hast eine "Solltemperatur". Diese wird automatisch über die ist-Temperaturregelung gehalten.
          Sobald jemand von Hand die Solltemperatur anpasst, dann unterbrichst du die Isttemperaturregelung in dem du sagst "ab jetzt, bis in einer Stunde keine Anpassung der Temperatur auf Basis der ist-Temperaturregelung
          Und bei Fenster-Auf machst du im Prinzip das gleiche: Solltemperatur merken (zum zurücksetzen), Solltemperatur auf 5 Grad damit der Hahn zu geht, jegliche Anpassung der Solltemperatur unterbinden bis das Fenster zu ist.
          Bei Fenster Zu: Solltemperatur wieder herstellen.

          Entscheidend ist was du blockieren musst. In deinem Fall ist das nur das Schreiben auf den Solltemperaturwert, und das abhängig von der Quelle. Dabei hat die automatische Regelung die geringste Priorität. Höher ist die Prio der Visualisierung - wenn die eine Vorgabe gemacht hat dann gilt die auf eine gewisse Zeit. Höchste Prio hat das offene Fenster.

          A.

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

          W 1 Antwort Letzte Antwort
          0
          • paul53P paul53

            @warhammer73 sagte: drei) Trigger jetzt synchronisiert und sich gegenseitig beeinflussend bekomme.

            Mittels globaler Variablen. Prinzip:

            const id1 = '...';
            const id2 = '...';
            const id3 = '...';
            
            var v1 = getState(id1).val;
            var v2 = getState(id2).val;
            var v3 = getState(id3).val;
            
            function auswertung() {
                // Hier die Variablen auswerten
            }
            
            auswertung(); // Skriptstart
            on(id1, function(dp) {
                v1 = dp.state.val;
                auswertung();
            });
            on(id2, function(dp) {
                v2 = dp.state.val;
                auswertung();
            });
            on(id3, function(dp) {
                v3 = dp.state.val;
                auswertung();
            }); 
            
            W Offline
            W Offline
            warhammer73
            schrieb am zuletzt editiert von
            #15

            @paul53
            Aber wie hilft mir das weiter?

            id2 sagt "Ist Temperatur am Thermometer hat sich geändert ich rufe mal auswertung auf"
            Auswertung sagt sich "Klasse, ich hol mir mal die aktuelle Solltemperatur und regle und damit ich das nicht alle paar Sekunden mache soll ich mich ja für 5min schlafen legen".
            Dann kommt jemand auf die Idee am Thermostat rumzuspielen und id3 sagt "Auch Prima, rufe ich mal auswertung auf".
            Auswertung sagt "Mh ok, will wohl jemand manuell was regeln ich soll jetzt ja eigentlich dafür sorgen das alles 1h schläft"
            -> ID2 hat aber vorher gesagt "Lege dich für 5min schlafen" und wacht entsprechend irgendwann wieder auf und fängt an zu regeln.

            Sollbruchstelle wenn ich die Ist-Temperatur per Trigger hole: Die Temperaturregelung muss auch regeln wenn sich am Thermometer nicht ändert.
            Beispiel:
            Früh sind 15° im Zimmer, der Kalender sagt um 6 ist die Solltemperatur 22°. Daraus macht die Regelung dann einen Befehl zum Thermostat der sagt "Stell mal 23° ein".
            In der Schleife läuft jetzt der Timer runter und nach den 5min sind es immer noch 15° am Thermometer und die Logik sagt sich aktuell "Na gut, wenns nicht wärmer wird mit den 23°, dann Thermostat stelle dich auf 28°". Wenn ich das nur Trigger basiert mache, dann dauert es ewig bis es warm wird (Weil der Trigger ja erst anspringt wenn das Thermometer mehr wie 15° meldet).
            Aber ok, ich könnte natürlich auch aus der Endlosschleife auswertung() aufrufen.

            1 Antwort Letzte Antwort
            0
            • AsgothianA Asgothian

              @warhammer73 sagte in await is only valid in async functions ...:

              Aber:
              Wenn jemand manuell über das Thermostat oder über die Visualisierung die Temperatur ändert soll natürlich das Script NICHT nach spätestens 5min die Einstellung wieder überschreiben. Deswegen die Idee mit dem Trigger und dem Timeout von 60min.
              Zusammengefasst also:
              Script regelt zyklisch das Thermostat und soll die Füsse für eine Stunde stillhalten wenn jemand manuell eingreift.
              An der Stelle komme ich jetzt nicht weiter wie ich die beiden Timeouts oder welche Mechanismen auch immer für die zyklische Bearbeitung und das Sperren der Bearbeitung zusammen bekomme.
              Und um es noch etwas komplizierter zu machen:
              Es gibt auch noch einen Fenster offen Sensor auf dessen Trigger natürlich das Thermostat auf min gehen soll und wenn Fester zu wieder auf den alten Wert.
              Und jetzt habe ich keine Idee wie ich diese (Im Zweifel ja drei) Trigger jetzt synchronisiert und sich gegenseitig beeinflussend bekomme.

              Das ist doch nicht so schwer:

              Du hast eine "Solltemperatur". Diese wird automatisch über die ist-Temperaturregelung gehalten.
              Sobald jemand von Hand die Solltemperatur anpasst, dann unterbrichst du die Isttemperaturregelung in dem du sagst "ab jetzt, bis in einer Stunde keine Anpassung der Temperatur auf Basis der ist-Temperaturregelung
              Und bei Fenster-Auf machst du im Prinzip das gleiche: Solltemperatur merken (zum zurücksetzen), Solltemperatur auf 5 Grad damit der Hahn zu geht, jegliche Anpassung der Solltemperatur unterbinden bis das Fenster zu ist.
              Bei Fenster Zu: Solltemperatur wieder herstellen.

              Entscheidend ist was du blockieren musst. In deinem Fall ist das nur das Schreiben auf den Solltemperaturwert, und das abhängig von der Quelle. Dabei hat die automatische Regelung die geringste Priorität. Höher ist die Prio der Visualisierung - wenn die eine Vorgabe gemacht hat dann gilt die auf eine gewisse Zeit. Höchste Prio hat das offene Fenster.

              A.

              W Offline
              W Offline
              warhammer73
              schrieb am zuletzt editiert von warhammer73
              #16

              @asgothian
              Ja, bis dahin ja kein Problem.
              Aber ich glaube ich hab eine Idee:
              Wenn ich zyklisch über die Schleife eine Soll Temperatur berechnen lasse und die als Parameter einer externen Funktion (also erstmal ähnlich zu @Paul53) übergebe, dann kann die die Solltemperatur einstellen.
              Wenn ein Trigger auf die externen Temperatureinstellungen der Funktion den Zeitpunkt der Änderung mitgibt dann braucht sich die Funktion nicht für 1h schlafen legen, sondern kann einfach prüfen wenn die Schleife den nächsten Soll Wert berechnet hat ob die Stunde schon vorbei ist und den Wert verwerfen.
              Analog der Trigger vom Fenster, der dann in der Funktion einfach "Vergiss alle Werte die als Sollwerte kommen bis das Fenster wieder zu ist".

              ... und eigentlich brauche ich dann auch keine externe Funktion, denn das kann die Schleife dann auch gleich prüfen bevor sie per setState den Wert ändert...

              W 1 Antwort Letzte Antwort
              0
              • W warhammer73

                @asgothian
                Ich versuchs mal mit Worten, weil der relevante Teil im Script ja nicht so will wie ich und es da eher ein grundlegendes Problem gibt.

                Es gibt diverse Eingangsparameter die eine Solltemperatur im Raum definieren.
                Es gibt ein Thermometer das die Ist Temperatur angibt.
                Mit diversen Sachen versucht jetzt das Script am Thermometer die Ist Temperatur zu erreichen.
                Das klappt alles soweit.
                Das ist momentan der Teil der in der Schleife läuft (Ja, kann man auch als Trigger auf die Ist Temperatur machen).
                Damit sich das Thermostat aber keinen Wolf dreht und das Script ständig Last erzeugt, soll die Regelung zwischen Ist und Soll nur zyklisch passieren (Daher der 5min Timeout)
                Das würde mit dem Script Ausschnitt auch funktionieren.

                Aber:
                Wenn jemand manuell über das Thermostat oder über die Visualisierung die Temperatur ändert soll natürlich das Script NICHT nach spätestens 5min die Einstellung wieder überschreiben. Deswegen die Idee mit dem Trigger und dem Timeout von 60min.

                Zusammengefasst also:
                Script regelt zyklisch das Thermostat und soll die Füsse für eine Stunde stillhalten wenn jemand manuell eingreift.

                An der Stelle komme ich jetzt nicht weiter wie ich die beiden Timeouts oder welche Mechanismen auch immer für die zyklische Bearbeitung und das Sperren der Bearbeitung zusammen bekomme.

                Und um es noch etwas komplizierter zu machen:
                Es gibt auch noch einen Fenster offen Sensor auf dessen Trigger natürlich das Thermostat auf min gehen soll und wenn Fester zu wieder auf den alten Wert.

                Und jetzt habe ich keine Idee wie ich diese (Im Zweifel ja drei) Trigger jetzt synchronisiert und sich gegenseitig beeinflussend bekomme.

                CodierknechtC Online
                CodierknechtC Online
                Codierknecht
                Developer Most Active
                schrieb am zuletzt editiert von
                #17

                @warhammer73 sagte in await is only valid in async functions ...:

                Damit sich das Thermostat aber keinen Wolf dreht und das Script ständig Last erzeugt, soll die Regelung zwischen Ist und Soll nur zyklisch passieren (Daher der 5min Timeout)

                Hast Du ein Thermostat oder ein Ventil + Thermometer?
                Wenn ich meinem Thermostat sage "mach mal 22°C" dann öffnet es. Und zwar so lange, bis das Thermometer (intern oder extern) sagt "22°C erreicht". Das macht das Ding völlig selbsttätig. Ob es sich dabei "einen Wolf dreht" ist mir völlig Schnuppe.
                Ändert jemand zwischendurch am Thermostat die Solltemperatur bleibt es entweder länger auf oder regelt früher ab. Auch ganz alleine ... ohne eine Zeile Code.
                Der Code kommt erst für die automatische Steuerung der Temperatur im Tag- bzw. Nachbetrieb ins Spiel. Der sagt per Schedule um 06:00 Uhr "stelle die Solltemperatur von 12 °C auf 22°C. Und schwupps ... öffnet sich das Ventil am Thermostat, um den Raum auf 22 °C zu heizen.
                Mein Thermostat regelt jedenfalls von alleine ;-)

                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                Proxmox 9.1.1 LXC|8 GB|Core i7-6700
                HmIP|ZigBee|Tasmota|Unifi
                Zabbix Certified Specialist
                Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                W 1 Antwort Letzte Antwort
                0
                • W warhammer73

                  @asgothian
                  Ja, bis dahin ja kein Problem.
                  Aber ich glaube ich hab eine Idee:
                  Wenn ich zyklisch über die Schleife eine Soll Temperatur berechnen lasse und die als Parameter einer externen Funktion (also erstmal ähnlich zu @Paul53) übergebe, dann kann die die Solltemperatur einstellen.
                  Wenn ein Trigger auf die externen Temperatureinstellungen der Funktion den Zeitpunkt der Änderung mitgibt dann braucht sich die Funktion nicht für 1h schlafen legen, sondern kann einfach prüfen wenn die Schleife den nächsten Soll Wert berechnet hat ob die Stunde schon vorbei ist und den Wert verwerfen.
                  Analog der Trigger vom Fenster, der dann in der Funktion einfach "Vergiss alle Werte die als Sollwerte kommen bis das Fenster wieder zu ist".

                  ... und eigentlich brauche ich dann auch keine externe Funktion, denn das kann die Schleife dann auch gleich prüfen bevor sie per setState den Wert ändert...

                  W Offline
                  W Offline
                  warhammer73
                  schrieb am zuletzt editiert von
                  #18

                  @warhammer73

                  ... so, die Idee mit dem Datum anstatt sleep funktioniert. Im Code sieht das dann erstmal so aus:
                  Trigger anlegen ausserhalb der Hauptschleife (Erstmal nur für ein Zimmer zum testen)
                  new_temperature_value ist jetzt eine globale Variable damit die auch hier ausgewertet werden kann

                  for (let i=0; i<1; i++) {
                      console.log("Create Trigger");
                      let room = deviceName[i];
                      on({id: [folderName + "." + room + ".Target_temperature_manual", "alias.0." + room + ".Thermostat.SET"], change: "any" }, function (obj) 
                      { 
                              if (getState("alias.0." + room + ".Thermostat.SET").val != new_temperature_value) { 
                                  console.log ("Datapoint manual changed");
                                  setState(folderName + "." + room + ".Temperature_manual_changed",true,true);
                                  changeDate=new Date();
                              }    
                      });
                  }
                  

                  In der Hauptschleife prüfe ich jetzt ob der DP für eine manuelle Änderung auf true steht und ob die Zeit überschritten wurde die das Script die Temperatur nicht überschreiben soll.
                  Wenn sie überschritten ist, wird der DP auf false gesetzt und nur wenn er auf false steht bekommt das Thermostat einen neuen Wert geschrieben.

                      if (getState(folderName + "." + room + ".Temperature_manual_changed").val == true && (new Date().getTime() - changeDate.getTime()) > locktime) {
                          console.log("Loop manual changed and locktime reached");
                          setState(folderName + "." + room + ".Temperature_manual_changed",false, true);
                      }
                      if (getState(folderName + "." + room + ".Temperature_manual_changed").val == false) {
                          console.log ("SetTemperatur on Thermostat: " + new_temperature_value + " based on Room temperature " + current_room_temperature + ", Thermostat_temparature " + getState("alias.0." + room + ".Thermostat.ACTUAL").val +" and target temperature " + target_temperature);
                          setState("alias.0." + room + ".Thermostat.SET", new_temperature_value, false);  
                      }
                      console.log ("Sleep for " + sleeptime + " sec");
                      await sleep(sleeptime);
                  

                  ... zwei Sachen dabei gelernt:
                  a) Wenn man einen DP abfragt, sollte man auch sicher gehen das er entweder den richtigen Wert beim erstmaligen Scriptlauf hat, oder dafür sorgen das das Script mit allen Eventualitäten umgehen kann. :)
                  b) Die Variante "Kann ich ja dann alles in der Schleife machen" funktioniert natürlich nicht, denn Änderungen werden erst nach Ablauf von sleep verarbeitet. Aber das sollte sich ja mit einer aufgerufenen Funktion ändern lassen...

                  1 Antwort Letzte Antwort
                  0
                  • CodierknechtC Codierknecht

                    @warhammer73 sagte in await is only valid in async functions ...:

                    Damit sich das Thermostat aber keinen Wolf dreht und das Script ständig Last erzeugt, soll die Regelung zwischen Ist und Soll nur zyklisch passieren (Daher der 5min Timeout)

                    Hast Du ein Thermostat oder ein Ventil + Thermometer?
                    Wenn ich meinem Thermostat sage "mach mal 22°C" dann öffnet es. Und zwar so lange, bis das Thermometer (intern oder extern) sagt "22°C erreicht". Das macht das Ding völlig selbsttätig. Ob es sich dabei "einen Wolf dreht" ist mir völlig Schnuppe.
                    Ändert jemand zwischendurch am Thermostat die Solltemperatur bleibt es entweder länger auf oder regelt früher ab. Auch ganz alleine ... ohne eine Zeile Code.
                    Der Code kommt erst für die automatische Steuerung der Temperatur im Tag- bzw. Nachbetrieb ins Spiel. Der sagt per Schedule um 06:00 Uhr "stelle die Solltemperatur von 12 °C auf 22°C. Und schwupps ... öffnet sich das Ventil am Thermostat, um den Raum auf 22 °C zu heizen.
                    Mein Thermostat regelt jedenfalls von alleine ;-)

                    W Offline
                    W Offline
                    warhammer73
                    schrieb am zuletzt editiert von
                    #19

                    @codierknecht said in await is only valid in async functions ...:

                    @warhammer73 sagte in await is only valid in async functions ...:

                    Damit sich das Thermostat aber keinen Wolf dreht und das Script ständig Last erzeugt, soll die Regelung zwischen Ist und Soll nur zyklisch passieren (Daher der 5min Timeout)

                    Hast Du ein Thermostat oder ein Ventil + Thermometer?
                    Wenn ich meinem Thermostat sage "mach mal 22°C" dann öffnet es. Und zwar so lange, bis das Thermometer (intern oder extern) sagt "22°C erreicht". Das macht das Ding völlig selbsttätig. Ob es sich dabei "einen Wolf dreht" ist mir völlig Schnuppe.
                    Ändert jemand zwischendurch am Thermostat die Solltemperatur bleibt es entweder länger auf oder regelt früher ab. Auch ganz alleine ... ohne eine Zeile Code.
                    Der Code kommt erst für die automatische Steuerung der Temperatur im Tag- bzw. Nachbetrieb ins Spiel. Der sagt per Schedule um 06:00 Uhr "stelle die Solltemperatur von 12 °C auf 22°C. Und schwupps ... öffnet sich das Ventil am Thermostat, um den Raum auf 22 °C zu heizen.
                    Mein Thermostat regelt jedenfalls von alleine ;-)

                    Thermostat mit internem Thermometer + externes Thermometer. Ja, ich kann dem Thermometer sagen "Mache 22°" - Nur was dann am anderen Ende vom Zimmer ankommt hat damit nichts zu tun.
                    Ja, ich hätte auch teure Bosch Thermometer kaufen können die dann automatisch mit dem Thermostat gesprochen hätten.
                    Ob sich das Thermostat einen Wolf dreht sollte Dir nicht Schnuppe sein - Geht nämlich massiv auf die Batterie.
                    Selbst Tag/Nacht und das pro Tag kann die Bosch App alleine.

                    ... was sie nicht kann:
                    Abhängig von Homeoffice Kalendern die Temperatur steuern
                    Mit zwei Heizkörpern und einem Innenthermometer unterschiedliche Temperaturen an den Thermostaten einstellen
                    Bei "Fenster auf" nur die Heizung runterregeln die in Fensternähe ist und erst ab einem längeren Abfall auch die andere Heizung abdrehen
                    ... und was so gar keine Thermostatregelung von alleine kann: Wenn es kalt ist, aber die PV Anlage genug Energie hat nicht per Heizkörper sondern per Splitklima heizen, es sei denn es ist jemand im Homeoffice.

                    CodierknechtC 1 Antwort Letzte Antwort
                    0
                    • W warhammer73

                      @codierknecht said in await is only valid in async functions ...:

                      @warhammer73 sagte in await is only valid in async functions ...:

                      Damit sich das Thermostat aber keinen Wolf dreht und das Script ständig Last erzeugt, soll die Regelung zwischen Ist und Soll nur zyklisch passieren (Daher der 5min Timeout)

                      Hast Du ein Thermostat oder ein Ventil + Thermometer?
                      Wenn ich meinem Thermostat sage "mach mal 22°C" dann öffnet es. Und zwar so lange, bis das Thermometer (intern oder extern) sagt "22°C erreicht". Das macht das Ding völlig selbsttätig. Ob es sich dabei "einen Wolf dreht" ist mir völlig Schnuppe.
                      Ändert jemand zwischendurch am Thermostat die Solltemperatur bleibt es entweder länger auf oder regelt früher ab. Auch ganz alleine ... ohne eine Zeile Code.
                      Der Code kommt erst für die automatische Steuerung der Temperatur im Tag- bzw. Nachbetrieb ins Spiel. Der sagt per Schedule um 06:00 Uhr "stelle die Solltemperatur von 12 °C auf 22°C. Und schwupps ... öffnet sich das Ventil am Thermostat, um den Raum auf 22 °C zu heizen.
                      Mein Thermostat regelt jedenfalls von alleine ;-)

                      Thermostat mit internem Thermometer + externes Thermometer. Ja, ich kann dem Thermometer sagen "Mache 22°" - Nur was dann am anderen Ende vom Zimmer ankommt hat damit nichts zu tun.
                      Ja, ich hätte auch teure Bosch Thermometer kaufen können die dann automatisch mit dem Thermostat gesprochen hätten.
                      Ob sich das Thermostat einen Wolf dreht sollte Dir nicht Schnuppe sein - Geht nämlich massiv auf die Batterie.
                      Selbst Tag/Nacht und das pro Tag kann die Bosch App alleine.

                      ... was sie nicht kann:
                      Abhängig von Homeoffice Kalendern die Temperatur steuern
                      Mit zwei Heizkörpern und einem Innenthermometer unterschiedliche Temperaturen an den Thermostaten einstellen
                      Bei "Fenster auf" nur die Heizung runterregeln die in Fensternähe ist und erst ab einem längeren Abfall auch die andere Heizung abdrehen
                      ... und was so gar keine Thermostatregelung von alleine kann: Wenn es kalt ist, aber die PV Anlage genug Energie hat nicht per Heizkörper sondern per Splitklima heizen, es sei denn es ist jemand im Homeoffice.

                      CodierknechtC Online
                      CodierknechtC Online
                      Codierknecht
                      Developer Most Active
                      schrieb am zuletzt editiert von
                      #20

                      @warhammer73
                      Also ich habe die Zieltemperatur am HM Wandthermostat mit der Zieltemperatur des ZigBee-Thermostaten gekoppelt.
                      Der ZigBee Fenstersensor liefert dem HM den Status des Fensters.
                      Heating-Control steuer das Ganze über die Zeit.
                      Funktioniert einwandfrei und reicht mir völlig.

                      Bei der Masse Deiner Anforderungen bin ich raus ... da stehen für mich Aufwand und Nutzen nicht im richtigen Verhältnis. Und: Je komplexer ein System, desto eher geht etwas schief wenn in dem filigranen Getriebe etwas knirscht.

                      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                      Proxmox 9.1.1 LXC|8 GB|Core i7-6700
                      HmIP|ZigBee|Tasmota|Unifi
                      Zabbix Certified Specialist
                      Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                      W 1 Antwort Letzte Antwort
                      0
                      • CodierknechtC Codierknecht

                        @warhammer73
                        Also ich habe die Zieltemperatur am HM Wandthermostat mit der Zieltemperatur des ZigBee-Thermostaten gekoppelt.
                        Der ZigBee Fenstersensor liefert dem HM den Status des Fensters.
                        Heating-Control steuer das Ganze über die Zeit.
                        Funktioniert einwandfrei und reicht mir völlig.

                        Bei der Masse Deiner Anforderungen bin ich raus ... da stehen für mich Aufwand und Nutzen nicht im richtigen Verhältnis. Und: Je komplexer ein System, desto eher geht etwas schief wenn in dem filigranen Getriebe etwas knirscht.

                        W Offline
                        W Offline
                        warhammer73
                        schrieb am zuletzt editiert von
                        #21

                        @codierknecht
                        Naja, aus WAF Gründen brauchte ich leise Thermostate - Leiser wie die Bosch habe ich nicht gefunden, die spielen aber ohne iobroker und co. eben nur mit Bosch.

                        So schlimm ist das meiste gar nicht - javascript mag nur vieles anders als die Sachen die ich gewohnt bin und da muss man manchmal um ein paar Ecken denken. :)

                        CodierknechtC 1 Antwort Letzte Antwort
                        0
                        • W Offline
                          W Offline
                          warhammer73
                          schrieb am zuletzt editiert von
                          #22

                          @Asgothian , @Paul53, @Codierknecht:
                          Danke für Eure Hinweise und Ideen.

                          Das ganze sieht jetzt so aus:

                          function SetTemperature(room) {
                              let locktime = 3600;
                              locktime = locktime * 1000;
                              setState(folderName + "." + room + ".Roomtemperature", current_room_temperature, true);
                              setState(folderName + "." + room + ".Target_temperature", parseInt(target_temperature), true); 
                              setState(folderName + "." + room + ".Thermostat_temperature", getState("alias.0." + room + ".Thermostat.ACTUAL").val, true);
                              setState(folderName + "." + room + ".Thermostat", parseInt(new_temperature_value), true);
                              setState(folderName + "." + room + ".Lastchange", new Date().toLocaleString(), true); 
                              console.log ("Manual changed: " + getState(folderName + "." + room + ".Temperature_manual_changed").val);
                              console.log ("Window: " + getState("alias.0." + room + ".Fensterkontakt.ACTUAL").val);
                              if (getState("alias.0." + room + ".Fensterkontakt.ACTUAL").val == false) {
                                  console.log ("Set temperature to minimum");
                                  setState("alias.0." + room + ".Thermostat.SET", min_temperature, true); 
                              }   else if (getState(folderName + "." + room + ".Temperature_manual_changed").val == true && (new Date().getTime() - changeDate.getTime()) > locktime) {
                                  console.log("Loop manual changed and locktime reached");
                                  setState(folderName + "." + room + ".Temperature_manual_changed",false, true);
                              }   else if (getState(folderName + "." + room + ".Temperature_manual_changed").val == false) {
                                  console.log ("SetTemperatur on Thermostat: " + new_temperature_value + " based on Room temperature " + current_room_temperature + ", Thermostat_temparature " + getState("alias.0." + room + ".Thermostat.ACTUAL").val +" and target temperature " + target_temperature);
                                  setState("alias.0." + room + ".Thermostat.SET", new_temperature_value, true);  
                              }
                          }
                          
                          
                          // Trigger für manuelle Änderungen anlegen, Testweise nur ein Raum
                          for (let i=0; i<1; i++) {
                              console.log("Create Trigger");
                              let room = deviceName[i];
                              on({id: [folderName + "." + room + ".Target_temperature_manual", "alias.0." + room + ".Thermostat.SET"], change: "any" }, function (obj) 
                              { 
                                      if (getState("alias.0." + room + ".Thermostat.SET").val != new_temperature_value) { 
                                          console.log ("Datapoint manual changed");
                                          setState(folderName + "." + room + ".Temperature_manual_changed",true,true);
                                          changeDate=new Date();
                                          SetTemperature(room);
                                      }    
                              });
                              on({id: ["alias.0." + room + ".Fensterkontakt.ACTUAL"], change: "any" }, function (obj) 
                              { 
                                      if (getState("alias.0." + room + ".Fensterkontakt.ACTUAL").val == true) { //geschlossen
                                          console.log ("Window Closed");
                                          SetTemperature(room);
                                      } else {
                                          console.log ("Window Opened");
                                          SetTemperature(room);
                                      }   
                              });
                          }
                          
                          
                          
                          while (1) {
                             ... kleine Magie zur Ist Temperaturberechnung. ;)
                              SetTemperature(room);
                              console.log ("Sleep for " + sleeptime + " sec");
                              await sleep(sleeptime);   
                          } 
                          
                          

                          ... das Einzige was jetzt noch fehlt ist das beim Fenster schliessen der alte Wert wiederhergestellt wird - Aber erstmal morgen alles durchtesten.

                          1 Antwort Letzte Antwort
                          0
                          • W warhammer73

                            @codierknecht
                            Naja, aus WAF Gründen brauchte ich leise Thermostate - Leiser wie die Bosch habe ich nicht gefunden, die spielen aber ohne iobroker und co. eben nur mit Bosch.

                            So schlimm ist das meiste gar nicht - javascript mag nur vieles anders als die Sachen die ich gewohnt bin und da muss man manchmal um ein paar Ecken denken. :)

                            CodierknechtC Online
                            CodierknechtC Online
                            Codierknecht
                            Developer Most Active
                            schrieb am zuletzt editiert von
                            #23

                            @warhammer73 sagte in await is only valid in async functions ...:

                            Naja, aus WAF Gründen brauchte ich leise Thermostate - Leiser wie die Bosch habe ich nicht gefunden, die spielen aber ohne iobroker und co. eben nur mit Bosch.

                            Die Fritz!Dect 301 sind ziemlich leise - zumindest im Vergleich mit Aqara E1.
                            Mich stört allerdings die Reaktionszeit von bis zu 15 Minuten. Darum gebe ich die wieder ab.
                            https://forum.iobroker.net/topic/61778/verkaufe-2x-fritz-dect-301-heizkörperthermostat

                            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                            Proxmox 9.1.1 LXC|8 GB|Core i7-6700
                            HmIP|ZigBee|Tasmota|Unifi
                            Zabbix Certified Specialist
                            Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                            W 1 Antwort Letzte Antwort
                            0
                            • CodierknechtC Codierknecht

                              @warhammer73 sagte in await is only valid in async functions ...:

                              Naja, aus WAF Gründen brauchte ich leise Thermostate - Leiser wie die Bosch habe ich nicht gefunden, die spielen aber ohne iobroker und co. eben nur mit Bosch.

                              Die Fritz!Dect 301 sind ziemlich leise - zumindest im Vergleich mit Aqara E1.
                              Mich stört allerdings die Reaktionszeit von bis zu 15 Minuten. Darum gebe ich die wieder ab.
                              https://forum.iobroker.net/topic/61778/verkaufe-2x-fritz-dect-301-heizkörperthermostat

                              W Offline
                              W Offline
                              warhammer73
                              schrieb am zuletzt editiert von
                              #24

                              @codierknecht
                              Netter Werbungsversuch ;)

                              1 Antwort Letzte Antwort
                              0
                              • W warhammer73

                                @asgothian
                                Ich versuchs mal mit Worten, weil der relevante Teil im Script ja nicht so will wie ich und es da eher ein grundlegendes Problem gibt.

                                Es gibt diverse Eingangsparameter die eine Solltemperatur im Raum definieren.
                                Es gibt ein Thermometer das die Ist Temperatur angibt.
                                Mit diversen Sachen versucht jetzt das Script am Thermometer die Ist Temperatur zu erreichen.
                                Das klappt alles soweit.
                                Das ist momentan der Teil der in der Schleife läuft (Ja, kann man auch als Trigger auf die Ist Temperatur machen).
                                Damit sich das Thermostat aber keinen Wolf dreht und das Script ständig Last erzeugt, soll die Regelung zwischen Ist und Soll nur zyklisch passieren (Daher der 5min Timeout)
                                Das würde mit dem Script Ausschnitt auch funktionieren.

                                Aber:
                                Wenn jemand manuell über das Thermostat oder über die Visualisierung die Temperatur ändert soll natürlich das Script NICHT nach spätestens 5min die Einstellung wieder überschreiben. Deswegen die Idee mit dem Trigger und dem Timeout von 60min.

                                Zusammengefasst also:
                                Script regelt zyklisch das Thermostat und soll die Füsse für eine Stunde stillhalten wenn jemand manuell eingreift.

                                An der Stelle komme ich jetzt nicht weiter wie ich die beiden Timeouts oder welche Mechanismen auch immer für die zyklische Bearbeitung und das Sperren der Bearbeitung zusammen bekomme.

                                Und um es noch etwas komplizierter zu machen:
                                Es gibt auch noch einen Fenster offen Sensor auf dessen Trigger natürlich das Thermostat auf min gehen soll und wenn Fester zu wieder auf den alten Wert.

                                Und jetzt habe ich keine Idee wie ich diese (Im Zweifel ja drei) Trigger jetzt synchronisiert und sich gegenseitig beeinflussend bekomme.

                                CodierknechtC Online
                                CodierknechtC Online
                                Codierknecht
                                Developer Most Active
                                schrieb am zuletzt editiert von
                                #25

                                @warhammer73 sagte in await is only valid in async functions ...:

                                Es gibt auch noch einen Fenster offen Sensor auf dessen Trigger natürlich das Thermostat auf min gehen soll und wenn Fester zu wieder auf den alten Wert.

                                Nur so als Anmerkung, weil ich diese Idee auch schon hatte:
                                Dein Zeitplan sagt: Zwischen 07:00 und 16:00 Uhr => Komforttemperatur (z.B. 22°C).
                                Um 15:55 Uhr macht jemand das Fenster auf => Runter auf Minimum und alten Wert merken.
                                Wird jetzt um 16:05 Uhr das Fenster geschlossen wird, würde ein einfaches "wieder auf den alten Wert" den Zeitplan aushebeln. Muss also irgendwie berücksichtigt werden.

                                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                                Proxmox 9.1.1 LXC|8 GB|Core i7-6700
                                HmIP|ZigBee|Tasmota|Unifi
                                Zabbix Certified Specialist
                                Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                                W 1 Antwort Letzte Antwort
                                0
                                • CodierknechtC Codierknecht

                                  @warhammer73 sagte in await is only valid in async functions ...:

                                  Es gibt auch noch einen Fenster offen Sensor auf dessen Trigger natürlich das Thermostat auf min gehen soll und wenn Fester zu wieder auf den alten Wert.

                                  Nur so als Anmerkung, weil ich diese Idee auch schon hatte:
                                  Dein Zeitplan sagt: Zwischen 07:00 und 16:00 Uhr => Komforttemperatur (z.B. 22°C).
                                  Um 15:55 Uhr macht jemand das Fenster auf => Runter auf Minimum und alten Wert merken.
                                  Wird jetzt um 16:05 Uhr das Fenster geschlossen wird, würde ein einfaches "wieder auf den alten Wert" den Zeitplan aushebeln. Muss also irgendwie berücksichtigt werden.

                                  W Offline
                                  W Offline
                                  warhammer73
                                  schrieb am zuletzt editiert von
                                  #26

                                  @codierknecht
                                  Richtig, ist aber ein Punkt den ich an der Stelle ignoriere.
                                  Warum? Die Schleife die alle X Minuten (Aktuell 10) einen neuen Wert würfelt berücksichtigt den Zeitplan.
                                  Der "falsche" Wert greift also maximal für die Schlafzeit des Scriptes. Für mich verkraftbar.

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


                                  Support us

                                  ioBroker
                                  Community Adapters
                                  Donate

                                  876

                                  Online

                                  32.4k

                                  Benutzer

                                  81.5k

                                  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