Hallo Zusammen,
ich habe nun 3 4 Tage versucht mich mit Hilfe verschiedenster Wiki, Foren und sonstigen Einträgen an das Thema MQTT heranzuwagen. Leider springt der Funkten noch nicht über... evtl. kann mir einer ein wenig auf die Sprünge helfen.
Ich würde gerne die Messwerte einer Enviro Messstation in FHEM einlesen. Das Teil steckt auf einem Pi Zero und wenn man eines der Python examples startet, wirft es Messwerte im Sekundentakt aus. (https://learn.pimoroni.com/tutorial/sandyj/getting-started-with-enviro-plus).
Mit dieser Anpassung (https://github.com/hotplot/enviroplus-mqtt) habe ich (hoffentlich) das Teil dazu gebracht MQTT Events zu senden. Die Config habe ich wie folgt angelegt:
[Unit]
Description=Enviro+ MQTT Logger
After=network.target
[Service]
ExecStart=/usr/bin/python3 /usr/src/enviroplus-mqtt/src/main.py -h 192.168.23.119 -p 1883 --prefix fhem/enviro --client-id enviro --interval 30
WorkingDirectory=/usr/src/enviroplus-mqtt
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
Auf 192.168.23.119 läuft ein leeres Test FHEM indem ich einen MQTT2_SERVER angelegt habe. Dort scheint auch was anzukommen, da das Reading nrclients immer zwischen 1 und 0 umschaltet. Im Log kommt das an:
2020.07.06 12:43:43 4: Connection accepted from myBroker_192.168.23.118_45681
2020.07.06 12:43:43 5: in: CONNECT: (16)(18)(0)(4)MQTT(4)(2)(0)<(0)(6)enviro
2020.07.06 12:43:43 4: myBroker_192.168.23.118_45681 cid:enviro CONNECT V:4 keepAlive:60
2020.07.06 12:43:43 5: out: CONNACK: (2)(0)(0)
2020.07.06 12:43:43 4: Connection closed for myBroker_192.168.23.118_45681: EOF
Und jetzt bin ich lost... Brauche ich nun einen MQTT2_Device, oder ein MQTT2_Client oder MQTT oder MQTT_bridge?!?!
Wenn ich das richtig verstanden habe müsste ENVIRO z.B. über das Topic fhem/enviro/temperatur den Temp Wert über MQTT an den Broker senden.
Kann ich diese Kommunikation irgendwo sehen (ohne Wireshark ;-)) ?
Wie bekomme ich die Messwerte in ein FHEM Gerät um sie entsprechend weiter zu verarbeiten?
Wäre nett wenn mir jemand helfen könnte. Ich hoffe meine Beschreibung ist für den Moment ausreichend.
Hi,
Dein MQTT2_Server sollte eigentlich automatisch ein MQTT2_DEVICE anlegen. Hast Du bei dem zusätzlich was eingestellt? Zeig am Besten ein list von dem MQTT2_Server.
Ich hatte hier (https://heinz-otto.blogspot.com/2019/11/)mal meine Anfänge dokumentiert, vielleicht hilft es Dir.
Gruß Otto
Also:
MMn hast du bis dahin - im Prinzip - alles richtig gemacht. MQTT2_SERVER steht auch per default auf "autocreate simple", was dann - ein aktives Gerät des TYPE autocreate vorausgesetzt - dazu führt, dass alle Infos/mqtt-publishes, die zu einer CID gehören jeweils in einem eigenen MQTT2_DEVICE landen.
Ergo ist das einzige Problem bis dahin, dass dein MQTT-Dienst bisher scheinbar nichts publisht, jedenfalls war aus dem Schnippsel nichts zu erkennen... Würde aber (leeres FHEM?) eher auf ein fehlendes TYPE=autocreate tippen?
Ansonsten kann man den MQTT-Verkehr auch beim MQTT2_SERVER mit RAW-Events sichtbar machen, sowas wie eine Kurzanleitung steht in dem "Praxisbeispielen" im Wiki.
Hallo Otto,
wie gesagt ich stehe mit MQTT ganz am Anfang :-)
Internals:
CFGFN
CONNECTS 571
DEF 1883 global
FD 10
FUUID 5f030911-f33f-64e7-99de-ef00a5e426d729bd
NAME myBroker
NR 14072
PORT 1883
STATE Initialized
TYPE MQTT2_SERVER
READINGS:
2020-07-06 13:51:17 nrclients -1
2020-07-06 13:20:49 state Initialized
clients:
retain:
Attributes:
autocreate simple
room MQTT
verbose 5
"autocreate simple" kannst du gleich wieder löschen. Das entspricht zwar dem default, Rudi empfiehlt aber gerne ausdrücklich, das (bei SERVER) nicht zu setzen (beim CLIENT wäre das was anderes).
Wie Beta-User vermutet - da scheint er nichts weiter zu senden/publishen sondern macht nur connect.
Zitat von: Beta-User am 06 Juli 2020, 13:52:31
Ergo ist das einzige Problem bis dahin, dass dein MQTT-Dienst bisher scheinbar nichts publisht, jedenfalls war aus dem Schnippsel nichts zu erkennen... Würde aber (leeres FHEM?) eher auf ein fehlendes TYPE=autocreate tippen?
Den verdacht habe ich auch, das ENVIRO zwar irgendwas schickt aber ich weiss nicht was. Ich schau mit das mit dem RAW mal an.
Wie wäre es, erst mal zu schauen, ob das autocreate vorhanden ist:
list TYPE=autocreate
Ist so vorhanden wie nach eine frischen fhem installation
Internals:
FUUID 5f025301-f33f-64e7-f0c6-8bfb549d06e814e0
NAME autocreate
NOTIFYDEV global
NR 8
NTFY_ORDER 50-autocreate
STATE active
TYPE autocreate
Attributes:
filelog ./log/%NAME-%Y.log
OK, dann scheint also wirklich bisher einfach noch nichts gesendet worden zu sein...
Ich habe die Bits aus dem verbose 5 Log mit dem Spec abgeglichen: ich sehe keinen Fehler: das Python Script schliesst die Verbindung ohne eine Begruendung direkt nach dem ersten Paketwechsel.
Meldet das Skript einen Fehler?
Funktioniert es mit mosquitto?
Zitat von: rudolfkoenig am 06 Juli 2020, 14:48:29
Ich habe die Bits aus dem verbose 5 Log mit dem Spec abgeglichen: ich sehe keinen Fehler: das Python Script schliesst die Verbindung ohne eine Begruendung direkt nach dem ersten Paketwechsel.
Meldet das Skript einen Fehler?
Funktioniert es mit mosquitto?
Wenn ich den service anhalte und das script auf der Console starte:
python main.py -h 192.168.23.119 -p 1883 --prefix fhem/enviro --client-id enviro --interval 60
Bekomme ich in der tat eine Fehlermeldung:
File "main.py", line 49
sys.exit(f"Connecting to the MQTT server failed: {logger.connection_error}")
^
Es kommt aber dann auch nichts bei MQTT2_Server auf FHEM an. (Kein Log Eintrag)
Mosquito habe ich noch noch getestet, wollte es eigentlich so schlank wie möglich realisieren.
Liege ich denn mit meinem Aufruf richtig? Evtl. habe ich da einen Denkfehler.
main.py -h 192.168.23.119 -p 1883 --prefix fhem/enviro --client-id enviro --interval 60
usage: main.py -h HOST [-p PORT] [-U USERNAME] [-P PASSWORD] [--prefix PREFIX]
[--client-id CLIENT_ID] [--interval INTERVAL] [--delay DELAY]
[--use-pms5003] [--help]
optional arguments:
-h HOST, --host HOST the MQTT host to connect to
-p PORT, --port PORT the port on the MQTT host to connect to
-U USERNAME, --username USERNAME
the MQTT username to connect with
-P PASSWORD, --password PASSWORD
the password to connect with
--prefix PREFIX the topic prefix to use when publishing readings, i.e.
'lounge/enviroplus'
--client-id CLIENT_ID
the MQTT client identifier to use when connecting
--interval INTERVAL the duration in seconds between updates
--delay DELAY the duration in seconds to allow the sensors to
stabilise before starting to publish readings
--use-pms5003 if set, PM readings will be taken from the PMS5003
sensor
--help print this help message and exit
Schau doch mal in meinen Link da steht alles in den ersten Zeilen. Du brauchst nur die mosquitto-clients (keinen Server installieren!)
Dann machst Du eine Zeile in der Art
mosquitto_pub -h 192.168.23.119 -i enviro1 -t fhem/enviro/temperature -m 22
Und schaust was passiert.
Dann wüsstest Du ob die FHEM Seite läuft ;)
hmm, wenn ich das script so aufrufe:
/usr/bin/python3 /usr/src/enviroplus-mqtt/src/main.py -h 192.168.23.119 -p 1883 --prefix fhem/enviro --client-id enviro --interval 60
bekomme ich das...
Traceback (most recent call last):
File "/usr/src/enviroplus-mqtt/src/main.py", line 65, in <module>
main()
File "/usr/src/enviroplus-mqtt/src/main.py", line 40, in main
logger.update(publish_readings=False)
File "/usr/src/enviroplus-mqtt/src/logger.py", line 99, in update
self.samples.append(self.take_readings())
File "/usr/src/enviroplus-mqtt/src/logger.py", line 76, in take_readings
gas_data = gas.read_all()
File "/usr/local/lib/python3.7/dist-packages/enviroplus-0.0.3-py3.7.egg/enviroplus/gas.py", line 79, in read_all
File "/usr/local/lib/python3.7/dist-packages/enviroplus-0.0.3-py3.7.egg/enviroplus/gas.py", line 50, in setup
File "/usr/local/lib/python3.7/dist-packages/ads1015-0.0.5-py3.7.egg/ads1015/__init__.py", line 167, in set_mode
self._ads1015.set('CONFIG', mode=value)
File "/usr/local/lib/python3.7/dist-packages/i2cdevice-0.0.6-py3.7.egg/i2cdevice/__init__.py", line 215, in set
self.read_register(register)
File "/usr/local/lib/python3.7/dist-packages/i2cdevice-0.0.6-py3.7.egg/i2cdevice/__init__.py", line 183, in read_register
self.values[register.name] = self._i2c_read(register.address, register.bit_width)
File "/usr/local/lib/python3.7/dist-packages/i2cdevice-0.0.6-py3.7.egg/i2cdevice/__init__.py", line 283, in _i2c_read
for x in self._i2c.read_i2c_block_data(self._i2c_address, register, bit_width // self._bit_width):
OSError: [Errno 121] Remote I/O error
Ich glaube das Problem liegt erst mal an der MQTT Geschichte auf dem ENVIRO. Ich kann leider kein Python, werde wohl mal den Entwickler anschreiben...
Zitat von: Otto123 am 06 Juli 2020, 15:30:13
Schau doch mal in meinen Link da steht alles in den ersten Zeilen. Du brauchst nur die mosquitto-clients (keinen Server installieren!)
Dann machst Du eine Zeile in der Art
mosquitto_pub -h 192.168.23.119 -i enviro1 -t fhem/enviro/temperature -m 22
Und schaust was passiert.
Dann wüsstest Du ob die FHEM Seite läuft ;)
Danke Otto, das versuche ich erst mal. Ich melde mich wenn ich weitergekommen bin.
Aber mal abgesehen von MQTT, das ENVIRO Modul ist echt klasse, kann sogar Feinstaub messen. Wäre doch mal ein Überlegung wert es direkt in FHEM zu unterstützen. ;) Aber so lerne ich mal wie MQTT arbeitet, ist auch gut, wollte ich mir schon lange man anschauen.
Also in Richtung fhem klappt alles. Ich habe mit MQTT Explorer erfolgreich Topics mit Werten abgesetzt und es wurde direkt ein MQTT2_Device angelegt und die readingList mit samt der Readings angelegt. Das ging dann doch einfacher als ich dachte.
Also muss ich mal tiefer in den ENVIRO einsteigen. Danke schon mal für die Hilfe.
Was ich deinen Links so gesehen habe:
Die python Geschichte ist ja zweiteilig, also zwei Teile wo was schief laufen kann.
Aufruf, Parameter, Bibliotheken, Rechte, User, Gruppen
Also hübsch Stück für Stück manuell testen und untersuchen, der Dienst das es automatisch läuft ist zum Schluss ;)
Das stand was von UART, das ist beim Pi auch etwas speziell.
Welche der Komponenten läuft denn schon?
Ich habe schon echt viel mit Pi´s von Zero bis 4er zum laufen gebracht aber das hier ist echt ne harte Nuss. (für mich) Die verschiedenen Setup Varianten legen unterschiedliche Verzeichnisstrukturen an. Manche Scripte laufen einwandfrei andere brechen mit Syntax Fehlern ab. Ich gehe jetzt mal pennen und fange morgen neu an. Leider stecke ich nicht bis auf die Tiefe eines Softwareentwicklers drin. Scheinbar setzten manche Scripte das Vorhandensein des PMS5003 Sensors vorraus.
Es wird nämlich seit einiger Zeit ein mqtt-all.py Script mit installiert wenn man es aber startet, kommt das:
python3 /home/pi/enviroplus-python/examples/mqtt-all.py --broker 192.168.23.119 --port 1883 --topic enviroplus
mqtt-all.py - Reads temperature, pressure, humidity,
PM2.5, and PM10 from Enviro plus and sends data over mqtt.
broker: 192.168.23.119
port: 1883
topic: enviroplus
Press Ctrl+C to exit!
Raspberry Pi serial: 0000000093510a14
Wi-Fi: connected
MQTT broker IP: 192.168.23.119
CONNACK received with code 0
connected OK
PMS5003 Read Timeout: Failed to read start of frame byte
PMS5003 Read Timeout: Failed to read start of frame byte
PMS5003 Read Timeout: Failed to read start of frame byte
PMS5003 Read Timeout: Failed to read start of frame byte
PMS5003 Read Timeout: Failed to read start of frame byte
PMS5003 Read Timeout: Failed to read start of frame byte
PMS5003 Read Timeout: Failed to read start of frame byte
PMS5003 Read Timeout: Failed to read start of frame byte
PMS5003 Read Timeout: Failed to read start of frame byte
PMS5003 Read Timeout: Failed to read start of frame byte
PMS5003 Read Timeout: Failed to read start of frame byte
PMS5003 Read Timeout: Failed to read start of frame byte
PMS5003 Read Timeout: Failed to read start of frame byte
PMS5003 Read Timeout: Failed to read start of frame byte
PMS5003 Read Timeout: Failed to read start of frame byte
PMS5003 Read Timeout: Failed to read start of frame byte
PMS5003 Read Timeout: Failed to read start of frame byte
PMS5003 Read Timeout: Failed to read start of frame byte
PMS5003 Read Timeout: Failed to read start of frame byte
PMS5003 Read Timeout: Failed to read start of frame byte
ç^CTraceback (most recent call last):
File "/home/pi/enviroplus-python/examples/mqtt-all.py", line 212, in <module>
main()
File "/home/pi/enviroplus-python/examples/mqtt-all.py", line 200, in main
values = read_values(bme280, pms5003)
File "/home/pi/enviroplus-python/examples/mqtt-all.py", line 69, in read_values
pm_values = pms5003.read() # int
File "/usr/local/lib/python3.7/dist-packages/pms5003-0.0.5-py3.7.egg/pms5003/__init__.py", line 125, in read
sof = self._serial.read(1)
File "/usr/local/lib/python3.7/dist-packages/pyserial-3.4-py3.7.egg/serial/serialposix.py", line 483, in read
ready, _, _ = select.select([self.fd, self.pipe_abort_read_r], [], [], timeout.time_left())
KeyboardInterrupt
Die Parameter von mqtt-all.py sind aber nicht dokumentiert. Scheint alles nicht ausgereift zu sein.
Zitat von: Otto123 am 06 Juli 2020, 21:45:24
Was ich deinen Links so gesehen habe:
Die python Geschichte ist ja zweiteilig, also zwei Teile wo was schief laufen kann.
Aufruf, Parameter, Bibliotheken, Rechte, User, Gruppen
Also hübsch Stück für Stück manuell testen und untersuchen, der Dienst das es automatisch läuft ist zum Schluss ;)
Das stand was von UART, das ist beim Pi auch etwas speziell.
Welche der Komponenten läuft denn schon?
Also ich fasse mal zusammen:
- Installation Enviro Board auf Raspi Zero -> läuft
- MQTT Broker auf FHEM -> läuft
- Kommunikation > von PI Zero über Mosquitto Client nach FHEM -> läuft
- Light oder Weather Python Scripts mit Ausgabe an Konsole -> läuft
Der letzte Baustein wäre nun das MQTT Pyhon Script lauffähig zu bekommen. Das scheitert gerade daran, das das Script auf die PMS und Gas Sensoren zugreift, die ich aber beide nicht habe. Der Kommentar des Entwicklers auf meine Frage ob er sein Script an das Enviro Board anpassen könnte (nicht Enviro+ mit PMS) ist:
"
...you would need to comment out a few lines from the existing script, please have a go." ;)
Ich habe jetzt mal wild im Script auskommentiert aber ich bekomme es nicht hin.
@Otto: würdest du mir dabei helfen? Ich habe das Script mal angehängt. Zum Schluss muss dann noch als Service laufen.
Original
values = read_values(bme280, pms5003)
Versuch mal Zeile 200 so zu ändern:
# values = read_values(bme280, pms5003)
values = read_values(bme280)
Zitat von: Otto123 am 07 Juli 2020, 13:49:35
Original
values = read_values(bme280, pms5003)
Versuch mal Zeile 200 so zu ändern:
# values = read_values(bme280, pms5003)
values = read_values(bme280)
Das hatte ich schon mal versucht:
File "mqtt-all.py", line 201
values = read_values(bme280)
^
IndentationError: unexpected indent
Ich habe gestern lange versucht, auch andere Zeilen auszukommentieren aber ich bekomme immer Fehlermeldungen. Am Ende wäre es Glücksache wenn ich die richtigen Zeilen erwische. Ich kann einfach nicht Programmieren. :(
Versuch mal so wie im Anhang. Ich kann es leider nicht testen und habe von der Schlange auch keine wirkliche Ahnung.
Zitat von: Otto123 am 08 Juli 2020, 09:11:56
Versuch mal so wie im Anhang. Ich kann es leider nicht testen und habe von der Schlange auch keine wirkliche Ahnung.
Danke für deine Hilfe, nur leider...
...
name 'pms5003' is not defined
name 'pms5003' is not defined
name 'pms5003' is not defined
name 'pms5003' is not defined
name 'pms5003' is not defined
name 'pms5003' is not defined
^CTraceback (most recent call last):
File "mqtt-new.py", line 200, in main
values = read_values(bme280, pms5003)
NameError: name 'pms5003' is not defined
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "mqtt-new.py", line 212, in <module>
main()
File "mqtt-new.py", line 208, in main
print(e)
KeyboardInterrupt
Wenn ich in der Zeile 200 die folgende Änderung machen:
# values = read_values(bme280, pms5003)
values = read_values(bme280)
kommt das:
read_values() missing 1 required positional argument: 'pms5003'
read_values() missing 1 required positional argument: 'pms5003'
^Cread_values() missing 1 required positional argument: 'pms5003'Traceback (most recent call last):
File "mqtt-new.py", line 201, in main
values = read_values(bme280)
TypeError: read_values() missing 1 required positional argument: 'pms5003'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "mqtt-new.py", line 213, in <module>
main()
File "mqtt-new.py", line 209, in main
print(e)
KeyboardInterrupt
Mittlerweile hat der Developer ein issue auf Git aufgemacht.
https://github.com/robmarkcole/rpi-enviro-mqtt/issues/7
Wenn wir hier nicht zu einer Lösung kommen, dann schreibe ich mal da was rein.
Ich habe jetzt eine Lösung erarbeitet. Das grundsätzliche Problem besteht darin, das es ein Enviro und ein Enviro+ Board gibt das Enviro+ hat zusätzlich einen MICS6814 analog gas sensor. Die Example MQTT Scripts gehen oft von einem Enviro+ Board aus und laufen in einen Fehler wenn man "nur" ein Enviro Board hat.
Ich habe das mitgelieferte mqtt-all.py Script nicht zum laufen bekommen, bin aber mit diesem Projekt erfolgreich gewesen. https://github.com/hotplot/enviroplus-mqtt
Für ein ENVIRO Board kann die angehängte logger.py verwendet werden.
Ich habe hier noch weitergearbeitet und habe das mitgelieferte mqtt-all.py Script angepasst und als Service implementiert. Die Lösung zeigt nun alle Werte auf dem Display und sendet sie per MQTT an FHEM.
Wer Interesse hat dem stelle ich das fertig Pi Zero Image gerne zur Verfügung.