Audi Connect / Audi MMI in fhem?

Begonnen von huhu, 02 Januar 2019, 13:53:10

Vorheriges Thema - Nächstes Thema

huhu

Hallo zusammen,

gibt es eine Audi Connect Implementierung in FHEM oder "arbeitet" zufällig jemand daran? Es gibt ein Python Script, aber leider reichen meine Kenntnisse nicht aus um das in FHEM zu übertragen.
https://github.com/davidgiga1993/AudiAPI

Viele Grüße

Gunther

Ist hier schon jemand "weitergekommen"?
FHEM@Proxmox@Nuc: TabletUI als User-Interface (4 Wandtablets) / IOs per ser2net gekapselt
Homematic: Heizung, Fenster, Bewegung | Jeelink: Temperatur | Z-Wave: Bewegung, Temperatur | FS20: Temperatur, Fenster | Viessmann-Heizung eingebunden

steffen83

Ich hatte es Mal versucht, kam aber überhaupt nicht weiter. Könnte nur die Seriennummer ist so anrufen. Rest habe ich nicht verstanden
Raspberry Pi 3 (Noobs, aktuelle Fhem und Pilight) | FHEMduino | HM-OCCU-SDK | HM-Sec-SCo | HM-Sec-SD-2 | HM-CC-RT-DN | HM-LC-Bl1PBU-FM

jojoja

Abend zusammen,

bei meinen Spielereien ist vorerst mal das herausgekommen:
import json
import string

from audiapi.API import *
from audiapi.Services import *
from audiapi.Token import *

def main():
    api = API()
    logon_service = LogonService(api)
    if not logon_service.restore_token():
        # We need to login
        with open('credentials.json') as data_file:
            data = json.load(data_file)
        logon_service.login(data['user'], data['pass'])

    car_service = CarService(api)
    vehicles_response = car_service.get_vehicles()
    print("\nGet vehicle information")
    vehicle = vehicles_response.vehicles[0]
    print((str(vehicle)).replace("'", '"'))

    vehicle_data = car_service.get_vehicle_data(vehicle)
#    print(vehicle_data)

    print("\nGet battery informations")
    battery_service = RemoteBatteryChargeService(api, vehicle)
    stored_data = battery_service.get_status()
    print((str(stored_data)).replace("'", '"'))

#    mgmt_service = VehicleManagementService(api, vehicle)
#    mgmt_service.get_information()

    print("\nGet vehicle location")
    car_finder_service = CarFinderService(api, vehicle)
    vehicle_position = car_finder_service.find()
    print((str(vehicle_position)).replace("'", '"'))

    print("\nDecode Position")
    pos = json.loads((str(vehicle_position)).replace("'", '"'))
    try:
        print("Longitude: ", str(pos["findCarResponse"]["Position"]["carCoordinate"]["longitude"]))
        print("Latitude: ", str(pos["findCarResponse"]["Position"]["carCoordinate"]["latitude"]))
        print("->  ",str(int(pos["findCarResponse"]["Position"]["carCoordinate"]["latitude"])/1000000), ", ", str(int(pos["findCarResponse"]["Position"]["carCoordinate"]["longitude"])/1000000))
    except Exception as e:
        print(e)


if __name__ == '__main__':
    main()


Das ergibt bei mir dann ungefähr folgendes:
Get vehicle information
{"vin": "nö", "csid": "nö", "registered": "nö"}

Get battery informations
{"charger": {"settings": {"maxChargeCurrent": {"content": 32, "timestamp": "2019-04-05T12:07:11Z"}}, "status": {"chargingStatusData": {"externalPowerSupplyState": {"content": "unavailable", "timestamp": "2019-12-10T16:15:10Z"}, "chargingState": {"content": "off", "timestamp": "2019-12-10T16:15:10Z"}, "chargingReason": {"content": "invalid", "timestamp": "2019-12-10T16:15:10Z"}, "energyFlow": {"content": "off", "timestamp": "2019-12-10T16:15:10Z"}, "chargingMode": {"content": "invalid", "timestamp": "2019-12-10T16:15:10Z"}}, "batteryStatusData": {"remainingChargingTimeTargetSOC": {"content": "unsupported", "timestamp": "2019-12-10T16:15:07Z"}, "remainingChargingTime": {"content": 0, "timestamp": "2019-12-10T16:15:07Z"}, "stateOfCharge": {"content": 60, "timestamp": "2019-12-10T16:17:14Z"}}, "plugStatusData": {"plugState": {"content": "disconnected", "timestamp": "2019-12-10T16:15:10Z"}, "lockState": {"content": "unlocked", "timestamp": "2019-12-10T16:15:10Z"}}, "ledStatusData": {"ledState": {"content": "off", "timestamp": "2019-12-10T16:15:10Z"}, "ledColor": {"content": "none", "timestamp": "2019-12-10T16:15:10Z"}}, "cruisingRangeStatusData": {"engineTypeFirstEngine": {"content": "typeIsElectric", "timestamp": "2019-12-10T16:17:14Z"}, "primaryEngineRange": {"content": 22, "timestamp": "2019-12-10T16:17:14Z"}}}}}

Get vehicle location
{"findCarResponse": {"parkingTimeUTC": "2019-12-10T16:15:58Z", "Position": {"timestampCarCaptured": "2019-12-10T17:17:14", "timestampCarSentUTC": "2019-12-10T16:15:58Z", "timestampCarSent": "2019-12-10T17:17:14", "timestampTssReceived": "2019-12-10T16:17:14Z", "carCoordinate": {"latitude": nö, "longitude": nö}}}}

Decode Position
Longitude:  nö
Latitude:  nö
->   nö,  nö


Das ausgeklammerte mgmt_service hat bei mir nicht funktioniert, fehlende Berechtigungen... Und die hier einbezogenen Batterie Infos funktionieren vermutlich nur bei den e-trons :D
Ich guck die Tage mal weiter, aber vielleicht kann schon jemand etwas damit anfangen.

Viele Grüße
Johannes
FHEM 6.0 @ IntelNUC6CAYH;  Unifi USG, Switch, AP AC Pro; HM-MOD-UART;  Sonos Play 1 & 3, One, Beam; Philips Hue

steffen83

Bin da leider Neuling drin, was soll ich genau da testen?
Helfe dann gern

Gesendet von meinem MI 8 mit Tapatalk

Raspberry Pi 3 (Noobs, aktuelle Fhem und Pilight) | FHEMduino | HM-OCCU-SDK | HM-Sec-SCo | HM-Sec-SD-2 | HM-CC-RT-DN | HM-LC-Bl1PBU-FM

jojoja

Kurz:

git clone https://github.com/davidgiga1993/AudiAPI.git
cd AudiAPI
cp credentials.template.json credentials.json
nano credentials.json
nano testAudi.py


Im ersten nano müssen deine Zugangsdaten rein und im zweiten nano den Code von oben. Mit
python3 testAudi.py

sollte/könnte es dann durchlaufen :D kannst ja mal probieren, ob mgmt_service tut, vielleicht braucht man dafür eine SIM im Auto. Viel Spaß!
FHEM 6.0 @ IntelNUC6CAYH;  Unifi USG, Switch, AP AC Pro; HM-MOD-UART;  Sonos Play 1 & 3, One, Beam; Philips Hue

steffen83

#6
python3 testAudi.py

Get vehicle information
{"vin": "nö", "registered": "2018-02-09T18:39:18.556+01:00", "csid": "nö"}

Get battery informations
Traceback (most recent call last):
  File "testAudi.py", line 50, in <module>
    main()
  File "testAudi.py", line 28, in main
    stored_data = battery_service.get_status()
  File "/home/pi/AudiAPI/audiapi/Services.py", line 330, in get_status
    data = self._api.get(self.url('/vehicles/{vin}/charger'))
  File "/home/pi/AudiAPI/audiapi/API.py", line 50, in get
    return self.__handle_error(r.json())
  File "/home/pi/AudiAPI/audiapi/API.py", line 68, in __handle_error
    raise Exception('API error: ' + str(error) + '\n' + error_msg)
Exception: API error: {'description': 'The service: rbatterycharge_v1 for VIN: nöööööööööööööö could not be found.', 'errorCode': 'batterycharge.auth.forbidden'}


Wenn ich den Teil mit der Batterie rausnehme klappt es besser :-)

Get vehicle information
{"registered": "2018-02-09T18:39:18.556+01:00", "vin": "xxx", "csid": "xxx"}

Get vehicle location
{"findCarResponse": {"Position": {"timestampCarSentUTC": "2019-12-11T06:08:40Z", "carCoordinate": {"longitude": 7xxx, "latitude": 51xxx}, "timestampTssReceived": "2019-12-11T06:08:48Z", "timestampCarCaptured": "0002-11-28T00:00:00", "timestampCarSent": "0002-11-28T00:00:00"}, "parkingTimeUTC": "2019-12-11T06:08:40Z"}}

Decode Position
Longitude:  7xxx
Latitude:  51xxx
->   51.xxx ,  7.xxx


Was man jetzt testen muss, ob er auch die Standortdaten ausgibt, wenn das Auto sich bewegt :-)
Raspberry Pi 3 (Noobs, aktuelle Fhem und Pilight) | FHEMduino | HM-OCCU-SDK | HM-Sec-SCo | HM-Sec-SD-2 | HM-CC-RT-DN | HM-LC-Bl1PBU-FM

der-Lolo


jojoja

Meine Erfahrung damit ist, dass das Auto von sich aus nur beim Abstellen sendet. Da in meiner Tiefgarage kein Empfang ist, steht es quasi immer beim letzten Halteort, also beim Einkaufen oder Arbeit. Über die App kann man aber ein manuelles Update anfragen.
FHEM 6.0 @ IntelNUC6CAYH;  Unifi USG, Switch, AP AC Pro; HM-MOD-UART;  Sonos Play 1 & 3, One, Beam; Philips Hue

der-Lolo

Toll wäre wenn man z.b. von FHEM aus Navigationziele eingeben könnte...

huhu

Schande über mein Haupt, diesen Thread habe ich schon total vergessen.. Habe es gerade mal mit dem Code von jojoja probiert aber es endet in:

python3 testAudi.py
Traceback (most recent call last):
  File "testAudi.py", line 1, in <module>
    from audiapi.Services import *
  File "/home/pi/AudiAPI/audiapi/Services.py", line 66
    return super().url(part, **format_data, vin=self._vehicle.vin)
                                          ^
SyntaxError: invalid syntax


Ich verstehe es aber leider nicht wirklich..

Basti-K

kann es sein das die API nicht mehr geht?

pi@FHEM:~/AudiAPI $ python3 ./testAudi.py
Traceback (most recent call last):
  File "./testAudi.py", line 50, in <module>
    main()
  File "./testAudi.py", line 15, in main
    logon_service.login(data['user'], data['pass'])
  File "/home/pi/AudiAPI/audiapi/Services.py", line 191, in login
    token = self.__login_request(user, password)
  File "/home/pi/AudiAPI/audiapi/Services.py", line 221, in __login_request
    reply = self._api.post(self.url('/token'), data, use_json=False)
  File "/home/pi/AudiAPI/audiapi/API.py", line 62, in post
    return self.__handle_error(r.json())
  File "/home/pi/AudiAPI/audiapi/API.py", line 68, in __handle_error
    raise Exception('API error: ' + str(error) + '\n' + error_msg)
Exception: API error: invalid_request
Backend Failure

steffen83

Audi hat glaube ich die Zusammenarbeit mit Google beendet oder umgekehrt.

Von daher klappt das nicht.
Raspberry Pi 3 (Noobs, aktuelle Fhem und Pilight) | FHEMduino | HM-OCCU-SDK | HM-Sec-SCo | HM-Sec-SD-2 | HM-CC-RT-DN | HM-LC-Bl1PBU-FM