FHEM Forum

FHEM - Hausautomations-Systeme => MQTT => Thema gestartet von: Thomas0401 am 21 Februar 2021, 19:25:19

Titel: ESP8266 mit DS18B20 mehrere Temp. auslesen, über MQTT in FHEM
Beitrag von: Thomas0401 am 21 Februar 2021, 19:25:19
Moin moin,
ich möchte gerne mit einem ESP8266 einige Temperaturen meiner Hzg.-Anlage (Pufferspeicher, Zirkulation, Warmwasser, Kaminofen) auslesen und mit MQTT subscriben. Der ESP verbindet sich auch tadellos mit dem MQTT-Server und kann das Topic subscriben aber ich bekomme keine Werte in MQTT-FX außer einer "0" angezeigt. Seit Tagen versuche ich verschiedene Varianten, leider kommt nichts dabei rum, im Gegenteil meist wird es noch schlimmer. Ich hoffe mir kann jemand helfen.


#include <Arduino.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ESP8266WiFi.h>
#include <WifiClient.h>
#include <PubSubClient.h>

#define ONEWIRE_PIN D4

OneWire ds(ONEWIRE_PIN);
DallasTemperature sensors(&ds);

WiFiClient net;
PubSubClient client(net);

const char* mqtt_server = "192.168.178....";
const char* ssid = "ssid";
const char* password = "Password";

DeviceAddress sensor1 = { 0x28, 0x13, 0x01, 0x07, 0xD6, 0x01, 0x3C, 0x46 };
DeviceAddress sensor2 = { 0x28, 0x7B, 0xCC, 0x07, 0xD6, 0x01, 0x3C, 0xEA };
DeviceAddress sensor3 = { 0x28, 0x04, 0x33, 0x07, 0xD6, 0x01, 0x3C, 0x9F };
DeviceAddress sensor4 = { 0x28, 0xE7, 0x65, 0x07, 0xD6, 0x01, 0x3C, 0xE6 };

void setup() {
  Serial.begin(115200);
  discoverOneWireDevices();

  sensors.begin();

  WiFi.mode(WIFI_AP_STA);
  WiFi.begin(ssid, password);

  connect();
  client.setServer(mqtt_server, 1883);

}

void connect() {

  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    WiFi.begin(ssid, password);
  }

  Serial.println(WiFi.localIP());
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    String clientId = "D1MiniClient-";
    clientId += String(random(0xffff), HEX);

    if (client.connect(clientId.c_str(), "MQTTUser", "MQTTPassword")) {
      Serial.println("connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");

      delay(5000);
    }
  }
}

void discoverOneWireDevices() {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];

  while (ds.search(addr)) {
    Serial.println("");
    Serial.print("Found 1-Wire device with address: ");
    for (i = 0; i < 8; i++) {
      Serial.print("0x");
      if (addr[i] < 16) {
        Serial.print('0');
      }
      Serial.print(addr[i], HEX);
      if (i < 7) {
        Serial.print(", ");
      }
    }
    if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.print("CRC is not valid!");
      return;
    }
  }

  Serial.println("");
  Serial.println("Ready.");
  ds.reset_search();
}

void loop() {

  if (!client.connected()) {
    reconnect();
   
  }

  sensors.requestTemperaturesByAddress(sensor1);
  float temp1 = sensors.getTempC(sensor1);
  Serial.print("TPO: ");
  Serial.println(temp1);

  sensors.requestTemperaturesByAddress(sensor2);
  float temp2 = sensors.getTempC(sensor2);
  Serial.print("TPM: ");
  Serial.println(temp2);

  sensors.requestTemperaturesByAddress(sensor3);
  float temp3 = sensors.getTempC(sensor3);
  Serial.print("TPU: ");
  Serial.println(temp3);

  sensors.requestTemperaturesByAddress(sensor4);
  float temp4 = sensors.getTempC(sensor4);
  Serial.print("TZW: ");
  Serial.println(temp4);

  char buffer[10];
  sprintf(buffer, "%lu", temp1, temp2, temp3, temp4);
  client.publish("/SmartHome/KG/Heizung/Temp", buffer);

  delay(5000);

}


Mit diesem Code klappt die Verbindung zu MQTT

VG Thomas
Titel: Antw:ESP8266 mit DS18B20 mehrere Temp. auslesen, über MQTT in FHEM
Beitrag von: Papa Romeo am 21 Februar 2021, 19:52:43
Hallo Thomas,

ich glaube irgendwo mal gelesen zu haben, dass "sprintf" mit "float" nicht funktioniert.

LG
Papa Romeo
Titel: Antw:ESP8266 mit DS18B20 mehrere Temp. auslesen, über MQTT in FHEM
Beitrag von: Papa Romeo am 21 Februar 2021, 20:05:32
...hab´s gefunden, schau mal hier:

http://yaab-arduino.blogspot.com/2015/12/how-to-sprintf-float-with-arduino.html

LG
Papa Romeo
Titel: Antw:ESP8266 mit DS18B20 mehrere Temp. auslesen, über MQTT in FHEM
Beitrag von: Thomas0401 am 21 Februar 2021, 20:08:12
Hallo Papa Romeo,

mit diesem "Aufbau" des Code´s lese ich auch RFID für Anwesenheit aus und das funktioniert super. Deshalb bin ich etwas ratlos bzw. es fehlt noch was von dem Code RFID in dem Code TempHzg aber keinen PLan wie das ungebaut wird  ;D

VG Thomas
Titel: Antw:ESP8266 mit DS18B20 mehrere Temp. auslesen, über MQTT in FHEM
Beitrag von: micky0867 am 21 Februar 2021, 20:10:40
Eine Frage, ohne das Problem verstanden zu haben....warum nimmst du nicht einfach ESPEasy für sowas?

https://www.letscontrolit.com/wiki/index.php/ESPEasy
Titel: Antw:ESP8266 mit DS18B20 mehrere Temp. auslesen, über MQTT in FHEM
Beitrag von: Thomas0401 am 21 Februar 2021, 20:18:39
Das ist eine sehr gute Frage, noch nicht mit beschäftigt.
Titel: Antw:ESP8266 mit DS18B20 mehrere Temp. auslesen, über MQTT in FHEM
Beitrag von: Papa Romeo am 21 Februar 2021, 20:19:30
Zitat von: Thomas0401 am 21 Februar 2021, 20:08:12
...lese ich auch RFID für Anwesenheit aus

....mit "float" Werten ?

..egal... "d´r Deifi is a Oichkatzerl" :P ;) ;D ... versuchs doch mal probehalber mit" int". Fehlen halt die Nachkommastellen. Aber zum testen ...

LG
Papa Romeo
Titel: Antw:ESP8266 mit DS18B20 mehrere Temp. auslesen, über MQTT in FHEM
Beitrag von: Papa Romeo am 21 Februar 2021, 20:24:04
Zitat von: micky0867 am 21 Februar 2021, 20:10:40
Eine Frage, ohne das Problem verstanden zu haben....warum nimmst du nicht einfach ESPEasy für sowas?

zu was ESPEasy wegen n´paar Temperaturwerten.

Bei einem eigenen Sketch, weiß ich was ich tu, bzw. der Sketch tut.... :P ::) :o ;) ;D ;D ;D ;D

LG
Papa Romeo
Titel: Antw:ESP8266 mit DS18B20 mehrere Temp. auslesen, über MQTT in FHEM
Beitrag von: Thomas0401 am 21 Februar 2021, 20:40:30
float durch int ersetzt, jetzt bekomme ich einen Wert aber der sieht so aus   4294967169
Titel: Antw:ESP8266 mit DS18B20 mehrere Temp. auslesen, über MQTT in FHEM
Beitrag von: micky0867 am 21 Februar 2021, 20:41:22

Zitat von: Papa Romeo am 21 Februar 2021, 20:24:04
zu was ESPEasy wegen n´paar Temperaturwerten.

deswegen:
Zitat von: Thomas0401 am 21 Februar 2021, 19:25:19
Seit Tagen versuche ich verschiedene Varianten, leider kommt nichts dabei rum, im Gegenteil meist wird es noch schlimmer.
Titel: Antw:ESP8266 mit DS18B20 mehrere Temp. auslesen, über MQTT in FHEM
Beitrag von: Thomas0401 am 21 Februar 2021, 20:54:17
Den Sketch verstehen wäre schon cool, für mich als Anfänger ist sicherlich einfacher mit ESPEasy aber man wächst ja mit seinen Aufgaben 8)
Titel: Antw:ESP8266 mit DS18B20 mehrere Temp. auslesen, über MQTT in FHEM
Beitrag von: Thomas0401 am 21 Februar 2021, 21:37:25
Hallo Pappa Romeo,

mit int war eine klasse Idee. Habe im Sketch noch was eingefügt und ein wenig erweitert. Jetzt klappt es perfekt.

Hier der Sketch für andere Interessenten


#include <Arduino.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ESP8266WiFi.h>
#include <WifiClient.h>
#include <PubSubClient.h>

#define ONEWIRE_PIN D4

OneWire ds(ONEWIRE_PIN);
DallasTemperature sensors(&ds);

WiFiClient net;
PubSubClient client(net);

const char* mqtt_server = "Host";
const char* ssid = "ssid";
const char* password = "Password";

char buf[10];

DeviceAddress sensor1 = { 0x28, 0x13, 0x01, 0x07, 0xD6, 0x01, 0x3C, 0x46 };
DeviceAddress sensor2 = { 0x28, 0x7B, 0xCC, 0x07, 0xD6, 0x01, 0x3C, 0xEA };
DeviceAddress sensor3 = { 0x28, 0x04, 0x33, 0x07, 0xD6, 0x01, 0x3C, 0x9F };
DeviceAddress sensor4 = { 0x28, 0xE7, 0x65, 0x07, 0xD6, 0x01, 0x3C, 0xE6 };

void setup() {
  Serial.begin(115200);
  discoverOneWireDevices();

  sensors.begin();

  WiFi.mode(WIFI_AP_STA);
  WiFi.begin(ssid, password);

  connect();
  client.setServer(mqtt_server, 1883);

}

void connect() {

  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    WiFi.begin(ssid, password);
  }

  Serial.println(WiFi.localIP());
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    String clientId = "D1MiniClient-";
    clientId += String(random(0xffff), HEX);

    if (client.connect(clientId.c_str(), "MQTT-User", "MQTT-Password")) {
      Serial.println("connected");
      client.subscribe("OsoyooCommand");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");

      delay(5000);
    }
  }
}

void discoverOneWireDevices() {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];

  while (ds.search(addr)) {
    Serial.println("");
    Serial.print("Found 1-Wire device with address: ");
    for (i = 0; i < 8; i++) {
      Serial.print("0x");
      if (addr[i] < 16) {
        Serial.print('0');
      }
      Serial.print(addr[i], HEX);
      if (i < 7) {
        Serial.print(", ");
      }
    }
    if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.print("CRC is not valid!");
      return;
    }
  }

  Serial.println("");
  Serial.println("Ready.");
  ds.reset_search();
}

void loop() {

  if (!client.connected()) {
    reconnect();
   
  }

  sensors.requestTemperaturesByAddress(sensor1);
  int temp1 = sensors.getTempC(sensor1);
  Serial.print("TPO: ");
  Serial.println(temp1);

  sensors.requestTemperaturesByAddress(sensor2);
  int temp2 = sensors.getTempC(sensor2);
  Serial.print("TPM: ");
  Serial.println(temp2);

  sensors.requestTemperaturesByAddress(sensor3);
  int temp3 = sensors.getTempC(sensor3);
  Serial.print("TPU: ");
  Serial.println(temp3);

  sensors.requestTemperaturesByAddress(sensor4);
  int temp4 = sensors.getTempC(sensor4);
  Serial.print("TZW: ");
  Serial.println(temp4);

  char buffer[10];
  sprintf(buffer, "%ld", temp1);
  client.publish("/SmartHome/KG/Heizung/Temp/TPO", buffer);

  sprintf(buffer, "%ld", temp2);
  client.publish("/SmartHome/KG/Heizung/Temp/TPM", buffer);

  sprintf(buffer, "%ld", temp3);
  client.publish("/SmartHome/KG/Heizung/Temp/TPU", buffer);

  sprintf(buffer, "%ld", temp4);
  client.publish("/SmartHome/KG/Heizung/Temp/TZW", buffer);

  delay(60000);

}

char* prepareToSend(String str)
{
  str.toCharArray(buf, str.length() + 1);
  return buf;
}


Vielen Dank und VG Thomas