Funksteckdose mit Raspi über MQTT schalten
- peter-pan
- Beiträge: 2573
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: Funksteckdose mit Raspi über MQTT schalten
Also das kann ich fast nicht glauben.
Ich habe zwischenzeitlich 8 Gosund SP111 in Betrieb (Tasmota V8.4 + V8.5) und alle laufen einwandfrei. Kannst du die Dosen im Netzwerk erkennen ?
Ich habe zwischenzeitlich 8 Gosund SP111 in Betrieb (Tasmota V8.4 + V8.5) und alle laufen einwandfrei. Kannst du die Dosen im Netzwerk erkennen ?
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian
-
- Beiträge: 206
- Registriert: 5. Mär 2019 21:13
- Wohnort: Ingolstadt
Re: Funksteckdose mit Raspi über MQTT schalten
Servus Peter,
defekt sind die FUNKsteckdosen.
Die beiden neunen Gosund SP1 gehen gut ( wenn auch noch nicht im Openhab )
defekt sind die FUNKsteckdosen.
Die beiden neunen Gosund SP1 gehen gut ( wenn auch noch nicht im Openhab )
--
Gruß
Jojo
Gruß
Jojo
- peter-pan
- Beiträge: 2573
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: Funksteckdose mit Raspi über MQTT schalten
Problem ?
Hier ein Beispiel für eine SP111, sollte aber bei der SP1 ähnlich sein:
.things:
Code: Alles auswählen
Thing topic sp11101 "Gosund SP111 01" @ "MQTT2" {
Channels:
Type switch : power "Power " [ stateTopic="stat/gosundsp111_01/POWER", commandTopic="cmnd/gosundsp111_01/POWER" ]
Type number : rssi "WiFi Signal Strength" [ stateTopic="tele/gosundsp111_01/STATE", transformationPattern="JSONPATH:$.Wifi.RSSI"]
Type string : version "Firmware Version " [ stateTopic="stat/gosundsp111_01/STATUS2", transformationPattern="JSONPATH:$.StatusFWR.Version"]
Type switch : reachable "Reachable" [ stateTopic="tele/gosundsp111_01/LWT",transformationPattern="MAP:reachable.map" ]
Type string : hardware "Chip Set " [ stateTopic="stat/gosundsp111_01/STATUS2", transformationPattern="JSONPATH:$.StatusFWR.Hardware"]
Type string : ipaddress "IP Address " [ stateTopic="stat/gosundsp111_01/STATUS5", transformationPattern="JSONPATH:$.StatusNET.IPAddress"]
Type number : powerload "Power load" [ stateTopic="tele/gosundsp111_01/SENSOR", transformationPattern="JSONPATH:$.ENERGY.Power"]
Type number : voltage "Line voltage" [ stateTopic="tele/gosundsp111_01/SENSOR", transformationPattern="JSONPATH:$.ENERGY.Voltage"]
Type number : current "Line current" [ stateTopic="tele/gosundsp111_01/SENSOR", transformationPattern="JSONPATH:$.ENERGY.Current"]
Type number : total "Total energy " [ stateTopic="tele/gosundsp111_01/SENSOR", transformationPattern="JSONPATH:$.ENERGY.Total"]
Type number : totalday "Total energy today" [ stateTopic="tele/gosundsp111_01/SENSOR", transformationPattern="JSONPATH:$.ENERGY.Today"]
Type number : totalyest "Total energy yesterday" [ stateTopic="tele/gosundsp111_01/SENSOR", transformationPattern="JSONPATH:$.ENERGY.Yesterday"]
Type string : ssid "WiFi" [ stateTopic="tele/gosundsp111_01/STATE", transformationPattern="JSONPATH:$.Wifi.SSId"]
Type datetime : time "Time" [ stateTopic="tele/gosundsp111_01/STATE", transformationPattern="JSONPATH:$.Time"]
}
Code: Alles auswählen
Switch Gosund_socket_01 "Gosund Switch 01 [MAP(de.map):%s]" <light> (gGosunds,gPlugSwitch) { channel="mqtt:topic:hans:sp11101:power"}
Number Gosund_socket_01_RSSI "Gosund Switch 01 RSSI [%s]" <qualityofservice> (gGosunds,gRSSI) { channel="mqtt:topic:hans:sp11101:rssi" }
String Gosund_socket_01_Version "Gosund Switch 01 Version 69[%s]" <gosundsp111> (gGosunds,gVer) { channel="mqtt:topic:hans:sp11101:version" }
Switch Gosund_socket_01_Unreach "Gosund Switch 01 Erreichbarkeit [%s]" <siren1> (gGosunds,gLWT) { channel="mqtt:topic:hans:sp11101:reachable" }
String Gosund_socket_01_Hardware "Gosund Switch 01 Hardware 69[%s]" <gosundsp111> (gGosunds,gHard) { channel="mqtt:topic:hans:sp11101:hardware" }
String Gosund_socket_01_IPAddress "Gosund Switch 01 IP-Address [%s]" <gosundsp111> (gGosunds,gHard) { channel="mqtt:topic:hans:sp11101:ipaddress" }
//* For Fun and Test
Number Gosund_socket_01_Verb "Gosund 01 Verbrauch Total[%.2f kWh]" <gosundsp111> (gGosunds) { channel="mqtt:topic:hans:sp11101:total" }
Number Gosund_socket_01_VerbHeute "Gosund 01 Verbrauch Heute[%.2f kWh]" <gosundsp111> (gGosunds) { channel="mqtt:topic:hans:sp11101:totalday" }
Number Gosund_socket_01_VerbGestern "Gosund 01 Verbrauch Gestern[%.2f kWh]" <gosundsp111> (gGosunds) { channel="mqtt:topic:hans:sp11101:totalyest" }
Number Gosund_socket_01_Strom "Gosund 01 Stromaufnahme [%.2f A]" <gosundsp111> (gGosunds) { channel="mqtt:topic:hans:sp11101:current" }
Number Gosund_socket_01_Spannung "Gosund 01 Spannung[%.2f Volt]" <gosundsp111> (gGosunds) { channel="mqtt:topic:hans:sp11101:voltage" }
Number Gosund_socket_01_Leisung "Gosund 01 Leistung[%.2f W]" <gosundsp111> (gGosunds) { channel="mqtt:topic:hans:sp11101:powerload" }
String Gosund_socket_01_SSID "Gosund 01 Wlan [%s]" <gosundsp111> (gGosunds) { channel="mqtt:topic:hans:sp11101:ssid" }
DateTime Gosund_socket_01_Date "Gosund 01 Refresh [%1$tH:%1$tM]" <gosundsp111> (gGosunds) { channel="mqtt:topic:hans:sp11101:time" }
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian
-
- Beiträge: 206
- Registriert: 5. Mär 2019 21:13
- Wohnort: Ingolstadt
Re: Funksteckdose mit Raspi über MQTT schalten
Geil Peter.
Danke. Das kommt mir etwas zuvor.
Ich hatte den Plan dieses Openhab-Thing-Bridge-item-Zeug mal selber zu schaffen und dadurch zu lernen.
Hat nicht funktioniert
Wenn du ein Auge riskieren möchtest?:
Ich habe Bridge und Things in einer Datei definiert:
Dazu dann itmes:
und die Sitemap:
Die ESPs an denen die Thermometer hängen senden, MQTTfx empfängt.
Was ich nicht habe ist eine Anzeige der Werte in meiner BasicUI / PaperUI
Ich habe schon meine Frage von vor einiger Zeit dazu gelesen bei der UdoToni mir geholfen hat, erfolglos.
EDIT: in der Paper UI sind sowohl die Biege als auch die Things online
Siehst du was ich falsch mache ?
Denn wenn das läuft greife ich die Gosund an ...
Danke. Das kommt mir etwas zuvor.
Ich hatte den Plan dieses Openhab-Thing-Bridge-item-Zeug mal selber zu schaffen und dadurch zu lernen.
Hat nicht funktioniert
Wenn du ein Auge riskieren möchtest?:
Ich habe Bridge und Things in einer Datei definiert:
Code: Alles auswählen
Bridge mqtt:broker:JojoBroker [
host="192.168.189.27", username="XXX", password ="YYYYY", secure="false" ]{
Thing topic Temperaturen "Temperaturen" @ "JojoBroker" {
Channels:
Type string : Terasse "Terasse" [stateTopic="/home/data/ESP/Terasse/" ]
Type string : Kellerabgang "Kellerabgang" [stateTopic="/home/data/ESP/Kellerabgang/"]
Type string : Wohnzimmer "Wohnzimmer" [stateTopic="/home/data/ESP/Wohnzimmer/"]
}
Code: Alles auswählen
String Kellerabgang "Kellerabgang [%s°C]" {channel="mqtt:topic:JojoBroker:Temperaturen:Kellerabgang"}
String Terasse "Terasse [%s°C]" {channel="mqtt:topic:JojoBroker:Temperaturen:Terasse"}
String Wohnzimmer "Wohnzimmer [%s°C]" {channel="mqtt:topic:JojoBroker:Temperaturen:Wohnzimmer"}
Code: Alles auswählen
Frame label="Temperaturen" {
Text item=Wohnzimmer icon="temperature"
Text item=Kellerabgang icon="temperature"
Text item=Terasse icon="temperature"
}
Was ich nicht habe ist eine Anzeige der Werte in meiner BasicUI / PaperUI
Ich habe schon meine Frage von vor einiger Zeit dazu gelesen bei der UdoToni mir geholfen hat, erfolglos.
EDIT: in der Paper UI sind sowohl die Biege als auch die Things online
Siehst du was ich falsch mache ?
Denn wenn das läuft greife ich die Gosund an ...
--
Gruß
Jojo
Gruß
Jojo
- peter-pan
- Beiträge: 2573
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: Funksteckdose mit Raspi über MQTT schalten
Ich bin mir jetzt gerade nicht sicher, was du mir hier zeigst? Sind das ESP8266 NodeMCUs mit ESP Easy Flash ?
Grundsätzlich solltest du aber wissen, dass jedes Device, also jeder ESP8266 oder auch deine Steckdosen ein eigenes Thing braucht und die entsprechenden Channels dazu. Das Beispiel, dass ich gepostet habe, bezieht sich nur auf eine Steckdose mit dem Topic-Namen "gosundsp111_01". .
Ob deine Vorgehensweise, die Things nach Verwendungszweck anzulegen auch funktioniert habe ich noch nicht ausprobiert, aber vielleicht kann der eine oder andere noch ein Statement dazu abgeben.
Deine Bridge sieht soweit ganz gut aus, wenn die IP-Adresse, von dem Rechner stammt, auf dem dein Broker läuft, also wahrscheinlich deinem RasPi. Du könntest auch noch "localhost" nehmen, wenn das der Rechner ist, auf dem auch "openHAB" läuft also etwa so:
Du solltest evtl. auch noch eine "clientID" vergeben, sonst vergibt OH bei einem Neustart jedes mal einen anderen Namen und das müllt nur dein System zu.
Ein mit ESP Easy geflashter ESP8266 könnte evtl. so aussehen:
Die Items dazu sehen dann so aus:
Du solltest also berücksichtigen, mit welchem "Flash" du arbeitest und wie du deine Devices konfigurieret hast. Ich helfe dir gerne weiter, soweit ich kann und sicherlich auch andere hier in der Community. Du müsstest ur etwas konkreter werden, was deine Devices betrifft und wie sie geflasht sind. Das ist mir noch nicht ganz klar.
Ein mit ESP-Easy geflashter ESP8266, sieht bei mir z.B. so aus: Also auf geht's
Grundsätzlich solltest du aber wissen, dass jedes Device, also jeder ESP8266 oder auch deine Steckdosen ein eigenes Thing braucht und die entsprechenden Channels dazu. Das Beispiel, dass ich gepostet habe, bezieht sich nur auf eine Steckdose mit dem Topic-Namen "gosundsp111_01". .
Ob deine Vorgehensweise, die Things nach Verwendungszweck anzulegen auch funktioniert habe ich noch nicht ausprobiert, aber vielleicht kann der eine oder andere noch ein Statement dazu abgeben.
Deine Bridge sieht soweit ganz gut aus, wenn die IP-Adresse, von dem Rechner stammt, auf dem dein Broker läuft, also wahrscheinlich deinem RasPi. Du könntest auch noch "localhost" nehmen, wenn das der Rechner ist, auf dem auch "openHAB" läuft also etwa so:
Code: Alles auswählen
//https://openhabforum.de/viewtopic.php?f=15&t=970&start=20 // from Udo
//Bridge mqtt:broker:MosquittoMqttBroker "Mosquitto MQTT Broker" @ "MQTT2"
// ^ ^ ^ ^ ^ Zeige diese Bridge auf der Unterseite "MQTT" in Paper UI Control
// ^ ^ ^ ^ Label der Bridge
// ^ ^ ^ Name der Bridge
// ^ ^ Art der Bridge
// ^ Binding
Bridge mqtt:broker:hans "Mosquitto" [ host="localhost", port=1883, secure=false, clientID="OH2_hans" ]
{
Ein mit ESP Easy geflashter ESP8266 könnte evtl. so aussehen:
Code: Alles auswählen
Thing topic esp_mini02 "ESP8266 Mini Nr 02" @ "MQTT2" {
Channels:
Type switch : reachable "Mini Reachable" [ stateTopic="esp_mini_2/status/LWT" ]
Type switch : motion "Mini Bewegung T1" [ stateTopic="esp_mini_2/hc-sr501/State" ]
Type number : temp "Temp. BME280 T2" [ stateTopic="esp_mini_2/bme280/Temperature"]
Type number : hum "Hum. BME280 T2" [ stateTopic="esp_mini_2/bme280/Humidity"]
Type number : pres "Pres. BME280 T2" [ stateTopic="esp_mini_2/bme280/Pressure"]
Type string : ipaddress "IP Address" [ stateTopic="esp_mini_2/IPAdress"]
Type string : ssid "WiFi" [ stateTopic="esp_mini_2/wifi_name"]
}
Code: Alles auswählen
Switch esp_mini_02_Unreach "ESP8266_Mini-2 LWT-Erreichbarkeit [%s]" <siren1> (gAmica,gLWTesp,gLWT) { channel="mqtt:topic:hans:esp_mini02:reachable"} // persisted in mapDB
Switch esp_mini_02_motion "ESP8266_Mini-2 Bewegung[%s]" <siren> (gAmica,EG_Buro,gMotion) { channel="mqtt:topic:hans:esp_mini02:motion"}
Number esp_mini_02_temp "ESP8266_Mini-2 BME280 Temperatur[%.1f °C]" <temperature> (gAmica,EG_Buro,gRtIstI) { channel="mqtt:topic:hans:esp_mini02:temp"}
Number esp_mini_02_hum "ESP8266_Mini-2 BME280 Luftfeuchtigkeit[%.1f %%]" <humidity> (gAmica,EG_Buro) { channel="mqtt:topic:hans:esp_mini02:hum"}
Number esp_mini_02_pres "ESP8266_Mini-2 BME280 LuftDruck[%.1f hPa]" <pressure> (gAmica,EG_Buro) { channel="mqtt:topic:hans:esp_mini02:pres"}
String esp_mini_02_Version "ESP8266_Mini-2 Version [%s]" <sonoff_pow> (gAmica,gVer) { http="<[http://192.168.178.84/json:3600000:JSONPATH($.System.['Git Build'])]" }
String esp_mini_02_IPAddress "ESP8266_Mini-2 IP-Address [%s]" <sonoff_pow> (gAmica,gHard) { channel="mqtt:topic:hans:esp_mini02:ipaddress" }
String esp_mini_02_SSID "ESP8266_Mini-2 Wlan [%s]" <sonoff_pow> (gAmica) { channel="mqtt:topic:hans:esp_mini02:ssid" }
Ein mit ESP-Easy geflashter ESP8266, sieht bei mir z.B. so aus: Also auf geht's
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian
-
- Beiträge: 206
- Registriert: 5. Mär 2019 21:13
- Wohnort: Ingolstadt
Re: Funksteckdose mit Raspi über MQTT schalten
Servus Peter,
wie auch UdoToni bist du ein Traum von Hilfe. Vielen Dank dafür !!!!!!
Grundsätzlich habe ich mehrere ESP8266 Lolin im Einsatz die ich mit der Arduino IDE programmiere. Aktuell sind es 3 an denen jeweils ein Thermometer hängt. Die Werte laufen dann auf den Broker der auf dem Raspi läuft ( 192.168.189.27 WLAN) Auf diesem Raspi läuft auch openHAB ( 192.168.188.36 LAN).
Und ein Batch, das die Werte des ESP "übersetzt" und die Zeit hinzufügt damit ich weiß wann der Wert gemessen wurde. Dieser String wird dann wieder per mqtt versendet und sollte in meiner BasicUI erscheinen.
Das klappt alles bis auf den Punkt: sollte in meiner BasicUI erscheinen.
Das möchte ich zuerst können, dann istdas nächste Projekt die Gosund Steckdosen mit einen AZ-Touch Wandgehäuse ( s.o. ) zu schalten
wie auch UdoToni bist du ein Traum von Hilfe. Vielen Dank dafür !!!!!!
Grundsätzlich habe ich mehrere ESP8266 Lolin im Einsatz die ich mit der Arduino IDE programmiere. Aktuell sind es 3 an denen jeweils ein Thermometer hängt. Die Werte laufen dann auf den Broker der auf dem Raspi läuft ( 192.168.189.27 WLAN) Auf diesem Raspi läuft auch openHAB ( 192.168.188.36 LAN).
Und ein Batch, das die Werte des ESP "übersetzt" und die Zeit hinzufügt damit ich weiß wann der Wert gemessen wurde. Dieser String wird dann wieder per mqtt versendet und sollte in meiner BasicUI erscheinen.
Das klappt alles bis auf den Punkt: sollte in meiner BasicUI erscheinen.
Das möchte ich zuerst können, dann istdas nächste Projekt die Gosund Steckdosen mit einen AZ-Touch Wandgehäuse ( s.o. ) zu schalten
--
Gruß
Jojo
Gruß
Jojo
- peter-pan
- Beiträge: 2573
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: Funksteckdose mit Raspi über MQTT schalten
Du hast also eigene Sketche für deine Lolins geschrieben ?!
Wie sieht denn so ein Sketch aus und was für eine Batch-Datei brauchst du noch dazu ? Das klingt alles etwas kompliziert. Und warum hast du 2 IP-Adressen für deinen RasPi ? Das brauchst doch gar nicht, oder ? LAN ist doch eh besser, also "192.168.188.36". Das sollte dann auch für den Broker gelten.
Deine Lolins sind doch mit Micro-USB-Anschluss ? Die kannst du doch ganz leicht flashen(Tasmota,ESP-Easy,etc), Konfigurieren, fertig. Kein übersetzen und nichts dazufügen.
Aber noch mal zu deinem SetUp. Kannst du mal ein Protokoll von MQTT.fx für einen deiner Lolins posten. Das mit der Zeit geht sicherlich auch per Rule (einfacher) in openHAB.
Hier siehst du mal, was mein Lolin so von sich gibt: So was ähnliches sollten deine ESP'S auch ausgeben und an den MQTT-Broker weiterleiten. Und das ist genau das was in deine Things gehört.
Wie sieht denn so ein Sketch aus und was für eine Batch-Datei brauchst du noch dazu ? Das klingt alles etwas kompliziert. Und warum hast du 2 IP-Adressen für deinen RasPi ? Das brauchst doch gar nicht, oder ? LAN ist doch eh besser, also "192.168.188.36". Das sollte dann auch für den Broker gelten.
Deine Lolins sind doch mit Micro-USB-Anschluss ? Die kannst du doch ganz leicht flashen(Tasmota,ESP-Easy,etc), Konfigurieren, fertig. Kein übersetzen und nichts dazufügen.
Aber noch mal zu deinem SetUp. Kannst du mal ein Protokoll von MQTT.fx für einen deiner Lolins posten. Das mit der Zeit geht sicherlich auch per Rule (einfacher) in openHAB.
Hier siehst du mal, was mein Lolin so von sich gibt: So was ähnliches sollten deine ESP'S auch ausgeben und an den MQTT-Broker weiterleiten. Und das ist genau das was in deine Things gehört.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian
-
- Beiträge: 206
- Registriert: 5. Mär 2019 21:13
- Wohnort: Ingolstadt
Re: Funksteckdose mit Raspi über MQTT schalten
Servus Peter,
nett das du mich nicht mehr vom Haken lässt
Der Raspi hat 2 IP weil meines WIssens mqtt / Raspberry / Linux ein Problem mit Sonderzeichen in Passwörtern hat. Deswegen funkt mein JojoBroker im Gäste Wlan. Mein "normales" WLAN hat eine Sonderzeichen Passwort.
Das ich die ESP´s flashen kann wusste ich nicht,
Sketch:
Selber geschrieben trifft es nicht so ganz
Läuft ohne Batch, ESP einstecken und los gehts ( wenns einmal drauf ist ). Das fand ich bisher nicht dramatisch. Werde mal einen mit Tasmota flashen.
Der Vorteil am "Übersetzen" ist, dass ich den Sensor umhängen kann ohne den Sketch neu zu schreiben. Ich finde es einfacher die Batch Datei auf dem Raspi zu ändern ( komme nicht per WLAN auf die ESP´s )
Batch:
Hat natürlich den Nachteil das die Batch laufen muss ...
Beim MQTTfx tut sich nicht viel: Die Jungs senden nur alle 30min
Und das senden sie an den Broker, respektive die Batch und die schickt dann mit dem Entsprechenden Zimmer Topic nochmal die umd die Zeit ergänzte Nachricht raus. Und dieses Topic ist der Channel im openHAB. Klappt aber nicht
Hoffnungsfrohe Grüße
nett das du mich nicht mehr vom Haken lässt
Der Raspi hat 2 IP weil meines WIssens mqtt / Raspberry / Linux ein Problem mit Sonderzeichen in Passwörtern hat. Deswegen funkt mein JojoBroker im Gäste Wlan. Mein "normales" WLAN hat eine Sonderzeichen Passwort.
Das ich die ESP´s flashen kann wusste ich nicht,
Sketch:
Code: Alles auswählen
/*
* Send temperature from ESP8266 with multiple DS18B20 to MQTT server.
* A simple Sketch to read the Temperature from multiple DS18B20 and publish them to a MQTT-Server using a ESP8266.
* Compiles in the Arduino IDE for the ESP8266
*
* For deep sleep support uncomment 'deep sleep' part
* For DHT22 support uncomment 'dht22' part
* OTA currently does not work.
*
*
*/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Streaming.h>
#include <ESP8266HTTPUpdateServer.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
//#include "SSD1306.h" // alias for `#include "SSD1306Wire.h"`
//SSD1306 display(0x3C,D1, D2);
/* dht22
#include <DHT.h>
*/
/* deep sleep
#define SLEEP_DELAY_IN_SECONDS 30
*/
// data cable connected to D4 pin
#define ONE_WIRE_BUS D4
//wifi
const char* ssid = "HAL9000Gast";
const char* password = "WGSHAL9000";
//mqtt
const char* mqtt_server = "192.168.189.27";
//
const char* mqtt_username = "";
const char* mqtt_password = "";
const char* host = "/home/data/out";
WiFiClient espClient;
PubSubClient client(espClient);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
delay (500);
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void setup() {
// setup serial port
Serial.begin(115200);
// setup WiFi
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
// setup OneWire bus
DS18B20.begin();
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
//if (client.connect("ESP8266Client", mqtt_username, mqtt_password)) {
if (client.connect("ESP8266Client")) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
/*void displayData() {
display.clear();
display.setTextAlignment(TEXT_ALIGN_CENTER);
display.setFont(ArialMT_Plain_10);
display.drawString(64, 0, "Office Temp/Humidty");
display.setFont(ArialMT_Plain_24);
display.display();
}*/
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// ds18b20
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
//Loop through all DS1820
while(oneWire.search(addr))
{
//Serial.print("ROM =");
//Topic is built from a static String plus the ID of the DS18B20
String romcode = "/home/data/ESP8266_3";
String Nummer = "Nummer";
//Serial.print( addr[i]);
for( i = 0; i < 8; i++) {
//Serial.write(' ');
//Serial.print(addr[i], HEX);
//romcode = romcode + String(addr[i], HEX);
Nummer = Nummer + String(addr[i]);
}
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return;
}
Serial.println();
// the first ROM byte indicates which chip
switch (addr[0]) {
case 0x10:
//Serial.println(" Chip = DS18S20"); // or old DS1820
type_s = 1;
break;
case 0x28:
//Serial.println(" Chip = DS18B20");
type_s = 0;
break;
case 0x22:
//Serial.println(" Chip = DS1822");
type_s = 0;
break;
default:
//Serial.println("Device is not a DS18x20 family device.");
return;
}
//oneWire.depower();
oneWire.reset();
oneWire.select(addr);
oneWire.write(0x44, 1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
// we might do a oneWire.depower() here, but the reset will take care of it.
present = oneWire.reset();
oneWire.select(addr);
oneWire.write(0xBE); // Read Scratchpad
//Serial.print(" Data = ");
//Serial.print(present, HEX);
//Serial.print(" ");
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = oneWire.read();
//Serial.print(data[i], HEX);
//Serial.print(" ");
}
//Serial.print(" CRC=");
//Serial.print(OneWire::crc8(data, 8), HEX);
Serial.println();
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
//convert RAW Temperature to String
String raw_temp = String(raw, DEC);
//convert RAW Temperature to celsius
double temp = raw * 0.0625;
Serial.print(temp);
//convert to string
char tempString[6];
dtostrf(temp, 2, 2, tempString);
if (client.publish((char*) romcode.c_str(), tempString)) {
client.publish (host,tempString);
// client.publish((char*) romcode.c_str(), romcode);
// display.drawString(66, 13, tempString );
// display.drawString(66, 40, display_humid + "%");
Serial.println();
Serial.println("Publish ok : ");
}
else {
Serial.println("Publish failed");
}
}
//End of the OneWire-Devices, reset Loop
Serial.println("End of Onewire Bus");
//oneWire.depower();
oneWire.reset_search();
delay(10000);
return;
// deep sleep
//Serial << "Closing MQTT connection..." << endl;
//client.disconnect();
//Serial << "Closing WiFi connection..." << endl;
//WiFi.disconnect();
delay(100);
// deep sleep
//Serial << "Entering deep sleep mode for " << SLEEP_DELAY_IN_SECONDS << " seconds..." << endl;
//ESP.deepSleep(SLEEP_DELAY_IN_SECONDS * 1000000, WAKE_RF_DEFAULT);
//ESP.deepSleep(10 * 1000, WAKE_NO_RFCAL);
//delay(500);
}
Läuft ohne Batch, ESP einstecken und los gehts ( wenns einmal drauf ist ). Das fand ich bisher nicht dramatisch. Werde mal einen mit Tasmota flashen.
Der Vorteil am "Übersetzen" ist, dass ich den Sensor umhängen kann ohne den Sketch neu zu schreiben. Ich finde es einfacher die Batch Datei auf dem Raspi zu ändern ( komme nicht per WLAN auf die ESP´s )
Batch:
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf-8 -*-
import paho.mqtt.client as mqtt
import paho.mqtt.publish as publish
import time
def on_message(client, userdata, message):
msg = str(message.payload.decode("utf-8"))
print("message received: ", msg)
print("message topic: ", message.topic)
if message.topic == ("/home/data/ESP8266_2"):
msg2 = ": "+ msg
msg3 = time.strftime("%H:%M ") + msg2
print (msg3)
publish.single("/home/data/ESP/Buero", msg3)
elif message.topic == ("/home/data/ESP8266_1"):
msg2 = ": " + msg
msg3 = time.strftime("%H:%M ") +msg2
print (msg3)
publish.single("/home/data/ESP/Terasse", msg3)
elif message.topic == ("/home/data/ESP8266_3"):
msg2 = ": " + msg
msg3 = time.strftime("%H:%M ") +msg2
print (msg3)
publish.single("/home/data/ESP/Kellerabgang", msg3)
elif message.topic == ("/home/data/ESP8266_6a"):
msg2 = ": " + msg
msg3 = time.strftime("%H:%M ") + msg2
print (msg3)
publish.single("/home/data/ESP/Esszimmer", msg3)
elif message.topic == ("/home/data/ESP8266_6b"):
msg2 = ": " + msg
msg3 = time.strftime("%H:%M ") + msg2
print (msg3)
publish.single("/home/data/ESP/Esszimmer", msg3)
elif message.topic == ("/home/data/feuchte"):
msg2 =": " +msg
msg3 = time.strftime("%H:%M ") + msg2
publish.single("/home/data/ESP/feuchte" , msg3)
else:
#print("Sacklzement")
print (msg)
#publish.single("home/data/temp/",msg2)
#print(message.topic)
#publish.single("home/data/","msg2")
#print (msg2)x
def on_publish(mosq, obj, mid):
print("mid: " + str(msg2))
def on_connect(client, userdata, flags, rc):
client.subscribe('/home/data/#')
BROKER_ADDRESS = "192.168.189.27"
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(BROKER_ADDRESS)
print("Connected to MQTT Broker: " + BROKER_ADDRESS)
client.loop_forever()
Beim MQTTfx tut sich nicht viel: Die Jungs senden nur alle 30min
Und das senden sie an den Broker, respektive die Batch und die schickt dann mit dem Entsprechenden Zimmer Topic nochmal die umd die Zeit ergänzte Nachricht raus. Und dieses Topic ist der Channel im openHAB. Klappt aber nicht
Hoffnungsfrohe Grüße
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
--
Gruß
Jojo
Gruß
Jojo
- udo1toni
- Beiträge: 13986
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Funksteckdose mit Raspi über MQTT schalten
Das kann ich nicht bestätigen. Ich habe einen Raspberry Pi3 per WLAN angebunden, das Passwort enthält alles, was die Zeichentablle hergibt (63 Zeichen lang). An der einen oder anderen Stelle gab es aber hartnäckig Probleme mit dem Passwort, so dass ich ein paar Sonderzeichen durch andere ersetzen musste (das ursprüngliche Passwort hat mit anderen Geräten und auch dem Pi funktioniert).Jojo hat geschrieben:Der Raspi hat 2 IP weil meines WIssens mqtt / Raspberry / Linux ein Problem mit Sonderzeichen in Passwörtern hat. Deswegen funkt mein JojoBroker im Gäste Wlan. Mein "normales" WLAN hat eine Sonderzeichen Passwort.
Ich habe auf dem Pi auch einen selbst geschriebenen mqtt Client laufen (Python, Paho library) und kann keinerlei Probleme feststellen.
Gesendet von iPad mit Tapatalk
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 206
- Registriert: 5. Mär 2019 21:13
- Wohnort: Ingolstadt