Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Finde fehler im Script nicht if/else Verschachtelung

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Finde fehler im Script nicht if/else Verschachtelung

    This topic has been deleted. Only users with topic management privileges can see it.
    • Z
      Zippolighter last edited by

      Ich habe einen Fehler im Script, den ich leider nicht finde.

      In dem nachfolgenden Script startet die Aktion4 also letzte if/else nicht. Immer Aktion3 obwohl Aktion4 richtig wäre.

      /* Programm Abwesend Kurz
         Ablösen des CCU2 Programms
         Mit Hilfe von Jey Cee, Pix und Paul53 
      */
      // Das Einschalten der Alarmierung der INSTAR2 Kamera erfolgt über CCU2 Programm "Anwesend kurz INSTAR2 Balkon Alarm Aus"
      // Abfrage der Abwesenheit Kurz:
      var idAbwesendKurzVariable = 'hm-rega.0.2330'; // System Variable CCU2 Abwesend Kurz
      var idLichthelligkeit = getState("hm-rega.0.19606").val; // zur besseren Übersicht Lichthelligkeit in eine lokale Variable geschrieben
      var idAstro = getState('hm-rega.0.7961').val; // zur besseren Übersicht Astro in eine lokale Variable geschrieben
      /*
      log('Abwesend Kurz = ' + getState('hm-rega.0.2330').val);
      log('Abwesend = ' + getState('hm-rega.0.950').val);
      log('Taster = ' + getState('hm-rpc.0.MEQ0670647.2.PRESS_SHORT').val);  
      */    
      // lange, ausführliche Schreibweise
      on({
          id: idAbwesendKurzVariable, // Datenpunkt der Überwachung
          change: 'ne' // auf Änderung
      }, function (obj2) {
      
          // den neuen Wert der Änderung checken
              if (obj2.state.val === false){ // wenn neuer Wert false
                  // aktuelle Abfrage der zweiten Variable - also nur prüfen
      
                  if (idAstro === false){ // wenn Astro ist Nacht
                      if (idLichthelligkeit === false){ // wenn Lichthelligkeit ist Dunkel
                          starteAktion2(); // Funktion1 (Abwesend Kurz zurück und Astro Nacht und Lichthelligkeit Dunkel aufrufen
                      }
      
                  }else{ // idAstro gleich true (Wenn Astro ist Tag)
                      if (idLichthelligkeit === true){
                          starteAktion3();
                      }
                      else{ //idLichthelligkeit === false (Wenn Lichthelligkeit dunkel)
                          starteAktion4();
                      }
                  }
              }    
          }
      );
      
      function starteAktion2() { //Nachts und Dunkel
      // Aktionen
      
              setState("hm-rpc.1.CUX4000002.2.PRESS_SHORT", true); // (Gruppe) Deko Licht An/Aus.PRESS_SHORT
              setState("hm-rpc.1.CUX4000002.1.PRESS_SHORT", true); // (Gruppe) Steckdosenleiste 1+2 An/Aus.PRESS_SHORT
              setState("hm-rega.0.56427", true); // Lichthelligkeit Anzeige An Trigger
              setState("hm-rpc.0.KEQ0926589.2.STATE", true); //Teichlicht.STATE
              setState("hm-rpc.0.KEQ0926570.2.STATE", true); //BlumenRGB-Stripe.STATE
              setState("hm-rpc.0.MEQ1711639.1.STATE", true); //Kugellampen.STATE
              setState("hm-rega.0.18930", true); // Bewegungsmelder aktiv ist falsch
              setState("hm-rpc.0.NEQ0018993.2.SUBMIT","0.7,1,108000,22"); // MP3 Funkgong        
              log('Nachts und Dunkel');
      // verzögerte Aktionen einfügen
              setStateDelayed("hm-rpc.1.CUX4000001.8.PRESS_SHORT", true, 3 * 1000); // Intel16000 WoL.PRESS_SHORT nach 3 Sekunden
      }
      
      function starteAktion3() { //Tags und Hell
      // Aktionen
      
              setState("hm-rpc.1.CUX4000002.1.PRESS_SHORT", true); // (Gruppe) Steckdosenleiste 1+2 An/Aus.PRESS_SHORT
              setState("hm-rega.0.18930", true); // Bewegungsmelder aktiv ist falsch
              setState("hm-rpc.0.NEQ0018993.2.SUBMIT","0.7,1,108000,21"); // MP3 Funkgong (Abwesend Kurz Zurück und Astro Tag und Lichthelligkeit Hell)
              log('Tag und Hell');
      // verzögerte Aktionen einfügen
              setStateDelayed("hm-rpc.1.CUX4000001.8.PRESS_SHORT", true, 3 * 1000); // Intel16000 WoL.PRESS_SHORT nach 3 Sekunden
      }
      
      function starteAktion4() { //Tags und Dunkel
      // Aktionen
      
              setState("hm-rpc.1.CUX4000002.2.PRESS_SHORT", true); // (Gruppe) Deko Licht An/Aus.PRESS_SHORT
              setState("hm-rpc.1.CUX4000002.1.PRESS_SHORT", true); // (Gruppe) Steckdosenleiste 1+2 An/Aus.PRESS_SHORT
              setState("hm-rega.0.56427", true); // Lichthelligkeit Anzeige An Trigger
              setState("hm-rega.0.18930", true); // Bewegungsmelder aktiv ist falsch
              setState("hm-rpc.0.NEQ0018993.2.SUBMIT","0.7,1,108000,23"); // MP3 Funkgong (Abwesend Kurz Zurück und Astro Tag und Lichthelligkeit Hell)
              log('Tag und Dunkel');
      // verzögerte Aktionen einfügen
              setStateDelayed("hm-rpc.1.CUX4000001.8.PRESS_SHORT", true, 3 * 1000); // Intel16000 WoL.PRESS_SHORT nach 3 Sekunden
      }
      
      

      Danke für Eure Hilfe

      Gruß Zippolighter

      1 Reply Last reply Reply Quote 0
      • P
        pix last edited by

        Hallo Zippolighter,

        in der Deklaration deiner Variable lässt du gleich den Wert des Objektes speichern. Das passiert nur beim Skriptstart. Das ist falsch:````
        var idLichthelligkeit = getState("hm-rega.0.19606").val; // zur besseren Übersicht Lichthelligkeit in eine lokale Variable geschrieben
        var idAstro = getState('hm-rega.0.7961').val; // zur besseren Übersicht Astro in eine lokale Variable geschrieben

        var idLichthelligkeit ="hm-rega.0.19606"; // Namen des Datenpunktes in Variable schreiben, damit später übersichtlicher abgefragt werden kann
        idAstro = 'hm-rega.0.7961';

        
        Dann in der Subscription (on) diese beiden Datenpunkten am Anfang einmal abfragen und den Wert in eine Variable schreiben. Das passiert dann immer, wenn sich der Wert von __idAbwesendKurzVariable__ ändert.
        
        Zur Zeit fragt dein Skript nach Wert, der zum Skriptstart gespeichert wurde. Es wird dann immer nur das ELSE ausgeführt.
        
        Ich schriebe mal alles zusammen (mit den hier im Forum üblichen Bezeichnungen):
        

        /* Programm Abwesend Kurz
        Ablösen des CCU2 Programms
        Mit Hilfe von Jey Cee, Pix und Paul53
        /
        // Das Einschalten der Alarmierung der INSTAR2 Kamera erfolgt über CCU2 Programm "Anwesend kurz INSTAR2 Balkon Alarm Aus"
        // Abfrage der Abwesenheit Kurz:
        var idAbwesendKurzVariable = 'hm-rega.0.2330'; // System Variable CCU2 Abwesend Kurz
        var idLichthelligkeit = "hm-rega.0.19606";
        var idAstro = 'hm-rega.0.7961';
        /

        log('Abwesend Kurz = ' + getState('hm-rega.0.2330').val);
        log('Abwesend = ' + getState('hm-rega.0.950').val);
        log('Taster = ' + getState('hm-rpc.0.MEQ0670647.2.PRESS_SHORT').val);
        */
        // lange, ausführliche Schreibweise
        on({
        id: idAbwesendKurzVariable, // Datenpunkt der Überwachung
        change: 'ne' // auf Änderung
        }, function (obj2) {
        var helligkeit = getState(idLichthelligkeit).val,
        astro = getState(idAstro).val;
        // den neuen Wert der Änderung checken
        if (obj2.state.val === false){ // wenn neuer Wert false
        // aktuelle Abfrage der zweiten Variable - also nur prüfen

                if (astro === false){ // wenn Astro ist Nacht
                    if (helligkeit === false){ // wenn Lichthelligkeit ist Dunkel
                        starteAktion2(); // Funktion1 (Abwesend Kurz zurück und Astro Nacht und Lichthelligkeit Dunkel aufrufen
                    }
        
                }else{ // astro gleich true (Wenn Astro ist Tag)
                    if (helligkeit === true){
                        starteAktion3();
                    }
                    else{ //helligkeit === false (Wenn Lichthelligkeit dunkel)
                        starteAktion4();
                    }
                }
            }    
        }
        

        );

        Darf ich fragen, ob das mit einem Skripteditor, wie ScriptGUI erstellt wurde?
        
        Die Aktionen durchzuzählen macht den Code ziemlich unleserlich. __starteAktion2__ sollte z.B. besser __starteNachtsDunkel__ heißen.
        
        Nochmal kurz zur Benennung der Variablen. Ich halte es so:
        
        Oben im Skript setz ich die Namen/Bezeichnungen der Datenpunkte (zB __hm-rpc.0.xxxx.STATE__) als Zeichekette in Variablen mit passenden Namen. Das Prefix __id__ sagt mir später, dass es sich um einen Datenpunkt handelt. Also zB __idWassermelder__. Wenn ich in eine Subscription diesen Datenpunkt verwende, kann ich einfach den Variablennamen in der Subscription verwenden:
        
        on(id: __idWassermelder__, function() …
        
        Wenn ich einen Wert dieses Objektes abfragen möchte, brauche ich zB den Befehl getState mit dem Appendix Typ Wert
        
        getState(__idWassermelder__).val für den Wert
        
        getState(__idWassermelder__).ts für den Timestamp …
        
        Funktionen lassen sich gut strukturiert benennen, wenn man das, was die Funktion tut auch in den Namen schreibt. Ein neues Wort mit einem Großbuchstaben zu beginnen, spart Unterstriche, Leerzeichen sind (glaube ich) nicht erlaubt.
        
        berechneTaupunkt()
        
        ermittleMaxWert()
        
        holeScreenshot()
        
        Viele Grüße
        
        Pix
        1 Reply Last reply Reply Quote 0
        • P
          pix last edited by

          Hier nochmal die Kurzschreibweise

          /* Programm Abwesend Kurz
             Ablösen des CCU2 Programms
             Mit Hilfe von Jey Cee, Pix und Paul53 
          */
          // Das Einschalten der Alarmierung der INSTAR2 Kamera erfolgt über CCU2 Programm "Anwesend kurz INSTAR2 Balkon Alarm Aus"
          // Abfrage der Abwesenheit Kurz:
          var idAbwesendKurzVariable = 'hm-rega.0.2330'; // System Variable CCU2 Abwesend Kurz
              idLichthelligkeit = "hm-rega.0.19606",
              idAstro = 'hm-rega.0.7961';
          
          // kurze Schreibweise
          on(idAbwesendKurzVariable, function (obj) {
              var helligkeit = getState(idLichthelligkeit).val,
                  astro = getState(idAstro).val;
              if (!obj.state.val) { // wenn neuer Wert false
                  if (!astro) { // wenn Astro ist Nacht
                      if (!helligkeit) starteAktion2();                 
                  } else { // wenn Astro ist Tag
                      if (helligkeit) starteAktion3();
                      else starteAktion4();
                  }
              }    
          });
          
          
          1 Reply Last reply Reply Quote 0
          • Z
            Zippolighter last edited by

            Danke schonmal für die super Erklärung.

            Ist alles von Hand geschrieben, ohne Scripteditor aber mit Hilfe von Forummitgliedern.

            Werde dies testen und berichten.

            Gruß Zippolighter

            1 Reply Last reply Reply Quote 0
            • G
              gst666 last edited by

              Kleine Anregungen:

              Das Ereignis soll letztendlich nur ausgeführt werden, wenn der Wert von idAbwesendKurzVariable false wird. Hier dürfte es effizienter sein, die Prüfung gleich bei on() vorzunehmen:

              on({id: idAbwesendKurzVariable', value: false},...)
              

              Da Programm würde sich dadurch noch mal verkürzen.

              /* Programm Abwesend Kurz
                 Ablösen des CCU2 Programms
                 Mit Hilfe von Jey Cee, Pix und Paul53 
              */
              // Das Einschalten der Alarmierung der INSTAR2 Kamera erfolgt über CCU2 Programm "Anwesend kurz INSTAR2 Balkon Alarm Aus"
              // Abfrage der Abwesenheit Kurz:
              var idAbwesendKurzVariable = 'hm-rega.0.2330'; // System Variable CCU2 Abwesend Kurz
                  idLichthelligkeit = "hm-rega.0.19606",
                  idAstro = 'hm-rega.0.7961';
              
              // kurze Schreibweise
              on({id: idAbwesendKurzVariable, value: false}, function (obj) {
                  var helligkeit = getState(idLichthelligkeit).val,
                      astro = getState(idAstro).val;
                  if (!astro) { // wenn Astro ist Nacht
                      if (!helligkeit) starteAktion2();                 
                  } else { // wenn Astro ist Tag
                      if (helligkeit) starteAktion3();
                      else starteAktion4();
                  }  
              });
              
              

              Warum verwendest Du Variablen von der Homematic? Wenn es geht solltest DU in Betracht ziehen, dass zu ändern. Die Variablen von Homematic werden nur von Zeit zu Zeit aktualisiert (gewollt). Daher kann es zu deutlichen Verzögerungen kommen. Ich habe bei mir nach und nach alle Abhängigkeiten der Homematic soweit möglich entfernt. Auch der Zustand Tag/Nacht wäre ein Punkt den man nach ioBroker verschieben könnte.

              1 Reply Last reply Reply Quote 0
              • First post
                Last post

              Support us

              ioBroker
              Community Adapters
              Donate

              549
              Online

              31.7k
              Users

              79.7k
              Topics

              1.3m
              Posts

              3
              5
              1596
              Loading More Posts
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes
              Reply
              • Reply as topic
              Log in to reply
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
              The ioBroker Community 2014-2023
              logo