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. Finde fehler im Script nicht if/else Verschachtelung

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    23
    1
    1.3k

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.5k

Finde fehler im Script nicht if/else Verschachtelung

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
5 Beiträge 3 Kommentatoren 1.6k Aufrufe
  • Ä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.
  • Z Offline
    Z Offline
    Zippolighter
    schrieb am zuletzt editiert von
    #1

    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 Antwort Letzte Antwort
    0
    • P Offline
      P Offline
      pix
      schrieb am zuletzt editiert von
      #2

      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

      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
      • P Offline
        P Offline
        pix
        schrieb am zuletzt editiert von
        #3

        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();
                }
            }    
        });
        
        

        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
        • Z Offline
          Z Offline
          Zippolighter
          schrieb am zuletzt editiert von
          #4

          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 Antwort Letzte Antwort
          0
          • G Offline
            G Offline
            gst666
            schrieb am zuletzt editiert von
            #5

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

            648

            Online

            32.5k

            Benutzer

            81.7k

            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