ESP8266 mit DS18B20 mehrere Temp. auslesen, über MQTT in FHEM

Begonnen von Thomas0401, 21 Februar 2021, 19:25:19

Vorheriges Thema - Nächstes Thema

Thomas0401

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

Papa Romeo

Hallo Thomas,

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

LG
Papa Romeo
...die richtige Lötspitzentemperatur prüft man zwischen Daumen und Zeigefinger.
...überlasse niemals etwas einer Software, das du hardwaremässig erreichen kannst.
...unvorsichtige Elektriker werden schnell zu leitenden Angestellten.
und...never change a running System...no Updates if not necessary

Papa Romeo

...die richtige Lötspitzentemperatur prüft man zwischen Daumen und Zeigefinger.
...überlasse niemals etwas einer Software, das du hardwaremässig erreichen kannst.
...unvorsichtige Elektriker werden schnell zu leitenden Angestellten.
und...never change a running System...no Updates if not necessary

Thomas0401

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

micky0867

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

Thomas0401

Das ist eine sehr gute Frage, noch nicht mit beschäftigt.

Papa Romeo

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
...die richtige Lötspitzentemperatur prüft man zwischen Daumen und Zeigefinger.
...überlasse niemals etwas einer Software, das du hardwaremässig erreichen kannst.
...unvorsichtige Elektriker werden schnell zu leitenden Angestellten.
und...never change a running System...no Updates if not necessary

Papa Romeo

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
...die richtige Lötspitzentemperatur prüft man zwischen Daumen und Zeigefinger.
...überlasse niemals etwas einer Software, das du hardwaremässig erreichen kannst.
...unvorsichtige Elektriker werden schnell zu leitenden Angestellten.
und...never change a running System...no Updates if not necessary

Thomas0401

float durch int ersetzt, jetzt bekomme ich einen Wert aber der sieht so aus   4294967169

micky0867


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.

Thomas0401

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)

Thomas0401

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