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

      Hallo, liebe Forengemeinde,

      ich habe mir auf eine Raspberry 3 den iobroker installiert. Nun wollte ich ein Projekt aus github (https://github.com/bruhautomation/ESP-M … ultisensor ) realisieren, das mir verschiedene Sensordaten an den iobroker liefert. Dazu habe ich im iobroker den MQTT Server Adapter installiert. Das klappt auch. Sobald der Sensor angeschlossen ist, wird ein Objekt angelegt. Nur werden mir die Sensordaten nicht als einzelne Datenpunkte angezeigt, sondern in einem String, der dann so aussieht:

      {"state":"OFF","color"{"r":255,"g":255,"b":255},"brightness":255,"humidity":"53.70","motion":"standby","ldr":"0","temperature":"74.48","heatIndex":"74.15"}

      Die Werte in dem String aktualisieren sich auch, also scheint die Übergabe zu funktionieren.

      Jetzt meine Frage: Gibt es eine (einfache) Möglichkeit, dass die Werte als einzelne Datenpunkte angezeigt werden?
      5573_screenshot.jpg

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

        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);
        
        
        1 Reply Last reply Reply Quote 0
        • 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