Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Temperatur aus JSON auslesen

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Temperatur aus JSON auslesen

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

      Hallo,

      ich bin ganz neu in dem Thema Mqtt-ioBroker.

      Ich habe mir den ioBroker mit dem Modul MQTT-Adapter (auf Server Konfiguriert) auf einem Raspi3 installiert.

      Als Aktor habe ich ein Sonoff-Basic mit der Tasmota Firmware.

      Das läuft auch soweit, nur leider bekomme ich die Daten aus dem Sonoff-Modul fast alle im JSON-Format.

      Welches wie für die Temperatur-Sensoren in der Variable "SENSOR" zu finden ist und wie folgt aussieht:

      {"Time":"2017-05-19T11:33:10", "DS18x20":{"DS1":{"Type":"DS18B20", "Address":"28FFB2AD621603FE", "Temperature":19.8}, "DS2":{"Type":"DS18B20", "Address":"28FF598A621603A2", "Temperature":13.5}}, "TempUnit":"C"}
      

      Jetzt wäre meine Frage, wie ich die beiden Temperaturen in einzelne Variablen bekomme?

      Soweit ich das bis jetzt verstanden habe muss ich irgendwo einen Code hinschreiben, der das irgendwie auseinander fummelt und dann z.B. in die Var Temp1 und Temp2 schreibt…

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

        @Feuer001:

        …muss ich irgendwo einen Code hinschreiben, der das irgendwie auseinander fummelt und dann z.B. in die Var Temp1 und Temp2 schreibt... `
        Ja, im Javascript-Adapter läßt sich der JSON-String "auseinander fummeln".

        Unter der Annahme, dass sich der JSON-String in einem Datenpunkt des MQTT-Adapters befindet, könnte das Skript so aussehen (oder so ähnlich):

        var idJSON = 'mqtt.0.SENSOR';  // Datenpunkt-ID mit JSON-String
        var Temp1;
        var Temp2;
        
        function JSONtoTemp(json) {
            var obj = JSON.parse(json);
            Temp1 = obj.DS18x20.DS1.Temperature;
            Temp2 = obj.DS18x20.DS2.Temperature;
            log('DS1: ' + Temp1 + ' °C, DS2: ' + Temp2 + ' °C');
        }
        
        JSONtoTemp(getState(idJSON).val);  // Script start
        
        on(idJSON, function(dp) {  // triggern bei Wertänderung
            JSONtoTemp(dp.state.val);
        });
        
        1 Reply Last reply Reply Quote 0
        • F
          Feuer001 last edited by

          Hey,

          im Log bekomme ich schon schön die beiden Temperaturen angezeigt,

          aber leider bekomme ich im MQTT-Server noch keinen Datenpunkt mit den Variablen Temp1 und Temp2.

          Muss ich da auch noch etwas machen??

          –-edit---

          danke, musste noch eine setState mit einbauen....

          kann ich mit dem script nur Temperaturen so zerlegen oder auch andere informationen wie z.B. batteriespannung und wlan signalstärke,

          da ja im script JSON to Temp....?

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

            @Feuer001:

            aber leider bekomme ich im MQTT-Server noch keinen Datenpunkt mit den Variablen Temp1 und Temp2.

            Muss ich da auch noch etwas machen?? `
            Ja, die beiden Datenpunkte vom Typ Zahl müssen noch im Admin-Reiter "Objekte" nach Selektion von mqtt.0 http://www.iobroker.net/?page_id=5495&lang=de#6hinzufuegen werden. Nachdem die Datenpunkte erzeugt sind, muss das Skript erweitert werden:

            var idJSON = 'mqtt.0.SENSOR';  // Datenpunkt-ID mit JSON-String
            var idTemp1 = 'mqtt.0.Temperatur1';
            var idTemp2 = 'mqtt.0.Temperatur2';
            ...
            

            Innerhalb der Funktion das log() ersetzen durch:

                ...
                setState(idTemp1, Temp1);
                setState(idTemp2, Temp2);
            }
            
            1 Reply Last reply Reply Quote 0
            • paul53
              paul53 last edited by

              @Feuer001:

              kann ich mit dem script nur Temperaturen so zerlegen oder auch andere informationen wie z.B. batteriespannung und wlan signalstärke, `
              Ja, wenn der JSON-String die gewünschten Informationen enthält. Jeder JSON-String ist anders aufgebaut; man muss also die Objekt-Struktur darin erkennen, um zum gewünschten Wert zu kommen. Dafür gibt es http://jsonviewer.stack.hu/.

              1 Reply Last reply Reply Quote 0
              • F
                Feuer001 last edited by

                Hab da nochmal eine frage,

                es läuft soweit alles, nur ist mir aufgefallen

                wenn eine Temperatur z.B 24,0°C ist

                wird mir aber nur 24 angezeigt und nicht 24,0.

                Bei 24,1 wird mir auch 24,1 angezeigt.

                Gibt es da noch einen Trick wie man sich auch die ,0 anzeigen lassen kann?

                Im JSON wird auch 24,0 übertragen!?

                1 Reply Last reply Reply Quote 0
                • Dutchman
                  Dutchman Developer Most Active Administrators last edited by

                  @Feuer001:

                  Hab da nochmal eine frage,

                  es läuft soweit alles, nur ist mir aufgefallen

                  wenn eine Temperatur z.B 24,0°C ist

                  wird mir aber nur 24 angezeigt und nicht 24,0.

                  Bei 24,1 wird mir auch 24,1 angezeigt.

                  Gibt es da noch einen Trick wie man sich auch die ,0 anzeigen lassen kann?

                  Im JSON wird auch 24,0 übertragen!? `

                  wo moechtest du das drin visualisieren ?

                  Die objecten runden immer ab, in vis kannst du im widget angeben wieviel stellen immer hinterm comma gezeigt werden muessen.

                  So habe ich auch diese view hier gebaut:

                  979_screen_shot_2017-06-15_at_12.10.26.png
                  979_screen_shot_2017-06-15_at_12.10.53.png
                  979_screen_shot_2017-06-15_at_11.57.54.png

                  • Dutch
                  1 Reply Last reply Reply Quote 0
                  • F
                    Feuer001 last edited by

                    Hey,

                    in der Vis ist das ja Problemlos möglich,

                    aber ich habe noch ein ESP8266 mit LCD-Display,

                    das dann eben nur 24 °C anzeigt, dachte man könnte da noch etwas am Script ändern….

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

                      @Feuer001:

                      … ich habe noch ein ESP8266 mit LCD-Display, das dann eben nur 24 °C anzeigt, dachte man könnte da noch etwas am Script ändern.... `
                      An das LCD-Display als String mit Wert.toFixed(1) ausgeben.

                      1 Reply Last reply Reply Quote 0
                      • F
                        Feuer001 last edited by

                        Wäre ne möglichkeit, aber dann müsste ich das koplette ESP-Programm ändern,

                        denn es werden char an das LCD-geschickt.

                        Kann ich da nix im Javascript beim ioBroker ändern?

                        Wäre für mich einfacher.

                        Hab beim ESP-Display schon ehwigkeiten gebraucht, bis ich es hinbekommen habe

                        zwei Topics anzeigen zu lassen….

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

                          @Feuer001:

                          Kann ich da nix im Javascript beim ioBroker ändern? `
                          Wie gelangen die Zeichen von ioBroker an das ESP8266 ? Das Wandeln mit Wert.toFixed(1) ist Javascript-Code für ioBroker-JS-Adapter..

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

                            Wenn die beiden Datenpunkte idTemp1 und idTemp2 nur zur Anzeige dienen, ändere den Typ von 'number' in 'string' und ergänze das setState

                                ...
                                setState(idTemp1, Temp1.toFixed(1) + ' °C');
                                setState(idTemp2, Temp2.toFixed(1) + ' °C');
                            }
                            
                            1 Reply Last reply Reply Quote 0
                            • F
                              Feuer001 last edited by

                              Besten Dank!!

                              Hab beim ioBroker JS das ".toFixed(1)" nachgetragen und damit funktioniert es wunderbar!

                              Das ESP8266-Display-Modul holt sich die Topic via MQTT-Callback

                              und die Callback Daten werden als char ans I2C-Display gereicht.

                              1 Reply Last reply Reply Quote 0
                              • R
                                ryan88 last edited by

                                Ich denke, das könnte hilfreich sein: https://jsonformatter-online.com/

                                1 Reply Last reply Reply Quote 0
                                • V
                                  vtwo last edited by

                                  @Dutchman:

                                  @Feuer001:

                                  Hab da nochmal eine frage,

                                  Die objecten runden immer ab, in vis kannst du im widget angeben wieviel stellen immer hinterm comma gezeigt werden muessen.

                                  • Dutch

                                  Hi,

                                  ich muss das alte Thema nochmal aufgreifen. Welches Widget nutzt du dafür? Bei mir kann ich keine Kommastellen ausgeben bzw habe die Auswahl nicht. Ich nutze zum Anzeigen von Temperten Basic Strick dort gibt es aber das Feld erweitert mit den Komma stellen nicht? Gerade in Bezug auf Xiaomi dort werden mir 2 komme stellen ausgegeben aber es reicht eine

                                  Grüße

                                  Clemens

                                  1 Reply Last reply Reply Quote 0
                                  • F
                                    Feuer001 0 @Feuer001 last edited by

                                    @feuer001
                                    Leider muss ich nochmal fragen, ich habe die ganze Zeit dieses Script benutzt um Temperaturen aus einem JSON auszulesen, was auch sehr lange Zeit funktioniert hat. Nach einem defekt meiner Speicherkarte muss ich jetzt leider alles neu einrichten und auch alle meine Scripts neu erstellen. Jetzt habe ich dieses Forum wiedergefunden wo damals schonmal fragen musste. Und da ich jetzt auch auf den aktuellen iobroker aktualisiert habe, läuft leider dieses Script nicht mehr. Könnte vielleicht einer nochmal so nett sein und mir nochmals helfen??
                                    Gruß
                                    Feuer001

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

                                      @feuer001-0 sagte in Temperatur aus JSON auslesen:

                                      läuft leider dieses Script nicht mehr.

                                      Die drei Datenpunkte vom Typ "string" mit den folgenden IDs exisitieren?

                                      const idJSON = 'mqtt.0.SENSOR';  // Datenpunkt-ID mit JSON-String
                                      const idTemp1 = 'mqtt.0.Temperatur1';
                                      const idTemp2 = 'mqtt.0.Temperatur2';
                                      
                                      function JSONtoTemp(json) {
                                          let obj = JSON.parse(json);
                                          let Temp1 = obj.DS18x20.DS1.Temperature;
                                          let Temp2 = obj.DS18x20.DS2.Temperature;
                                          setState(idTemp1, Temp1.toFixed(1) + ' °C');
                                          setState(idTemp2, Temp2.toFixed(1) + ' °C');
                                      }
                                       
                                      JSONtoTemp(getState(idJSON).val);  // Script start
                                       
                                      on(idJSON, function(dp) {  // triggern bei Wertänderung
                                          JSONtoTemp(dp.state.val);
                                      });
                                      
                                      F 1 Reply Last reply Reply Quote 0
                                      • F
                                        Feuer001 0 @paul53 last edited by

                                        @paul53
                                        Vielen Herzlichen Dank
                                        Läuft wieder, hat sich mal wieder was geändert.
                                        Und sorry, für die späte Rückmeldung.

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

                                        Support us

                                        ioBroker
                                        Community Adapters
                                        Donate

                                        300
                                        Online

                                        31.7k
                                        Users

                                        79.8k
                                        Topics

                                        1.3m
                                        Posts

                                        6
                                        18
                                        5977
                                        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