BMW i3-Daten vom Server per MQTT weiterleiten

Begonnen von hasenhirn, 13 Juni 2021, 19:48:44

Vorheriges Thema - Nächstes Thema

xasher

Hallo Rudolf, hallo zusammen,

OK, die Werte die mich interessieren ist Schritt 2. Ich habe das Problem, dass ich entweder alle Werte bekomme, aber gezielt einen einzelnen Wert eben nicht

In der Shell schicke ich die Daten im Prinzip so zu mosquitto:
/home/pi/.local/bin/bimmerconnected status --json $USER $PASS rest_of_world | mosquitto_pub -h 127.0.0.1 -p 1883 -d -t /bmw -l --quiet

in Fhem bekomme ich mit readingList so auch alle Werte angezeigt:
/bmw:.* { json2nameValue($EVENT) }

Ich hätte gerne wie von Hasenhirn oben beschrieben einzelne Werte, die ich selber so benennen kann, wie ich das gerne möchte
Zitat von: hasenhirn am 03 November 2021, 16:53:14
defmod BMW MQTT2_DEVICE MQTT2_Client
attr BMW IODev MQTT2_Client
attr BMW autocreate 0
attr BMW devStateIcon DIS:Typ_2_Stecker@red NOTC:Typ_2_Stecker@blue CHAR:Typ_2_Stecker@green
attr BMW group Autos
attr BMW readingList MQTT2_Client:I3/updateTime_converted_timestamp:.* updateTime_converted_timestamp\
MQTT2_Client:I3/chargingHVStatus:.* chargingHVStatus\
MQTT2_Client:I3/vehicle_tracking:.* vehicle_tracking\
MQTT2_Client:I3/beRemainingRangeElectricKm:.* beRemainingRangeElectricKm\
MQTT2_Client:I3/updateTime_converted_time:.* updateTime_converted_time\
MQTT2_Client:I3/trunk_state:.* trunk_state\


So wie ich das verstehe, nimmt Thomas hier einzelne Werte und gibt ihnen einen Namen
MQTT2_Client:I3/updateTime_converted_time:.* updateTime_converted_time
Ich kapier aber nicht, er greift den Client direkt ab. Das geht bei mir nicht selbst nicht MQTT_Client:.* test
Das einzige was Readings erzeiugt ist das
/bmw:.* { json2nameValue($EVENT) }
Ich will aber nur die vin oder den Akkustand...

Verzweifle etwas :-)

Sorry, hab gerade eine Blockade.

Grüße
Alex

isy

#61
Ich lese hier mal mit! Mein Interesse ist das Auslesen vom SOC meines X1 25E.
Es gibt dazu noch mindestens einen weiteren Thread unter https://forum.fhem.de/index.php?topic=130998.msg1271206#msg1271206

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

satprofi

hallo.
möchte jetzt wieder meinen i3s aktivieren, hänge aber bei den zugangsdaten.
müssen ja in account.py eingetragen werden, aber wie? einfach hinzufügen oder pur ?
class MyBMWAccount:
    """Create a new connection to the MyBMW web service."""

    username: str
    xyz@email.com

    password: InitVar[str]
    passwd

    region: Regions
    """Region of the account. See `api.Regions`."""

    config: MyBMWClientConfiguration = None  # type: ignore[assignment]
    """Optional. If provided, username/password/region are ignored."""

    log_responses: InitVar[bool] = False
    """Optional. If set, all responses from the server will be logged to this directory."""

    observer_position: InitVar[GPSPosition] = None
    """Optional. Required for getting a position on older cars."""

    use_metric_units: InitVar[bool] = True
    """Optional. Use metric units (km, l) by default. Use imperial units (mi, gal) if False."""
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

isy

https://forum.fhem.de/index.php?topic=133692.0
Damit sollte es funktionieren. Installation ist gut erklärt.
Nur wenige Schritte.
Ein Weg wird erst zu einem Weg, wenn man ihn geht

satprofi

danke. passt.
nur wie bekomm ich die readings sauber gelistet?

"isRemoteEngineStartSupported": false, "isRemoteServicesActivationRequired": false, "isRemoteServicesBookingRequired": false, "isScanAndChargeSupported": false, "lastStateCallState": "ACTIVATED", "lights": true, "lock": true, "sendPoi": true, "unlock": true, "vehicleFinder": true, "vehicleStateSource": "LAST_STATE_CALL", "isRemoteHistorySupported": true, "isWifiHotspotServiceSupported": false, "isNonLscFeatureEnabled": false, "isSustainabilitySupported": false, "isSustainabilityAccumulatedViewEnabled": false, "specialThemeSupport": [], "isRemoteParkingSupported": false, "remoteChargingCommands": {}, "isClimateTimerWeeklyActive": false, "digitalKey": {"state": "NOT_AVAILABLE", "vehicleSoftwareUpgradeRequired": false, "bookedServicePackage": "NONE"}, "isPersonalPictureUploadSupported": false, "isPlugAndChargeSupported": false, "isOptimizedChargingSupported": false}}, "fuel_and_battery": {"remaining_range_fuel": [null, null], "remaining_range_electric": [181, "km"], "remaining_range_total": [181, "km"], "remaining_fuel": [null, null], "remaining_fuel_percent": null, "remaining_battery_percent": 89, "charging_status": "NOT_CHARGING", "charging_start_time_no_tz": null, "charging_end_time": null, "is_charger_connected": false, "charging_target": 100, "
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

isy

#65
Hast du die extra Zeile aus meinem Beispiel in das MQTT Device eingetragen?
Ich habe das Script nach dem Vorschlag von beta-user erweitert, damit der MQTT2 Server ein autocreate macht.
Dann wird diese Zeile notwendig.

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

Das Fhem Device bekommt den Namen MyBMW.

Und dann weiter unten den defmod... einsortieren. Darin ist die extra Zeile
Ein Weg wird erst zu einem Weg, wenn man ihn geht

satprofi

Zitat von: isy am 28 Mai 2023, 14:15:25Hast du die extra Zeile aus meinem Beispiel in das MQTT Device eingetragen?
Ich habe das Script nach dem Vorschlag von beta-user erweitert, damit der MQTT2 Server ein autocreate macht.
Dann wird diese Zeile notwendig.

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

Das Fhem Device bekommt den Namen MyBMW.

Und dann weiter unten den defmod... einsortieren. Darin ist die extra Zeile

hallo.
autocreate hab ich , ja. unter readings habe ich nur bmw mit dieser ganzen zeile/daten.

was meinst du mit extra zeile?
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

satprofi

hallo, habs jetzt.
diese zeile meintest du, richtig?
MyBMW:/bmw:.* { json2nameValue($EVENT) }
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

isy

Genau.
Ich will den Thread nicht kapern, muss aber auch gestehen, dass ich eine ganze Weile am Testsystem probiert habe. MQTT ist für mich neu.
Bin unterwegs und poste evtl heute Abend noch meine Lösung mal am Stück.
Das ist dann einfacher zu kopieren
Ein Weg wird erst zu einem Weg, wenn man ihn geht

satprofi

#69
hallo.
wie kann ich einzelne werte ausfiltern? hätte gerne nur die wichtigsten, die mit Zahlen befüllten.
diese z.b. hätte ich gerne unterdrückt

hier gefunden -> https://forum.fhem.de/index.php?topic=133692.msg1276566#msg1276566
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

isy

Ich habe das über eine Readingsgroup gemacht. Es geht aber auch mit Readingsproxy, wie oben im Thread von Jmr008 angegeben.

Heir mein Beispiel.
defmod BMWX1 readingsGroup MQTT2_MyBMW:2_data_state_electricChargingState_chargingLevelPercent MQTT2_MyBMW:2_data_state_electricChargingState_range MQTT2_MyBMW:2_data_state_combustionFuelLevel_remainingFuelLiters MQTT2_MyBMW:2_fuel_and_battery_remaining_range_fuel_1 MQTT2_MyBMW:2_fuel_and_battery_remaining_range_total_1
attr BMWX1 alias BMW X1 xDrive25E
attr BMWX1 group Fahrzeuge
attr BMWX1 mapping {'2_data_state_electricChargingState_chargingLevelPercent' => 'Ladestatus SOC [%}', '2_data_state_electricChargingState_range' => 'Elektr. Reichweite [km]', '2_fuel_and_battery_remaining_range_fuel_1' => 'Verbrenner Reichweite [km]', '2_data_state_combustionFuelLevel_remainingFuelLiters' => 'Aktuelle Tankfüllung [l]', '2_fuel_and_battery_remaining_range_total_1' => 'Gesamte Reichweite [km]'}
attr BMWX1 nostate 1
attr BMWX1 room Garagen

Bei mir ist der X1 das Auto "2". Bei dir einfach eine 1 davor setzen.
Ein Weg wird erst zu einem Weg, wenn man ihn geht

isy

#71
Hier noch mal meine komplette Installation. Basis dafür siehe auch https://forum.fhem.de/index.php?topic=133692.msg1276566#msg1276566 vom User Jmr008. Vielen Dank dafür!

Bedingungen: mqtt2 Server läuft, autocreate aktiviert.

Meine Schritte:
sudo apt-get install python3-pip
sudo pip3 install --upgrade bimmer_connected
sudo apt-get install mosquitto-clients

Dann dieses Script anlegen, User/Pass für BMW und mqtt anpassen und das Script ausführbar machen für "jeden". Ich habe es unter /home/pi angelegt als getBimmer.sh
#!/bin/bash
PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin bimmerconnected status --json <BMW_user> <BMW_Passwort> rest_of_world | mosquitto_pub -h 192.168.xxx.xx -p 1883 -u <mqtt2_user> -P <mqtt2_Passwort> -d -t /bmw -l -i MyBMW --quiet

Testen im Terminal mit ./getBimmer.sh
pi@fhem:~ $ ./getBimmer.sh
Client MyBMW sending CONNECT
Client MyBMW received CONNACK (0)
DEBUG:asyncio:Using selector: EpollSelector
Client MyBMW sending PUBLISH (d0, q0, r0, m1, '/bmw', ... (20464 bytes))
Client MyBMW sending DISCONNECT
pi@fhem:~ $

In FHEM wird damit ein Device "MyBMW" automatisch angelegt.
Dies per defmod drüberkopieren, dann sehen die Readings gut aus:

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

Die Readings (ziemlich runterscrollen) sehen dann in FHEM so aus (Auszug):
1_data_state_climateTimers_3_timerWeekDays_1 MONDAY 2023-05-28 20:02:29
1_data_state_combustionFuelLevel_range 314 2023-05-28 20:02:29
1_data_state_combustionFuelLevel_remainingFuelLiters 26 2023-05-28 20:02:29

Die "1" vorne steht für den ersten BMW in der Connected App. Bei 2 Autos dann die "2" usw.

Ich starte das obige Script nicht per cron-job, sondern ereignisgesteuert und per Button in FHEM.
Immer wenn eine der Garagen sich öffnet oder schließt, oder wenn sich der Status meiner Wallbox ändert oder wenn ich "Update" anklicke.

Mein Beispiel:
defmod getBimmer_notify notify (ga_myGoE:car_state:.*|ga_TK_Tor:.*|ga_TK_TorA:.*|getBimmerUpdate:.*) { fhem("\"/home/pi/getBimmer.sh\"") }
attr getBimmer_notify room System->notify

Und per Button manuell:
defmod getBimmerUpdate dummy
attr getBimmerUpdate alias Update Fahrzeuge
attr getBimmerUpdate group Fahrzeuge
attr getBimmerUpdate icon car@green
attr getBimmerUpdate room Garagen
attr getBimmerUpdate webCmd Update

Anzeigen realisiere ich aktuell über readingsGroup. Das sieht so aus:
defmod BMWX1 readingsGroup MQTT2_MyBMW:2_data_state_electricChargingState_chargingLevelPercent MQTT2_MyBMW:2_data_state_electricChargingState_range MQTT2_MyBMW:2_data_state_combustionFuelLevel_remainingFuelLiters MQTT2_MyBMW:2_fuel_and_battery_remaining_range_fuel_1 MQTT2_MyBMW:2_fuel_and_battery_remaining_range_total_1
attr BMWX1 alias BMW X1 xDrive25E
attr BMWX1 group Fahrzeuge
attr BMWX1 mapping {'2_data_state_electricChargingState_chargingLevelPercent' => 'Ladestatus SOC [%}', '2_data_state_electricChargingState_range' => 'Elektr. Reichweite [km]', '2_fuel_and_battery_remaining_range_fuel_1' => 'Verbrenner Reichweite [km]', '2_data_state_combustionFuelLevel_remainingFuelLiters' => 'Aktuelle Tankfüllung [l]', '2_fuel_and_battery_remaining_range_total_1' => 'Gesamte Reichweite [km]'}
attr BMWX1 nostate 1
attr BMWX1 room Garagen

Der X1 ist mein 2. Fahrzeug, daher die "2" zu Beginn der Readings.

Den Ladezustand nutze ich u.a. in meiner PV-Überschuss-Regelung.
Wenn die Hausbatterie wenig Restkapazität hat und zu wenig Sonne scheint, dann prüfe ich den SOC des X1 und lade 15km Reichweite, da wir ungefähr diese Strecke pro Tag zurücklegen.

Ich hoffe, damit kommen alle Leser zurecht!

VG Helmut












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

satprofi

Zitat von: isy am 29 Mai 2023, 10:41:35Ich starte das obige Script nicht per cron-job, sondern ereignisgesteuert und per Button in FHEM.



Hallo.
Ich machs über at

Mein Beispiel:
define bmwstatus at +*00:15:00 "/usr/local/bin/bmwstatus"

das script in bmwstatus dazu
#!/bin/bash
PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
bimmerconnected status --json user password rest_of_world | mosquitto_pub -h 192.168.0.43 -p 1883 -u DVES_USER -P DVES_USER -d -t /bmw -l -i MyBMW --quiet

user password anpassen !

Rest mache ich mit Stateformat

1_fuel_and_battery_remaining_battery_percent% , 1_fuel_and_battery_remaining_range_electric_1 km <br>
1_mileage_1 km , 1_data_state_doorsState_combinedState <br>
1_data_state_location_address_formatted<br>1_fuel_and_battery_charging_status , fertig in 1_data_state_electricChargingState_remainingChargingMinutes min

jetzt noch ans FTUI anpassen.

Dank allen die hier Infos beigetragen haben.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram