Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Mehrere DS18B20 aus mqtt auflösen

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    Mehrere DS18B20 aus mqtt auflösen

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

      Hi Leutz
      Ich habe mehrere (bis jetzt 5) DS18B20 an einen ESP8266 (Tasmota) an einem GPIO-Port angeschlossen. Diesen per mqtt an den iobroker angebunden. Fuktioniert so weit auch. Ich bekomme die drei Ordner stat, cmnd und tele. Unter tele/Sensor sehe ich alle fünf ID's mit den dazugehörigen Temperaturen.
      So wie ich das verstanden habe, handelt es sich hierbei um ein Json. Bezeichnet sind sie mit DS18B20-1. Ich habe schon Forenbeiträge gelesen, wobei das -Zeichen in z.B. einen _Zeichen geändert werden muss (Sonderzeichen nicht erlaubt)
      Ich hätte die fünf Werte gerne in jeweils einen Datenpunkt geschrieben.
      Jetzt bräuchte ich einmal einen Tip, wie ich das anstelle. Blockly? JS?
      Gibt es irgendwo ein Beispiel-Skript?

      LG aus dem Sauerland
      Jörg

      paul53 Segway 2 Replies Last reply Reply Quote 0
      • paul53
        paul53 @c3b last edited by paul53

        @c3b sagte: handelt es sich hierbei um ein Json.

        Bitte JSON in Code tags posten.

        @c3b sagte in Mehrere DS18B20 aus mqtt auflösen:

        Gibt es irgendwo ein Beispiel-Skript?

        Ja, hier.

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

          @paul53 Hallo

          Sorry, du hast natürlich recht.

          {
            "Time": "2022-12-27T19:10:38",
            "DS18B20-1": {
              "Id": "3C2AF6491BC1",
              "Temperature": 19.6
            },
            "DS18B20-2": {
              "Id": "3C56F649A2C6",
              "Temperature": 20
            },
            "DS18B20-3": {
              "Id": "3C8AF6493673",
              "Temperature": 20.3
            },
            "DS18B20-4": {
              "Id": "3CADF649DB07",
              "Temperature": 19.9
            },
            "DS18B20-5": {
              "Id": "3CFBE3814518",
              "Temperature": 20.9
            },
            "TempUnit": "C"
          }
          

          Ich habe mir die Links angeschaut. Der Post von Bahnuhr ist schon hilfreich. Somit kann man die einzelnen Datenpunkte zerlegen. Wie aber schreibe ich diese Werte in verschiedene Datenpunkte?
          Ich möchte gerne unter User.0 einen Ordner mit den Datenpunkten anlegen. Da sollen sie hin. Idealerweise lege ich pro Sensor einen Ordner an.
          Ich denke ich muss die www von molili durcharbeiten.

          Ich hate nur gedacht, dass es ein komplettes Skript als Vorlage gibt.

          Vielen Dank.

          LG aus dem Sauerland

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

            @c3b
            Das ist nicht ganz so einfach.
            Problem ist, dass Tasmota die einzelnen DS18B20 nicht immer an die gleiche Stelle tut.
            Soll heißen, dein Sensor mit der ID3 C2AF6491BC1 ist manchmal an der Stelle 1; oder eben an einer anderen.

            Aus diesem Grund musst die die ID beim Script mit beurteilen und dann bei Eindeutigkeit den DP zuweisen.
            Anbei mein Script.
            Bei Fragen gerne melden.

            // Temperatur der Heizungsrohre
                var Id, Temp, z;
                on({id: "mqtt.2.Wemos_Heizung_Rohre.SENSOR", change: "ne"}, function(obj){
                    obj = JSON.parse(obj.state.val); 
                    for (z = 1; z <= 8; z++) {
                        Id = obj["DS18B20-"+z].Id;
                        Temp = obj["DS18B20-"+z].Temperature;
                        Temp_schreiben(Id,Temp);
                    }
                var sdatum = formatDate(obj.Time,"DD.MM.YYYY");
                var szeit = formatDate(obj.Time,"SS:mm");
                //log ("Temperatur Heizungsrohre aktualisiert am " + sdatum + " um " + szeit + " Uhr");
                setState("javascript.0.Geräte.Heizung.Rohre.Aenderung",(sdatum + " um " + szeit + " Uhr"));
                }); 
            
                function Temp_schreiben(Id,Temp) {
                    if (Id == "0117B37A48FF") setState("javascript.0.Geräte.Heizung.Rohre.Temp_Kaltwasser", Temp);
                    if (Id == "0117B38548FF") setState("javascript.0.Geräte.Heizung.Rohre.Temp_Vorlauf", Temp);
                    if (Id == "0117B38B14FF") setState("javascript.0.Geräte.Heizung.Rohre.Temp_Umwaelz", Temp);
                    if (Id == "0417A2D62CFF") setState("javascript.0.Geräte.Heizung.Rohre.Temp_Ruecklauf", Temp);
                    if (Id == "0517C0E88FFF") setState("javascript.0.Geräte.Heizung.Rohre.Temp_Waermetauscher", Temp);
                    if (Id == "0517C0EA1CFF") setState("javascript.0.Geräte.Heizung.Rohre.Temp_Warmwasser", Temp);
                    if (Id == "0517C0EAF2FF") setState("javascript.0.Geräte.Heizung.Rohre.Fussbodenheizung_Ruecklauf", Temp);
                    if (Id == "0517C0EB6FFF") setState("javascript.0.Geräte.Heizung.Rohre.Fussbodenheizung_Vorlauf", Temp);
                }
            
            C 1 Reply Last reply Reply Quote 0
            • paul53
              paul53 @c3b last edited by paul53

              @c3b sagte: unter User.0 einen Ordner mit den Datenpunkten anlegen. Da sollen sie hin. Idealerweise lege ich pro Sensor einen Ordner an.

              Beispiel:

              const idJson = 'mqtt.0.xyz'; 
              const path = '0_userdata.0.Sensoren.Sensor';
              
              on(idJson, function(dp) {
                  const obj = JSON.parse(dp.state.val);
                  setState(path + '1.Temperatur', obj['DS18B20-1'].Temperature, true);
                  setState(path + '2.Temperatur', obj['DS18B20-2'].Temperature, true);
                  setState(path + '3.Temperatur', obj['DS18B20-3'].Temperature, true);
                  setState(path + '4.Temperatur', obj['DS18B20-4'].Temperature, true);
                  setState(path + '5.Temperatur', obj['DS18B20-5'].Temperature, true);
              });
              
              bahnuhr 1 Reply Last reply Reply Quote 0
              • bahnuhr
                bahnuhr Forum Testing Most Active @paul53 last edited by

                @paul53

                Paul,
                funktioniert so nicht.
                Der Temp kann im mqtt an unterschiedlicher Stelle auftauchen. Siehe mein Beitrag vorher.

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

                  @bahnuhr sagte: Der Temp kann im mqtt an unterschiedlicher Stelle auftauchen.

                  Danke für die Info. Das war mir nicht bekannt.

                  1 Reply Last reply Reply Quote 1
                  • C
                    c3b @bahnuhr last edited by

                    @bahnuhr Hi

                    Lieben vielen Dank.
                    Ich were mich der Sache einmal annehmen.

                    Die Nacht ist gerettet. 👍 😱

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

                      @c3b
                      Vorschlag, wenn es sich um Raumtemperaturen handelt:

                      // IDs anpassen!
                      const idJson = 'mqtt.0.xyz';
                      const path = '0_userdata.0.Sensoren.';
                      const rooms = {
                          "3C2AF6491BC1": 'Wohnzimmer',
                          "3C56F649A2C6": 'Kueche',
                          "3C8AF6493673": 'Schlafzimmer',
                          "3CADF649DB07": 'Bad',
                          "3CFBE3814518": 'Buero'
                      };
                      
                      on(idJson, function(dp) {
                          const obj = JSON.parse(dp.state.val); 
                          for(let i = 1; i <= 5; i++) {
                              let id = obj["DS18B20-" + i].Id;
                              setState(path + rooms[id] + '.Temperatur', obj["DS18B20-" + i].Temperature, true);
                          }
                      });
                      
                      bahnuhr 1 Reply Last reply Reply Quote 0
                      • bahnuhr
                        bahnuhr Forum Testing Most Active @paul53 last edited by

                        @paul53
                        Mein Script hat ihm nicht gefallen 😉

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

                          @bahnuhr
                          Ich mag es gern übersichtlich: Erst Deklarationen - dann Programmausführung.

                          C 1 Reply Last reply Reply Quote 1
                          • C
                            c3b @paul53 last edited by

                            @paul53 Hi Leutz

                            Ich hab mal ein bischen rumgespielt. Klappt super. Hab gerade eine Abfrage alle 10 Sekunden drin. (nur zum probieren) Ist etwas unübersichtlich, da ich für jeden Wert einen Ordner anlegen muss und dort der DP "Temperatur" drin steht. Schöner wäre unter dem Ordner Fußbodenheizung/Obergeschoß alle Werte mit Namen zu sehen. Beispiel: Bad_Vorlauf 21,4.
                            Sollte das dann so aussehen?

                            setState(path '.rooms[id]', obj["DS18B20-" + i].Temperature, true)
                            

                            Dann hätte ich einen Ordner mit 5 Einträgen.

                            Hier mein komplettes Skript:

                            // Temperatursensorwerte der Fußbodenheizung 
                            // Übertragen werden sie per mqtt nach tele.SENSOR im JSON-Format
                            
                            const idJson = 'mqtt.0.Heizung.Sensor.Fußbodenheizung_Obergeschoß_B596D3.tele.SENSOR'; // Pfad für mqtt-Daten
                            
                            const path = '0_userdata.0.Fußbodenheizung.Obergeschoß.';                              // Pfad für Datenpunkte
                            
                            const rooms = {                                                                        // ID Zuordnung für Datenpunkte
                                "3C2AF6491BC1": 'Bad_Vorlauf',
                                "3C56F649A2C6": 'Bad_Ruecklauf',
                                "3C8AF6493673": 'Buero_Vorlauf',
                                "3CADF649DB07": 'Buero_Ruecklauf',
                                "3CFBE3814518": 'Schlafzimmer_Eltern_Vorlauf'
                               // "xxxxxxxxxx": 'Schlafzimmer_Eltern_Ruecklauf',
                               // "XXXXXXXXXX": 'Schlafzimmer_Leo_Vorlauf',
                               // "xxxxxxxxxx": 'Schlafzimmer_Leo_Ruecklauf'
                            };
                            
                            on(idJson, function(dp){                                                               
                                const obj = JSON.parse(dp.state.val); 
                                for(let i = 1; i <= 5; i++) {
                                    let id = obj["DS18B20-" + i].Id;
                                    setState(path + rooms[id] + '.Temperatur', obj["DS18B20-" + i].Temperature, true)
                                }
                            });
                            
                            

                            In Zukunft sollen es 8 Werte werden. Die fehlenden habe ich deshalb auskommentiert.

                            Schönen Abend und LG aus dem Sauerland
                            Jörg

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

                              @c3b sagte in Mehrere DS18B20 aus mqtt auflösen:

                              Hi Leutz
                              Ich habe mehrere (bis jetzt 5) DS18B20 an einen ESP8266 (Tasmota) an einem GPIO-Port angeschlossen. Diesen per mqtt an den iobroker angebunden. Fuktioniert so weit auch. Ich bekomme die drei Ordner stat, cmnd und tele. Unter tele/Sensor sehe ich alle fünf ID's mit den dazugehörigen Temperaturen.

                              Interessante Geschichte. Habe so etwas ähnliches vor und bräuchte für meinen Teich-Filterkeller mehrere Temperatursensoren, die ich dann auslesen.
                              Wie ist dein Hardwareaufbau, dass du an nur EINEM GPIO mehrere DS18B20 auslesen kannst ?
                              Das würde mich interessieren. Bei mir kommen wohl auch locker 10 Temps in Frage.

                              C 1 Reply Last reply Reply Quote 0
                              • C
                                c3b @Segway last edited by

                                @segway Hi.
                                Ganz einfach. Ein ESP8266 mit Tasmota und dann alle Datenleitungen an den GPIO. Pullup von 4k7 an Vdd und fertig.

                                DS18b20.JPG

                                LG aus dem Sauerland

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

                                  @segway
                                  66c14df5-fc18-4a61-b06d-c7e74a44dff8-image.png

                                  und noch einige pdf
                                  Temperatursensor (DS18B20) - Arduino Datenlogger mit Stockwaage für Imker.pdf
                                  DS18x20 Temperatursensor - Tasmota.pdf
                                  DS18B20 Temperatur Shield.pdf

                                  Man beachte die Begrenzung auf 8 Sensoren.

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

                                    @c3b sagte: Schöner wäre unter dem Ordner Fußbodenheizung/Obergeschoß alle Werte mit Namen zu sehen.

                                    Dann lass einfach '.Temperatur' weg.

                                            setState(path + rooms[id], obj["DS18B20-" + i].Temperature, true);
                                    

                                    und weise den Ordnern (z.B. "Bad_Vorlauf") jeweils ein Datenpunkt-Objekt zu. Die "Temperatur"-Datenpunkte löschen.

                                    Anmerkung: Die Vorlauftemperaturen sollten sich nicht unterscheiden.

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

                                      @paul53 Hi

                                      Danke für die Info. Jetzt läuft es so, wie ich möchte.

                                      // Temperatursensorwerte der Fußbodenheizung 
                                      // Übertragen werden sie per mqtt nach tele.SENSOR im JSON-Format
                                      
                                      const idJson = 'mqtt.0.Heizung.Sensor.Fußbodenheizung_Obergeschoß_B596D3.tele.SENSOR'; // Pfad für mqtt-Daten
                                      
                                      const path = '0_userdata.0.Fußbodenheizung.Obergeschoß.';                              // Pfad für Datenpunkte
                                      
                                      const rooms = {                                                                        // ID Zuordnung für Datenpunkte
                                          "3C2AF6491BC1": 'Bad_Vorlauf',
                                          "3C56F649A2C6": 'Bad_Ruecklauf',
                                          "3C8AF6493673": 'Buero_Vorlauf',
                                          "3CADF649DB07": 'Buero_Ruecklauf',
                                          "3CFBE3814518": 'Schlafzimmer_Eltern_Vorlauf'
                                         // "xxxxxxxxxx": 'Schlafzimmer_Eltern_Ruecklauf',
                                         // "XXXXXXXXXX": 'Schlafzimmer_Leo_Vorlauf',
                                         // "xxxxxxxxxx": 'Schlafzimmer_Leo_Ruecklauf'
                                      };
                                      
                                      on(idJson, function(dp){                                                               
                                          const obj = JSON.parse(dp.state.val); 
                                          for(let i = 1; i <= 5; i++) {
                                              let id = obj["DS18B20-" + i].Id;
                                              setState(path + rooms[id] , obj["DS18B20-" + i].Temperature, true)
                                          }
                                      });
                                      

                                      Datenpunkte sind alle in einem Ordner.
                                      Mit der Vorlauf- und Rücklauftemperatur wirst du sicher recht haben. Ich hatte gedacht bei einer Differenz von null gibt die Leitung keine Wärme mehr ab und somit sollte die Raumtemperatur gleich der Rücklauftemperatur sein. Da das System aber sehr sehr träge ist und die Sensoren eine Abweichung bis zu 0,8°C haben kann ich das wohl vergessen. Das NSPanel zeigt als Raumtemperatur auch eher eine Fahrkarte an. Bleibt wohl doch nur ein separater Raumfühler. Für die VIS ist es aber auf jeden Fall etwas. Bringt vielleicht nichts, sieht aber Geil aus. 😊

                                      Danke noch einmal und LG aus dem Sauerland

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

                                        @bahnuhr sagte in Mehrere DS18B20 aus mqtt auflösen:

                                        Man beachte die Begrenzung auf 8 Sensoren.

                                        Gäbe es auch eine I2C Lösung . Da gingen doch mehr als 8 Sensoren oder liege ich da falsch?

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

                                          @segway sagte in Mehrere DS18B20 aus mqtt auflösen:

                                          @bahnuhr sagte in Mehrere DS18B20 aus mqtt auflösen:

                                          Man beachte die Begrenzung auf 8 Sensoren.

                                          Gäbe es auch eine I2C Lösung . Da gingen doch mehr als 8 Sensoren oder liege ich da falsch?

                                          Hast du meine eingestellten pdf gelesen.
                                          Dort steht die eingeschränkte Lösung drin.

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

                                            @bahnuhr sagte in Mehrere DS18B20 aus mqtt auflösen:

                                            Hast du meine eingestellten pdf gelesen.
                                            Dort steht die eingeschränkte Lösung drin.

                                            Ja sicher, und es ist klar warum bei 1-wire das auf 8 Sensoren (respektive 11) begrenzt ist.
                                            Das war aber nicht meine Frage.
                                            Ist I2C eine Alternative und hat die 8er Begrenzung nicht ? Laut Beschreibungen gibt es diese Begrenzung dort nicht.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate
                                            FAQ Cloud / IOT
                                            HowTo: Node.js-Update
                                            HowTo: Backup/Restore
                                            Downloads
                                            BLOG

                                            793
                                            Online

                                            32.0k
                                            Users

                                            80.5k
                                            Topics

                                            1.3m
                                            Posts

                                            6
                                            29
                                            2052
                                            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