MultiSensor/Actor - nodemcu -- MQTT2-Server/MQTT2-Device

Begonnen von holle75, 27 Januar 2020, 16:00:30

Vorheriges Thema - Nächstes Thema

Beta-User

...es ist auch nicht ganz einfach, in die Zusammenhänge mit diesem "speziellen" Device einsteigen zu wollen. Die bridgeRegexp-Geschichte geht erst mal davon aus, dass übliche firmwares mit denselben Defaults bzw. Einstellungen betrieben werden wie für MQTT2_SERVER in den Praxisbeispielen beschrieben.

Langer Rede kurzer Sinn: Das bringt dir im Moment mit dem einen Device nichts...
Hier ist weiter Handarbeit angesagt, daher hatte ich den entsprechenden Code auch gepostet ;) :
Zitat von: Beta-User am 28 Januar 2020, 13:01:41
Vorab kannst du ja mal das hier testen, ausgehend davon, dass 1 und 0 als payload passen:

attr MQTT2_ESP8266HDMClient setList on /light/in 1\
off /light/in 0

Wenn du das setList-Attribut händisch bearbeitest: Bitte den Zeilenumbruch (\) rauslassen...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

holle75

Zitat von: Beta-User link=topic=107830 .msg1018211#msg1018211 date=1580216146
Hier ist weiter Handarbeit angesagt, daher hatte ich den entsprechenden Code auch gepostet ;) :Wenn du das setList-Attribut händisch bearbeitest: Bitte den Zeilenumbruch (\) rauslassen...

Hatte es ja in Handarbeit versucht, aber der zweite Teil in deinem Satz war entscheidend! ;)

YES! die LED schaltet! Dankeschön ...

Aber hast du eine Idee, anhand des arduino sketches, warum es 5-10 Sekunden dauert bis sie das tut?

Zitat von: Beta-User am 28 Januar 2020, 13:55:46
...es ist auch nicht ganz einfach, in die Zusammenhänge mit diesem "speziellen" Device einsteigen zu wollen. Die bridgeRegexp-Geschichte geht erst mal davon aus, dass übliche firmwares mit denselben Defaults bzw. Einstellungen betrieben werden wie für MQTT2_SERVER in den Praxisbeispielen beschrieben.

Deswegen habe ich mich ja auch totgesucht ...

Aber hey, jetzt gibt es auch ein Beispiel für den steinigen Weg im Forum :)

Beta-User

Sorry, habe mir angewöhnt, nur noch in "RAW" zu schreiben...

Das mit der Dauer kann alles mögliche sein, könnte z.B. auch aus den Logs von mosquitto was zu sehen sein usw.. Ich kenne mich da bei Arduino@MQTT nicht aus, ich mache das wenn, dann mit MySensors ;D . (Da hat man diese Art Stress in der Regel nicht, sondern einfach zu überblickenden Code und seriellen Output, warum was nicht geht...).

Zum totsuchen:
Es ist m.E. immer empfehlenswert, erst mal beim Kennenlernen neuer Techniken einen erprobten Weg zu nehmen, bevor man anfängt, an allen Enden zu ziehen. Und grade bei den MQTT2-Modulen ist "eigentlich" sehr transparent, was jeweils passiert, wenn man das Grundprinzip mal verstanden hat ;) . Dafür reicht es aber eigentlich, einmal einen ESP mit Tasmota geflasht zu haben...

(Beispiele für steinige Wege haben wir schon genug im Forum ;) ).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

holle75


holle75

.... falls noch jemand eine Idee für die Verzögerung hat ....

Ach so, und falls jemand weiss, wie man das autosave von MQTT2 ausschaltet wäre ich auch recht dankbar. Was ist da der Zweck dahinter?

holle75

Zitat von: holle75 am 28 Januar 2020, 14:46:29
.... falls noch jemand eine Idee für die Verzögerung hat ....

kam von diesen delays in dem loop

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  // Publishes a random 0 and 1 like someone switching off and on randomly (random(2))
  client.publish(out_topic, String(random(2)).c_str(), true);
  delay(1000);
  client.subscribe(in_topic);
  delay(1000);
}

Beta-User

...das verzögert, klar, würde aber nur ca. 2 Sekunden erklären...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

holle75

Der Sketch scheint mir nicht so ganz astrein zu sein. Eben noch einen anderen mit ähnlicher Funktionalität probiert, da ist die Responsezeit so um eine halbe Sekunde.

Deswegen wäre ich noch sehr an den Beispielen von @Gisbert und @Papa Romeo interessiert. So lernt sichs am schnellsten ...

Papa Romeo

holle75,

schau mal hier : https://forum.fhem.de/index.php/topic,91042.msg835297.html#msg835297

Das ist der Großteil meiner Projekte.
Normalerweise sind die Sketche (x...x.ino)  überall irgendwo, wenn erforderlich, mit angehängt.
Wenn nicht, oder sollte ein Passwort abgefragt werden, dann meld dich einfach.

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

holle75

Uiuiuii, was machst du denn da für Sachen ...

Denke, da brauch ich noch ein paar Monate/Jahre/Jahrzente um das auseinanderklabüstern zu können.

Gisbert

Hallo holle75,

ich glaube nicht, dass du Monate oder mehr brauchst, dafür bist du schon zu nah dran an einer Lösung, aber du wirst wahrscheinlich eine zweistellige Zahl an Tagen benötigen.

Mit einer NodeMCU hast du schon eine brauchbare Hardwarebasis. Ich hatte mit einem ESP8266-01 angefangen, und mich nur gewundert, dass nach 1-2 Tagen das Teil tot war, zumindest schien es so.

Es gibt die Fraktion, zu der gehöre ich, die haben folgende MQTT-Umgebung:

  • MQTT-Broker mosquitto
  • Ein Device in Fhem mit dem Modul MQTT, in dem der Broker und ggf. Credentials gespeichert sind
  • Viele Devices in Fhem mit dem Modul MQTT-DEVICE, die eigentlichen Geräte
Diese Installation ist historisch gesehen die ältere, sie funktioniert und hat lediglich einen kleinen Nachteil, dass json strings als Readings nicht vereinzelt dargestellt werden; das Problem ist aber leicht lösbar.

Die neueren Entwicklungen nutzen MQTT2-DEVICE, SERVER, ... Vorteil ist, das kein seperater MQTT-Broker (z.B. mosquitto) installiert werden muss, und die json strings werden gleich zerlegt.

Da bei mir viele Geräte nach der älteren Methode problemlos laufen, habe ich noch keine ausreichende Motivation gesehen, umzusteigen.

Ich glaube eines deiner Probleme ist, dass du zuviele Baustellen gleichzeitig angehst. Wenn es um einen funktionalen Sketch geht, den du entwickeln willst, dann brauchst du erst mal gar kein Fhem, lediglich einen MQTT-Broker auf deinem Server und MQTTfx auf deinem Win10-Rechner.

Ich sende dir gleich noch eine Beispiel-Installation, die bei mir schon lange problemlos läuft.
Schau es dir gerne an, aber nur wenn du nicht gleich fünf weitere Dinge gleichzeitig machen willst, eins nach dem anderen.

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Papa Romeo

Zitat von: holle75 am 28 Januar 2020, 19:13:48
Uiuiuii, was machst du denn da für Sachen ...

Denke, da brauch ich noch ein paar Monate/Jahre/Jahrzente um das auseinanderklabüstern zu können.

...ich denke da hat Gisbert recht, das geht recht schnell.
Vor etwa knapp 3 Jahren, waren das für mich auch alles "Böhmische Dörfer"... ;D :P ::)
...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

Beta-User

#me too ....
Aber im Ernst: wenn du das nur an FHEM anbinden willst, überspringe mosquitto.Just my2ct...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Gisbert

Hallo holle75,

so hier ist meine MQTT-Umgebung:

Mosquitto:
pi@HPT610:~$ sudo systemctl status mosquitto
● mosquitto.service - Mosquitto MQTT v3.1/v3.1.1 Broker

Wenn du diesen Weg gehen willst, dann musst du MQTT auf einen (Linux)-Server installieren. Wie das geht ist nicht Teil meiner Doku.

MQTT-Broker in Fhem:
defmod MyBroker MQTT 192.168.xx.yy:1883
Ggf. sind Credentials einzutragen, die bei der Installation des MQTT-Brokers auf den (Linux)-Server festgelegt wurden.

Mein MQTT_DEVICE, das in Fhem angelegt ist und mit einem ESP8266 kommunziert, auf dem ich einen eigenen Sketch am Laufen habe:
Wichtig ist hier eigentlich nur die Struktur des Topics "Heizung/Widerstand/+" - ich hoffe, du weisst, wofür das "+" steht, wie gepublisht und wie subskribiert wird.
Publishen z.B. set HeizungResist [HeizungResist:Widerstand_Forecast], wobei der Wert des Readings weiter unten in einem userReadings errechnet wird. Übertragen wird dann z.B. set HeizungResist 20.
Was subskribiert wird, steht in den Attributen attr HeizungResist subscribeReading_..., d.h. das sind die Daten, die der ESP rausschickt und die im Sketch definiert sind.
defmod HeizungResist MQTT_DEVICE
attr HeizungResist IODev MyBroker
attr HeizungResist alias Heizung [kΩ]
attr HeizungResist autoSubscribeReadings Heizung/Widerstand/+
attr HeizungResist comment Publishen geht wie folgt: \
set HeizungResist [HeizungResist:Widerstand] oder \
set HeizungResist [HeizungResist:Widerstand_Forecast] bzw. \
Der Inhalt wird zum Topic "Heizung/Widerstand/Sollwert" geschickt, welches im Attribut publishSet definiert wurde. \
\
Für die Nachtabschaltung der Warmwassererzeugung wird folgendes publiziert: \
set HeizungResist Warmwasser 0|1 (0=Nacht, 1=Tag) \
Schaltung über eine Relais: \
const int Relay_PIN = 14;;  // Relay is connected to GPIO14 D5 \
\
Temp ist die gemittelte Temperatur aus der Messung und dem Forecast \
Temp_eff = Temp - Temp_delta \
Abfrage nach gerade/ungerader Stunde: {strftime("%H", localtime)%2} - liefert 0 bei gerader, 1 bei ungerader Stunde \
\
stateFormat, z.B.: "Forecast: [DWD.Wetter.Leverkusen:fc0_4_TTT:d1]"\
<format> d<number> zum Runden des Wertes mit Nachkommastellen --> :d1 bedeutet eine Nachkommastelle\
\
Digitaler Potentiometer:\
#define INC 2  // D1 Mini D4 - pulled up in H/W (10k) ->  chip pin 1\
#define UD 15  // D1 Mini D8                          ->  chip pin 2\
#define CS 16  // D1 Mini D0 - pulled up in H/W (10k) ->  chip pin 7
attr HeizungResist event-min-interval .*:290
attr HeizungResist event-on-change-reading .*
attr HeizungResist icon sani_boiler_temp
attr HeizungResist publishSet Heizung/Widerstand/Sollwert
attr HeizungResist publishSet_Warmwasser Heizung/Widerstand/Warmwasser
attr HeizungResist room Heizung
attr HeizungResist stateFormat Aussentemp.: [TH.Kuhlmannweg8:temperature]°C<br>\
<span style="font-size:14px"><i>Resistance: [$name:Widerstand] kΩ</i></span><br>\
Temp<i><span style="vertical-align: -3px;; font-size: 75%;;">eff</span></i>: [$name:Temp_eff:r1]°C<br>\
Resistance: [$name:Istwert] kΩ<br>\
Forecast today: [DWD.Wetter.Leverkusen:fc0_4_TTT:d1]°C<br>\
Forecast +1: [DWD.Wetter.Leverkusen:fc1_4_TTT:d1]°C
attr HeizungResist subscribeReading_Istwert Heizung/Widerstand/Istwert
attr HeizungResist subscribeReading_Sollwert Heizung/Widerstand/Sollwert
attr HeizungResist subscribeReading_Spannung Heizung/Widerstand/Spannung
attr HeizungResist subscribeReading_Warmwasser Heizung/Widerstand/Warmwasser
attr HeizungResist subscribeReading_Warmwasser_ist Heizung/Widerstand/Warmwasser_ist
attr HeizungResist userReadings Widerstand {round(32.501037*exp(-0.052932*ReadingsVal('TH.Kuhlmannweg8','temperature','')),0)}, \
Temp {if (strftime("%H", localtime) < 18) \
{round(1/2*ReadingsVal('TH.Kuhlmannweg8','temperature','') + 1/2*ReadingsVal('DWD.Wetter.Leverkusen','fc0_4_TTT',''),2)} \
else {round(1/2*ReadingsVal('TH.Kuhlmannweg8','temperature','') + 1/2*ReadingsVal('DWD.Wetter.Leverkusen','fc1_4_TTT',''),2)}}, \
Temp_delta {round(2 + 1.25*ReadingsVal('Ueberwachung','UeberwachungEG','') + 1.25*ReadingsVal('Ueberwachung','UeberwachungOG',''),2)}, \
Temp_eff {if (ReadingsVal('HeizungResist','Temp','') < 16 and ReadingsVal('DWD.Wetter.Leverkusen','fc0_4_TTT','') < 18) \
{round(ReadingsVal('HeizungResist','Temp','') + ReadingsVal('HeizungResist','Temp_delta',''),2)} \
elsif (ReadingsVal('HeizungResist','Temp','') >= 16 or ReadingsVal('DWD.Wetter.Leverkusen','fc0_4_TTT','') >= 18) {22}}, \
Widerstand_Forecast {round(32.501037*exp(-0.052932*ReadingsVal('HeizungResist','Temp_eff','')),0)}, \
Zeitstempel {substr(ReadingsTimestamp($name,'Spannung',''),0,16)}


Zu guter letzt noch der Arduino-Sketch, den ich als Datei anhänge.
Wichtig ist hier, dass ich Credentials bei MQTT-Broker definiert habe, die ich natürlich im Sketch auch eintragen muss.
Die WLAN SSID und das zugehörige Passwort sind nicht im Sketch hinterlegt. Es ist ein Webserver vorhanden, auf den man sich z.B. mit dem Handy einloggen kann, und dort kann man dann SSID und Passwort speichern. Ich finde das besser als in allen möglichen Sketchen diese Dinge im Klartext lesen zu können.

Viel Spaß (hoffentlich ;)) und viele Grüße
Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

holle75

Vielen Dank Gisbert für die Mühe. Das .ino hilft mir schon sehr für den Aufbau weiter.

Allerdings werde ich bei MQTT2-Server/Devices bleiben, da ich bis jetzt keinen Nachteil sehen kann und es mir ein "zusätzliches Gerät" (mosquitto) erspart. Und du hast ja geschrieben, ich soll mich Schritt für Schritt rantasten :) ... ein Schritt weniger und MQTT2 fange ich langsam! an zu verstehen.

Jetzt für den Anfang war erstmal entscheidend, den richtigen Weg für den Aufbau für meinen sperrigen Anspruch zu finden. Denke dank euch ist das jetzt erledigt.

Dann lerne ich jetzt mal "arduino"

Nochmals vielen Dank an euch und mit leider allergrößter Sicherheit werden hier noch ganz viele Fragen von mir auftauchen ;)