neues Release
Mit Kommandos! 
Senden von Vorklimatisierung, Auf- und Abschließen, Hupe (Sorry Nachbarn, musste Testen!) und Lichthupe.
Ich hab's bewusst zweistufig gemacht in FHEM. Wer es automatisieren will (Morgens, bei -10° automatisch vorklimatisieren) kann das dann eigentsändig auch direkt über die Methode machen.
Zum Nutzen in FHEM:
1) im Drop-Down das Kommando auswählen (Bsp Licht)
2) Dann drunter auf "SendCommand" klicken. 
3) Dann auf den Status schauen: Pending / sent to car / excuted bzw als Uhr, Auto und OK Symbole. (wird max 8 mal alle 10 Sekunden abgerufen)
##########################################################
# Changelog V0.4 Beta
# SanityCheck für Credentials
# ..Passwort darf kein # enthalten
# Deaktivierung der Abfrage bei Netzwerkfehlern (fritzbox defekt, FHEM offline, etc... --> entlastet den FHEM Server bei Problemen)
# ..per DOIF auf NetzwerkOk --> Bitte NetzwerkOk anlegen, falls nicht vorhanden. Bsp. zum anpingen der Fritzbox
# ----defmod NetzwerkOk presence lan-ping 192.168.178.1 30 # Fritzbox anpingen
# ----attr NetzwerkOk eventMap present:OK absent:DOWN # Mapping auf OK und DOWN
# ----attr NetzwerkOk event-on-change-reading state
# ***NEU: Senden von Kommandos! 
# ..Senden von Kommandos für Klima, Hupe, Lichthupe, Auf- und Abschließen
# ..Rückmeldung pollen bis erfolgreich (mach 8 Versuche)
#
#Known or new Bugs
# Neue Bugs sind zu gut versteckt... hab bisher keine gefunden
##########################################################
Anleitung
- Beide Dateien downloaden und öffnen
- einen beliebigen Dummy öffnen
- dort auf "Raw definition klicken
- den dortigen Text löschen und durch den Inhalt von BMW_FHEM.txt ersetzen
- Falls nicht bereits gesechehen: Den Inhalt des ersten Postings mit den Anmeldedaten dort ebenfalls hinten dran hängen
- Execute Commands drücken
- Edit Files --> bestehende 99_myBMWUtils.pm öffnen
- alles markieren und löschen
- Den Inhalt der 99_myBMWUtils.pm.txt dort hinen kopieren
- Testen
- Save Config falls alles klappt.
Kleine Warnung: der das push umgesetzt hat für sich (pushbullet oder anderes) könnte vielleicht kurz die Gratulation bekommen, dass das Auto eingefahren ist. 
Wie immer alle Angaben ohne Gewähr oder Garantie.
Ich bin nicht haftbar, falls BMW euch den Account sperrt oder das Auto wegen zu viel Vorklimatisierung mit nem leeren Akku stehen bleibt. 
Oder falls die Nachbarn sich wegen Ruhestörung durch zu viel gehupe nachs um 3 beschweren. 
Edit:
Auf Anregung von @tschimi hab ich mir jetzt auch ne kleine automatische Vorklimatisierung programmiert.
Das werd ich aber nicht ins BMW-Modul übernehmen, das ist zu speziell 
Bei mir: Wenn mein Piepser runter geht (DRK-Einsätze, Brände, ...) bekommt das meine Heimautomatisierung bereits mit.
Die 3-4 Minuten zum Umziehen kann man ja gut nutzen, in dem die Klimaanlage schon mal angeschaltet wird.
Zumindest falls a) das Auto am Strom hängt oder b) genug Akku vorhanden ist. Zudem sollte es zwischen 15 und 25°C sein. keine Ahnung, ob diese Grenzen Sinn ergeben. 
Und ich soll nicht grade den X1 vom DRK zuhause haben, weil dann nutz ich meinen 225xe ja nicht... der andere hat n blaues Lichtchen auf dem Dach, da macht das mehr Sinn als mein AT 
Hier mal der Beispielcode (wird per Notify angestoßen)
sub DRK_Einsatz
{
// [...] anderer Code dazwischen (Lampen an, Push-Benachrichgungen,, Probealarm erkennen, ...
if (1) // hier prüfung auf Probealarm, ob ich den X1 grad hab (steht in meinem Kalender), ...
{
my $Temp = ReadingsVal("Netatmo_Balkon","temperature","ERROR"); //Außentemperatur abrufen (Netatmo)
my $BMWBatt = ReadingsVal("BMW_chargingLevelHv","state","ERROR"); //Ladezustand BMW_chargingLevelHv
my $Eingesteckt = ReadingsVal("TBMW_connectorStatusEST","state","ERROR"); //Ladekabel BMW_connectorStatus
if ( (($Temp < 15) || ($Temp > 25)) && (($BMWBatt >75) || ($Eingesteckt eq "CONNECTED")) )
{
fhem("set BMW_CommandsToExecute Klima"); //Kommando auf Klima setzen
fhem("set BMW_ExecuteCommandNow on"); //Kommando ausführen
}
}
}
Alles anzeigen
Kommentare mit # hat es nicht angezeigt, daher (hier falsch) auf // geändert
Nachtrag 2: es wird immer verrückter:
(Heimautomatisierung macht süchtig)
Man könnte es ja auch im Kalender eintragen, wenn das Auto vorklimatisiert werden soll...
//Kalender Updates
sub Kalenderstart ($)
{
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids = split(/;/,$Ereignisteil1);
foreach my $uid (@uids)
{
my $Kalendertext = fhem("get CalenderJens summary uid=$uid 1");
if ($Kalendertext =~ /BMW_Vorheizen/)
{
fhem("set BMW_CommandsToExecute Klima");
fhem("set BMW_ExecuteCommandNow on");
}
}
}
Alles anzeigen
Der Kalender kommt hier über gmail per ics-datei
define CalenderJens Calendar ical url https://calendar.google.com/calendar/ical/....xxx..../basic.ics