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 Then mehrfach [gelöst]

    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 Then mehrfach [gelöst]

    This topic has been deleted. Only users with topic management privileges can see it.
    • bahnuhr
      bahnuhr Forum Testing Most Active last edited by

      Was machst du wenn der Wind = 20 ist.
      Dann läuft das Script ins Leere.

      Also mal ein <= oder >= setzen.

      Weiterhin könntest du mit "else if" arbeiten, dann hast du nur jeweils eine Werteangabe.

      Also ungefähr so:

      if (windspeedakt < 1) { Beaufort = "Windstill"; } 
      else if (windspeedakt < 6) { Beaufort = "leiser Zug"; } 
      else if (windspeedakt < 12) { Beaufort = "leichte Brise"; } 
      ...
      else { Beaufort = "Orkan"};
      

      mfg

      ceng bahnuhr 2 Replies Last reply Reply Quote 0
      • ceng
        ceng @bahnuhr last edited by ceng

        @bahnuhr
        Nachdem ich Dein Scriptschnipsel gesehen habe, passte ich mein Script folgendermassen an und siehe da, die Ausrufezeichen sind weg. Ich darf nur einmal "var beaufort" schreiben...

        var aktuellerWind = getState("hm-rpc.2.0017D709AE3070.1.WIND_SPEED"/*HmIP-SWO-B 0017D709AE3070:1.WIND_SPEED*/).val;
        var loggen = false;  // = false, wenn kein Logging gewünscht
        var timestamp = Date();
        var timestampUnix = Math.round(+new Date()/1000);
        
        createState('status_Wind.Windstatus', 'INITIAL', {type: 'string'});           // Wetterstatus
        createState('status_Wind.Beaufort', 'INITIAL', {type: 'string'});           // Wetterstatus
        
        createState('status_Wind.timestampaktWind', 'INITIAL', {type: 'string'});       // Ausführungsdatum
        createState('status_Wind.timestampaktWindUnix', timestampUnix, {type: 'number'});// Ausführungsdatum Unix Format
        createState('status_Wind.windspeedakt', 0, {type: 'number'});                   // aktuelle Windgeschwindigkeit
        
        createState('status_Wind.timestamp1Wind', 'INITIAL', {type: 'string'});         // Ausführungsdatum
        createState('status_Wind.windspeed1', 0, {type: 'number'});                     // letzte Windgeschwindigkeit
        createState('status_Wind.timestamp2Wind', 'INITIAL', {type: 'string'});         // Ausführungsdatum
        createState('status_Wind.windspeed2', 0, {type: 'number'});                     // vorletzte Windgeschwindigkeit
        createState('status_Wind.timestamp3Wind', 'INITIAL', {type: 'string'});         // Ausführungsdatum
        createState('status_Wind.windspeed3', 0, {type: 'number'});                     // vorvorletzte Windgeschwindigkeit
        
        
        function windstate() {
            var windspeedakt        = getState("hm-rpc.2.0017D709AE3070.1.WIND_SPEED"/*HmIP-SWO-B 0017D709AE3070:1.WIND_SPEED*/).val;             // Windgeschwindigkeit
            var windspeed1          = getState("javascript.0.status_Wind.windspeedakt"/*status_Wind.windspeedakt*/).val;             // letzte Windgeschwindigkeit
            var windspeed2          = getState("javascript.0.status_Wind.windspeed1"/*status_Wind.windspeedakt*/).val;             // vorletzte Windgeschwindigkeit
            var windspeed3          = getState("javascript.0.status_Wind.windspeed2"/*status_Wind.windspeedakt*/).val;             // vorletzte Windgeschwindigkeit
            var winddurchschnitt    = ( windspeedakt + windspeed1 + windspeed2 + windspeed3 ) / 4;
            
            var timestampaktWind    = timestamp;
            var timestampaktWindUnix= getState("javascript.0.status_Wind.timestampaktWindUnix").val;
            var timestamp1Wind      = getState("javascript.0.status_Wind.timestampaktWind"/*status_Wind.windspeedakt*/).val;        // Zeit letzte Windgeschwindigkeit
            var timestamp2Wind      = getState("javascript.0.status_Wind.timestamp1Wind"/*status_Wind.windspeedakt*/).val;          // Zeit vorletzte Windgeschwindigkeit
            var timestamp3Wind      = getState("javascript.0.status_Wind.timestamp2Wind"/*status_Wind.windspeedakt*/).val;          // Zeit vorvorletzte Windgeschwindigkeit
            
            var timediff            = timestampUnix-timestampaktWindUnix;
            
            var Beaufort            = 'undefined';
            if (0 < windspeedakt && windspeedakt < 1) {Beaufort='Windstill';}
            if (1 < windspeedakt && windspeedakt < 6) {Beaufort='leiser Zug';}
            if (6 < windspeedakt && windspeedakt < 12) {Beaufort='leichte Briese';}
            if (12 < windspeedakt && windspeedakt < 20) {Beaufort='schwacher Wind';}
            if (20 < windspeedakt && windspeedakt < 29) {Beaufort='mäßiger Wind';}
            if (29 < windspeedakt && windspeedakt < 39) {Beaufort='frischer Wind';}
            if (39 < windspeedakt && windspeedakt < 50) {Beaufort='starker Wind';}
            if (50 < windspeedakt && windspeedakt < 62) {Beaufort='steifer Wind';}
            if (62 < windspeedakt && windspeedakt < 75) {Beaufort='stürmischer Wind';}
            if (75 < windspeedakt && windspeedakt < 89) {Beaufort='Sturm';}
            if (89 < windspeedakt && windspeedakt < 103) { Beaufort='schwerer Sturm';}
            if (103 < windspeedakt && windspeedakt < 118) {Beaufort='orkanartiger Sturm';}
            if (windspeedakt > 118) {Beaufort='Orkan';}
            setState("status_Wind.Beaufort", Beaufort);                                 // Schreibt Beaufort Bezeichnung
            
            setState("status_Wind.timestampaktWind", timestampaktWind);                 // Schreibt Datum des Ausführung
            setState("status_Wind.timestampaktWindUnix", timestampUnix);                // Schreibt Datum des Ausführung zur Berechung
            setState("status_Wind.timestamp1Wind", timestamp1Wind);                     // überträgt Datum des letzten Ausführung
            setState("status_Wind.timestamp2Wind", timestamp2Wind);                     // überträgt Datum des vorletzten Ausführung
            setState("status_Wind.timestamp3Wind", timestamp3Wind);                     // überträgt Datum des vorvorletzten Ausführung
            
            setState("status_Wind.windspeedakt", windspeedakt);                         
            setState("status_Wind.windspeed1", windspeed1);                          
            setState("status_Wind.windspeed2", windspeed2);                         
            setState("status_Wind.windspeed3", windspeed3); 
            
        
            
            if(loggen) log("Zeitdifferenz seit letztem Status: " + timediff);
            if(loggen) log("Aktueller Wind: " + windspeedakt);
            if(loggen) log("1 Wind: " + windspeed1);
            if(loggen) log("2 Wind: " + windspeed2);
            if(loggen) log("3 Wind: " + windspeed3);
            if(loggen) log("Durchschnitt: " + winddurchschnitt);
            
            //if (windspeedakt>20){"status_Wind.Wetterstatus", 'Windig'}
                    
        }
        
        windstate();
        
        on(
            {id: 'hm-rpc.2.0017D709AE3070.1.WIND_SPEED', change: "ne"}, function (obj) {
                windstate();
                console.log('Windspeed changed');
        });
        
        1 Reply Last reply Reply Quote 0
        • ceng
          ceng @paul53 last edited by ceng

          @paul53
          Ok, was bedeutet "nur einmal deklarieren". Mit dem Beispiel von Bahnuhr wurde mir Deine Aussage dann klar.

          paul53 1 Reply Last reply Reply Quote 0
          • bahnuhr
            bahnuhr Forum Testing Most Active @bahnuhr last edited by

            @bahnuhr sagte in If Then mehrfach [gelöst]:

            Was machst du wenn der Wind = 20 ist.
            Dann läuft das Script ins Leere.

            Das Problem hast du aber immer noch.

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

              @ceng Die Abfrage kann vereinfacht werden, da nur eine Variable gesetzt wird, die beliebig oft überschrieben werden kann.

                  var Beaufort = 'Windstill';
                  if (1 < windspeedakt)  Beaufort = 'leiser Zug';
                  if (6 < windspeedakt)  Beaufort = 'leichte Briese';
                  if (12 < windspeedakt) Beaufort = 'schwacher Wind';
                  if (20 < windspeedakt) Beaufort = 'mäßiger Wind';
                  if (29 < windspeedakt) Beaufort = 'frischer Wind';
                  if (39 < windspeedakt) Beaufort = 'starker Wind';
                  if (50 < windspeedakt) Beaufort = 'steifer Wind';
                  if (62 < windspeedakt) Beaufort = 'stürmischer Wind';
                  if (75 < windspeedakt) Beaufort = 'Sturm';
                  if (89 < windspeedakt) Beaufort = 'schwerer Sturm';
                  if (103 < windspeedakt) Beaufort = 'orkanartiger Sturm';
                  if (windspeedakt > 118) Beaufort = 'Orkan';
              
              1 Reply Last reply Reply Quote 0
              • bahnuhr
                bahnuhr Forum Testing Most Active last edited by

                Paul,
                die Werte passen aber nicht zu den Werten vom TE.

                Bei 5 wollte er z.B. "leiser Zug"; bei dir steht jetzt "leichte Briese"

                Aber egal, muss er halt anpassen so wie er es will.

                mfg

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

                  @bahnuhr sagte:

                  Bei 5 wollte er z.B. "leiser Zug"; bei dir steht jetzt "leichte Briese"

                  ??

                  1 Reply Last reply Reply Quote 0
                  • bahnuhr
                    bahnuhr Forum Testing Most Active last edited by

                    TE:

                    if (0 < windspeedakt && windspeedakt < 1) {var Beaufort='Windstill';}
                        if (1 < windspeedakt && windspeedakt < 6) {var Beaufort='leiser Zug';}
                        if (6 < windspeedakt && windspeedakt < 12) {var Beaufort='leichte Briese';}
                    

                    Paul:

                        if (1 < windspeedakt)  Beaufort = 'leiser Zug';
                        if (6 < windspeedakt)  Beaufort = 'leichte Briese';
                        if (12 < windspeedakt) Beaufort = 'schwacher Wind';
                    

                    Bei Wert 5 ergibt oben was anderes als unten.
                    Oder lese ich falsch.
                    Ist aber auch nicht schlimm, kann er ja ändern.

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

                      @bahnuhr sagte:

                      Bei Wert 5 ergibt oben was anderes als unten.

                      Wirklich ? Wert 5 ergibt in beiden Fällen "leiser Zug".

                      bahnuhr 1 Reply Last reply Reply Quote 0
                      • bahnuhr
                        bahnuhr Forum Testing Most Active @paul53 last edited by

                        @paul53 sagte in If Then mehrfach [gelöst]:

                        Wirklich ? Wert 5 ergibt in beiden Fällen "leiser Zug".

                        Ok, hast recht. Hab falsch gelesen.
                        Entschuldigung.

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

                          Wäre ein "switch - case" nicht die bessere Wahl?

                          So in der Art:

                          switch (windspeedakt) {
                              case < 6:
                                  Beaufort = 'leichte Briese;
                                  break;
                              case <12:
                                  Beaufort = 'schwacher Wind';  
                                  break;
                              ...
                          
                              default:
                                 Beaufort = "irgendwas".;
                               break;
                          
                          1 Reply Last reply Reply Quote 0
                          • bahnuhr
                            bahnuhr Forum Testing Most Active last edited by

                            case funktioniert auch.

                            Aber vielleicht könnte mal ein Experte sagen, ob es da eine bessere Methode gibt.

                            Für mich hätte "if", "else if" oder case den gleichen Effekt.
                            Gibts da eine Auswahl "was ist besser ?"

                            G 1 Reply Last reply Reply Quote 0
                            • G
                              George_Best @bahnuhr last edited by

                              @bahnuhr sagte in If Then mehrfach [gelöst]:

                              case funktioniert auch.

                              Aber vielleicht könnte mal ein Experte sagen, ob es da eine bessere Methode gibt.

                              Für mich hätte "if", "else if" oder case den gleichen Effekt.
                              Gibts da eine Auswahl "was ist besser ?"

                              "Switch - Case" ist in der Ausführung schneller, meinte ich mal gehört zu haben. Das liegt wohl daran, dass der Compiler beim Kompilieren den Code effizienter gestalten kann.

                              Alternative wäre noch eine LookUp-Table, aber das funktioniert meines Wissens nicht mit Vergleichsoperatoren <, > sondern nur mit ===.

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

                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              381
                              Online

                              31.8k
                              Users

                              80.0k
                              Topics

                              1.3m
                              Posts

                              javascript security
                              6
                              20
                              1162
                              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