Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] Bitte um Nachhilfe zur "on" Anweisung

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst] Bitte um Nachhilfe zur "on" Anweisung

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

      Ich brauche bitte Hilfe. Ich möchte mithilfe der "On" Anweisung einige Befehle ausführen lassen, in diesem Falle meinen Saugrobotet starten, wenn die entsprechende Homematic Variable auf "start" steht:

      //##############Aufruf über Start##########################
      var Variable = "hm-rega.0.51644"/*Xiaomi_Start*/
      on(Variable, function (data) {
      
      var idStart="mihome-vacuum.0.start"/*Start vacuum*/;
      var wert = "true";
      
      setState(idStart,wert);
      });
      

      So, wie ich das Skript momentan eingerichtet habe, löst das Skript bei jeder Änderung der Variablen "hm-rega.0.51644" aus. Das will ich aber nicht. Es soll nur ausgelöst werden, wenn einer der beiden Zustände ("start" od. "stop", Logic Variable) erreicht ist, also in meinem Fall "start", aber nicht bei "stop".

      Leider weiß ich nicht, wie die On Anweisung mit einer entsprechenden Anweisung versehen warden muß. Ich dachte an sowas wie

      Variable == "start"
      

      Aber das klappt nicht. Die Erklärung im Github hilft mir leider auch nicht weiter bzw. gibt es dort auch kein Beispiel.

      Wie ware es richtig? Kann mir wer helfen?

      1 Reply Last reply Reply Quote 0
      • Jey Cee
        Jey Cee Developer last edited by

        So vielleicht: on({ID: variable, val: true}, Funktion()

        Gesendet von meinem m8 mit Tapatalk

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

          Ich nehme mal an, dass die Zuordnung in der SV vom Typ Logikwert so ist: falsch = "stop", wahr = "start" ? Der Datenpunkt mit dem Namen "Start vacuum" ist vom Typ 'boolean' ? Dann muss man auf true prüfen und mit true einschalten:

          //##############Aufruf über Start##########################
          var idSV = getIdByName("Xiaomi_Start");
          var idStart = getIdByName("Start vacuum");
          
          on({id: idSV, val: true}, function () {
          setState(idStart, true);
          });
          

          Will man mit der gleichen SV ein- und ausschalten, funktioniert das so:

          //##############Aufruf über Start##########################
          var idSV = getIdByName("Xiaomi_Start");
          var idStart = getIdByName("Start vacuum");
          
          on(idSV, function (dp) {
          setState(idStart, dp.state.val);
          });
          

          oder falls "Stop vacuum" ein extra Datenpunkt ist, dann so:

          //##############Aufruf über Start##########################
          var idSV = getIdByName("Xiaomi_Start");
          var idStart = getIdByName("Start vacuum");
          var idStop = getIdByName("Stop vacuum");
          
          on(idSV, function (dp) {
          if (dp.state.val) setState(idStart, true);
          else setState(idStop, true);
          });
          
          1 Reply Last reply Reply Quote 0
          • P
            pix last edited by

            Hallo,

            deine Variante entspricht der Kurzform der Reaktion auf Änderung

            change: 'ne'
            ````Daher wird bei jeder Änderung ausgelöst. Du willst aber nur auslösen, wenn der Inhalt der überwachten Variable "Variable" mit "Start" gefüllt ist. Das erreichst du durch die Abfrage des Inhalts nach der Änderung und durch das Vergleichen des Inhalts mit der Zeichenkette "Start". Ah, ich sehe gerade, die Homematic Variable ist eine Logic/Boolean Variable (false/true).
            
            Dazu noch ein wenig Kosmetik. __idStart__ lieber ganz oben deklarieren und __Variable__ nenne ich mal __idVariable__, weil es ein Objekt ist. Dazu noch ein Semikolon… :lol:
            
            

            //##############Aufruf über Start##########################
            var idVariable = "hm-rega.0.51644"/Xiaomi_Start/;
            var idStart="mihome-vacuum.0.start"/Start vacuum/;

            on(idVariable, function (data) {
            var wert = "false";
            if (data.state.val === "start" || data.state.val /* === true */) {
            wert = "true";
            }
            // und Erweiterung um STOP
            if (data.state.val === "stop" || !data.state.val) {
            wert = "false";
            }
            setState(idStart,wert);
            });

            
            Probier mal!
            
            Gruß
            
            Pix
            
            EDIT: Paul war schneller, bei mir siehst du eher die Herleitung von deinem Code
            1 Reply Last reply Reply Quote 0
            • S
              skorpil last edited by

              Auf Euch ist Verlass, Männer! Vielen Dank. Jetzt geht es so, wie ich es will! Danke!

              1 Reply Last reply Reply Quote 0
              • S
                skorpil last edited by

                @pix,

                ich habe es jetzt mit der ersten von paul53 geposteten Variante am laufen. Dennoch interessiert mich Dein Ansatz. Und da ich ja um Nachhilfe gebeten habe, würde ich die jetzt aus akademischem Interesse in Anspruch nehmen. Dein Skript:

                //##############Aufruf über Start##########################
                var idVariable = "hm-rega.0.51644"/*Xiaomi_Start*/;
                var idStart="mihome-vacuum.0.start"/*Start vacuum*/;
                
                on(idVariable, function (data) {
                    var wert = "false";
                    if (data.state.val === "start" || data.state.val /* === true */) {
                        wert = "true";
                    }
                    // und Erweiterung um STOP
                     if (data.state.val === "stop" || !data.state.val) {
                        wert = "false";
                    }
                    setState(idStart,wert);
                });
                
                

                verstehe ich bis zur on Anweisung. Dann verläßt mich des Sänger's Höflichkeit

                Was bitte bedeutet:
                ` > if (data.state.val === "start" || data.state.val /* === true */) {

                wert = "true"; `

                • data wurde doch vorher nirgendwo definiert, nur idVariable und idStart?

                • was bedeutet "||" und warum "===", also dreimal =

                • und das verstehe ich auch nicht "data.state.val "

                Was die if Anweisung macht, das verstehe ich: sie prüft, ob da "start" oder "stop" steht. Und setzt entsprechend die Variable wert auf true od. false. Aber die Syntax kapiere ich überhaupt nicht.

                1 Reply Last reply Reply Quote 0
                • Y
                  ykuendig last edited by

                  Bis der Profi die Details klärt, einige Infos vorab (soweit ich Ahnung hab)

                  on(idVariable, function (data) {
                  ````reagiert auf Dein Objekt und startet die Funktion UND übergibt das Objekt in 'data'
                  

                  ||

                  ===

                  data.state.val

                  1 Reply Last reply Reply Quote 0
                  • AlCalzone
                    AlCalzone Developer last edited by

                    @skorpil:

                    • data wurde doch vorher nirgendwo definiert, nur idVariable und idStart? `
                      Doch, hier (als Funktionsargument):
                    on(idVariable, function (data) {
                    

                    @skorpil:

                    • was bedeutet "||" und warum "===", also dreimal = `
                      || steht in JavaScript für "ODER", d.h. der Teil in geschweiften Klammern hinter if (…) wird ausgeführt, wenn mind. eine der Bedingungen erfüllt ist.

                    === ist ein Vergleich auf Gleichheit. Oft sieht man auch "==", der Unterschied hierbei ist, dass "==" auch Werte unterschiedlicher Typen zulässt, "===" aber nicht. Vermeidet ein paar Probleme die auftreten könnten. So ist "1" == 1 wahr, aber nicht "1" === 1 (da sie unterschiedliche Variablentypen sind).

                    @skorpil:

                    • und das verstehe ich auch nicht "data.state.val " `
                      data.state ist der State in ioBroker, den du in der on-Anweisung überwachst, in deinem Fall also "hm-rega.0.51644". Der wird dir bei der Überwachung mitgegeben, um auf den aktuellen (und alten) Wert ragieren zu können.

                    data.state.val ist der Wert, der aktuell in diesem State steht.

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

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    510
                    Online

                    31.7k
                    Users

                    79.8k
                    Topics

                    1.3m
                    Posts

                    6
                    8
                    721
                    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