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
Hallo Thomas,
ich glaube irgendwo mal gelesen zu haben, dass "sprintf" mit "float" nicht funktioniert.
LG
Papa Romeo
...hab´s gefunden, schau mal hier:
http://yaab-arduino.blogspot.com/2015/12/how-to-sprintf-float-with-arduino.html
LG
Papa Romeo
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
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
Das ist eine sehr gute Frage, noch nicht mit beschäftigt.
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
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
float durch int ersetzt, jetzt bekomme ich einen Wert aber der sieht so aus 4294967169
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.
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)
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