BMW i3-Daten vom Server per MQTT weiterleiten

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

Vorheriges Thema - Nächstes Thema

hasenhirn

Moin,

ich habe mal ein kleines Programm gebastelt um Daten vom I3s meiner Frau per MQTT in FHEM weiterzuleiten.
Die Idee und Programmteile habe ich von Rumbel aus dem Active-Tourer-Forum.de geklaut  - danke dafür :-)
Als erste info, ich habe keine Ahnung vom Programmieren, aber scheint trotzdem zu funktionieren  ;D ;D ;D
Wenn jemand daran Interesse hat kann er es gerne verwende oder abändern.
Ich übernehme aber keine Haftung für das Programm - Nutzung ist auf eigene Gefahr!!!

Wer es mal ausprobieren möchte, einfach den Code in eine Datei oder den Anhang nehmen und z.B. auf einem RasPi mit "sudo ./I3_Info.pl &" im Verzeichniss in der die Datei liegt starten. Natürlich müssen vorher die Zugangsdaten und die Daten für den MQTT-Server angepasst werden.
Viel Spaß damit!!!

Gruß
Thomas

Die URL von BMW hat sich geändert. Siehe Post 7 hier => https://forum.fhem.de/index.php/topic,121625.msg1190749.html#msg1190749

#!/usr/bin/perl

##########################################################
#
# Author : Thomas O.
#
# Version : 0.1
#
# Zweck : Daten für den I3 vom BMW-Server laden und an einen MQTT-Server weiterleiten
#
# Idee und Progammteile geklaut von Rumbel aus dem Active-Tourer-Forum.de  - danke dafür :-)
#
# Das Programm kann gerne von jedem verwendet, verändert oder sonst etwas damit gemacht werden.
# Ich übernehme KEINE Haftung für irgendwelche Schäden oder Fehlfunktionen!!!

##########################################################

use strict;
use warnings;
use POSIX;
use LWP::UserAgent ();
use Data::Dumper;
use JSON::Parse ':all';
use POSIX qw(strftime);
use XML::Simple qw(:strict);
use Net::MQTT::Simple;

########### Diese Daten müssen angepasst werden #######################################################

my $MQTT_IP = "192.168.1.38";
my $MQTT_Port = "1883";
my $mqtt_username = "user";
my $mqtt_password = "passwort";
my $User = 'BMW_Username@t-Offline.de';
my $Pass = "BMW_Passwort";
my $VIN = "WBY12345678901234";# Bei der VIN müssen alle 17 Stellen eingegeben werden
 
########### Diese Daten müssen angepasst werden #######################################################

my $abrufdauer = "300";#Pause zwische den Abrufen
my $dataurl = "https://www.bmw-connecteddrive.com/api/vehicle";
my $authurl = "https://customer.bmwgroup.com/gcdm/oauth/authenticate";
my $modul = "";
my $modul_1 = "dynamic";
my $modul_2 = "service";
my $modul_3 = "navigation";
my $rep = "";
my $DEBUG = 0;
my $Bearer = "Pv8MTRaNjsaXL5rIY5mq2i1DONjRuuiP";
my $BearerValidUntil = "1623578914";
my $AnzahlBearerAbrufe = 0;
my $mqtt = "";
my @Werte = ('remaining_range', 'updateTime_converted_timestamp', 'chargingHVStatus', 'vehicle_tracking', 'beRemainingRangeElectricKm', 'updateTime_converted_time', 'trunk_state', 'overall_energy_consumption', 'mileage', 'condition_based_services', 'Segment_LastTrip_time_segment_end_formatted_date', 'heading', 'door_passenger_rear', 'chargingLevelHv', 'updateTime', 'beEnergyLevelHv', 'battery_size_max', 'remaining_charging_time_minutes', 'connectorStatus', 'Segment_LastTrip_ratio_electric_driven_distance', 'lights_parking', 'door_passenger_front', 'updateTime_converted_date', 'unitOfEnergy', 'soc_hv_percent', 'window_driver_front', 'beChargingLevelHv', 'hood_state', 'unitOfCombustionConsumption', 'lsc_trigger', 'Segment_LastTrip_time_segment_end_formatted_time', 'gps_lng', 'beRemainingRangeElectric', 'gps_lat', 'remaining_fuel', 'lastUpdateReason', 'charging_status', 'beRemainingRangeFuelMile', 'charging_connection_type', 'beMaxRangeElectricKm', 'lastChargingEndReason', 'Segment_LastTrip_time_segment_end_formatted', 'door_lock_state', 'single_immediate_charging', 'beMaxRangeElectric', 'beRemainingRangeFuel', 'unitOfLength', 'door_driver_front', 'updateTime_converted', 'beRemainingRangeElectricMile', 'window_passenger_front', 'door_driver_rear', 'unitOfElectricConsumption', 'kombi_current_remaining_range_fuel', 'beRemainingRangeFuelKm', 'Segment_LastTrip_time_segment_end');

################################################################################################################################

# i3Info
{
print "i3Info Start \n" if $DEBUG  > 0 ;
i3Info_MQTT_Login();
while (1) {
my $BearerAbruf = 0;
print "Bearer : $Bearer \n"  if $DEBUG  > 1;
print "BearerValidUntil : " if $DEBUG  > 1;
print strftime(" %d.%m.%Y - %H:%M:%S", localtime($BearerValidUntil))  if $DEBUG  > 1;
print "\n"  if $DEBUG  > 1;
if ( $Bearer eq "" ) {
    print "Bearer leer \n"  if $DEBUG  > 1;
    $BearerAbruf = i3Info_BearerAbruf();
}
if ( $BearerValidUntil <= time()) {
    print "Bearer abgelaufen \n"  if $DEBUG  > 1;
    $BearerAbruf = i3Info_BearerAbruf();
}
if ( $BearerAbruf eq 0 ) {
     $modul = $modul_1;
     i3Info_Datenabruf();
     i3Info_Datenauswertung();
#     $modul = $modul_2;
#     i3Info_Datenabruf();
#     i3Info_Datenauswertung();
#     $modul = $modul_3;
#     i3Info_Datenabruf();
#     i3Info_Datenauswertung();
    }
    sleep $abrufdauer;
    }
print "i3Info Ende \n" if $DEBUG > 0 ;
}

################################################################################################################################

sub i3Info_Datenauswertung()
{
print "i3Info_Datenauswertung Start \n" if $DEBUG  > 0 ;
my $content=parse_json($rep->decoded_content());
#print Dumper($content);
my $i = 0;
while ($i <= $#Werte) {
$mqtt->publish("I3/$Werte[$i]", "$content->{attributesMap}->{$Werte[$i]}");
#    print $content->{attributesMap}->{$Werte[$i]}. " $Werte[$i] \n";
$i++;
}
print "i3Info_Datenauswertung Ende \n" if $DEBUG  > 0 ;
}

################################################################################################################################

sub i3Info_MQTT_Login()
{
$ENV{MQTT_SIMPLE_ALLOW_INSECURE_LOGIN} = 1; #Unverschlüsselte Verbindung mit Login erlaubt
$mqtt = Net::MQTT::Simple->new( "$MQTT_IP:$MQTT_Port");
if($mqtt_username and $mqtt_password) {
    $mqtt->login($mqtt_username, $mqtt_password);
}
#$mqtt->disconnect();
}

################################################################################################################################

sub i3Info_BearerAbruf()
{
print "i3Info_BearerAbruf Start \n" if $DEBUG  > 0;
my $Bearerexpires = 0;
my $Zugangsdatentest = i3Info_Zugangsdatentest();
print "Zugangsdatentest : $Zugangsdatentest \n" if $DEBUG  > 0;
if ($Zugangsdatentest eq "OK")
    {
    print "AnzahlBearerAbrufe : $AnzahlBearerAbrufe \n"  if $DEBUG  > 1;   
     if ( $AnzahlBearerAbrufe < 3 )
        {
        my $Browser = LWP::UserAgent->new;
        $Browser->timeout(10);
        $Browser->agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"); 
        $Browser->default_header('Content-Type' => "application/x-www-form-urlencode");
        $Browser->default_header("Accept" => "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
        $Browser->max_redirect(1);
        $Browser->add_handler( response_header =>  sub { my($response, $ua, $h,$data) = @_; $rep = $response; }  );
        $Browser->post("$authurl?username=$User&password=$Pass&client_id=dbf0a542-ebd1-4ff0-a9a7-55172fbfce35&redirect_uri=https%3A%2F%2Fwww.bmw-connecteddrive.com%2Fapp%2Fdefault%2Fstatic%2Fexternal-dispatch.html&response_type=token&scope=authenticate_user%20fupo&state=eyJtYXJrZXQiOiJkZSIsImxhbmd1YWdlIjoiZGUiLCJkZXN0aW5hdGlvbiI6InVzZXJEYXNoYm9hcmQiLCJwYXJhbWV0ZXJzIjoie30ifQ&locale=DE-de");
        print $rep->code if $DEBUG  > 1;
        print " \n" if $DEBUG  > 1;
        my $Bearerdata = $rep->header("Location");
        print " Bearerdata : $Bearerdata \n"if $DEBUG  > 0;
        if ( $Bearerdata eq "https://www.bmw-connecteddrive.com/app/default/static/external-dispatch.html?error=access_denied" )
        {
        $AnzahlBearerAbrufe++ ;
        print " Fehler beim Abruf - neuer Versuch \n"if $DEBUG  > 0;
        i3Info_BearerAbruf();
        }
        $Browser->remove_handler( undef );
        $Bearerdata =~ s/.*access_token=([^&]*).*expires_in=([^&]*).*/$1,$2/;
        ($Bearer, $Bearerexpires) = split(/,/,$Bearerdata);
        $BearerValidUntil = time() + $Bearerexpires - 10;
        print "Bearer : $Bearer \n"  if $DEBUG  > 1;
        my $date = strftime(" %d.%m.%Y - %H:%M:%S", localtime($BearerValidUntil));
        print "BearerValidUntil : $BearerValidUntil \n"  if $DEBUG  > 1;
        print "BearerValidUntil : $date \n"  if $DEBUG  > 1;
        print "AnzahlBearerAbrufe : $AnzahlBearerAbrufe \n"  if $DEBUG  > 1;
        print "i3Info_BearerAbruf Ende \n" if $DEBUG  > 0;
        return 0;
        }
    }
    print "Zugangsdatenfehler \n" if $DEBUG  > 1;
    print "i3Info_BearerAbruf Ende mit Fehler \n" if $DEBUG  > 0;
    exit;
}

################################################################################################################################

sub i3Info_Zugangsdatentest()
{
    print "i3Info_Zugangsdatentest Start \n" if $DEBUG  > 0;
    if ($User eq "" or $Pass eq "" or $VIN eq "")
    {       
        #fhem("set BMW_CurrentState Error: Username,Passwort oder VIN leer") if $DEBUG > 0;
        return "Error: Username,Passwort oder VIN leer";
    }
   
    # Test Mailadresse
    if ($User !~ m/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/)
    {
        #fhem("set BMW_CurrentState Error: Mailadresse schein falsch zu sein: <$User>") if $DEBUG > 0;
        return "Error: Mailadresse schein falsch zu sein: <$User>";
    }
   
    # Passwort auf unzulässige Zeichen testen
    if ($Pass =~ m/.*[&#+].*/) # auf & prüfen
    {
        #fhem("set BMW_CurrentState Error: Password enthält unzulässige Zeichen ( &#+ )") if $DEBUG > 0;
        return "Error: Password enthält unzulässige Zeichen ( &#+ )";   
    }
     
    # VIN auf Richtigkeit und länge testen
    if ($VIN !~ m/WB[ASY].{14}/)
    {
        #fhem("set BMW_CurrentState Error: VIN überprüfen. Sind 17 Zeichen eingegeben und fängt an mit WB...? ") if $DEBUG > 0;
        return "Error: VIN überprüfen. Sind 17 Zeichen eingegeben?)";   
    }
    print "i3Info_Zugangsdatentest Ende \n" if $DEBUG  > 0;   
    return "OK";
}

################################################################################################################################

sub i3Info_Datenabruf
{
    print "i3Info_Datenabruf Start \n" if $DEBUG  > 0;
    my $Browser = LWP::UserAgent->new;
    $Browser->timeout(10);
    $Browser->agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"); 
    $Browser->default_header('Content-Type' => "application/json, text/plain, */*");
    $Browser->default_header("Authorization" => "Bearer ". $Bearer);
    $Browser->default_header("Connection" => "keep-alive");
    $Browser->default_header("Accept-Encoding" => "gzip, deflate, br");
    $Browser->default_header("Accept-Language" => "de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7");
    $Browser->default_header("Host" => "www.bmw-connecteddrive.com");
    $Browser->default_header("Referer" => "https://www.bmw-connecteddrive.com/app/de/index.html");
    $Browser->agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"); 
    $rep = $Browser->get("$dataurl/$modul/v1/$VIN?offset=-60");
    if ( $DEBUG > 1 )
    {
    print "Abruf-URL : $dataurl/$modul/v1/$VIN?offset=-60 \n" ;
    print "\n Code : ";
    print Dumper($rep->code);
    print "\n Message : ";
    print Dumper($rep->message);
    print "\n Content : ";
    print Dumper($rep->decoded_content());   
    print "\n";
    }
    if ( $rep->code != 200 )
    {
    i3Info_BearerAbruf();
    }   
$AnzahlBearerAbrufe = 0 ;
print "i3Info_Datenabruf Ende \n" if $DEBUG  > 0;
}

################################################################################################################################


hasenhirn

#1
Moin,

ich habe im Programm ein paar Klammerzeichen hinter der Definition der sub's entfernt welche beim Aufruf Fehlermeldungen produziert haben.
Die neu Version habe ich angehängt.
Des weiteren war der Start über die Kommandozeile auch nur eine Notlösung auf die Schnelle.
Im Anhang habe ich noch einen Service-Datei um das Programm über systemd starten zu lassen. So gefällt mir das schon besser  ;) ;D

Gruß
Tom

[Unit]
Description=I3_Info, the daemon for communication with the BMW I3 system.
After=network-online.target
ConditionPathExists=/var/log

[Service]
Type=simple
Restart=always
RestartSec=30
User=root
Group=dialout
WorkingDirectory=/usr/bin
PIDFile=/var/run/I3_Info.pid
ExecStart=/usr/bin/perl I3_Info.pl

[Install]
WantedBy=multi-user.target

Bjoernar

Hallo,

Ich habe dein Modul verwendet und so geändert das die Daten direkt und nicht über mqtt in fhem landen.
Ich habe nun aber immer wieder das Problem das die Daten nicht aktualisiert werden.

UpdateTime ist schon ein paar Stunden alt.
Die Daten werden aber korrekt von BMW geholt und an fhem übergeben.

Wenn ich das Auto öffne und wieder schliße oder über die my BMW App die Daten Abfrage sind danach auch die Daten über die API aktuelle.

Hast du solche Probleme auch?

Gruß
Björnar

hasenhirn

Moin Bjoernar,

das ist halt ein BMW  ;)
Bei meinem Tesla z.B. werden die Daten im Prinzip direkt vom Auto abgerufen und das Auto dafür aufgeweckt.
Beim BMW werden die Daten auf einen Server übertragen und du bekommst sie von dort.
Wenn das Auto jetzt "einschläft" werden immer die Daten vom Server abgefragt und das Auto "schläft" weiter. So spart das Auto Strom.
In den Daten die abgerufen werden steht irgendwo auch das Datum und die Uhrzeit der letzten Aktualisierung.
In der Variablen "Segment_LastTrip_time_segment_end" steht glaube ich die Zeit der letzten Datenübertragung vom Auto zu Server.
Ich hoffe das hat dir weiter geholfen.

LG
Thomas

s00rb

Moin hasenhirn,

Erstmal vielen Dank für deine Arbeit und die Bereitstellung der beiden Script.
Die laufen auch problemlos bei mir.

Eine Sache bzw. Frage habe ich allerdings.

Bei mir ist es so, dass alle 2-3 Tage ein neues MQTT device angelegt wird in dem die Daten vom i3 gelistet werden. Im ,,alten" Device werden die readings nicht mehr aktualisiert.
Somit ist es sinnlos irgendwelche notifys zu erstellen, da sich das Ursprungs-Device andauernd ändert.

Verhält sich das bei dir (bzw anderen Nutzern) genau so? Oder wie hast Du (ihr) gelöst ?
Ist es möglich über den Script eine Client ID zu vergeben, sodass nicht immer ein neues MQTT Device erstellt wird?

Lieben Gruß Mario

hasenhirn

Hallo Mario,

freut mich dass es dir gefällt  ;D
Mein Device sieht so aus wie im Anhang.
Das läuft auch schon ewigkeiten so ohne Probleme.
Ich hatte nur autocreate auf 0 gestellt nachdem alle Readings da waren
Da gab es irgend ein Problem aber das ist schon so lange her dass ich mich nicht mehr an die Auswirkungen erinnern kann.

Vielleicht hilft dir ja meine RawDefiniton weiter:
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\
MQTT2_Client:I3/overall_energy_consumption:.* overall_energy_consumption\
MQTT2_Client:I3/mileage:.* mileage\
MQTT2_Client:I3/condition_based_services:.* condition_based_services\
MQTT2_Client:I3/Segment_LastTrip_time_segment_end_formatted_date:.* Segment_LastTrip_time_segment_end_formatted_date\
MQTT2_Client:I3/heading:.* heading\
MQTT2_Client:I3/door_passenger_rear:.* door_passenger_rear\
MQTT2_Client:I3/chargingLevelHv:.* chargingLevelHv\
MQTT2_Client:I3/updateTime:.* updateTime\
MQTT2_Client:I3/beEnergyLevelHv:.* beEnergyLevelHv\
MQTT2_Client:I3/battery_size_max:.* battery_size_max\
MQTT2_Client:I3/remaining_charging_time_minutes:.* remaining_charging_time_minutes\
MQTT2_Client:I3/connectorStatus:.* connectorStatus\
MQTT2_Client:I3/Segment_LastTrip_ratio_electric_driven_distance:.* Segment_LastTrip_ratio_electric_driven_distance\
MQTT2_Client:I3/lights_parking:.* lights_parking\
MQTT2_Client:I3/door_passenger_front:.* door_passenger_front\
MQTT2_Client:I3/updateTime_converted_date:.* updateTime_converted_date\
MQTT2_Client:I3/unitOfEnergy:.* unitOfEnergy\
MQTT2_Client:I3/soc_hv_percent:.* soc_hv_percent\
MQTT2_Client:I3/window_driver_front:.* window_driver_front\
MQTT2_Client:I3/beChargingLevelHv:.* beChargingLevelHv\
MQTT2_Client:I3/hood_state:.* hood_state\
MQTT2_Client:I3/unitOfCombustionConsumption:.* unitOfCombustionConsumption\
MQTT2_Client:I3/lsc_trigger:.* lsc_trigger\
MQTT2_Client:I3/Segment_LastTrip_time_segment_end_formatted_time:.* Segment_LastTrip_time_segment_end_formatted_time\
MQTT2_Client:I3/gps_lng:.* gps_lng\
MQTT2_Client:I3/beRemainingRangeElectric:.* beRemainingRangeElectric\
MQTT2_Client:I3/gps_lat:.* gps_lat\
MQTT2_Client:I3/remaining_fuel:.* remaining_fuel\
MQTT2_Client:I3/lastUpdateReason:.* lastUpdateReason\
MQTT2_Client:I3/charging_status:.* charging_status\
MQTT2_Client:I3/beRemainingRangeFuelMile:.* beRemainingRangeFuelMile\
MQTT2_Client:I3/charging_connection_type:.* charging_connection_type\
MQTT2_Client:I3/beMaxRangeElectricKm:.* beMaxRangeElectricKm\
MQTT2_Client:I3/lastChargingEndReason:.* lastChargingEndReason\
MQTT2_Client:I3/Segment_LastTrip_time_segment_end_formatted:.* Segment_LastTrip_time_segment_end_formatted\
MQTT2_Client:I3/door_lock_state:.* door_lock_state\
MQTT2_Client:I3/single_immediate_charging:.* single_immediate_charging\
MQTT2_Client:I3/beMaxRangeElectric:.* beMaxRangeElectric\
MQTT2_Client:I3/beRemainingRangeFuel:.* beRemainingRangeFuel\
MQTT2_Client:I3/unitOfLength:.* unitOfLength\
MQTT2_Client:I3/door_driver_front:.* door_driver_front\
MQTT2_Client:I3/updateTime_converted:.* updateTime_converted\
MQTT2_Client:I3/beRemainingRangeElectricMile:.* beRemainingRangeElectricMile\
MQTT2_Client:I3/window_passenger_front:.* window_passenger_front\
MQTT2_Client:I3/door_driver_rear:.* door_driver_rear\
MQTT2_Client:I3/unitOfElectricConsumption:.* unitOfElectricConsumption\
MQTT2_Client:I3/kombi_current_remaining_range_fuel:.* kombi_current_remaining_range_fuel\
MQTT2_Client:I3/beRemainingRangeFuelKm:.* beRemainingRangeFuelKm\
MQTT2_Client:I3/Segment_LastTrip_time_segment_end:.* Segment_LastTrip_time_segment_end
attr BMW room E3/DC,MQTT,Wallbox
attr BMW stateFormat {\
my $SoC = ReadingsVal("BMW","chargingLevelHv",0) ;;\
my $Time_to_Charge = ReadingsVal("BMW","remaining_charging_time_minutes",0) ;;\
my $Ladestatus = ReadingsVal("BMW","chargingHVStatus",0) ;;\
my $Stecker = ReadingsVal("BMW","connectorStatus",0);;\
my $Status ="0";;\
if($Stecker eq "DISCONNECTED" )\
   { $Status = 'DIS'}\
elsif ($Ladestatus eq "NOT_CHARGING" )\
   { $Status = 'NOTC'}\
elsif ($Ladestatus eq "CHARGING" )\
   { $Status = 'CHAR'};;\
"$SoC %SoC / $Time_to_Charge Min. bis Vollgeladen  -\
$Status"\
}\


Gruß

Thomas

hasenhirn

Moin,

seit vorgestern hat das Abrufen der Daten vom I3 nicht mehr funktioniert.
Heute habe ich die Lösung für das Problem gefunden  :o
Im Script habe ich die Adresse :
my $dataurl = "https://www.bmw-connecteddrive.com/api/vehicle";
ausgetauscht gegen :
my $dataurl = "https://b2vapi.bmwgroup.com/api/vehicle";

Jetzt läuft es wieder  ;D ;D ;D

Vielleicht kann ja jemand die Info gebrauchen.

LG

Thomas

tschimi

#7
Hi,
erstmal vielen vielen Dank für die Umstellung und Anpassung. Läuft auch super bis auf eine Kleinigkeit bei mir.

Es wird ca alle 20min ein neues Device angelegt. Die Namen siehen irgendwie "komisch" aus. Hat jemand eine Idee, woran es bei mir liegt? Es scheint auch so zu sein, das der SERVICE neu gestartet wird und das ggf. das Neuanlegen auslöst? Und in Zeile 103 gibt es ne uninitialisierte Variable - das scheint aber nicht das Problem zu sein...

Lg, tschimi

P.S.: Autocreate sollte man ausschalten ;-) Stupid me... Sorry.... Bleibt noch der "Fehler" in Zeile 103...

hasenhirn

Hallo tschimi,

freut mich wenn es wieder bei dir läuft.
Den Fehler konnte ich bei mir reproduzieren.
Da er aber keine Auswirkungen zu haben scheint, werde ich mir das erst mal bei Gelegenheit anschauen.
Es eilt ja nicht so ;-)
Wenn ich was finde werde ich es teilen.

LG
Thomas

tschimi

Hi Thomas,
dankeschön nochmal. Sag mal, ist es bei dir auch so, das bei jedem neubooten des FHEMServers der Names des BMW-Devices geändert wird, sprich, MQTT2 jedesmal ein neues Device anlegt in FHEM? Wenn die Verbindung mal steht, läuft alles - eben solange, bis mal neu gebootet wird... Wo ist da mein Denkfehler?

Lg, tschimi

hasenhirn

Hallo tschimi,

kann ich leider nicht nachvollziehen. Du meinst einen normalen "shutdown - restart"?
Da passiert bei mir nichts.
Im Anhang mal noch meine Einstellungen. Ich hoffe das hilft dir weiter :-)


LG
Thomas

tschimi

Fehler gefunden !!!! DANKE. Hatte einen Dreher im MQTT2 device ;-)

Gutes Nächtle :-)

hasenhirn


hasenhirn

Moin,

ich habe auch den Fehler mit der uninitialisierten Variablen gefunden :)

in der Zeile in der die Werte initialisiert werden mit "my @Werte" steht der Wert "lights_parking" drin.
Keine Ahnung wie der da rein kommt wird aber scheinbar nicht, oder nicht mehr herunter geladen.
Einfach den Wert mit den Anführungszeichen und dem Komma raus werfen und gut is  ;D

LG

Thomas

satprofi

hey, danke für die arbeit. hatre auch das andere laufen, das dann nicht mehr ging. werde mur deine scriote mal anlegen.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

satprofi

Zitat von: hasenhirn am 22 Juni 2021, 21:10:26
Moin,

ich habe im Programm ein paar Klammerzeichen hinter der Definition der sub's entfernt welche beim Aufruf Fehlermeldungen produziert haben.
Die neu Version habe ich angehängt.
Des weiteren war der Start über die Kommandozeile auch nur eine Notlösung auf die Schnelle.
Im Anhang habe ich noch einen Service-Datei um das Programm über systemd starten zu lassen. So gefällt mir das schon besser  ;) ;D

Gruß
Tom

[Unit]
Description=I3_Info, the daemon for communication with the BMW I3 system.
After=network-online.target
ConditionPathExists=/var/log

[Service]
Type=simple
Restart=always
RestartSec=30
User=root
Group=dialout
WorkingDirectory=/usr/bin
PIDFile=/var/run/I3_Info.pid
ExecStart=/usr/bin/perl I3_Info.pl

[Install]
WantedBy=multi-user.target


hallo.
wohin kommt die service datei?
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

hasenhirn

Hallo satprofi,

die Datei I3_Info.service kommt nach /etc/systemd/system/
Dort sollten auch schon mehrere .service-Dateien liegen.

Gruß

Thomas


satprofi

hallo.
was könnte hier falsch sein? Use of uninitialized value in string at /usr/local/bin/i3Info.pl line 100.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

hasenhirn

Das sollte das Problem beheben. Es sollten aber trotz der uninitialisierten Variablen Werte in MQTT ankommen oder?

Zitat von: hasenhirn am 27 Dezember 2021, 09:59:44
Moin,

ich habe auch den Fehler mit der uninitialisierten Variablen gefunden :)

in der Zeile in der die Werte initialisiert werden mit "my @Werte" steht der Wert "lights_parking" drin.
Keine Ahnung wie der da rein kommt wird aber scheinbar nicht, oder nicht mehr herunter geladen.
Einfach den Wert mit den Anführungszeichen und dem Komma raus werfen und gut is  ;D

LG

Thomas

satprofi

verstehs nicht. das script i3Info.pl dürfte bei mir nur 1x durchlaufen, dann nkommen keine ereignisse mehr, egal was ich beim auto mache.
starte ich aber das script manuell wird neues mqtt2 device angelegt, status des wagens richtig abgefragt, aber das wars auch schon.
habe es sogar per cron angelegt, abere da kommen immer neue mqtt2 devices. habe bullseye.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

hasenhirn

Moin,

in der Variablen "my $abrufdauer = "300";#Pause zwischen den Abrufen"  wird, wie im Kommentar steht, die Pause zwischen den Abrufen festgelegt.
Es werden also nur alle 5min ( 300sec ) Daten vom Server geholt. Du kannst die Zeitspanne dort verkürzen. Hast Du 5min gewartet?
Mir persönlich reicht es alle 5min Daten zu bekommen. Ich habe noch nicht ausprobiert wo hier das Minimum ist.
Ich hoffe das hilft dir weiter.

Gruß

Thomas

satprofi

Hallo.
ja, sogar länger gewartet. Wie gesagt, starte ich das Script manuell, wird der Server abgerufen, aber neues device angelegt.
werd mich morgen weiterspielen,
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

hasenhirn

Schau mal nach ob der Service noch läuft und über PS das Script noch läuft

satprofi

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

hasenhirn

Was passiert wenn du das Script von Hand auf der Konsole startest?
Stützt es ab? Gibt es Meldungen?

satprofi

#25
Zitat von: hasenhirn am 12 Februar 2022, 20:41:11
Was passiert wenn du das Script von Hand auf der Konsole startest?
Stützt es ab? Gibt es Meldungen?


main::i3Info_BearerAbruf() called too early to check prototype at /usr/local/bin/i3Info.pl line 148.
main::i3Info_MQTT_Login() called too early to check prototype at /usr/local/bin/i3Info.pl line 60.
main::i3Info_BearerAbruf() called too early to check prototype at /usr/local/bin/i3Info.pl line 69.
main::i3Info_BearerAbruf() called too early to check prototype at /usr/local/bin/i3Info.pl line 73.
main::i3Info_Datenauswertung() called too early to check prototype at /usr/local/bin/i3Info.pl line 78.


und das beim aufruf der service datei

/etc/systemd/system/I3_Info.service: Zeile 1: [Unit]: Kommando nicht gefunden.
/etc/systemd/system/I3_Info.service: Zeile 2: the: Kommando nicht gefunden.
/etc/systemd/system/I3_Info.service: Zeile 6: [Service]: Kommando nicht gefunden
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

hasenhirn

was für ein System hast du da am laufen?

Ist die I3_Info.pl unter /usr/bin/ ?
Wenn ja sind die Rechte so gesetzt? -rwxr-xr-x 1 root root   10292 Dez 27 09:48 I3_Info.pl
Ist die I3_Info.service unter /etc/systemd/system/
Wenn ja sind die Rechte so gesetzt? -rwxr-xr-x  1 root root  342 Jun 27  2021 I3_Info.service

Wenn dort alles klar ist starte das Script mal mit /usr/bin/perl /usr/bin/I3_Info.pl und setz mal $DEBUG = 0; in der I3_Info.pl auf $DEBUG = 3;
Mal sehen ob im Log was erhellendes steht. Bevor du es postest schau bitte das keine Persönlichen- resp. Zugangsdaten drin stehen  ;)

Gruß

Thomas

satprofi

So, schaut eigentlich gut aus, bis auf die letzten 3 Zeilen. Komisch das das script nicht endet, und wenn ich die Konsole beende ist auch ende vom script.
Viele Infos werden gar nicht im mqtt2 device angezeigt, wie z.b Wartungstermin



i3Info Start
Bearer : Pv8MTRaNjsaXL5rIY5mq2i1DONjRuuiP
BearerValidUntil :  13.06.2021 - 12:08:34
Bearer abgelaufen
i3Info_BearerAbruf Start
i3Info_Zugangsdatentest Start
i3Info_Zugangsdatentest Ende
Zugangsdatentest : OK
AnzahlBearerAbrufe : 0
302
Bearerdata : https://www.bmw-connecteddrive.com/app/default/static/external-dispatch.html#state=eyJtYXJrZXQiOiJkZSIsImxhbmd1YWdlIjoiZGUiLCJkZXN0aW5hdGlvbiI6InVzZXJEYXNoYm9hcmQiLCJwYXJhbWV0ZXJzIjoie30ifQ&access_token=krXTxfS1lZMy5nmRpdFbyb8H6XbZfZlF&token_type=Bearer&expires_in=7199
Bearer : krXTxfS1lZMy5nmRpdFbyb8H6XbZfZlF
BearerValidUntil : 1644747890
BearerValidUntil :  13.02.2022 - 11:24:50
AnzahlBearerAbrufe : 0
i3Info_BearerAbruf Ende
i3Info_Datenabruf Start
Abruf-URL : https://b2vapi.bmwgroup.com/api/vehicle/dynamic/v1/WBYxxxxxxxxxxxx?offset=-60

Code : $VAR1 = '200';

Message : $VAR1 = 'OK';

Content : $VAR1 = '{"attributesMap":{"unitOfLength":"km",
"remaining_range":"0",
"sunroof_state":"CLOSED",
"vehicle_tracking":"true",
"updateTime_converted":"12.02.2022 16:14",
"door_driver_rear":"CLOSED",
"beMaxRangeElectricKm":"202",
"door_passenger_rear":"CLOSED",
"Segment_LastTrip_time_segment_end_formatted_date":"12.02.2022",
"door_driver_front":"CLOSED",
"shdStatusUnified":"CLOSED",
"hood_state":"CLOSED",
"charging_status":"NOCHARGING",
"kombi_current_remaining_range_fuel":"0",
"beMaxRangeElectric":"202",
"beRemainingRangeElectricKm":"131",
"mileage":"62154",
"Segment_LastTrip_time_segment_end_formatted_time":"16:12",
"Segment_LastTrip_time_segment_end_formatted":"12.02.2022 16:12",
"unitOfEnergy":"kWh",
"overall_energy_consumption":"18.366",
"beRemainingRangeElectric":"131",
"sunroof_position":"0",
"soc_hv_percent":"63",
"single_immediate_charging":"false",
"updateTime_converted_time":"16:14",
"connectorStatus":"DISCONNECTED",
"chargingHVStatus":"INVALID",
"chargingLevelHv":"67",
"unitOfCombustionConsumption":"l/100km",
"gps_lat":"xx.xxxxx",
"window_driver_front":"CLOSED",
"Segment_LastTrip_ratio_electric_driven_distance":"100",
"gps_lng":"xx.xxxxx",
"condition_based_services":"33,OK,2022-04,;3,OK,2022-05,;100,OK,2022-05,;",
"window_passenger_front":"CLOSED",
"lastChargingEndReason":"CHARGING_GOAL_REACHED",
"updateTime_converted_date":"12.02.2022",
"door_passenger_front":"CLOSED",
"beChargingLevelHv":"67",
"updateTime_converted_timestamp":"1644682472000",
"remaining_fuel":"0",
"heading":"138","lsc_trigger":"VEHCSHUTDOWN_SECURED",
"door_lock_state":"SECURED",
"updateTime":"12.02.2022 15:14:32 UTC",
"beEnergyLevelHv":"18.366",
"remaining_charging_time_minutes":"0",
"trunk_state":"CLOSED",
"battery_size_max":"33.2",
"beRemainingRangeElectricMile":"131",
"charging_connection_type":"conductive",
"unitOfElectricConsumption":"kWh/100km",
"lastUpdateReason":"VEHCSHUTDOWN_SECURED",
"Segment_LastTrip_time_segment_end":"12.02.2022 16:12:00 UTC"},
"vehicleMessages":{"ccmMessages":[],"cbsMessages":[{"date":"2022-04","description":"Nächste gesetzliche Abgasuntersuchung spätestens zum angegebenen Termin.",
"id":33,
"messageType":"CBS",
"status":"OK",
"text":"§ Abgasuntersuchung"},{"date":"2022-05","description":"Nächster Wechsel spätestens zum angegebenen Termin.",
"id":3,"messageType":"CBS",
"status":"OK",
"text":"Bremsflüssigkeit"},{"date":"2022-05","description":"Nächste Sichtprüfung nach der angegebenen Fahrstrecke oder zum angegebenen Termin.",
"id":100,"messageType":"CBS","status":"OK","text":"Fahrzeug-Check"}]}}';

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

hasenhirn

Ich würde sagen -> läuft  ;D

Das Script soll auch nicht enden sondern läuft in einer Endlosschleife und ruft alle 300sec die Daten neu ab  ;)
Die .service Datei startet das Script und MQTT wird dann alle 300sec mit frischen Daten gefüttert

Die Daten für Service, Sichtprüfung usw. steht unter condition_based_services

satprofi

Hallo.
das mit Endlosschleife is mir klar, nur wenn ich den raspi neu starte, finde ich den Prozess nicht. Auch nicht über cron @reboot, oder autostart in etc/init.d.
Ich werde es beobachten, evt. eine while Funktion einfügen.

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

hasenhirn

Hi,

kein Ding  ;)

Starten kannst Du das Ganze mit sudo service I3_Info start
Wenn er bei jedem Neustart des Rechners automatisch anlaufen soll musst Du es einfach einschalten mit sudo service I3_Info enabled
Ob der Service noch läuft kannst Du einfach überprüfen mit sudo service I3_Info status
das Ergebnis sollte dann ungefähr so aussehen wie in der angehängten Datei.
Mit dem Befehl ps -Alf | grep I3 sollte in der Prozessliste das Script ungefähr so auftauchen: 4 S root      4517     1  0  80   0 -  6656 -      10:49 ?        00:00:00 /usr/bin/perl I3_Info.pl

Gruß

Thomas

satprofi

sudo service I3_Info befehle klappen alle, nur nach neustart läuft das service nicht. trotz enabled.
versuche das ganze jetzt über cron zu starten.

hast du das script am raspi mit fhem laufen? oder ext. raspi?
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

hasenhirn


satprofi

ok. so, mit befehl im crontab startet der service nach reboot. aber mit fehler das neues device angelegt wird.
verstehe die welt nicht mehr.....
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

hasenhirn



Zitat von: satprofi am 13 Februar 2022, 11:55:20
sudo service I3_Info befehle klappen alle, nur nach neustart läuft das service nicht. trotz enabled.
versuche das ganze jetzt über cron zu starten.

hast du das script am raspi mit fhem laufen? oder ext. raspi?

was zeigt er an wenn Du nach dem Neustart den Status abrufst mit sudo service I3_Info status?

satprofi

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

hasenhirn

ups :(

kann es sein dass noch irgend ein Dienst fehlt der gestartet sein müsste?

satprofi

wie gesagt, über cron @reboot klappts ja. läuft auch sauber, bis auf neues device bei evt. reboot
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

hasenhirn

Cron startet vermutlich erst wenn alle Dienste laufen.
Über den Service wird es so schnell wie möglich gestartet.
Man kann aber in der .service Datei angeben welche Dienste vorher laufen müssen.
Ich weiß jetzt leider nicht welcher Dienst fehlt .

Migul47

Hallo,

geht bei mir nicht mehr. Bearer bleibt leer.

hasenhirn

Jop, die haben was an der Authentifizierung gedreht.
Ich hatte leider am WE keine Zeit.
Hoffe ich komme die Woche dazu  ???
Wenn ich was neues habe stelle ich es hier online.

LG

Thomas

tschimi

Hi,
hat schon jemand ne Lösung gefunden? Bei mir kommen leider auch keine Daten mehr :-(
Lg, tschimi

hasenhirn

Hi,

ich bin noch dran. Leider ist bei mir in letzter Zeit sehr viel los so das ich nicht so viel Zeit habe.
Komme gerade wieder von einer 10 Stunden Schicht  :P
Das Authentifizierungserfahren ist OAuth2, so viel habe ich schon mal heraus gefunden und da lese ich mich gerade ein.
Ich habe Homeassistant installiert da es in dem Modul funktioniert. Leider habe ich von Hass und Python wenig Ahnung was es nicht leichter macht  ;)
Sobald ich weiter gekommen bin, schreibe ich es hier rein.
Vielleicht hat ja jemand ein paar gute Infos, dann immer her damit  ;D

LG
Tom

potash

Hallo,

ich habe einen Lösungsvorschlag über Bimmer Connected . https://github.com/bimmerconnected
Die Installationsanleitung für das Kommandozeilen - Tool befindet sich unter  https://bimmer-connected.readthedocs.io/en/latest/#cli.
Danke an die Autoren!

Mit Hilfe von mosquitto_pub kann die Ausgabe von Bimmer Connected  an FHEM übertragen werden.
Hierzu verwende ich unter Linux (Bullseye) folgenden Service-Script.
#!/bin/bash
#Service zur Abfrage der BMW Fahrzeugdaten über bimmerconnected

# Definition der Parameter
#Abfrageintevall in Sekunden
INTERVAL=7200
#Nutzername
USER="BMW-NUTZERNAME"
#Passwort
PASS="BMW-PASSWORT"
#MQTT Host
MQTTHOST="HOSTNAME"
#MQTT Port
MQTTPORT=1883
#MQTT topic
MQTTTOPIC="/BMW/Status"
#Ende der Defintion

# Lockfile enthält Prozess-ID (PID)
BASENAME=`basename $0`
LOCKFILE="/var/run/${BASENAME}.pid"

# teste auf root
if [ ${UID} -gt 0 ]
then
    echo $"Pleas run as root"
    exit 1
fi

case "$1" in
    start)
        echo -ne "Starting $0 "
        $0 run &
        while [ ! -e ${LOCKFILE} ]
        do
          echo -ne "."
          sleep 2
        done
        echo "(PID: "`cat ${LOCKFILE}`")."
        exit
        ;;

    stop)
        if [ -e ${LOCKFILE} ]
        then
          CPID=`cat ${LOCKFILE}`
          echo -ne "Stopping $0 with PID $CPID "
          # beenden mit SIGTERM,
          # warte bis PID-File entfernt ist
          while [ -e ${LOCKFILE} ]
          do
             echo -ne "."
             kill ${CPID}
             sleep 2
          done
          echo "[done]"

        else
          echo "$0 is not running."
          exit
        fi
        ;;
    restart)
        $0 stop ; $0 start
        ;;
    run)
    if [ -e ${LOCKFILE} ]
    then
      CPID=`cat ${LOCKFILE}`
      echo "Programm lauft bereits. (PID: ${CPID})"
      exit -1
    else
      # PID File samt PID speichern
      # wird via trap am Programm-Ende wieder
      # entsorgt
      echo $$ > ${LOCKFILE}
      trap "rm -f ${LOCKFILE}; exit" INT TERM EXIT
    fi
    while true
    do
     bimmerconnected status --json $USER $PASS rest_of_world|mosquitto_pub -h $MQTTHOST -p $MQTTPORT -d -t $MQTTTOPIC -l --quiet
      sleep $INTERVAL
    done
        ;;
    *)
        echo "usage: $0 start|stop|restart|run"
        echo "options:"
        echo "  start: runs program in background"
        echo "   stop: stops background program"
        echo "restart: restart a already running instance"
        echo "    run: run program in foreground, stopps with Strg-C"
        exit
        ;;
esac



In FHEM dann ein ein MQTT2_DEVICE anlegen. Da die Ausgabe von Bimmer Connected im JSON-Format übermittelt wird, kann man die
Readings im MQTT2_DEVICE über das Atrribut

readingList /BMW/Status:.* { json2nameValue($EVENT) }

anlegen.

LG und schöne Ostern

Heiko
Raspberry Pi 3, FHEM-Server 5.7

hasenhirn

Hallo Heike,

super Arbeit!!!
Danke für die Info und den Code  :)
Ich bin jetzt schon sehr lange am testen und bekomme es unter Perl nicht hin mich gegen den BMW-Server zu authentifizieren  >:(
Vermutlich werde ich auf meiner NAS IOBroker installieren da gibt es ein Modul für BMW und für meinen E3DC.
Schau ma mal.
Sollte ich doch noch eine Lösung finden werde ich sie natürlich hier teilen.

LG und frohe Ostern

Thomas

Manfi

@potash
Hi,
Versuche seit einiger Zeit die Ur-Lösung von Rumbel durch Deine zu ersetzen, scheitere aber mangels Programmierkenntnissen.
Letzte Version von bimmerconnected ist installiert, funktioniert und liefert Werte. Wenn ich deinen Script starte, bekomme ich allerdings folgende Meldung:

sudo /opt/fhem/BMW2MQTT start
Starting /opt/fhem/BMW2MQTT .Client (null) sending CONNECT
Client (null) received CONNACK (0)
Traceback (most recent call last):
  File "/home/pi/.local/bin/bimmerconnected", line 5, in <module>
    from bimmer_connected.cli import main
ModuleNotFoundError: No module named 'bimmer_connected'
Client (null) sending DISCONNECT
(PID: 779).


LG und frohe Weihnachten  ;)
Manfi
Hardware: Raspberry Pi2, SignalDuino 433, Sonoff/Tasmota, NodeMCU/ESPEasy, FS10

hasenhirn

Hallo Manfi,

BMW hat einige male die Authentifizierung umgestellt und ich hatte irgendwann keine Lust mehr dem hinterher zu programmieren.
Ich bin auf IoBroker umgestiegen da es dort ein gut funktionierendes Modul gibt und ich den Rest von FHEM jetzt nach und nach durch IoBroker ersetze.
Tut mir leid dass ich dir da nicht weiter helfen kann - sorry

LG

Thomas

potash

@Manfi

Hallo Manfi,

ich habe leider erst am Wochenende Zeit für Dein Problem.
Die Lösung mit bimmerconnected funktioniert jedenfalls bei mir auch mit der aktuiellen Authentifizierung.

Noch einen schönen Abend.

Heiko

Raspberry Pi 3, FHEM-Server 5.7

binford6000

#48
Hi,
bei mir läuft das hier seit 2 Monaten stabil:
#!/bin/bash
MQTTHOST="10.3.3.8"
MQTTPORT="1883"
MQTTUSER="mqtt_user"
MQTTPW="mqtt_pass"
#get data from bmw:
echo -e "Hole Daten bei BWM..."
json=$(sudo /usr/local/bin/./bimmerconnected status -j 'user' 'pass' rest_of_world)
echo -e "...fertig"
echo -e "Sende Daten an FHEM..."
mosquitto_pub -h $MQTTHOST -p $MQTTPORT -u $MQTTUSER -P $MQTTPW -t bmw -i bmw -m "$json"
echo -e "...fertig!"


Das zughörige device sieht dann so aus:
defmod bmw.mqtt MQTT2_DEVICE fhem2
attr bmw.mqtt autocreate 0
attr bmw.mqtt readingList fhem2:bmw:.* { my $h1 = json2nameValue($EVENT);;;; my %h2 = map { my $k=$_;;;; $k=~s/^1_//;;;; ($k,$h1->{$_}) } keys %{$h1};;;; \%h2 }


Siehe auch hier:
https://forum.fhem.de/index.php/topic,128932.0/all.html
und hier mit Maps-Anbindung von Boris:
https://forum.fhem.de/index.php/topic,129067.html

VG Sebastian

Manfi

Hi,
Habe deine Variante mal an meine Verhältnisse angepasst:

#!/bin/bash
MQTTHOST="10.1.1.114"
MQTTPORT="1883"
MQTTUSER=""
MQTTPW=""
#get data from bmw:
echo -e "Hole Daten bei BWM..."
json=$(sudo /home/pi/.local/bin/bimmerconnected status -j 'user' 'password' rest_of_world)
echo -e "...fertig"
echo -e "Sende Daten an FHEM..."
mosquitto_pub -h $MQTTHOST -p $MQTTPORT -u $MQTTUSER -P $MQTTPW -t bmw -i bmw -m "$json"
echo -e "...fertig!"




...und bekomme den gleichen Fehler wie bei der Variante von potash:

$ /opt/fhem/530d2MQTT.sh
Hole Daten bei BWM...
Traceback (most recent call last):
  File "/home/pi/.local/bin/bimmerconnected", line 5, in <module>
    from bimmer_connected.cli import main
ModuleNotFoundError: No module named 'bimmer_connected'
...fertig
Sende Daten an FHEM...
...fertig!

bimmerconnected von der Kommandozeile gestartet funktioniert einwandfrei

LG
Manfi
Hardware: Raspberry Pi2, SignalDuino 433, Sonoff/Tasmota, NodeMCU/ESPEasy, FS10

potash

Hallo Manfi,

Da bimmerconnected auf der Kommandozeile funktioniert, von woher wird es aufgerufen?

which bimmerconnected

Versuche doch mal die direkte Übergabe von bimmerconnected auf  mosquitto_pub über die Kommandozeile:

sudo bimmerconnected status -j 'user' 'password' rest_of_world | mosquitto_pub -h 10.1.1.114 -p 1883  -t bmw -d  --quiet  -l

Einen schönen 3. Advent,

Heiko
Raspberry Pi 3, FHEM-Server 5.7

Manfi

Hi Heiko,

Hier das Resultat:

$ which bimmerconnected                                       
/home/pi/.local/bin/bimmerconnected


$ sudo bimmerconnected status -j 'user' 'password' rest_of_world | mosquitto_pub -h 10.1.1.114 -p 1883  -t bmw -d  --quiet  -l Client (null) sending CONNECT
Client (null) received CONNACK (0)
sudo: bimmerconnected: command not found
Client (null) sending DISCONNECT


allerdings:

$ bimmerconnected status -j 'user' 'password' rest_of_world | mosquitto_pub -h 10.1.1.114 -p 1883  -t bmw -d  --quiet  -l Client (null) sending CONNECT
Client (null) received CONNACK (0)
DEBUG:asyncio:Using selector: EpollSelector
Client (null) sending PUBLISH (d0, q0, r0, m1, 'bmw', ... (7301 bytes))
Client (null) sending DISCONNECT

funktioniert  ;D
jetzt muß ich das noch in FHEM zum Laufen bringen.

Danke
und auch noch einen schönen Rest-Adventsonntag

LG
Manfi
Hardware: Raspberry Pi2, SignalDuino 433, Sonoff/Tasmota, NodeMCU/ESPEasy, FS10

potash

Hallo Manfi,

ich habe bei mir die Abfrage über einen "service "automatisiert. Angepaßt an Deine Konfiguration sieht der Script dann so aus:
#!/bin/bash
#Service zur Abfrage der BMW Fahrzeugdaten über bimmerconnected

# Definition der Parameter
#Abfrageintevall in Sekunden
INTERVAL=7200
#Nutzername
USER="user"
#Passwort
PASS="password"
MQTTHOST="10.1.1.114"
MQTTPORT=1883
MQTTTOPIC="bmw"


# Lockfile enthält Prozess-ID (PID)
BASENAME=`basename $0`
LOCKFILE="/var/run/${BASENAME}.pid"

# teste auf root
if [ ${UID} -gt 0 ]
then
    echo $"Script muss als Superuser ausgef▒gret werden!"
    exit 1
fi


case "$1" in
    start)
        echo -ne "Starting $0 "
        $0 run &
        while [ ! -e ${LOCKFILE} ]
        do
          echo -ne "."
          sleep 2
        done
        echo "(PID: "`cat ${LOCKFILE}`")."
        exit
        ;;

    stop)
        if [ -e ${LOCKFILE} ]
        then
          CPID=`cat ${LOCKFILE}`
          echo -ne "Stopping $0 with PID $CPID "
          # beenden mit SIGTERM,
          # warte bis PID-File entfernt ist
          while [ -e ${LOCKFILE} ]
          do
             echo -ne "."
             kill ${CPID}
             sleep 2
          done
          echo "[done]"

        else
          echo "$0 is not running."
          exit
        fi
        ;;
    restart)
        $0 stop ; $0 start
        ;;
    run)
    if [ -e ${LOCKFILE} ]
    then
      CPID=`cat ${LOCKFILE}`
      echo "Programm lauft bereits. (PID: ${CPID})"
      exit -1
    else
      # PID File samt PID speichern
      # wird via trap am Programm-Ende wieder
      # entsorgt
      echo $$ > ${LOCKFILE}
      trap "rm -f ${LOCKFILE}; exit" INT TERM EXIT
    fi
    while true
    do
     sudo pi /home/pi/.local/bin/bimmerconnected status --json $USER $PASS rest_of_world | mosquitto_pub -h $MQTTHOST -p $MQTTPORT -d -t $MQTTTOPIC -l --quiet
      sleep $INTERVAL
    done
        ;;
    *)
        echo "usage: $0 start|stop|restart|run"
        echo "options:"
        echo "  start: runs program in background"
        echo "   stop: stops background program"
        echo "restart: restart a already running instance"
        echo "    run: run program in foreground, stopps with Strg-C"
        exit
        ;;
esac


Auf FHEM Seite empfängt dann folgendes MQTT2 - DEVICE

define StatusBMW MQTT2_DEVICE
attr StatusBMW autocreate 0
attr StatusBMW readingList /bmw:.* { json2nameValue($EVENT) }


Noch einen schönen Abend, LG Heiko
Raspberry Pi 3, FHEM-Server 5.7

Heiner

Hi,
ich hab Bimmerconnected am laufen, kriege die Daten aber nicht ins fhem.
Beides laeuft auf dem gleichen PI.
Brauchts unbedingt MQTT? Und wenn, gehts auch auf Basis MQTT2 aus fhem, das hab ich naemlich schon in Betrieb und moscitto on top fuert zu problemen.

Danke fuer eure Tipps.
Heiner
--------------------------------
fhem auf Pi3+
CUL 868MHz, Signalduino 434MHz, HM-CFG-USB
HM, THZ, Kostal, Somfy, Conbee, Pytonbinding, FritzBox, FTUI, MQTT2

potash

Hallo Heiner,

für die Übertragung der Ausgabe von Bimmerconnected auf den MQTT2 - Server in FHEM benötigst Du noch einen "MQTT Publisher".
Ich habe den aus dem Mosquitto - Paket verwendet. Dieser läßt sich auch ohne Mosquitto-Server installieren.
Hier das Beispiel für Ubuntu/Debian/Rasbian

sudo apt install mosquitto-clients

LG und schöne Feiertage!

Heiko
Raspberry Pi 3, FHEM-Server 5.7

Heiner

Hi, frohe Weihnachten.
Danke funktioniert.

Wie krieg ich den Time reading fuer die naechste Inspektion auf Jahr und Monat reduziert?

Das Reading zeigt:
2024-07-01T00:00:00.000Z
mit value format und %1i bekomme ich das Jahr aber leider bekome ich auch mit %2i nicht den Monat.
Heiner
--------------------------------
fhem auf Pi3+
CUL 868MHz, Signalduino 434MHz, HM-CFG-USB
HM, THZ, Kostal, Somfy, Conbee, Pytonbinding, FritzBox, FTUI, MQTT2

xasher

Hallo zusammen,

ich habe eine Frage zu den Daten in FHEM. Ich habe das Script am Laufen und die Daten werden an mosquitto übergeben.

Ich kann die Daten auch abrufen auf cli
mosquitto_sub -h localhost -t bmw
[{"data": {"vin": "xxxx", .....usw


In Fhem ist mir der Zusammenhang zum Mosquitto nicht so ganz klar. Fhem und Mosquitto laufen auf demselben Raspi, aber ich bekomme keine Daten angezeigt, wenn ich das wie beschrieben einrichte:

Zitat von: potash am 15 Dezember 2022, 17:08:12

Auf FHEM Seite empfängt dann folgendes MQTT2 - DEVICE

define StatusBMW MQTT2_DEVICE
attr StatusBMW autocreate 0
attr StatusBMW readingList /bmw:.* { json2nameValue($EVENT) }



Hätte jemand einen Hinweis, wo mein Fehler sein könnte?

VG
Alex

rudolfkoenig

Es fehlt eine  MQTT2_CLIENT Instanz, damit FHEM mit mosquitto reden kann.

Mein Rat: wenn man nicht so recht weiss, wozu man mosquitto braucht, dann sollte man es stoppen, und stattdessen MQTT2_SERVER in FHEM definieren. Dann braucht man auch kein MQTT2_CLIENT, und MQTT2_DEVICE wird automatisch angelegt. Siehe auch https://wiki.fhem.de/wiki/MQTT

xasher

Hallo Rudolf,

mit MQTT_Client klappt es jetzt. Danke für den Wink in die richtige Richtung.

Ich habe nochmals ein Verständnisproblem mit der readingList

Ich möchte gerne nur die Werte, die mich interessieren. Bisher legt er alle Readings mit eigenem Namen an (durch json2nameValue)

# Hier attr readingList
/bmw:.* { json2nameValue($EVENT) }
/bmw:.* dataalex


Das json aus "dataalex" habe ich mal angehängt.

wenn ich nur z.B. die vin möchte scheitere ich  kläglich  :-[

/bmw/data/vin:* vinalex
/bmw/.*vin.*: vinalex2

Ich weiß schon garnicht mehr, welche Varianten ich in den letzten Stunden schon probiert habe. Habe ich grundsätzlich ein Problem???

Vielen Dank für weitere Hinweise schon mal.

VG
Alex

rudolfkoenig

ZitatIch möchte gerne nur die Werte, die mich interessieren.
Dafuer muss man weitere Parameter angeben, siehe https://wiki.fhem.de/wiki/MQTT2_DEVICE_-_Schritt_f%C3%BCr_Schritt#json2nameValue.28.29

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