Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Frage zu JS Code (Neuling kenn sich noch nicht so aus)

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Frage zu JS Code (Neuling kenn sich noch nicht so aus)

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

      Also ich bin etwas ratlos.

      Der Code funktioniert so nicht.

      var ALanwesend = getState('radar.0.Andrea_Handy.here'.val);
      var CLanwesend = getState('radar.0.Christian_Tablet.here'.val);
      
      /** Anwesenheit überprüfen **/
      
      function anwesenheit_pruefen() {
        if (ALanwesend === false && CLanwesend === false) setState("hm-rega.0.950", false);
        else setState("hm-rega.0.950", true);
      }
      
      /** Prüfen bei Skriptstart **/
      anwesenheit_pruefen();
      
      /** Andrea Handy auf anwesenheit prüfen **/
      on({id: 'radar.0.Andrea_Handy.here', change: 'ne'}, function (obj) {
        var value = obj.state.val;
        var oldValue = obj.oldState.val;
        ALanwesend = value;
        anwesenheit_pruefen();
      });
      
      /** Christian Tablet auf anwesenheit prüfen **/
      on({id: 'radar.0.Christian_Tablet.here', change: 'ne'}, function (obj) {
        var value = obj.state.val;
        oldValue = obj.oldState.val;
        CLanwesend = value;
        anwesenheit_pruefen();
      });
      

      Bin jetzt bei der Analyse und diese beiden Zeilen versteh ich erhlich gesagt nicht

        var value = obj.state.val;
        var oldValue = obj.oldState.val;
      

      Gebe zu die beiden Zeilen hab ich aus dem Beispiel von paul53 übernommen, ohne zu wissen was das tut oder soll.

      Ich mein OK, die erste Zeile versteh ich noch, da wird der Variable 'valu' der Wert des Objektes übergeben.

      Aber bitteschön für was brauch ich die zweite Zeile.

      Ja und warum muss oder soll ich den Wert des Objekts der Variable 'valu' übergeben, kann ich den Wert nicht gleich an meine eigen Variable übergeben?

      1 Reply Last reply Reply Quote 0
      • Thisoft
        Thisoft last edited by

        Was genau heißt denn "funktioniert nicht"???

        Und - ja du kannst natürlich den Wert gleich direkt an deine Variable übergeben. Und den "oldState" brauchst du (im Moment) auch nicht - das hast du eben wie du richtig schreibst einfach nur kopiert 😉

        Und dann bin ich mir nicht sicher ob deine If-Abfrage syntaktisch richtig ist - habe aber die JS-Syntax noch nicht 100%ig intus. Ich würde das jedenfalls so schreiben:

        function anwesenheit_pruefen() {
          if (ALanwesend === false && CLanwesend === false) {
          	setState("hm-rega.0.950", false);}
          else {
          	setState("hm-rega.0.950", true);}
        }
        
        1 Reply Last reply Reply Quote 0
        • T
          tempestas last edited by

          es müsste imhogetState(id).val sein und nicht````
          getState(id.val)

          
          Die Wertzuordnung am Anfang wird vorgenommen, damit beim erstmaligen Start die Anwesenheit bestimmt wird und die hm-rega korrekt gesetzt wird.
          
          

          var ALanwesend = getState('radar.0.Andrea_Handy.here').val;
          var CLanwesend = getState('radar.0.Christian_Tablet.here').val;
          var debug = true; // zum debuggen)

          /** Anwesenheit überprüfen **/

          function anwesenheit_pruefen() {
          if (ALanwesend === false && CLanwesend === false) setState("hm-rega.0.950", false);
          else setState("hm-rega.0.950", true);

          if(debug) log("Anwesenheit Andrea: "+ ALanwesend + " .Anwesenheit Christian: "+ CLanwesend);
          }

          /** Prüfen bei Skriptstart **/
          anwesenheit_pruefen();

          /** Andrea Handy auf anwesenheit prüfen **/ // hier werden die Auslöser definiert. Entweder Änderung beim Status Anwesenheit Andrea oder Christian
          on({id: 'radar.0.Andrea_Handy.here', change: 'ne'}, function (obj) {
          var value= obj.state.val;
          // var oldValue = obj.oldState.val --> sehe nicht, wozu das notwendig wäre, kann imho raus
          ALanwesend = value;
          anwesenheit_pruefen();
          if(debug) log("Andreas Anwesenheitsstatus hat von " +obj.oldState.val + " auf " + value "+ gewechselt);
          });

          /** Christian Tablet auf anwesenheit prüfen **/
          on({id: 'radar.0.Christian_Tablet.here', change: 'ne'}, function (obj) {
          var value = obj.state.val;
          CLanwesend = value;
          anwesenheit_pruefen();
          if(debug) log("Christians Anwesenheitsstatus hat von " +obj.oldState.val + " auf " + value "+ gewechselt);
          });

          1 Reply Last reply Reply Quote 0
          • T
            tempestas last edited by

            @Thisoft:

            Was genau heißt denn "funktioniert nicht"???

            Und - ja du kannst natürlich den Wert gleich direkt an deine Variable übergeben. Und den "oldState" brauchst du (im Moment) auch nicht - das hast du eben wie du richtig schreibst einfach nur kopiert 😉

            Und dann bin ich mir nicht sicher ob deine If-Abfrage syntaktisch richtig ist - habe aber die JS-Syntax noch nicht 100%ig intus. Ich würde das jedenfalls so schreiben:

            function anwesenheit_pruefen() {
              if (ALanwesend === false && CLanwesend === false) {
              	setState("hm-rega.0.950", false);}
              else {
              	setState("hm-rega.0.950", true);}
            }
            ```` `  
            

            die geschweiften Klammern bei einer if Abfrage brauchst du nur, wenn du mehrere Folgen hast. Ist einfach nur kürzer ohne, wenn man eh nur eine Folge hat

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

              Danke #Thisoft

              Danke #tempestas

              Damit komm ich, vermutlich weiter.

              Eine Farge (von noch vielen anderen :? ) hätte ich da aber trotzdem noch.

              Warum wird das in JS so geschrieben …

                var value = obj.state.val;
                CLanwesend = value;
              

              und nocht so …

                CLanwesend = obj.state.val;
              

              hat das einen bestimmten Grund?

              Ich komm aus der VB / C++ Fraktion, da waren solche Sachen mehr als verpöhnt.

              Jede Zeile Code zu viel wurde da schwer abkassiert in die Kaffekasse.

              1 Reply Last reply Reply Quote 0
              • T
                tempestas last edited by

                sollte auch kürzer gehen wie von dir vorgeschlagen

                1 Reply Last reply Reply Quote 0
                • paul53
                  paul53 last edited by

                  @PapaChriLo:

                  Aber bitteschön für was brauch ich die zweite Zeile.

                  Ja und warum muss oder soll ich den Wert des Objekts der Variable 'valu' übergeben, kann ich den Wert nicht gleich an meine eigen Variable übergeben? `
                  Das habe ich so vom ersten Skript übernommen, dessen Vorlage offenbar mit Blockly erstellt wurde. Blockly erzeugt die beiden Variablen value und oldValue per default. Selbst würde ich auch nicht den Umweg über eine Zwischenvariable value machen.

                  Dein Skript mit Korrekturen und kürzer:

                  var ALanwesend = getState('radar.0.Andrea_Handy.here').val;
                  var CLanwesend = getState('radar.0.Christian_Tablet.here').val;
                  
                  /** Anwesenheit überprüfen **/
                  function anwesenheit_pruefen() {
                    if (ALanwesend || CLanwesend) setState("hm-rega.0.950", true);
                    else setState("hm-rega.0.950", false);
                  }
                  
                  /** Prüfen bei Skriptstart **/
                  anwesenheit_pruefen();
                  
                  /** Andrea Handy auf anwesenheit prüfen **/
                  on('radar.0.Andrea_Handy.here', function (obj) {  // Triggert bei Wertänderung
                    ALanwesend = obj.state.val;
                    anwesenheit_pruefen();
                  });
                  
                  /** Christian Tablet auf anwesenheit prüfen **/
                  on('radar.0.Christian_Tablet.here', function (obj) {
                    CLanwesend = obj.state.val;
                    anwesenheit_pruefen();
                  });
                  
                  1 Reply Last reply Reply Quote 0
                  • Thisoft
                    Thisoft last edited by

                    @tempestas:

                    die geschweiften Klammern bei einer if Abfrage brauchst du nur, wenn du mehrere Folgen hast. Ist einfach nur kürzer ohne, wenn man eh nur eine Folge hat `

                    Danke - gut zu wissen dass das auch so geht. Ich bin ja auch grundsätzlich faul 😉 und dieser ganzen geschweiften Klammerei stehe ich sowieso nicht gerade freundschaftlich gegenüber da ich auch aus der VB und .NET - Ecke komme und dort geht es (sehr gut) ohne diese zusätzliche Tipperei 😉

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

                      OK Danke nochmal an alle.

                      Ich fang mit JS grade erst mal an und da klaube ich mir halt alles so irgendwie zusammen was momentan für mich Sinn ergibt.

                      Danach mach ich mich dann ans analysieren und versuch das dann halt mit meinen eigenen Codes.

                      Mittlerweile komm ich ja auch auf einen grünen Zweig 😉 wenn der auch noch sehr sehr kurz ist :roll:

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

                        Hallo,

                        hab das mal schnell im Online-Editor geschrieben. Das sollte auch gehen und nutzt RegExp. Als Beispiel und Denkanstoß

                        • debug kann man weglassen (natürlich dann auch die Logzeile)

                        • Einzeilige Kommentare mit // beginnen, mehrzeilige Kommentare in /* und */ einschließen

                        • Hinweis: in der if-Abfrage ist das Ausrufezeichen genutzt. Das ist die Kurzschreibweise für die Abfrage auf false.

                        Grundsätzlich gilt ja: wenn mindestens ein Gerät auf true, dann anwesend. Wenn alle Geräte auf false, dann abwesend.

                        /* Andrea und Christian Handy auf Anwesenheit prüfen 
                           Regexp auf radar.0.Christian_Tablet.here und radar.0.Andrea_Handy.here */
                        
                        var debug = true;
                        
                        // Bei Änderung
                        on(/^radar\.[0-9]\.*here$/, function (obj) {  // Triggert bei Wertänderung
                          if (debug) log('Anwesenheitserkennung: '  + obj.common.name + ' auf ' + obj.state.val + ' gesetzt ' >;
                          if (obj.state.val) setState("hm-rega.0.950", true); // wenn ein Trigger true, dann anwesend
                          else {
                              if (!getState('radar.0.Andrea_Handy.here').val && !getState('radar.0.Christian_Tablet.here').val) setState("hm-rega.0.950", false); // wenn jetzt beide false dann abwesend
                          }
                        });
                        
                        // bei Skriptstart
                        if (getState('radar.0.Andrea_Handy.here').val || getState('radar.0.Christian_Tablet.here').val) setState("hm-rega.0.950", true);
                        else setState("hm-rega.0.950", false);
                        
                        

                        Ach, mit der Vorschau Funktion im Forum-Editor kann man den Text nochmal prüfen und ggf. Schreibfehler finden 😄

                        Gruß

                        Pix

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        814
                        Online

                        31.7k
                        Users

                        79.8k
                        Topics

                        1.3m
                        Posts

                        6
                        21
                        1525
                        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