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. [gelöst] Script zum Lüften und zur Statusanzeige in vis

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.1k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    935

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

[gelöst] Script zum Lüften und zur Statusanzeige in vis

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
17 Beiträge 8 Kommentatoren 3.7k 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.
  • andreA Offline
    andreA Offline
    andre
    Developer
    schrieb am zuletzt editiert von
    #1

    Hallo,

    ich habe mir ein kleines Script zum Thema Lüften und zur Statusanzeige in vis gebastelt. Ist eigentlich sehr einfach gestrickt, allerdings ist die Funktion derzeit noch nicht wie gewünscht. :(

    Mein Problem ist offensichtlich der Scriptaufruf. Ich mache das über ein on() mit newState. Irgendwie habe ich aber das Gefühl, dass das nicht mit allen "Auslösern" funktioniert. Kann mal jemand schauen wo es klemmt? Sicherlich kann man das Script auch noch verbessern… ;)

    Konkretes Fehlerbild: Nach dem Schließen der Fenster (täglicher Zähler / vis.lueften.og_daily = true) springt der Status auf 0. Erwartet wird allerdings, dass er auf 3 springt, da die Bedingungen alle erfüllt sind... Starte ich das Script dann manuell nochmal, wird der Status korrekt gesetzt. Alle anderen Statusanzeigen scheinen gut zu funktionieren.

    Hier mal mein Script mit Erläuterungen:

    ! ````
    // Script: Tägliches Lüften im Obergeschoss + Statusanzeige in Vis
    ! // Datenpunkte für den täglichen "Zähler" und den aktuellen Status anlegen
    createState('vis.lueften.og_daily', false, {name: 'Wurde heute im OG schon gelüftet?'});
    createState('vis.lueften.og_status', 0, {name: 'Status zum Lüften im OG zur Anzeige in Vis'});
    ! // Datenpunkt-IDs
    var idBOlueften = "hm-rpc.0.LEQXXXXXXX.1.STATE"; // Fenster Drehgriffsensoren
    var idSZlueften = "hm-rpc.0.JEQXXXXXXX.1.STATE";
    var idK1lueften = "hm-rpc.0.KEQXXXXXXX.1.STATE";
    var idK2lueften = "hm-rpc.0.JEQXXXXXXX.1.STATE";
    var idStatus = "vis.lueften.og_status";
    var idDaily = "vis.lueften.og_daily";
    var idOutTemp = "hm-rpc.0.KEQXXXXXXX.2.TEMPERATURE"; // Temperatursensor Außentemperatur
    var idSZTemp = "hm-rpc.0.JEQXXXXXXX.1.TEMPERATURE"; // Temperatursensor Schlafzimmer
    ! // Variablendeklaration und Initialisierung bei Scriptstart
    var stateBOlueften = getState(idBOlueften).val;
    var stateSZlueften = getState(idSZlueften).val;
    var stateK1lueften = getState(idK1lueften).val;
    var stateK2lueften = getState(idK2lueften).val;
    var stateStatus = getState(idStatus).val;
    var stateDaily = getState(idDaily).val;
    var stateOutTemp = getState(idOutTemp).val;
    var stateSZTemp = getState(idSZTemp).val;
    ! // Funktion zum Rücksetzen des täglichen "Zählers" (ob schon gelüftet) um 1:00 Uhr
    schedule("0 1 * * *", function () {
    setState(idDaily, false);
    });
    ! // Funktion zum Stzen des Status bei Lüften OG
    function setStatus() {
    if (stateDaily === false && stateOutTemp > stateSZTemp) {
    setState(idStatus, 2); // Lüften nicht sinnvoll!
    } else if (stateDaily === true && stateBOlueften === 0 && stateSZlueften === 0 && stateK1lueften === 0 && stateK2lueften === 0) {
    setState(idStatus, 3); // Heute bereits gelüftet!
    } else if (stateBOlueften !== 0 && stateSZlueften !== 0 && stateK1lueften !== 0 && stateK2lueften !== 0) {
    setState(idStatus, 1); // Es wird gerade gelüftet!
    setState(idDaily, true);
    } else if (stateBOlueften !== 0 || stateSZlueften !== 0 || stateK1lueften !== 0 || stateK2lueften !== 0) {
    setState(idStatus, 4); // Fenster gerade offen!
    } else {
    setState(idStatus, 0); // Heute noch nicht gelüftet!
    }
    }
    ! // Aufruf der Funktionen bei Scriptstart
    setStatus();
    ! // Aufruf der Funktionen bei Änderung der Stati
    on(idBOlueften, function(dp) {
    stateBOlueften = dp.newState.val;
    setStatus();
    });
    on(idSZlueften, function(dp) {
    stateSZlueften = dp.newState.val;
    setStatus();
    });
    on(idK1lueften, function(dp) {
    stateK1lueften = dp.newState.val;
    setStatus();
    });
    on(idK2lueften, function(dp) {
    stateK2lueften = dp.newState.val;
    setStatus();
    });
    on(idOutTemp, function(dp) {
    stateOutTemp = dp.newState.val;
    setStatus();
    });
    on(idDaily, function(dp) {
    stateDaily = dp.newState.val;
    setStatus();
    });

    Da ich mir sicher bin, dass das für unsere Profis hier Kinderkram ist, bedanke ich mich vorab schonmal mit einem dicken DANKE! :)
    
    MfG,
    
    André
    
    ****[EDIT] Habe das Problem lösen können. Die Lösung und das letztendliche Script gibts hier:
    
    [http://forum.iobroker.net/viewtopic.php … 714#p25072](http://forum.iobroker.net/viewtopic.php?f=21&t=2714#p25072)****

    Bitte keine Support-Fragen per PN! Nutzt die öffentliche Kanäle damit auch andere von den Antworten profitieren können!

    1 Antwort Letzte Antwort
    0
    • paul53P Offline
      paul53P Offline
      paul53
      schrieb am zuletzt editiert von
      #2

      Weshalb wird auf idDaily getriggert ?

      Wie testest Du ? Hoffentlich nicht, indem Du die Werte im Reiter "Objekte" veränderst, denn das funktioniert (noch) nicht richtig.

      Soll idDaily nur dann auf true gesetzt werden, wenn alle Fenster geöffnet sind ? So ist es zumindest programmiert.

      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
      0
      • andreA Offline
        andreA Offline
        andre
        Developer
        schrieb am zuletzt editiert von
        #3

        @paul53:

        Weshalb wird auf idDaily getriggert ? `
        Damit die Anzeige in vis aktualisiert wird, wenn der Wert in der Nacht zurück gesetzt wird. Kann man vielleicht auch weg lassen wenn man das beim nächtlichen Zurücksetzen mit einbaut…

        @paul53:

        Wie testest Du ? Hoffentlich nicht, indem Du die Werte im Reiter "Objekte" veränderst, denn das funktioniert (noch) nicht richtig. `
        Nein. Ich teste im tatsächlichen Betrieb. Also mit den original Triggern (Fensterkontakte) oder bei der Temperatur durch Umkehrung der Bedingung.

        @paul53:

        Soll idDaily nur dann auf true gesetzt werden, wenn alle Fenster geöffnet sind ? So ist es zumindest programmiert. `
        Ja. Nur wenn quer gelüftet wurde (alle vier Fenster offen) zählt das als erfolgreiches Lüften.

        MfG,

        André

        Bitte keine Support-Fragen per PN! Nutzt die öffentliche Kanäle damit auch andere von den Antworten profitieren können!

        1 Antwort Letzte Antwort
        0
        • paul53P Offline
          paul53P Offline
          paul53
          schrieb am zuletzt editiert von
          #4

          Nach den Aussagen kann ich das beschriebene Fehlverhalten nicht nachvollziehen. Um zu sehen, ob irgendetwas nicht sauber über geben wird, solltest zu Beginn der Funktion setStatus ein log einfügen:

          function setStatus() {
          	log(stateDaily+typeof stateDaily+stateBOlueften+typeof stateBOlueften+stateSZlueften+typeof stateSZlueften+stateK1lueften+typeof stateK1lueften+stateK2lueften+typeof stateK2lueften);
          	if (stateDaily === false && stateOutTemp > stateSZTemp) {...
          
          

          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
          0
          • andreA Offline
            andreA Offline
            andre
            Developer
            schrieb am zuletzt editiert von
            #5

            Ok, da bin ich ja schonmal froh, dass meine Logik im Programm nicht ganz falsch ist…

            Ich werde das mit dem Logging mal versuchen.

            Habe irgendwie im Gefühl, dass vielleicht die Ausführung des Scripts die Statusänderung überholt.

            In meinem Fall: letztes Fenster wird geschlossen, Änderung wird erkannt, Funktion getriggert, aber zur Entscheidung wird noch der alte Status genommen.

            Nur das würde meines Erachtens erklären, dass bei einem manuellen Scriptreload (über den Admin) der Status letztendlich korrekt gesetzt wird...

            Mal sehen was das Log dazu sagt.

            MfG,

            André

            Gesendet mit Tapatalk.

            Bitte keine Support-Fragen per PN! Nutzt die öffentliche Kanäle damit auch andere von den Antworten profitieren können!

            1 Antwort Letzte Antwort
            0
            • P Offline
              P Offline
              pix
              schrieb am zuletzt editiert von
              #6

              Hallo Andre,

              ich sehe da auch einen logischen Konflikt in den Stati:
              <list type="decimal">3. Lüften nicht sinnvoll!

              1. Heute bereits gelüftet!

              2. Es wird gerade gelüftet!

              3. Fenster gerade offen!

              4. Heute noch nicht gelüftet!

              2 und 5 sind wie boolean. Wurde gelüftet? Ja/Nein.

              1 Könnte das noch übersteuern. Egal ob gelüftet wurde, jetzt ist es jedenfalls nicht sinnvoll.

              3 und 4 sind eigentlich identisch und passen nicht ganz rein. Denn der 3 oder 4 wird angezeigt, egal ob es sinnvoll ist oder bereits bzw. noch nicht gelüftet wurde. Das macht keinen Sinn und passt eher in eine andere Variable, die den http://forum.iobroker.org/viewtopic.php?f=21&t=535#p3682 anzeigt, nicht den Zustand des Lüftungsbedarfs. Auf jeden Fall sind die vielen "else" sehr verwirrend.

              Ich würde daher die Funktion setStatus verändern:

              function setStatus() {
                  if (stateDaily) setState(idStatus,3);                           // Heute bereits gelüftet!
                  if (!stateDaily) {  // alternativ kann statt if auch ein else dazwischen
                      setState(idStatus, 0);                                      // Heute noch nicht gelüftet!
                      if (stateOutTemp > stateSZTemp) setState(idStatus, 2);      // Lüften aber nicht sinnvoll!
                  }
                  // wenn trotzdem gelüftet wird
                  if (stateBOlueften !== 0 && stateSZlueften !== 0 && stateK1lueften !== 0 && stateK2lueften !== 0) {
                      setState(idStatus,3);
                      // setState(andereVariableFuerStatusAllerFenster, offen);
                  } else {
                      // setState(andereVariableFuerStatusAllerFenster, zu); 
                      log('alle Fenster zum Lüften öffnen');
                  }
              }
              ````evtl. kann man auch den "sinnvoll"-Status für die Hauptklammer verwenden. Wenn nicht sinnvoll, dann gar keine weitere Reaktion.
              
              Gruß
              
              Pix

              ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

              1 Antwort Letzte Antwort
              0
              • T Offline
                T Offline
                tgirard
                schrieb am zuletzt editiert von
                #7

                Ich hatte ein ähnliches Problem und glaube (!), dass Deine Variablen unter:

                // Variablendeklaration und Initialisierung bei Scriptstart

                var stateBOlueften = getState(idBOlueften).val;

                nur beim Start des Scripts initialisiert werden und dann nicht mehr aktualisiert.

                Versuch mal diesen Block der Variablen nach dem Trigger zu deklarieren.

                1 Antwort Letzte Antwort
                0
                • blauholstenB Offline
                  blauholstenB Offline
                  blauholsten
                  Developer
                  schrieb am zuletzt editiert von
                  #8

                  @tgirard:

                  Versuch mal diesen Block der Variablen nach dem Trigger zu deklarieren. `

                  Hi,

                  ich denke das wird bereits gemacht. Mithilfe von newState. Val

                    on(idK1lueften, function(dp) {
                     stateK1lueften = dp.newState.val;
                     setStatus();
                  });     
                  

                  Entwickler vom: - Viessman Adapter
                  - Alarm Adapter

                  1 Antwort Letzte Antwort
                  0
                  • S Offline
                    S Offline
                    Solear
                    schrieb am zuletzt editiert von
                    #9

                    Ich habe bei meinem Lüften-Script manchmal Anlaufprobleme. Obwohl die Bedingen ausnahmslos erfüllt sind und die Triggerwerte sich ändern, funktioniert es erst beim nächsten oder übernächsten "umschalten", ab dann aber stabil. Bin noch nicht dahintergekommen, warum das so ist. Vielleicht ist das bei dir auch so,

                    iobroker als LXC unter Proxmox

                    1 Antwort Letzte Antwort
                    0
                    • andreA Offline
                      andreA Offline
                      andre
                      Developer
                      schrieb am zuletzt editiert von
                      #10

                      @pix:

                      Hallo Andre,

                      ich sehe da auch einen logischen Konflikt in den Stati:
                      <list type="decimal">3. Lüften nicht sinnvoll!

                      1. Heute bereits gelüftet!

                      2. Es wird gerade gelüftet!

                      3. Fenster gerade offen!

                      4. Heute noch nicht gelüftet!

                      2 und 5 sind wie boolean. Wurde gelüftet? Ja/Nein.

                      1 Könnte das noch übersteuern. Egal ob gelüftet wurde, jetzt ist es jedenfalls nicht sinnvoll.

                      3 und 4 sind eigentlich identisch und passen nicht ganz rein. Denn der 3 oder 4 wird angezeigt, egal ob es sinnvoll ist oder bereits bzw. noch nicht gelüftet wurde. Das macht keinen Sinn und passt eher in eine andere Variable, die den http://forum.iobroker.org/viewtopic.php?f=21&t=535#p3682 anzeigt, nicht den Zustand des Lüftungsbedarfs. Auf jeden Fall sind die vielen "else" sehr verwirrend.

                      Ich würde daher die Funktion setStatus verändern:

                      function setStatus() {
                          if (stateDaily) setState(idStatus,3);                           // Heute bereits gelüftet!
                          if (!stateDaily) {  // alternativ kann statt if auch ein else dazwischen
                              setState(idStatus, 0);                                      // Heute noch nicht gelüftet!
                              if (stateOutTemp > stateSZTemp) setState(idStatus, 2);      // Lüften aber nicht sinnvoll!
                          }
                          // wenn trotzdem gelüftet wird
                          if (stateBOlueften !== 0 && stateSZlueften !== 0 && stateK1lueften !== 0 && stateK2lueften !== 0) {
                              setState(idStatus,3);
                              // setState(andereVariableFuerStatusAllerFenster, offen);
                          } else {
                              // setState(andereVariableFuerStatusAllerFenster, zu); 
                              log('alle Fenster zum Lüften öffnen');
                          }
                      }
                      ````evtl. kann man auch den "sinnvoll"-Status für die Hauptklammer verwenden. Wenn nicht sinnvoll, dann gar keine weitere Reaktion.
                      
                      Gruß
                      
                      Pix `  
                      

                      Hallo Pix,

                      danke dass du dir Zeit genommen hast. So ganz kann ich dir aber gerade nicht folgen. Vielleicht habe ich aber auch ein wenig zuviel mit Informationen zum Nutzen des Scripts geknausert. ;)

                      Mein Script soll eigentlich nur einen Nutzen haben: Den aktuellen Lüftungsstatus in den Werten 1-5 ausgeben.

                      Dabei soll der Lüftungsstatus 1 = Es wird gerade gelüftet! (Alle Fenster offen) und 4 = Fenster gerade offen! (Mindestens ein Fenster offen) immer eingeblendet werden, egal ob schon gelüftete wurde oder es vielleicht nicht sinnvoll ist. Also wenn Fenster auf, dann 1 oder 4.

                      Zusätzlich soll, solange noch nicht gelüftet wurde (stateDaily=false) und die Temperaturbedingung erfüllt ist der Status auf 2 = Lüften nicht sinnvoll! gesetzt werden.

                      Sobald gelüftet wurde (stateDaily=true), und alle Fenster wieder geschlossen wurden soll der Status auf 3 = Heute bereits gelüftet! gesetzt werden. Dies sollte dann ggf. den Status 2 überschreiben, weil ja schon gelüftet wurde.

                      Ich könnte sicherlich eine Variable für "alle Fenster offen" einführen. Allerdings würde ich diese dann ja wieder verwenden um meine idStatus entsprechend zu setzen. Die Anzeige in vis läuft nämlich über ein "value List HTML"-Widget, dass je nach Status (also 1-5) das Aussehen ändert.

                      [{"tpl":"tplValueListHtml8","data":{"oid":"javascript.0.vis.lueften.og_status","visibility-cond":"==","visibility-val":1,"count":"4","gestures-offsetX":0,"gestures-offsetY":0,"test_list":"4","value0":"Heute noch nicht gelüftet!","value1":"Es wird gerade gelüftet!","value2":"Lüften aktuell nicht sinnvoll!","style0":"background-color:rgb(162, 0, 37);","value3":"Heute bereits gelüftet!","style1":"background-color:blue;","style2":"background-color:darkorange;","value4":"Fenster offen, kein Lüften!"},"style":{"left":"1133px","top":"340px","box-shadow":"inset 0px 0px 1px #FFFFCC","z-index":"1","width":"215px","height":"15px","background":"#222222","font-family":"Verdana, Geneva, sans-serif","color":"#FFFFFF","font-size":"x-small","font-weight":"normal","text-align":"center","padding":"","padding-top":"3px"},"widgetSet":"basic"}]
                      

                      Aber jetzt wo ich das hier mal so aufgeschrieben habe, ist es vielleicht gar nicht so falsch die Funktion in verschiedene Ebenen abzustufen, also zu verschachteln. Ich werd mir das gleich mal aufmalen…

                      MfG,

                      André

                      PS: Hier nochmal wie es bei mir in vis angezeigt wird/ werden soll. Erst, alle Fenster geschlossen, noch nicht gelüftet. Dann ein Fenster geöffnet, aber kein (Quer-)Lüften
                      914_visualisierung.jpg
                      914_visualisierung1.jpg

                      Bitte keine Support-Fragen per PN! Nutzt die öffentliche Kanäle damit auch andere von den Antworten profitieren können!

                      1 Antwort Letzte Antwort
                      0
                      • P Offline
                        P Offline
                        pix
                        schrieb am zuletzt editiert von
                        #11

                        Hallo andre,

                        das ganze ist schließlich eine ganz individuelle Angelegenheit. Es ist sicher der beste Weg, sich erstmal im Klaren zu werden, was man braucht und anzeigen will. Es gibt bei diesem Problem leider einige Schwierigkeiten: Status "Noch nicht gelüftet" impliziert eigentlich, dass ja noch gelüftet werden muss. Wenn aber die Aussentemperatur zu hoch ist, dann soll nicht gelüftet werden. Da kollidieren Aufgaben der beiden Variablen. Was soll dann angezeigt werden? Ich will damit sagen, dass das Widget "value List HTML" vielleicht nicht das richtige Widget für diese komplexe Aufgabe ist. Zumindest nicht, wenn du nur eines benutzt.

                        Gruß

                        Pix

                        ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                        1 Antwort Letzte Antwort
                        0
                        • andreA Offline
                          andreA Offline
                          andre
                          Developer
                          schrieb am zuletzt editiert von
                          #12

                          @pix:

                          Hallo andre,

                          das ganze ist schließlich eine ganz individuelle Angelegenheit. Es ist sicher der beste Weg, sich erstmal im Klaren zu werden, was man braucht und anzeigen will. Es gibt bei diesem Problem leider einige Schwierigkeiten: Status "Noch nicht gelüftet" impliziert eigentlich, dass ja noch gelüftet werden muss. Wenn aber die Aussentemperatur zu hoch ist, dann soll nicht gelüftet werden. Da kollidieren Aufgaben der beiden Variablen. Was soll dann angezeigt werden? Ich will damit sagen, dass das Widget "value List HTML" vielleicht nicht das richtige Widget für diese komplexe Aufgabe ist. Zumindest nicht, wenn du nur eines benutzt.

                          Gruß

                          Pix `

                          Hallo Pix,

                          das kann man so nicht sagen. Individuell, klar. Genauso natürlich Geschmackssache. :)

                          Ich bin mir auch im Klaren was ich mit dem Script erreichen will, und weiß auch, welcher Status welchen überschreibt. (Im Beispiel: "Noch nicht gelüftet" unterliegt immer "Nicht sinnvoll weil Außentemp zu hoch" weil ich für mein Verständnis sage, wenn da "Lüften nicht sinnvoll" steht, dann muss auch noch nicht gelüftet worden sein. Andernfalls wäre der Text in der Tat sinnlos, weil ja schon gelüftet.)

                          Mit dem "Value List HTML"-Widget habe ich meiner Meinung nach auch das Richtige gefunden. In der Anzeige habe ich genau eine Zeile zur Information über den Status zum Lüften. Diese Zeile kann nach meiner Definition jeweils nur einen der folgenden Werte annehmen:

                          0 - Heute noch nicht gelüftet (idDaily false, alle Fenster zu, Außentemp kleiner Innentemp)

                          1 - Es wird gerade gelüftet (idDaily true oder false, alle Fenster auf)

                          2 - Lüften nicht sinnvoll (idDaily false, alle Fenster zu, Außentemp größer Innentemp)

                          3 - Heute bereits gelüftet (idDaily true, alle Fenster zu, Außentemp und Innentemp egal)

                          4 - Fenster gerade offen, kein echtes Lüften (idDaily true oder false, 1-3 Fenster offen, Außentemp und Innentemp egal)

                          Das bedeutet, das Script muss am Ende immer einen einzigen Status auswählen der angezeigt wird. Dazu muss es eben auch wissen welcher Status welchen sticht(, was sicherlich Geschmackssache ist).

                          Nunja, auf deinen Anreiz zum Verschachteln der if habe ich meine Funktion gerade noch einmal komplett überarbeitet. Wenn ich das jetzt mal so in Trockenübung im Kopf durch gehe, sollte es so passen. Mal sehen ob ich das morgen nach dem Lüften auch noch sagen werde. ;) Außerdem ist es jetzt irgendwie übersichtlicher….

                          function setStatus() {
                          	if (stateDaily === true) {
                          		if (stateBOlueften !== 0 && stateSZlueften !== 0 && stateK1lueften !== 0 && stateK2lueften !== 0) {
                          			setState(idStatus, 1);      // Es wird gerade gelüftet!
                          		} else if (stateBOlueften === 0 && stateSZlueften === 0 && stateK1lueften === 0 && stateK2lueften === 0) {
                          			setState(idStatus, 3);      // Heute bereits gelüftet!
                          		} else if (stateBOlueften !== 0 || stateSZlueften !== 0 || stateK1lueften !== 0 || stateK2lueften !== 0) {
                          			setState(idStatus, 4);      // Fenster gerade offen, kein echtes Lüften!
                          		}
                          	} else if (stateDaily === false) {
                          		if (stateBOlueften !== 0 && stateSZlueften !== 0 && stateK1lueften !== 0 && stateK2lueften !== 0) {
                          			setState(idStatus, 1);      // Es wird gerade gelüftet!
                          			setState(idDaily, true);
                          		} else if (stateBOlueften !== 0 || stateSZlueften !== 0 || stateK1lueften !== 0 || stateK2lueften !== 0) {
                          			setState(idStatus, 4);      // Fenster gerade offen, kein echtes Lüften!
                          		} else if (stateOutTemp > stateSZTemp) {
                          			setState(idStatus, 2);      // Lüften nicht sinnvoll!
                          		} else {
                          			setState(idStatus, 0);      // Heute noch nicht gelüftet!
                          		}
                          	}
                          }
                          

                          MfG,

                          André

                          Bitte keine Support-Fragen per PN! Nutzt die öffentliche Kanäle damit auch andere von den Antworten profitieren können!

                          1 Antwort Letzte Antwort
                          0
                          • etvE Offline
                            etvE Offline
                            etv
                            schrieb am zuletzt editiert von
                            #13

                            Liebe Leute,

                            ja das mit den Lüftungsempfehlungen ist so eine Sache ;-)

                            Ich hab bei mir auch schon mindestens 3 oder 4 mal meine Logik geändert und bin nun zwar im Winter "glücklich" gewesen, weiß aber jetzt schon, dass es im Sommer wieder nicht mehr passen wird ;-)

                            Ich hab dazu noch ein Büro im Keller (zwar halb aus der elErde, aber eben trotzdem gerne kühl dort unten) wo ich dann noch extra überprüfe, ob ich nicht "mit der Außenluft heizen" kann….+ Feuchte & Co....

                            Auf jeden Fall Kopf hoch, diese Spielwiese wird euch sicher noch eine Weile beschäftigen....

                            Aja, ich hab's übrigens auch mit dem Valuelist HTML Widget und setze eine Variable je nach Scriptentscheidung.

                            Grüße

                            etv

                            …ist schon sehr lange begeisterter ioBroker Nutzer! 1x zu Hause und 1x auf der Alm. ioBroker ist das 'Hirn' des Smarthome und steuert HomeMatic und Shellys, loggt was so passiert, zeigt es auf Tabletts schön an und ermöglicht mir via Cloud Adapter den Fernzugriff...

                            1 Antwort Letzte Antwort
                            0
                            • andreA Offline
                              andreA Offline
                              andre
                              Developer
                              schrieb am zuletzt editiert von
                              #14

                              So, also der Tag hat gezeigt, dass auch die neue Funktion funktioniert. :) Und zwar genauso, wie die erste Version, inklusive dem Fehler, dass der Zustand "Heute bereits gelüftet" beim Schließen nicht korrekt gesetzt wird. Erst beim erneuten, manuellen Starten des Scripts wird die Variable entsprechend korrekt gesetzt.

                              Das lässt für mich irgendwie darauf schließen, dass das Script irgendwie nicht hinterher kommt, oder zu schnell abläuft. Deshalb habe ich jetzt den on()-Trigger mal mit einer Verzögerung von 5 Sekunden versehen. Vielleicht geht das ja…

                              on(idBOlueften, function(dp) {
                                  setTimeout(function(){
                                      stateBOlueften = dp.newState.val;
                                      setStatus();
                                  }, 5000);
                              });                    //usw...
                              

                              MfG,

                              André

                              Bitte keine Support-Fragen per PN! Nutzt die öffentliche Kanäle damit auch andere von den Antworten profitieren können!

                              1 Antwort Letzte Antwort
                              0
                              • andreA Offline
                                andreA Offline
                                andre
                                Developer
                                schrieb am zuletzt editiert von
                                #15

                                Jetzt noch zur Vervollständigung:

                                Nach weiteren Tagen mit "try & error" habe ich das Script jetzt endlich zum Laufen bekommen. :)

                                Die Lösung war letztendlich ein einfaches, erneutes initialisieren der Variable stateDaily zu Beginn der Funktion welche den Status zum Lüften setzt.

                                Warum die Variable über den "herkömmlichen" Weg nicht sauber initialisiert wurde (wie die anderen states eben auch), konnte ich bisher nicht klären. Daher ist die Lösung eher eine Umgehungslösung. Aber egal, es funktioniert.

                                Hier noch einmal mein letztendliches Script:

                                ! ````
                                // Script: Tägliches Lüften im Obergeschoss + Statusanzeige in Vis
                                ! // Datenpunkte für den täglichen "Zähler" und den aktuellen Status anlegen
                                createState('vis.lueften.og_daily', false, {name: 'Wurde heute im OG schon gelüftet?'});
                                createState('vis.lueften.og_status', 0, {name: 'Status zum Lüften im OG zur Anzeige in Vis'});
                                ! // Datenpunkt-IDs
                                var idBOlueften = "hm-rpc.0.LEQXXXXXXX.1.STATE"; // Fenster Drehgriffsensoren
                                var idSZlueften = "hm-rpc.0.JEQXXXXXXX.1.STATE";
                                var idK1lueften = "hm-rpc.0.KEQXXXXXXX.1.STATE";
                                var idK2lueften = "hm-rpc.0.JEQXXXXXXX.1.STATE";
                                var idStatus = "vis.lueften.og_status";
                                var idDaily = "vis.lueften.og_daily";
                                var idOutTemp = "hm-rpc.0.KEQXXXXXXX.2.TEMPERATURE"; // Temperatursensor Außentemperatur
                                var idSZTemp = "hm-rpc.0.JEQXXXXXXX.1.TEMPERATURE"; // Temperatursensor Schlafzimmer
                                ! // Variablendeklaration und Initialisierung bei Scriptstart
                                var stateBOlueften = getState(idBOlueften).val;
                                var stateSZlueften = getState(idSZlueften).val;
                                var stateK1lueften = getState(idK1lueften).val;
                                var stateK2lueften = getState(idK2lueften).val;
                                var stateStatus = getState(idStatus).val;
                                var stateDaily = getState(idDaily).val;
                                var stateOutTemp = getState(idOutTemp).val;
                                var stateSZTemp = getState(idSZTemp).val;
                                ! // Funktion zum Rücksetzen des täglichen "Zählers" (ob schon gelüftet) um 1:00 Uhr
                                schedule("0 1 * * *", function () {
                                setState(idDaily, false);
                                });
                                ! // Funktion zum Setzen des Status bei Lüften OG
                                function setStatus() {
                                var stateDaily = getState(idDaily).val;
                                if (stateDaily === true) {
                                if (stateBOlueften !== 0 && stateSZlueften !== 0 && stateK1lueften !== 0 && stateK2lueften !== 0) {
                                setState(idStatus, 1); // Es wird gerade gelüftet!
                                } else if (stateBOlueften === 0 && stateSZlueften === 0 && stateK1lueften === 0 && stateK2lueften === 0) {
                                setState(idStatus, 3); // Heute bereits gelüftet!
                                } else if (stateBOlueften !== 0 || stateSZlueften !== 0 || stateK1lueften !== 0 || stateK2lueften !== 0) {
                                setState(idStatus, 4); // Fenster gerade offen, kein echtes Lüften!
                                }
                                } else if (stateDaily === false) {
                                if (stateBOlueften !== 0 && stateSZlueften !== 0 && stateK1lueften !== 0 && stateK2lueften !== 0) {
                                setState(idStatus, 1); // Es wird gerade gelüftet!
                                setState(idDaily, true);
                                } else if (stateBOlueften !== 0 || stateSZlueften !== 0 || stateK1lueften !== 0 || stateK2lueften !== 0) {
                                setState(idStatus, 4); // Fenster gerade offen, kein echtes Lüften!
                                } else if (stateOutTemp > stateSZTemp) {
                                setState(idStatus, 2); // Lüften nicht sinnvoll!
                                } else {
                                setState(idStatus, 0); // Heute noch nicht gelüftet!
                                }
                                }
                                }
                                ! // Aufruf der Funktionen bei Scriptstart
                                setStatus();
                                ! // Aufruf der Funktionen bei Änderung der Stati
                                on(idBOlueften, function(dp) {
                                setTimeout(function(){
                                stateBOlueften = dp.newState.val;
                                setStatus();
                                }, 1000);
                                });
                                on(idSZlueften, function(dp) {
                                setTimeout(function(){
                                stateSZlueften = dp.newState.val;
                                setStatus();
                                }, 1000);
                                });
                                on(idK1lueften, function(dp) {
                                setTimeout(function(){
                                stateK1lueften = dp.newState.val;
                                setStatus();
                                }, 1000);
                                });
                                on(idK2lueften, function(dp) {
                                setTimeout(function(){
                                stateK2lueften = dp.newState.val;
                                setStatus();
                                }, 1000);
                                });
                                on(idOutTemp, function(dp) {
                                setTimeout(function(){
                                stateOutTemp = dp.newState.val;
                                setStatus();
                                }, 1000);
                                });
                                on(idDaily, function(dp) {
                                setTimeout(function(){
                                stateDaily = dp.newState.val;
                                setStatus();
                                }, 1000);
                                });

                                Das Script schreibt, nach Auswertung der verschiedenen Bedingungen den Wert für den Status zum Lüften in einen Datenpunkt. In der Form 0-4\. Mit einem ValueList Widget mache ich dann eine entsprechende Anzeige in vis.
                                
                                Hier mein ValueList-HTML-Widget:
                                
                                >! ````
                                [{"tpl":"tplValueListHtml8","data":{"oid":"javascript.0.vis.lueften.og_status","visibility-cond":"==","visibility-val":1,"count":"4","gestures-offsetX":0,"gestures-offsetY":0,"test_list":"","value0":"Heute noch nicht gelüftet!","value1":"Es wird gerade gelüftet!","value2":"Lüften aktuell nicht sinnvoll!","style0":"background-color:rgb(162, 0, 37);","value3":"Heute bereits gelüftet!","style1":"background-color:blue;","style2":"background-color:darkorange;","value4":"Fenster offen, kein Lüften!"},"style":{"left":"1133px","top":"340px","box-shadow":"inset 0px 0px 1px #FFFFCC","z-index":"1","width":"215px","height":"15px","background":"#222222","font-family":"Verdana, Geneva, sans-serif","color":"#FFFFFF","font-size":"x-small","font-weight":"normal","text-align":"center","padding":"","padding-top":"3px"},"widgetSet":"basic"}]
                                

                                Im View sieht das dann so aus (nur jeweils der untere Teil mit dem Text):
                                914_lueftenstatus.jpg
                                MfG,

                                André

                                Bitte keine Support-Fragen per PN! Nutzt die öffentliche Kanäle damit auch andere von den Antworten profitieren können!

                                1 Antwort Letzte Antwort
                                0
                                • S Offline
                                  S Offline
                                  simpixo
                                  schrieb am zuletzt editiert von
                                  #16

                                  Super Script, kann ich gut gebrauchen, aber eine Frage hätte ich da noch

                                  Du benutzt in deinem Script 4 Drehgriffsensoren. Ich würde gern mehr nutzen können, wäre das Problemlos möglich? Oder muss im Script was angepasst werden?

                                  Danke dir schon in voraus

                                  1 Antwort Letzte Antwort
                                  0
                                  • andreA Offline
                                    andreA Offline
                                    andre
                                    Developer
                                    schrieb am zuletzt editiert von
                                    #17

                                    @simpixo:

                                    Du benutzt in deinem Script 4 Drehgriffsensoren. Ich würde gern mehr nutzen können, wäre das Problemlos möglich? Oder muss im Script was angepasst werden? `
                                    Ja, das geht sicher. Allerdings nicht "von Haus aus".

                                    Du musst einfach entsprechend weitere Datenpunkt-IDs anlegen und diese deklarieren und initialisieren:

                                    // Datenpunkt-IDs
                                    var idNEUlueften = "hm-rpc.0.LEQXXXXXXX.1.STATE";    // Weiterer Sensor
                                    
                                    // Variablendeklaration und Initialisierung bei Scriptstart
                                    var stateNEUlueften = getState(idNEUlueften).val;
                                    
                                    

                                    Anschließend musst du natürlich die Bedingungen der Funktion nach deinen Wünschen anpassen bzw. erweitern. Beispiel:

                                    // Funktion zum Setzen des Status bei Lüften OG
                                    function setStatus() {
                                        var stateDaily = getState(idDaily).val;
                                         if (stateDaily === true) {	// Wenn og_daily = true
                                          if (stateBOlueften !== 0 && stateSZlueften !== 0 && stateK1lueften !== 0 && stateK2lueften !== 0 && stateNEUlueften !== 0) {	// Wenn alle Fenster offen
                                             setState(idStatus, 1);      // Es wird gerade gelüftet!
                                          } else if (stateBOlueften === 0 && stateSZlueften === 0 && stateK1lueften === 0 && stateK2lueften === 0 &&  stateNEUlueften === 0) {		// Wenn alle Fenster geschlossen
                                             setState(idStatus, 3);      // Heute bereits gelüftet!
                                          } else if (stateBOlueften !== 0 || stateSZlueften !== 0 || stateK1lueften !== 0 || stateK2lueften !== 0 || stateNEUlueften !== 0) {		// Wenn mindestens ein Fenster offen
                                             setState(idStatus, 4);      // Fenster gerade offen, kein echtes Lüften!
                                          }
                                       } else if (stateDaily === false) {	// Wenn og_daily = false
                                          if (stateBOlueften !== 0 && stateSZlueften !== 0 && stateK1lueften !== 0 && stateK2lueften !== 0 && stateNEUlueften !== 0) {	// Wenn alle Fenster offen
                                             setState(idStatus, 1);      // Es wird gerade gelüftet!
                                             setState(idDaily, true);
                                          } else if (stateBOlueften !== 0 || stateSZlueften !== 0 || stateK1lueften !== 0 || stateK2lueften !== 0 || stateNEUlueften !== 0) {		// Wenn mind. ein Fester offen
                                             setState(idStatus, 4);      // Fenster gerade offen, kein echtes Lüften!
                                          } else if (stateOutTemp > stateSZTemp) {	// Wenn Außentemperatur größer Innentemperatur
                                             setState(idStatus, 2);      // Lüften nicht sinnvoll!
                                          } else {	// Für alle anderen Fälle
                                             setState(idStatus, 0);      // Heute noch nicht gelüftet!
                                          }
                                       }
                                    }
                                    

                                    Und zum Schluss dann am Besten noch auf den zusätzlichen Sensor triggern und die Funktion ausführen lassen:

                                    // Aufruf der Funktionen bei Änderung der Stati
                                    on(idNEUlueften, function(dp) {
                                        setTimeout(function(){
                                            stateNEUlueften = dp.newState.val;
                                            setStatus();
                                        }, 1000);
                                    });
                                    

                                    MfG,

                                    André

                                    Bitte keine Support-Fragen per PN! Nutzt die öffentliche Kanäle damit auch andere von den Antworten profitieren können!

                                    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

                                    822

                                    Online

                                    32.6k

                                    Benutzer

                                    82.2k

                                    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