tillsteinbach/WeConnect-mqtt

WeConnect in Verbindung mit FHEM verwenden

Closed this issue · 28 comments

Bevor ich mit der Eingabe in FHEM nach deinem Beispiel beginnen werde, möchte ich erstmal probieren ob die Installation auf dem Raspberry funktioniert.
Ich habe "pip3 install weconnect-mqtt" ausgeführt und anschließend "pip3 install weconnect-mqtt --upgrade".
Alles wurde ohne Fehlermeldung installiert. Anschließend noch ein sudo reboot.
Um zu prüfen ob es funktioniert und eine Verbindung aufgebaut wird habe ich folgendes eingegeben (natürlich mit den richtigen Daten:
pi@raspberrypi:~ $ weconnect-mqtt --username xxxxxxxxxxxxx@koeln.de --password xxxx1234 --spin xxxx --mqttbroker 192.168.0.1

Als Fehlermeldung kommt danach diese Meldung:

Traceback (most recent call last):
File "/home/pi/.local/bin/weconnect-mqtt", line 8, in
sys.exit(main())
File "/home/pi/.local/lib/python3.9/site-packages/weconnect_mqtt/weconnect_mqtt_base.py", line 332, in main
mqttCLient.connect(args.mqttbroker, args.mqttport, args.mqttkeepalive)
File "/home/pi/.local/lib/python3.9/site-packages/paho/mqtt/client.py", line 914, in connect
return self.reconnect()
File "/home/pi/.local/lib/python3.9/site-packages/paho/mqtt/client.py", line 1044, in reconnect
sock = self._create_socket_connection()
File "/home/pi/.local/lib/python3.9/site-packages/paho/mqtt/client.py", line 3685, in _create_socket_connection
return socket.create_connection(addr, timeout=self._connect_timeout, source_address=source)
File "/usr/lib/python3.9/socket.py", line 843, in create_connection
raise err
File "/usr/lib/python3.9/socket.py", line 831, in create_connection
sock.connect(sa)
socket.timeout: timed out

Was habe ich da falsch gemacht oder nicht richtig verstanden?
Gruß aus Köln
Norbert

Hallo Norbert, ich kann nur raten dass dein mqttbroker nicht unter der IP oder dem standard Port erreichbar ist.

Ich habe jetzt die Netzweradresse des Raspi eingegeben , auf dem ich die ganze WeConnect Installation gemacht habe und auf dem auch FHEM läuft.
Ich hoffe das ist richtig so.
Folgende Meldung kommt dann:
2023-10-05T12:06:27+0200:ERROR:weconnect_mqtt_base:Could not connect to MQTT-Server: [Errno 111] Connection refused, will retry in 10 seconds
2023-10-05T12:06:37+0200:ERROR:weconnect_mqtt_base:Could not connect to MQTT-Server: [Errno 111] Connection refused, will retry in 10 seconds
2023-10-05T12:06:47+0200:ERROR:weconnect_mqtt_base:Could not connect to MQTT-Server: [Errno 111] Connection refused, will retry in 10 seconds

Gruß
Norbert

Ist FHEM denn als MQTT Broker konfiguriert?

Ja, ich habe MQTT Broker installiert.
Ich habe dann erst mal gestoppt, weil das WeConnect Portal von VW Anfang November geschlossen wird und durch ein neues Portal und seit gestern auch durch eine neue App ersetzt wird, My Volkswagen.
Ich weiß ja nicht ob dein WeConnect-mqtt damit weiter funktioniert.
Wenn dem so ist, werde ich mit der Einrichtung natürlich weiter machen.
Gruß aus Köln
Norbert

WeConnect-mqtt benutzt die neue API die auch durch die Volkswagen App verwendet wird

Ich habe wie folgt alles neu installiert:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get --purge -y autoremove
sudo cpan install Net::MQTT:Simple
sudo cpan install Net::MQTT:Constants
sudo apt-get install libjpeg-dev
sudo reboot
pip3 install weconnect-mqtt
pip3 install weconnect-mqtt --upgrade
sudo reboot
in FHEM:
defmod myBroker MQTT2_SERVER 1883 global
define mymqttbroker MQTT2_CLIENT mymqttbroker:1883 clientId= fhem username= user
define MyCar MQTT2_DEVICE mit der FIN

danach im Terminal:
weconnect-mqtt --username ##########@koeln.de --password ####1234 --spin #### --mqttbroker

Danach bleibt der Raspberry stehen und reagiert nicht mehr.
In FHEM tauchen mehrere Readings mit Details des Fahrzeugs unter "MQTT2_myBroker" auf und eine große ReadingList.

Der Raspberry läßt sich erst wieder bedienen, wenn ich in FHEM einen Neustart mache. Folgendes erscheint dann:

^CTraceback (most recent call last):
File "/home/pi/.local/bin/weconnect-mqtt", line 8, in
sys.exit(main())
File "/home/pi/.local/lib/python3.9/site-packages/weconnect_mqtt/weconnect_mqtt_base.py", line 353, in main
mqttCLient.disconnect()
File "/home/pi/.local/lib/python3.9/site-packages/weconnect_mqtt/weconnect_mqtt_base.py", line 435, in disconnect
disconectPublish.wait_for_publish()
File "/home/pi/.local/lib/python3.9/site-packages/paho/mqtt/client.py", line 371, in wait_for_publish
self._condition.wait(timeout_tenth)
File "/usr/lib/python3.9/threading.py", line 312, in wait
waiter.acquire()
KeyboardInterrupt

Gehe ich dann mit CTRL-Z weiter erscheinen diese Fehlermeldungen:

KeyboardInterrupt
-bash: :s^CTraceback (most recent call last):: substitution failed
-bash: syntax error near unexpected token newline' -bash: syntax error near unexpected token main'
-bash: File: command not found
-bash: syntax error near unexpected token File' -bash: syntax error near unexpected token File'
-bash: syntax error near unexpected token timeout_tenth' -bash: File: command not found -bash: syntax error near unexpected token KeyboardInterrupt'
pi@raspberrypi:~ $

Woran liegt das und was mache ich falsch?
Gruß
Nobbi

sieht alles richtig aus. Wenn du den Befehl mit -vv startest dann siehst du auch dass was passiert. Was du vermutlich willst ist dass weconnect-mqtt beim Systemstart gestartet wird. Ein Beispiel wie das z.B. mit systemd geht ist hier: https://github.com/tillsteinbach/WeConnect-mqtt/tree/main/autostart/systemd

Hallo Till,

Ich habe die Datei „weconnect-mqtt.service“ editiert mit meinen Daten und nach /etc/systemd/system/weconnect-mqtt.service kopiert und die Rechte auf 644 gesetzt. User=yourunixusername habe ich nicht editiert. Nach dem Aufruf mit weconnect-mqtt pasiert nichts. mit dem Aufruf sudo systemctl status weconnect-mqtt kommen folgende Hinweise:

pi@raspberrypi:~ $ sudo systemctl status weconnect-mqtt
● weconnect-mqtt.service - WeConnect-mqtt
Loaded: loaded (/etc/systemd/system/weconnect-mqtt.service; disabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Fri 2023-10-20 13:39:32 CEST; 1min 27s ago
Process: 791 ExecStart=/usr/bin/python -m weconnect-mqtt --username xxxxxxxx@koeln.de --password xxxxx123--spin 1234 --mqttbroker 192.168.xxx.xx --convert-times Europe/Berlin>
Main PID: 791 (code=exited, status=217/USER)
CPU: 0

Oct 20 13:39:32 raspberrypi systemd[1]: Started WeConnect-mqtt.
Oct 20 13:39:32 raspberrypi systemd[1]: weconnect-mqtt.service: Main process exited, code=exited, status=217/USER
Oct 20 13:39:32 raspberrypi systemd[1]: weconnect-mqtt.service: Failed with result 'exit-code'.
lines 1-10/10 (END)
Beim direkten Aufruf funktioniert es noch.

Gruß
Nobbi

User=yourunixusername wenn es als Root ausgeführt werden soll, vielleicht mal Root da eintragen probieren. Ansonsten sieht es im Log so aus alsob da ein Leerzeichen zwischen Passwort und —Spin fehlt

Der Fehler mit dem Leerzeichen ist beim Kopieren entstanden. Eingabe ist OK. User=root habe ich geändert, änliche Fehlermeldung kommt raus.

pi@raspberrypi:~ $ sudo systemctl start weconnect-mqtt
pi@raspberrypi:~ $ sudo systemctl status weconnect-mqtt
● weconnect-mqtt.service - WeConnect-mqtt
Loaded: loaded (/etc/systemd/system/weconnect-mqtt.service; disabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Fri 2023-10-20 15:23:08 CEST; 1min 1s ago
Process: 851 ExecStart=/usr/bin/python -m weconnect-mqtt --username xxxxxxxxxxxx@koeln.de --password xxxx1234 --spin 1234 --mqttbroker 192.168.xxx.xx --convert-times Europe/Berlin
Main PID: 851 (code=exited, status=1/FAILURE)
CPU: 312ms

Oct 20 15:23:08 raspberrypi systemd[1]: Started WeConnect-mqtt.
Oct 20 15:23:08 raspberrypi python[851]: /usr/bin/python: No module named weconnect-mqtt
Oct 20 15:23:08 raspberrypi systemd[1]: weconnect-mqtt.service: Main process exited, code=exited, status=1/FAILURE
Oct 20 15:23:08 raspberrypi systemd[1]: weconnect-mqtt.service: Failed with result 'exit-code'.
lines 1-11/11 (END)

Ahh, it does not find the module. Maybe you can change to user root and reinstall everything, or you try to execute the script as the user you used for installing.

Auf allen Raspis melde ich mit dem User "pi" an und führe dann alle Installationen mit sudo...... aus.

Dann vielleicht mal user=pi probieren

Hallo Till
Habe gleich als erste Idee gehabt und auch schon mit "pi" und mit "root" probiert. Geht beides nicht.
Ich möchte ganz einfach wenn ich in FHEM zB. My Car aufrufe über {system("sudo systemctl start weconnect-mqtt")} gleichzeitig die Abfrage der Fahrzeugdaten starten. Wenn diese Daten alle gelesen sind schließe ich über {system("sudo systemctl stop weconnect-mqtt")} aus FHEM heraus wieder die Abfrage von Weconnect. Deshalb möchte ich gerne das Script von dir nutzen, aber warum es nicht funktioniert weiß ich nicht und um das herauszufinden reichen meine Kenntnisse sicher nicht aus. Vielleicht gibt es ja auch eine einfachere Lösung für mein Problem.......?
Gruß aus Köln
Norbert

Hallo Till,
ich muß mich noch mal melden, weil ich dein Programm toll finde und ich es gerne benutzen möchte.
Ich habe am Wochenende etliche Zeit damit verbracht das Tool ans laufen zu bekommen.
Ich habe einen Raspi komplett neu installiert, angefangen mit Bullseye und mit Fhem komplett neu. Alle Installationen und Einstellungen habe ich als Root User vorgenommen.

sudo apt-get update
sudo apt-get upgrade
sudo apt-get --purge -y autoremove
sudo cpan install Net::MQTT:Simple
sudo cpan install Net::MQTT:Constants
sudo apt-get install libjpeg-dev
sudo reboot
pip3 install weconnect-mqtt
pip3 install weconnect-mqtt --upgrade
sudo reboot
in Fhem dann:
defmod myBroker MQTT2_SERVER 1883 global
define mymqttbroker MQTT2_CLIENT mymqttbroker:1883 (clientId= fhem, username= user, dann Passwort v. Raspi eingeben)
define MyCar MQTT2_DEVICE

dann Eingabe mit dem üblichen: weconnect-mqtt --username --password --spin --mqttbroker --convert-times Europe/Berlin
Ergebniss = funktioniert in Fhem einwandfrei
beendet mit Strg+Z (geht leider nicht anders, deshalb die Start-Stop Installation von Dir)

Zuerst die Datei „weconnect-mqtt.service“ editiert (User=root) und nach /etc/systemd/system/ kopiert und Rechte auf 644 gesetzt.
Dann die Eingabe sudo systemctl start weconnect-mqtt (Immer noch alles als User-Root)
keine Fehlermeldung, passiert aber auch nichts, dann habe ich die Status Abfrage gemacht:

root@raspberrypi:/home/pi# sudo systemctl status weconnect-mqtt
● weconnect-mqtt.service - WeConnect-mqtt
Loaded: loaded (/etc/systemd/system/weconnect-mqtt.service; disabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Mon 2023-10-23 10:46:37 CEST; 13s ago
Process: 9089 ExecStart=/usr/bin/python -m weconnect-mqtt --username xxx@koeln.de --password xxx --spin xxx
--mqttbroker xxx --convert-times Europe/Berlin
Main PID: 9089 (code=exited, status=1/FAILURE)
CPU: 279ms

Oct 23 10:46:37 raspberrypi systemd[1]: Started WeConnect-mqtt.
Oct 23 10:46:37 raspberrypi python[9089]: /usr/bin/python: No module named weconnect-mqtt
Oct 23 10:46:37 raspberrypi systemd[1]: weconnect-mqtt.service: Main process exited, code=exited, status=1/FAILURE
Oct 23 10:46:37 raspberrypi systemd[1]: weconnect-mqtt.service: Failed with result 'exit-code'.
lines 1-11/11 (END)

Irgendwo muß in dem Code ein Fehler sein, denn über den Pfad /usr/bin/python findet das Programm nicht das Modul weconnect-mqtt. Nach mehreren Versuchen komme ich immer zum gleichen Ergebnis. Ich habe mich genau an alle Anweisungen gehalten. Vielleicht fehlt auch noch was.
Hast du das denn mal probiert ob das in dieser Konstellation wirklich funktioniert?

Es wäre klasse, wenn ich das Programm auch benutzen könnte. Ich muß das Programm nur mit einem Befehl starten und mit einem Befehl beenden können. Selbst ein Timer der das Programm nach einer bestimmten Zeit beendet, wär schon eine Lösung.

Grüße aus Köln
Norbert

Hallo Till,
nachdem ich dein Tool nicht über FHEM starten kann, weil der username "@" enthält, habe ich mir gedacht das ganze über .netrc zu machen. Ich habe die Datei erstellt:

For the MQTTBroker

machine 192.168.xxx.xx
login xxxxxxxxxxxxxxx@koeln.de
password xxxx1234

und ins home/pi Verzeichniss kopiert.
Dann starte ich mit: root@raspberrypi:/home/pi# weconnect-mqtt --netrc NETRC --mqttbroker 192.168.xxxx.xx
und bekomme die Fehlermeldung:
:ERROR:weconnect_mqtt_base:NETRC netrc-file was not found. Create it or provide at least a username with --username

Wo muß die Datei denn liegen oder was muß ich noch machen, damit sie gefunden wird?

Gruß aus Köln
Nobbi

Hallo Nobbi,

es wird die .netrc genommen die dem User gehört. Wenn du also mit root startest musst du das file im home Verzeichnis vom root user ablegen

Viele Grüße
Till

Hallo Till,

ich habe die .netrc Datei in:
root
home
home/pi

untergebracht und habe mich als user pi und als user root (sudo su) eingeloggt
und eingegeben "weconnect-mqtt --netrc NETRC" und auch mit "weconnect-mqtt --netrc /home/pi/NETRC" probiert.
In allen Fällen erhalte ich als Meldung:
usage: weconnect-mqtt [-h] [--v............................................INGDATEFORMAT] [--hide-repeated-log]
weconnect-mqtt: error: the following arguments are required: --mqttbroker

Die Datei wird immer noch nicht gefunden nicht gefunden. Dabei ist das eigendlich ziemlich klar und einfach, aber bei mir funktioniert es nicht.
Warum?

Gruß
Nobbi

Hallo Nobbi, der Fehler ist ja nun anders, du hast vergessen die Adresse von deinem Broker anzugeben.

Hallo Till, ja sieht so aus, das habe ich jetzt nochmal versucht mit user=pi und user=root mit folgendem Ergebnis:

pi@raspberrypi:~ $ weconnect-mqtt --netrc NETRC --mqttbroker 192.168.xxx.xx
2023-10-31T14:10:15+0100:ERROR:weconnect_mqtt_base:NETRC netrc-file was not found. Create it or provide at least a username with --username
pi@raspberrypi:~ $ sudo su

root@raspberrypi:/home/pi# weconnect-mqtt --netrc NETRC --mqttbroker 192.168.xxx.xx
2023-10-31T14:10:57+0100:ERROR:weconnect_mqtt_base:NETRC netrc-file was not found. Create it or provide at least a username with --username

Das Program "meckert" wahrscheinlich immer wenn die Angabe des mqttbroker fehlt, unabhängig davon ob der .netrc File vorhanden ist oder nicht und sucht erst danach nach dem .netrc File. Wenn der dann nicht gefunden wird, soll man den username eingeben.

2.Versuch mit vorangestelltem mqttbroker und Pfadangabe:

pi@raspberrypi:~ $ weconnect-mqtt --mqttbroker 192.168.115.64 --netrc /home/pi/NETRC
2023-10-31T16:02:03+0100:ERROR:weconnect_mqtt_base:/home/pi/NETRC netrc-file was not found. Create it or provide at least a username with --username
pi@raspberrypi:~ $ sudo su
root@raspberrypi:/home/pi# weconnect-mqtt --mqttbroker 192.168.115.64 --netrc /home/pi/NETRC
2023-10-31T16:03:01+0100:ERROR:weconnect_mqtt_base:/home/pi/NETRC netrc-file was not found. Create it or provide at least a username with --username
root@raspberrypi:/home/pi# weconnect-mqtt --mqttbroker 192.168.115.64 --netrc /root/NETRC
2023-10-31T16:03:20+0100:ERROR:weconnect_mqtt_base:/root/NETRC netrc-file was not found. Create it or provide at least a username with --username

Leider auch ohne Erfolg. Die Datei wird einfach nicht gefunden.
Woran kann das jetzt noch liegen?

Was sagt ein ls-alh in dem Verzeichnis? Das .netrc muss dem
User gehören und 0600 also nur vom User lesbar sein.

ls- alh antwortet mit:

pi@raspberrypi:~ $ ls -alh
total 25M
drwxr-xr-x 16 pi pi 4.0K Oct 31 17:52 .
drwxr-xr-x 3 root root 4.0K Oct 31 16:30 ..
-rw------- 1 pi pi 7.1K Oct 31 17:59 .bash_history
-rw-r--r-- 1 pi pi 220 May 3 02:07 .bash_logout
-rw-r--r-- 1 pi pi 3.5K May 3 02:07 .bashrc
drwxr-xr-x 2 pi pi 4.0K May 3 02:16 Bookshelf
drwxr-xr-x 6 pi pi 4.0K Sep 21 17:56 .cache
drwx------ 6 pi pi 4.0K May 3 02:37 .config
drwxr-xr-x 2 pi pi 4.0K May 3 02:37 Desktop
drwxr-xr-x 2 pi pi 4.0K May 3 02:37 Documents
drwxr-xr-x 2 pi pi 4.0K May 3 02:37 Downloads
-rw-r--r-- 1 root root 25M Jan 15 2023 fhem-6.2.deb
drwxr-xr-x 4 pi pi 4.0K Sep 21 17:56 .local
drwxr-xr-x 2 pi pi 4.0K May 3 02:37 Music
-rw------- 1 pi pi 107 Oct 31 17:56 .netrc
drwxr-xr-x 2 pi pi 4.0K May 3 02:37 Pictures
-rw-r--r-- 1 pi pi 807 May 3 02:07 .profile
drwxr-xr-x 2 pi pi 4.0K May 3 02:37 Public
drwxr-xr-x 2 pi pi 4.0K May 3 02:37 Templates
drwxr-xr-x 4 pi pi 4.0K Oct 15 21:46 upsplus
drwxr-xr-x 2 pi pi 4.0K May 3 02:37 Videos
drwxr-xr-x 12 pi pi 4.0K Sep 22 17:45 wiringpi
-rw------- 1 pi pi 56 Aug 20 20:38 .Xauthority
-rw------- 1 pi pi 2.5K Aug 20 20:39 .xsession-errors
-rw------- 1 pi pi 2.5K Aug 20 20:05 .xsession-errors.old
pi@raspberrypi:~ $

Was ich noch nicht verstehe, gibst du den —netrc parameter an? Den kannst du weglassen wenn das file an der richtigen Stelle liegt. Wenn es woanders ist muss da genau der Pfad zum file rein.

Ich gebe folgendes ein in /home/pi/ wo auch der file liegt, ohne weitere parameter:
pi@raspberrypi:~ $ weconnect-mqtt --mqttbroker 192.168.xxx.xx --netrc NETRC

2023-10-31T18:18:09+0100:ERROR:weconnect_mqtt_base:NETRC netrc-file was not found. Create it or provide at least a username with --username
pi@raspberrypi:~

Statt NETRC machst du den Pfad zum file?

meist du so?

pi@raspberrypi:~ $ weconnect-mqtt --mqttbroker 192.168.xxx.xx --netrc /home/pi/
Traceback (most recent call last):
File "/usr/local/bin/weconnect-mqtt", line 8, in
sys.exit(main())
File "/usr/local/lib/python3.9/dist-packages/weconnect_mqtt/weconnect_mqtt_base.py", line 187, in main
secrets = netrc.netrc(file=args.netrc)
File "/usr/lib/python3.9/netrc.py", line 29, in init
with open(file) as fp:
IsADirectoryError: [Errno 21] Is a directory: '/home/pi/'

Nein, wirklich den Pfad bis zur Datei. Also .netrc noch dazu

damit geht es:
weconnect-mqtt --mqttbroker 192.168.xxx.xx --convert-times Europe/Berlin --netrc /home/pi/.netrc

Jetzt muß ich das ganze noch in Fhem "einbauen".

Vielen Dank für deine Hilfe
Gruß
Nobbi aus Köln