Anzeige von BMW-Fahrzeugdaten mit Hilfe von bimmer_connected

Begonnen von Jmr008, 22 Mai 2023, 13:39:50

Vorheriges Thema - Nächstes Thema

Jmr008

Hallo,
ich möchte hier meine Lösung zur Anzeige von BMW-Fahrzeugdaten mit Hilfe des Toolsets bimmer_connected (https://github.com/bimmerconnected/bimmer_connected) vorstellen.

Mit der Lösung zeige ich zurzeit die Daten meiner eAutos
- Fahrzeugname
- Reichweite
- soc
- Ladestatus
- Ladeziel
- km
in Fhem an.

Die Daten werden vom BMW-Server geholt. Damit Daten da sind, muss das Fahrzeug bei der MyBMW-App angemeldet sein.

Was ist zu tun:
1: Installation von bimmer_connected und mosquitto auf den fhem-Server .
----
sudo apt-get install python3-pip
sudo pip3 install --upgrade bimmer_connected

und

sudo apt-get install mosquitto-clients
----

2: Script zum Abrufen bei BMW und Weitergeben der Daten an Fhem bauen
----
#!/bin/bash
PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
bimmerconnected status --json bbbbbb pppppp res
t_of_world | mosquitto_pub -h 192.168.1.17 -p 1884 -d -t /bmw -l --quiet
----
Für bbbbbb die eMail-Adresse des MyBMW-Accouts und
für  pppppp das Passwort des MyBMW-Accouts eingeben.
192.168.1.17 ist mein Fhem-Server.
Rechte mit chmod setzen nicht vergessen.
Sobald das Script ausreichend  getestet ist, kann es regelmäßig mit einen cron-job gestartet werden.
Der Port 1884 muss frei sein, ggf. einen anderen nehmen.
Das Script wird noch Fehler melden, da das Ziel  - Port 1884 - auf Fhem noch nicht aktiv ist.

3. Datenempfang in Fhem freischalten
----
define StatusBMW MQTT2_SERVER 1884 global
attr StatusBMW autocreate complex
define MQTT2_StatusBMW MQTT2_DEVICE StatusBMW
attr MQTT2_StatusBMW readingList StatusBMW:/bmw:.* { json2nameValue($EVENT) }
----
Mit dieser Definition werden mit dem Script die Daten in  MQTT2_StatusBMW geschrieben und können bei Readings eingesehen werden.

4. Relevante Daten auswählen
Mit readingsProxy-Definitionen können die gewünschten Daten angezeigt werden.
----
define soc_1 readingsProxy MQTT2_StatusBMW:1_data_state_electricChargingState_chargingLevelPercent
define BMW1 readingsProxy MQTT2_StatusBMW:1_name
define Reichweite_1 readingsProxy MQTT2_StatusBMW:1_fuel_and_battery_remaining_range_total_1
define Ladestatus_1 readingsProxy MQTT2_StatusBMW:1_fuel_and_battery_charging_status
define Ladeziel_1 readingsProxy MQTT2_StatusBMW:1_data_state_chargingProfile_chargingSettings_targetSoc
define km_1 readingsProxy MQTT2_StatusBMW:1_mileage_1
----



Gruß
Jürgen

isy

Ein Weg wird erst zu einem Weg, wenn man ihn geht

isy

#2
Hallo Jürgen,
bin am Starten.

FHEM läuft auf RasPi4 mit Buster.
Zu erst musste ich dies installieren:
sudo apt-get install python3-pip
Danach ließ sich BimmerConnected installieren.
sudo pip3 install --upgrade bimmer_connected
Dein Script in Datei kopieren und Adressen und User/Pass für BMW ändern, ausführbar machen für User PI.
#!/bin/bash
PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin bimmerconnected status --json uuuuuu pppppp rest_of_world | mosquitto_pub -h 192.168.1.86 -p 1884 -d -t /bmw -l --quiet
Frage: An welcher Stelle muss ich das PW für meinen MQTT Server setzen?

Beim Start des Scripts
./getBimmerX1.shmit angepassten Adressen für meinen MQTT2_SERVER komme ich zu folgender FM:

./getBimmerX1.sh: Zeile 2: mosquitto_pub: Kommando nicht gefunden.
DEBUG:asyncio:Using selector: EpollSelector
Traceback (most recent call last):
  File "/usr/local/bin/bimmerconnected", line 10, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.7/dist-packages/bimmer_connected/cli.py", line 356, in main
    loop.run_until_complete(args.func(args))
  File "/usr/lib/python3.7/asyncio/base_events.py", line 584, in run_until_complete
    return future.result()
  File "/usr/local/lib/python3.7/dist-packages/bimmer_connected/cli.py", line 141, in get_status
    print(json.dumps(account.vehicles, cls=MyBMWJSONEncoder))
BrokenPipeError: [Errno 32] Broken pipe

Kannst du bitte was zu dieser FM "mosquitto_pub: Kommando nicht gefunden." sagen?
Ein Weg wird erst zu einem Weg, wenn man ihn geht

Jmr008

#3
Hallo,

bei dir fehlt

sudo apt-get install mosquitto
sudo apt-get install mosquitto-clients

Habe ich jetzt oben eingefügt.
Danke für den Hinweis.
Gruß Jürgen

Geändert: sudo apt-get install mosquitto kann entfallen

Jmr008

#4
Zu
Frage: An welcher Stelle muss ich das PW für meinen MQTT Server setzen?

Ich habe einen separaten MQTT Server definiert. Ohne Pw

Der Aufruf von mosquitto_pub zeigt dir aber alle Möglichkeiten - auch das PW-Setzen

Beta-User

Doofe Fragen von einem Mitleser, der ein "analoges" Konkurenzprodukt fährt:
- Wofür muss mosquitto installiert werden? M.E. ist dieser Schritt überflüssig (Achtung: mosquitto-clients braucht man).
- Warum autocreate "complex"? Da mosquitto_pub (nach dieser Anleitung!) ohne ClientID zu senden scheint, wird autocreate (eigentlich) so oder so nicht aktiv.
- Wo kommt die ClientID (StatusBMW) her? Setzt die irgendwie das (Python-) script oder fehlt da was in der Anleitung?

Würde behaupten, das ganze wird viel einfacher, wenn ein "normaler" MQTT2_SERVER auf Port 1883 das bequem mit erledigt, (der steht im default/ohne gesetztes Attribut auf autocreate simple). Man muss halt dahin publishen und dann Username und Passwort (`man msoquitto_pub`) mitgeben, wenn man das so konfiguriert hat, und ggf. sinnvollerweise auch den Parameter "-i" im mosquuitto_pub-Aufruf ergänzen, wenn man auch noch autocreate haben will....
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

isy

Hallo zusammen,
ich kann aktuell nicht weiter in das Thema einsteigen, dazu fehlt mir der Background bzgl. MQTT / Bimmer / Zeit für Installationen usw. in meinem Testsystem.
Auch noch zu klären, wie ich bei 2 registrierten Fahrzeugen in BMW Connected das E-Auto auswählen kann (in diesem Codeschnipsel?).

Es sah so aus, als liefe der Code mit wenigen Einstellungen.......

VG Helmut

Ein Weg wird erst zu einem Weg, wenn man ihn geht

Jmr008

#7
Zitat von: isy am 24 Mai 2023, 10:02:34Auch noch zu klären, wie ich bei 2 registrierten Fahrzeugen in BMW

Es werden die Daten aller registrierten Autos eingelesen.
Anzeige der Daten für das erste Auto
define BMW1 readingsProxy MQTT2_StatusBMW:1_name

Anzeige der Daten für das zweite Auto
define BMW2 readingsProxy MQTT2_StatusBMW:2_name

Zitat von: isy am 24 Mai 2023, 10:02:34Es sah so aus, als liefe der Code mit wenigen Einstellungen.......
Ich habe den gesamten Code aufgeführt.

isy

Hallo Jürgen,
ich bin ein Stück weiter!

#!/bin/bash
PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin bimmerconnected status --json <bmwUser> <bmwPass> rest_of_world | mosquitto_pub -h 192.168.178.86 -p 1883 -u <mqttUser> -P <mqttPass> -d -t /bmw -l -i MyBMW --quiet

Hiermit wird das von Beta-User vorgeschlagene autocreate genutzt und ein Device MQTT2_MyBMW vom System angelegt.

Läuft schon mal glatt durch, bis auf eine Debug Meldung:
Client MyBMW sending CONNECT
Client MyBMW received CONNACK (0)
DEBUG:asyncio:Using selector: EpollSelector
Client MyBMW sending PUBLISH (d0, q0, r0, m1, '/bmw', ... (20576 bytes))
Client MyBMW sending DISCONNECT

Jürgen, kannst du was zur Debug Meldung sagen? OK?

Die Abfrage braucht eine kurze Zeit.
Damit verbunden deine Erfahrung mit der Häufigkeit der Abfrage über das Skript.
Die SOC Daten brauche ich nur vor bzw. während der Ladung, also alle 5 Minuten oder so.
Ein Triggern des Scripts über FHEM (non-blocking) wäre schön.

VG Helmut
Ein Weg wird erst zu einem Weg, wenn man ihn geht

isy

Auf der MQTT Seite wurde dieses Device angelegt, die Zeile MyBMW:/bmw:.* { json2nameValue($EVENT) } habe ich manuell ergänzt.
Es kommen Readings der Fahrzeuge sauber formatiert zur Weiterverarbeitung in readingsGroup usw., je nach Bedarf.

defmod MQTT2_MyBMW MQTT2_DEVICE MyBMW
attr MQTT2_MyBMW readingList MyBMW:/bmw:.* bmw\
MyBMW:/bmw:.* { json2nameValue($EVENT) }
attr MQTT2_MyBMW room MQTT2_DEVICE

Danke sehr für das Skript!
Ein Weg wird erst zu einem Weg, wenn man ihn geht

isy

Die Abfrage der Daten habe ich ohne Schleifen realisiert:
- Jeweils beim Öffnen und Schließen der Garagen
- Bei jeder Statusänderung der Wallbox


Ein Weg wird erst zu einem Weg, wenn man ihn geht

isy

Hallo Jürgen,
läuft bimmerconnected bei dir heute?
Bei mir bricht der Abruf mit einer langen Fm ab

VG Helmut
Ein Weg wird erst zu einem Weg, wenn man ihn geht

satprofi

gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

isy

Danke für die Info!
Ja, das ist korrekt, VIN ist immer 17-stellig.

Ich habe mittlerweile Python 3.11 installiert, da das neueste Skript bimmer_connected 0.14.3 die Version 3.7 nicht mehr unterstützt.
Ebenso die neueste "pip" Version.

Bringt eine neue FM, die habe ich im GIT mal gepostet.
Dort kümmert sich der Entwickler, hat auch schon geantwortet.

Mal sehen, ob die das wieder hinkriegen.
Ein Weg wird erst zu einem Weg, wenn man ihn geht

Tomk

#14
Funktioniert! Danke...
Mal eine Frage zur Sicherheit: die Daten werden direkt bei den bmw Servern abgefragt, wenn ich das auf Git richtig gesehen haben, oder? Kann man das Passwort irgendwie verschlüsselt speichern?

Und noch eine Frage: würde gerne die standheizung vom TouchScreen zuhause einschalten. Kann man auch Werte schreiben über den Mqtt Server?