Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Windrichtung kommt mit 0-5V an soll in Windrichtung N/S/W/O

    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

    Windrichtung kommt mit 0-5V an soll in Windrichtung N/S/W/O

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

      Hallo zusammen,

      wie ihr gleich seht bin ich nicht der beste im scripten 😕
      Ich bekommen eine Windrichtung von 0-5V mit MQTT, dieser soll dann umgewandelt werden in Begrifflichkeiten.

      // Original-Datenpunkt
      const idOrigin = 'mqtt.0.WindJet.Windrichtung_Nord.Windrichtung';
       
      // Alias-Datenpunkt
      const idAlias = 'Windrichtung.Windrichtung';
      var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk;
      // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich
      // nameAlias = 'Batterie Deckenlicht';
      desc = 'per Script erstellt';
      // typeAlias = 'boolean'; // oder 'number'
      // read = "val < 20 ? true : false"; // Erkennung "Aus" --> false erfolgt automatisch  
      // write = "val ? 'Ein' : 'Aus'";
      // role = 'indicator';
      // min = 0; // nur Zahlen
      // max = 100; // nur Zahlen
      // unit = '%'; // nur für Zahlen
      let between = (x, min, max) => x >= min && x <= max; 
      const direction = value => {
          switch (true) {
              case between(value, 2.3408, 2.9658) || between(value, 12.0,12.0): 
                  console.log("NORD");
                  return "NORD";
              case between(value, 2.9659, 3.5908):
                  console.log("NORD-OST");
                  return "NORD-OST";
              case between(value, 3.5909, 3.9158):
                  console.log("OST");
                  return "OST";
              case between(value, 3.9159, 4.5408):
                  console.log("SÜD-OST");
                  return "SÜD-OST";
              case between(value, 4.5409, 5.0000):
                  console.log("SÜD");
                  return "SÜD";
              case between(value, 0.0000, 0.4658):
                  console.log("SÜD");
                  return "SÜD";
              case between(value, 0.4659, 1.0908):
                  console.log("SÜD-WEST");
                  return "SÜD-WEST";
              case between(value, 1.0909, 1.7158):
                  console.log("WEST");
                  return "WEST";
              case between(value, 1.7158, 2.3407):
                  console.log("NORD-WEST");
                  return "NORD-WEST";
      
          }
      }
      
      console.log(`Die Himmelsrichtung ist: ${(direction(12.0))}`); // direction liefert dann die Himmelsrichtung
      
      // custom = []; // verhindert doppelte Ausführung von history, ...
      // raum = 'EG_Flur'; // Groß-/Kleinschreibung in der ID beachten !
      // gewerk = 'Licht'; // Groß-/Kleinschreibung in der ID beachten !
       
      function createAlias(idSrc, idDst) {
         if(existsState(idDst)) log(idDst + ' schon vorhanden !', 'warn');
         else {
            var obj = {};
            obj.type = 'state';
            obj.common = getObject(idSrc).common;
            obj.common.alias = {};
            obj.common.alias.id = idSrc;
            if(typeAlias) obj.common.type = typeAlias;
            if(obj.common.read !== false && read) obj.common.alias.read = read;
            if(obj.common.write !== false && write) obj.common.alias.write = write;
            if(nameAlias) obj.common.name = nameAlias;
            if(role) obj.common.role = role;
            if(desc) obj.common.desc = desc;
            if(min !== undefined) obj.common.min = min;
            if(max !== undefined) obj.common.max = max;
            if(unit) obj.common.unit = unit;
            if(states) obj.common.states = states;
            if(custom && obj.common.custom) obj.common.custom = custom;
            obj.native = {};
            setObject(idDst, obj);
            if(raum && getObject('enum.rooms.' + raum)) {
               let obj = getObject('enum.rooms.' + raum)
               obj.common.members.push(idDst);
               setObject('enum.rooms.' + raum, obj);
            }
            if(gewerk && getObject('enum.functions.' + gewerk)) {
               let obj = getObject('enum.functions.' + gewerk)
               obj.common.members.push(idDst);
               setObject('enum.functions.' + gewerk, obj);
            }
         } 
      }
       
      createAlias(idOrigin, 'alias.0.' + idAlias);
      

      es will einfach nicht, kann einer Helfen?

      MfG

      A Codierknecht 2 Replies Last reply Reply Quote 0
      • A
        acidsubway @acidsubway last edited by

        @acidsubway

        2024_01_24_21_57_40_objects_iobroker_Mozilla_Firefox.jpg

        Codierknecht 1 Reply Last reply Reply Quote 0
        • Codierknecht
          Codierknecht Developer Most Active @acidsubway last edited by

          @acidsubway

          Du wendest das switch völlig falsch an.
          https://www.w3schools.com/js/js_switch.asp

          true ist eine Konstante - die ändert sich nicht und daher kann die auch nie zwischen x und y sein.

          Versuch's mal zunächst so:

          if (between(value, 2.3408, 2.9658) || between(value, 12.0,12.0)) {
                      console.log("NORD");
                      return "NORD";
          } else if (between(value, 2.9659, 3.5908)) {
                      console.log("NORD-OST");
                      return "NORD-OST";
          } else if (between(value, 3.5909, 3.9158)) {
                      console.log("OST");
                      return "OST";
          }
          
          1 Reply Last reply Reply Quote 0
          • Codierknecht
            Codierknecht Developer Most Active @acidsubway last edited by Codierknecht

            @acidsubway
            Ein Alias repräsentiert einen anderen DP.
            So wie Du das machen willst, wird das nix.
            Da schreibt man nicht per Script rein.

            Lege den von Dir gewünschten DP nicht als Alias, sondern unterhalb von 0_userdata an.

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

              @codierknecht sagte: DP nicht als Alias, sondern unterhalb von 0_userdata an.

              ... und prüfe die Spannungen in der passenden Reihenfolge.

              const idVolt = 'mqtt.0.WindJet.Windrichtung_Nord.Windrichtung';
              const idDir = '0_userdata.0.Wetter.Wind.Richtung';
              
              on(idVolt, function(dp) {
                  const v = dp.state.val;
                  let dir = 'SÜD';
                  if(v <= 0.4658) dir = 'SÜD';
                  else if(v <= 1.0908) dir = 'SÜD-WEST';
                  else if(v <= 1.7158) dir = 'WEST';
                  // usw. 
                  setState(idDir, dir, true); 
              });
              
              A 1 Reply Last reply Reply Quote 0
              • A
                acidsubway @paul53 last edited by

                @paul53
                Danke

                Auch allen anderen ein dank erst mal.

                hab das nun so umgeändert

                const idVolt = 'mqtt.0.WindJet.Windrichtung_Nord.Windrichtung';
                const idDir = '0_userdata.0.Wetter.Windrichtung';
                 
                on(idVolt, function(dp) {
                    const v = dp.state.val;
                    let dir = 'SÜD';
                    if(v <= 0.4658) dir = 'SÜD';
                    else if(v <= 1.0908) dir = 'SÜD-WEST';
                    else if(v <= 1.7158) dir = 'WEST';
                    else if(v <= 2.3407) dir = 'NORD-WEST';
                    else if(v <= 2.9658) dir = 'NORD';
                    else if(v <= 3.5908) dir = 'NORD-OST';
                    else if(v <= 3.9158) dir = 'OST';
                    else if(v <= 4.5408) dir = 'SÜD-OST';
                    else if(v <= 5.0000) dir = 'SÜD';
                    setState(idDir, dir, true); 
                });
                

                kommt aber ein komische fehler:

                251	2024-01-26 12:25:07.005	warn	Object of state "0_userdata.0.Wetter.Windrichtung" is missing the required property "common.type"
                

                ich mach sier was falsch 😕

                Codierknecht paul53 2 Replies Last reply Reply Quote 0
                • Codierknecht
                  Codierknecht Developer Most Active @acidsubway last edited by

                  @acidsubway
                  Zeig mal, wie Dein DP 0_userdata.0.Wetter.Windrichtung definiert ist.

                  A 1 Reply Last reply Reply Quote 0
                  • A
                    acidsubway @Codierknecht last edited by

                    @codierknecht

                    2024-01-26 12_52_10-objects - iobroker – Mozilla Firefox.jpg 2024-01-26 12_52_16-objects - iobroker – Mozilla Firefox.jpg

                    Codierknecht 1 Reply Last reply Reply Quote 0
                    • Codierknecht
                      Codierknecht Developer Most Active @acidsubway last edited by

                      @acidsubway
                      Das ist ein "folder" - da kann man nix reinschreiben.
                      Lege Dir darunter einen DP vom Typ "Zeichenfolge" an. Den kannst Du dann beschreiben.

                      A 1 Reply Last reply Reply Quote 0
                      • A
                        acidsubway @Codierknecht last edited by

                        Hat geklappt, Danke Dir, euch allen ein DANKE!!!

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

                          @acidsubway sagte: hab das nun so umgeändert

                          Das letzte else if (Zeile 15) kann wegfallen, da dir mit "SÜD" vordefiniert ist.

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

                            Wieso überhaupt ein script und nicht einen echten Alias mit einer read formel?

                            val <= 0.4658 ? 'SÜD' :
                                  val <= 1.0908 ? 'SÜD-WEST' :
                                  val <= 1.7158 ? 'WEST' :
                                  val <= 2.3407 ? 'NORD-WEST' :
                                  val <= 2.9658 ? 'NORD' :
                                  val <= 3.5908 ? 'NORD-OST' :
                                  val <= 3.9158 ? 'OST' :
                                  val <= 4.5408 ? 'SÜD-OST' :
                                  val <= 5.0000 ? 'SÜD' : 'SÜD';
                            
                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            805
                            Online

                            31.8k
                            Users

                            80.0k
                            Topics

                            1.3m
                            Posts

                            javascript
                            4
                            12
                            327
                            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