Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Mqtt: String in Datenpunkte umwandeln?

    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

    Mqtt: String in Datenpunkte umwandeln?

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

      @paul53:

      Das müsse etwa so funktionieren per Javascript:

      var obj = JSON.parse(getState('mqtt.0.bruh.sensornode1').val);
      setState(idState, obj.state, true);
      setState(idRot, obj.color.r, true);
      setState(idGruen, obj.color.g, true);
      setState(idBlau, obj.color.b, true);
      setState(idHell, obj.brightness, true);
      setState(idFeuchte, obj.humidity, true);
      setState(idBeweg, ovj.motion, true);
      setState(idTemp, obj.temperature, true);
      setState(idHeiz, obj.heatindex, true);
      
      ```` `  
      

      Besten Dank für den Lösungsansatz!

      Also einfach im Reiter „Skripte“ unter „common“ ein neues Script erstellen und diese Zeilen einfügen? Sorry, wenn ich so blöd frage, aber ich bin auf diesem Gebiet absoluter Neuling.

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

        @wolf:

        Also einfach im Reiter „Skripte“ unter „common“ ein neues Script erstellen und diese Zeilen einfügen? `
        Nein, das zeigt nur das Prinzip, wie man die einzelnen Werte aus dem JSON-String in Datenpunkte schreibt. Die Datenpunkte müssen erst erstellt werden, am Besten im Reiter "Objekte" unter javascript.0. Als Beispiel der Datenpunkt für Rot:

        Name: 'Bruh.Farbe.Rot'

        Typ: Zahl
        ` > role: value

        read: anhaken (true)

        write: anhaken (true)

        min: 0

        max: 255

        unit: (leer) `
        Dann im Skript die symbolischen ID-Bezeichnungen durch die tatasächliche ID ersetzen. Dabei hilft der Button "ID einfügen" (rechts oben).

        function setDps() {
          var obj = JSON.parse(getState('mqtt.0.bruh.sensornode1').val);
          if(obj.state == "OFF") setState('javascript.0.Bruh.Ein', false, true);  // DP-Typ: Logikwert
          else  setState('javascript.0.Bruh.Ein', true, true);
          setState('javascript.0.Bruh.Farbe.Rot', obj.color.r, true);  // DP-Typ: Zahl
          setState('javascript.0.Bruh.Farbe.Gruen', obj.color.g, true);  // DP-Typ: Zahl
          // usw.
          setState(idBlau, obj.color.b, true); // DP-Typ: Zahl
          setState(idHell, obj.brightness, true); // DP-Typ: Zahl
          setState(idFeuchte, parseFloat(obj.humidity), true);  // DP-Typ: Zahl
          setState(idBeweg, obj.motion, true);  // DP-Typ: Zeichenkette
          setState(idTemp, parseFloat(obj.temperature), true); // DP-Typ: Zahl
          setState(idHeiz, parseFloat(obj.heatindex), true);  // DP-Typ: Zahl
        }
        
        setDps();  // Skriptstart
        on('mqtt.0.bruh.sensornode1', setDps);  // Triggert bei jeder Inhaltsänderung des JSON-Strings
        
        
        1 Reply Last reply Reply Quote 0
        • W
          wolf last edited by

          Hallo Paul!

          Vielen, vielen Dank!!!!

          Mein stundenlanges Brüten ohne verwertbares Resultat hat dein Script nun beendet. Ich habe wie von dir gezeigt, neue Datenpunkte angelegt und das Script folgend angepasst:

          function setDps() {

          var obj = JSON.parse(getState('mqtt.0.bruh.sensornode1').val);

          if(obj.state == "OFF") setState('javascript.0.Bruh.Ein', false, true); // DP-Typ: Logikwert

          else setState('javascript.0.Bruh.Ein', true, true);

          setState('javascript.0.Bruh.Farbe.Rot', obj.color.r, true); // DP-Typ: Zahl

          setState('javascript.0.Bruh.Farbe.Gruen', obj.color.g, true); // DP-Typ: Zahl

          // usw.

          setState("javascript.0.Bruh.Farbe.Blau"/Bruh.Farbe.Blau/, obj.color.b, true); // DP-Typ: Zahl

          setState("javascript.0.Bruh.Sensor.Helligkeit"/Bruh.Sensor.Helligkeit/, obj.brightness, true); // DP-Typ: Zahl

          setState("javascript.0.Bruh.Sensor.Feuchte"/Bruh.Sensor.Feuchte/, parseFloat(obj.humidity), true); // DP-Typ: Zahl

          setState("javascript.0.Bruh.Sensor.Bewegung"/Bruh.Sensor.Bewegung/, obj.motion, true); // DP-Typ: Zeichenkette

          setState("javascript.0.Bruh.Sensor.Temperatur"/Bruh.Sensor.Temperatur/, parseFloat(obj.temperature), true); // DP-Typ: Zahl

          setState("javascript.0.Bruh.Sensor.Waermeindex"/Bruh.Sensor.Waermeindex/, parseFloat(obj.heatindex), true); // DP-Typ: Zahl

          }

          setDps(); // Skriptstart

          on('mqtt.0.bruh.sensornode1', setDps); // Triggert bei jeder Inhaltsänderung des JSON-Strings

          Ich bekomme zwar am Wärmeindex eine "0" geliefert, aber diesen Wert benötige ich eigentlich nicht.

          Die relevanten Werte von Bewegung, Feuchtigkeit und Temperatur werden geliefert. Da ich auf den Lichtsensor noch warte, kann da noch kein vernünftiger Wert drin stehen.

          Drei Fragen hätte ich noch:

          1. Ist es möglich, dass der Temperaturwert in Celsius angezeigt wird?

          2. Wie kann ich der LED einen anderen Wert übermitteln, so dass sie beispielweise rot leuchtet, wenn der Bewegungssensor auf "motion detected" schaltet?

          3. Mein log ist voll mit:

          javascript.0 2018-01-28 15:35:19.441 warn at Object.setDps (script.js.common.Sensoren_auslesen:3:26)

          javascript.0 2018-01-28 15:35:19.439 warn State "javascript.0.Bruh.Ein" not found

          javascript.0 2018-01-28 15:34:56.985 warn at Object.setDps (script.js.common.Sensoren_auslesen:3:26)

          javascript.0 2018-01-28 15:34:56.984 warn State "javascript.0.Bruh.Ein" not found

          Hat das damit zu tun, dass der Lichtsensor noch nicht angeschlossen ist?

          Jedenfalls nochmals vielen Dank für deine Hilfe!

          LG

          wolf
          5573_datenpunkte.jpg

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

            @wolf:

            1. Ist es möglich, dass der Temperaturwert in Celsius angezeigt wird? `
            Wie wird der wert jetzt angezeigt ? Wenn in Fahrenheit, muss man umrechnen.

            setState("javascript.0.Bruh.Sensor.Temperatur"/*Bruh.Sensor.Temperatur*/, (parseFloat(obj.temperature) - 32) / 1.8, true);
            
            

            @wolf:

            2. Wie kann ich der LED einen anderen Wert übermitteln, so dass sie beispielweise rot leuchtet, wenn der Bewegungssensor auf "motion detected" schaltet? `
            Welche LED ? Bisher werden nur Werte eingelesen.
            @wolf:

            javascript.0 2018-01-28 15:35:19.439 warn State "javascript.0.Bruh.Ein" not found `
            Der Datenpunkt "javascript.0.Bruh.Ein" vom Typ Logikwert, der anzeigt, ob das Gerät eingeschaltet ist, fehlt noch.

            1 Reply Last reply Reply Quote 0
            • W
              wolf last edited by

              Danke für das learning by doing Tutorial von dir… 🙂

              @paul53:

              @wolf:

              1. Ist es möglich, dass der Temperaturwert in Celsius angezeigt wird?

              Wie wird der wert jetzt angezeigt ? Wenn in Fahrenheit, muss man umrechnen.

              setState("javascript.0.Bruh.Sensor.Temperatur"/*Bruh.Sensor.Temperatur*/, (parseFloat(obj.temperature) - 32) / 1.8, true);
              
              ```` `  
              

              Ja, wurde in Fahrenheit angezeigt. Hab deinen Code eingefügt und er zeigt die Grade in Celsius an… Wieder Danke!

              @wolf:

              2. Wie kann ich der LED einen anderen Wert übermitteln, so dass sie beispielweise rot leuchtet, wenn der Bewegungssensor auf "motion detected" schaltet? `
              Welche LED ? Bisher werden nur Werte eingelesen.

              Tja, die LED, für die die RGB-Werte übernommen werden (hab ich zumindest angenommen). Ich weiß schon, dass du eine profundere Antwort erwartet hast, die ich dir aber mangels Wissen leider nicht liefern kann.

              @wolf:

              javascript.0 2018-01-28 15:35:19.439 warn State "javascript.0.Bruh.Ein" not found Der Datenpunkt "javascript.0.Bruh.Ein" vom Typ Logikwert, der anzeigt, ob das Gerät eingeschaltet ist, fehlt noch.

              Hab jetzt den Datenpunkt "javascript.0.Bruh.Ein" angelegt (ist mir jetzt erst im Script aufgefallen). Jetzt kommt kein "warn" mehr im Log. Er hat aber immer den Wert "false". Wozu ist der eigentlich?

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

                @wolf:

                Wozu ist der eigentlich? `
                Da er die erste Objekteigenschaft ("state":"OFF") abbildet, vermute ich Gerät Aus/Ein ?
                @wolf:

                Wie kann ich der LED einen anderen Wert übermitteln, so dass sie beispielweise rot leuchtet, `
                Du kannst mal versuchen, im Reiter "Objekte" direkt im Datenpunkt 'mqtt.0.bruh.sensornode1' den JSON-String zu verändern:

                Hinter "g":255 –> 0 und hinter "b":255 --> 0. Tut sich dann was ?

                1 Reply Last reply Reply Quote 0
                • W
                  wolf last edited by

                  @paul53:

                  @wolf:

                  Wozu ist der eigentlich? `
                  Da er die erste Objekteigenschaft ("state":"OFF") abbildet, vermute ich Gerät Aus/Ein ?
                  @wolf:

                  Wie kann ich der LED einen anderen Wert übermitteln, so dass sie beispielweise rot leuchtet, `
                  Du kannst mal versuchen, im Reiter "Objekte" direkt im Datenpunkt 'mqtt.0.bruh.sensornode1' den JSON-String zu verändern:

                  Hinter "g":255 –> 0 und hinter "b":255 --> 0. Tut sich dann was ? `

                  Nein, die LED leuchtet unverändert blau, egal was ich eintrage…

                  Ach ja, etwas ist mir aufgefallen... Die Temperatur wird mir mit vielen Kommastellen angezeigt: 24.89999999999999. Gibt's eine Möglichkeit, dass nur 2 Kommastellen gezeigt werden... Nur ganze Zahlenwerte wären auch ok...

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

                    @wolf:

                    Gibt's eine Möglichkeit, dass nur 2 Kommastellen gezeigt werden… Nur ganze Zahlenwerte wären auch ok... `
                    Ja, natürlich. Aber langsam wird der Ausdruck unübersichtlich.

                    setState("javascript.0.Bruh.Sensor.Temperatur", Math.round((parseFloat(obj.temperature) - 32) / 0.18) / 10, true);
                    

                    rundet auf eine Nachkommastelle.

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

                      @wolf:

                      Nein, die LED leuchtet unverändert blau, egal was ich eintrage… `
                      Das hatte ich vermutet: Wenn die Kommunikation über JSON erfolgt, dann meist nur in eine Richtung.

                      1 Reply Last reply Reply Quote 0
                      • W
                        wolf last edited by

                        @paul53:

                        @wolf:

                        Nein, die LED leuchtet unverändert blau, egal was ich eintrage… Das hatte ich vermutet: Wenn die Kommunikation über JSON erfolgt, dann meist nur in eine Richtung.

                        Nicht wirklich tragisch, wäre nur ein netter Mehrwert gewesen.

                        Wäre dieses Script eigentlich auch unter Blockly zu realisieren gewesen? Damit konnte ich schon ein paar vernünftige Ergebnisse erzielen, wenn es um die Abfrage von Schaltzuständen gegangen ist. Hat für einen Anfänger wie mich den Vorteil, dass man die ganze Befehlssyntax nicht kennen muss. Gibt es eigentlich ein Programm, das den Code des Scriptes in Blockly Struktur darstellt? Würde mir das Lernen erleichtern.

                        Jedenfalls nochmals Danke für deine Hilfe! Du hast mir wirklich sehr geholfen.

                        LG

                        Wolf

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        599
                        Online

                        31.7k
                        Users

                        79.8k
                        Topics

                        1.3m
                        Posts

                        2
                        12
                        4508
                        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