NEWS
Mehrere DS18B20 aus mqtt auflösen
-
@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
@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); }); -
@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); });Paul,
funktioniert so nicht.
Der Temp kann im mqtt an unterschiedlicher Stelle auftauchen. Siehe mein Beitrag vorher. -
Paul,
funktioniert so nicht.
Der Temp kann im mqtt an unterschiedlicher Stelle auftauchen. Siehe mein Beitrag vorher. -
@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); } -
@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); } }); -
@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); } });@paul53
Mein Script hat ihm nicht gefallen ;-) -
@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 -
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@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. -
@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. -
und noch einige pdf
Temperatursensor (DS18B20) - Arduino Datenlogger mit Stockwaage für Imker.pdf
DS18x20 Temperatursensor - Tasmota.pdf
DS18B20 Temperatur Shield.pdfMan beachte die Begrenzung auf 8 Sensoren.
-
@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@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.
-
@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.
@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
-
und noch einige pdf
Temperatursensor (DS18B20) - Arduino Datenlogger mit Stockwaage für Imker.pdf
DS18x20 Temperatursensor - Tasmota.pdf
DS18B20 Temperatur Shield.pdfMan beachte die Begrenzung auf 8 Sensoren.
-
@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?
@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 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.@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 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.@segway sagte in Mehrere DS18B20 aus mqtt auflösen:
Ist I2C eine Alternative
Hab ich nie probiert.
Ich habe zufällig genau 8 Sensoren da dran. -
Braucht es nicht für I2C einen SCL und SDA.
Und bei den DS18B20 hast du aber nur 1 Datenkabel. -
Braucht es nicht für I2C einen SCL und SDA.
Und bei den DS18B20 hast du aber nur 1 Datenkabel.@bahnuhr sagte in Mehrere DS18B20 aus mqtt auflösen:
Braucht es nicht für I2C einen SCL und SDA.
Und bei den DS18B20 hast du aber nur 1 Datenkabel.Ja genau, für I2C braucht man SCL und SDA. Da wird man wohl einen BME280 nehmen müssen, aber so viel teurer sind die ja nicht.
-
Hi Leutz
Ich nochmal. Die Temp-Sensoren funktionieren und die Werte kommen per json als mqtt in den iobroker. Dank dem Skript habe ich alle Temperaturen incl. Namen unter 0.user.
Jetz habe ich mir gedacht ich hänge noch 2 Relais mit an den ESP (Ziel sind bis zu 8 Relais) . Ich bekomme sie configuriert und kann sie auch im web-Interface ein- und ausschalten.
Im iobroker unter stat werden beide Relais als power1 und power2 aufgefürt. Unter cmd steht allerdings nur einmal power. Hiermit kann ich durch ändern der Werte aber nur power1 schalten.Wie kann ich das zweite bzw. weitere Relais übe den iobroker schalten?
LG aus dem Sauerland
Jörg
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden


