Autor Thema: BMW i3-Daten vom Server per MQTT weiterleiten  (Gelesen 7599 mal)

Offline hasenhirn

  • Full Member
  • ***
  • Beiträge: 111
BMW i3-Daten vom Server per MQTT weiterleiten
« am: 13 Juni 2021, 19:48:44 »
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;
}

################################################################################################################################
« Letzte Änderung: 27 Dezember 2021, 10:09:24 von hasenhirn »

Offline hasenhirn

  • Full Member
  • ***
  • Beiträge: 111
Antw:BMW i3-Daten vom Server per MQTT weiterleiten
« Antwort #1 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
« Letzte Änderung: 13 Februar 2022, 09:11:43 von hasenhirn »

Offline Bjoernar

  • Full Member
  • ***
  • Beiträge: 272
Antw:BMW i3-Daten vom Server per MQTT weiterleiten
« Antwort #2 am: 23 Oktober 2021, 15:30:30 »
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

Offline hasenhirn

  • Full Member
  • ***
  • Beiträge: 111
Antw:BMW i3-Daten vom Server per MQTT weiterleiten
« Antwort #3 am: 23 Oktober 2021, 15:44:03 »
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

Offline s00rb

  • New Member
  • *
  • Beiträge: 4
Antw:BMW i3-Daten vom Server per MQTT weiterleiten
« Antwort #4 am: 03 November 2021, 16:40:18 »
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

Offline hasenhirn

  • Full Member
  • ***
  • Beiträge: 111
Antw:BMW i3-Daten vom Server per MQTT weiterleiten
« Antwort #5 am: 03 November 2021, 16:53:14 »
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

Offline hasenhirn

  • Full Member
  • ***
  • Beiträge: 111
Antw:BMW i3-Daten vom Server per MQTT weiterleiten
« Antwort #6 am: 02 Dezember 2021, 22:10:19 »
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
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline tschimi

  • Jr. Member
  • **
  • Beiträge: 67
Antw:BMW i3-Daten vom Server per MQTT weiterleiten
« Antwort #7 am: 08 Dezember 2021, 07:59:14 »
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...
« Letzte Änderung: 08 Dezember 2021, 09:40:10 von tschimi »

Offline hasenhirn

  • Full Member
  • ***
  • Beiträge: 111
Antw:BMW i3-Daten vom Server per MQTT weiterleiten
« Antwort #8 am: 08 Dezember 2021, 16:52:39 »
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

Offline tschimi

  • Jr. Member
  • **
  • Beiträge: 67
Antw:BMW i3-Daten vom Server per MQTT weiterleiten
« Antwort #9 am: 09 Dezember 2021, 15:17:44 »
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
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline hasenhirn

  • Full Member
  • ***
  • Beiträge: 111
Antw:BMW i3-Daten vom Server per MQTT weiterleiten
« Antwort #10 am: 09 Dezember 2021, 18:04:30 »
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

Offline tschimi

  • Jr. Member
  • **
  • Beiträge: 67
Antw:BMW i3-Daten vom Server per MQTT weiterleiten
« Antwort #11 am: 09 Dezember 2021, 20:33:23 »
Fehler gefunden !!!! DANKE. Hatte einen Dreher im MQTT2 device ;-)

Gutes Nächtle :-)

Offline hasenhirn

  • Full Member
  • ***
  • Beiträge: 111
Antw:BMW i3-Daten vom Server per MQTT weiterleiten
« Antwort #12 am: 09 Dezember 2021, 22:13:50 »
na dann, tipp top  ;)

Gute N8

Offline hasenhirn

  • Full Member
  • ***
  • Beiträge: 111
Antw:BMW i3-Daten vom Server per MQTT weiterleiten
« Antwort #13 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

Offline satprofi

  • Hero Member
  • *****
  • Beiträge: 1600
Antw:BMW i3-Daten vom Server per MQTT weiterleiten
« Antwort #14 am: 11 Februar 2022, 07:31:18 »
hey, danke für die arbeit. hatre auch das andere laufen, das dann nicht mehr ging. werde mur deine scriote mal anlegen.
gruss
-----------------------------------------------------------------------
Raspberry - Fhem 5.7 CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram