Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. IF Vergleichsoperator als Variable

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    IF Vergleichsoperator als Variable

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

      Moin Zusammen,

      ich möchte die funktionierende Prüfung

      if  (getState('0_userdata.0.Smartmeter.AVG3MinutenWirkleistung').val > 1000) { 
      

      mit Variablen bzw. aus einem Array aufbauen

      bis hierher bin ich schon gekommen

      if  (getState(myItems[i][2]).val > myItems[i][4]) {             
      

      leider schaffe ich es aber nicht auch den Vergleichsopetaror gegen eine Variable auszutauschen > oder später =< oder auch ==

      if  (getState(myItems[i][2]).val myItems[i][3] myItems[i][4]) {     
      

      In [i][3] ist '>' gesetzt

      EDIT:
      Alternativ würde ich gern auch eine Variable '>1000' nutzen

      bahnuhr OliverIO 2 Replies Last reply Reply Quote 0
      • bahnuhr
        bahnuhr Forum Testing Most Active @ostseeskipper last edited by

        @ostseeskipper sagte in IF Vergleichsoperator als Variable:

        if (getState(myItems[i][2]).val myItems[i][3] myItems[i][4]) {

        Das verstehe ich überhaupt nicht.
        Schreib mal genauer, was du willst.

        O 1 Reply Last reply Reply Quote 0
        • O
          ostseeskipper @bahnuhr last edited by ostseeskipper

          @bahnuhr
          ich möchte Vergleichsoperator in einer variable haben

          <

          ==
          <>
          =<
          =>

          um a < b in einer schleife in
          a > b
          a == b
          a <> b
          usw prüfen zu lassen

          EDIT
          in myItems[i][3] steht der Vergleichsoperator drin

          bahnuhr 1 Reply Last reply Reply Quote 0
          • OliverIO
            OliverIO @ostseeskipper last edited by

            @ostseeskipper sagte in IF Vergleichsoperator als Variable:

            if (getState(myItems[i][2]).val myItems[i][3] myItems[i][4]) {

            Das funktioniert nicht.
            Du kannst keine Programmkonstrukte (also operatoren)
            gegen Variablen ersetzen.

            Wenn dann kannst du einen string zusammen bauen und mit eval interpretieren lassen,
            was aber allgemein als böse/nicht tun angesehen wird.
            du könntest über eine switch konstruktion alle operatoren aufführen, danach abfragen
            und dann jeweils den richtigen operator direkt angeben.

            O 2 Replies Last reply Reply Quote 0
            • bahnuhr
              bahnuhr Forum Testing Most Active @ostseeskipper last edited by

              @ostseeskipper

              Tut mir leid, ich verstehs nicht.

              1000 hast du doch oben.

              1 Reply Last reply Reply Quote 0
              • O
                ostseeskipper @OliverIO last edited by

                @oliverio

                // Arrryzeile [0-Prio, 1-Aktiv, 2-Bedingung DP, 3-Vergleichsoperator, 4-Bedingung Wert, 5-Schalten DP, 6-mit welchen Wert, 7-Kommentar]
                myItems[0] = [1,true,'0_userdata.0.Smartmeter.AVG3MinutenWirkleistung','>',1000,'javascript.0.Anel.1.R3.Rel_Status',1, 'wenn PVÜ > 1000 dann Relais3 einschalten'];
                myItems[1] = [1,true,'0_userdata.0.Smartmeter.AVG3MinutenWirkleistung','<',400,'javascript.0.Anel.1.R3.Rel_Status',0, 'wenn PVÜ < 400 dann Relais3 ausschalten'];
                

                heisst ich muss erst prüfen welcher Vergleichsoperator in der Arrayzeile gewünscht wird und muss dann in ein vorgefertigtes If .... gehen? Für jede Möglichkeit eine extra If Schleife bauen. Das ja unschön.

                Wie geht das mit eval

                if  (getState('0_userdata.0.Smartmeter.AVG3MinutenWirkleistung').val > 1000)] {            
                

                Kann den damit so vorgebaut damit zum Vergleich übergeben?

                1 Reply Last reply Reply Quote 0
                • O
                  ostseeskipper @OliverIO last edited by

                  @oliverio said in IF Vergleichsoperator als Variable:

                  Wenn dann kannst du einen string zusammen bauen und mit eval interpretieren lassen,
                  > was aber allgemein als böse/nicht tun angesehen wird.
                  du könntest über eine switch konstruktion alle operatoren aufführen, danach abfragen
                  und dann jeweils den richtigen operator direkt angeben.

                  Hab es jetzt mit eval lauffähig und es macht was es soll.
                  Warum sollte man eval nicht nutzen?

                  let myDebugLevel = "info";
                  let myItems =[];
                  
                  // Arrryzeile [0-Prio, 1-Aktiv, 2-Bedingung DP, 3-Vergleichsoperator, 4-Bedingung Wert, 5-Schalten DP, 6-mit welchen Wert, 7-Kommentar]
                  myItems[0] = [1,true,'0_userdata.0.Smartmeter.AVG3MinutenWirkleistung','>',1000,'javascript.0.Anel.1.R3.Rel_Status',1, 'wenn PVÜ > 1000 dann Relais3 einschalten'];
                  myItems[1] = [1,true,'0_userdata.0.Smartmeter.AVG3MinutenWirkleistung','<',400,'javascript.0.Anel.1.R3.Rel_Status',0, 'wenn PVÜ < 400 dann Relais3 ausschalten'];
                  
                  function pvueL1(){
                  
                      for (let i = 0; i < myItems.length; i++){
                          let myVergleich = '';
                          myVergleich = getState(myItems[i][2]).val +' '+ myItems[i][3]+' ' + myItems[i][4];
                          log("IF String "+ myVergleich,myDebugLevel);
                  
                              if  (eval(myVergleich) == true) {
                                      log(("> Schwellwert wahr: Item "+ i +' '+ getState(myItems[i][2]).val)+' ' + myItems[i][3] +' '+ myItems[i][4],myDebugLevel);
                                       }
                                   else {
                                       log(("> ELSE Schwellwert falsch: Item "+ i+' ' + getState(myItems[i][2]).val)+' ' + myItems[i][3] +' '+ myItems[i][4],myDebugLevel);
                                       }   
                         };
                  };             
                  
                  OliverIO 1 Reply Last reply Reply Quote 0
                  • OliverIO
                    OliverIO @ostseeskipper last edited by

                    @ostseeskipper

                    https://stackoverflow.com/questions/86513/why-is-using-the-javascript-eval-function-a-bad-idea

                    Serien IFs immer mit demnhleichen Parameter ist dann besser mit switch
                    https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Statements/switch

                    1 Reply Last reply Reply Quote 0
                    • O
                      ostseeskipper last edited by

                      @oliverio
                      das Switch werd ich mir auf alle Fälle ansehen.

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

                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      791
                      Online

                      31.8k
                      Users

                      80.0k
                      Topics

                      1.3m
                      Posts

                      3
                      9
                      322
                      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