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
Ist hier schon jemand "weitergekommen"?
Ich hatte es Mal versucht, kam aber überhaupt nicht weiter. Könnte nur die Seriennummer ist so anrufen. Rest habe ich nicht verstanden
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
Bin da leider Neuling drin, was soll ich genau da testen?
Helfe dann gern
Gesendet von meinem MI 8 mit Tapatalk
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ß!
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 :-)
zum mitlesen!
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.
Toll wäre wenn man z.b. von FHEM aus Navigationziele eingeben könnte...
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..
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
Audi hat glaube ich die Zusammenarbeit mit Google beendet oder umgekehrt.
Von daher klappt das nicht.