Re: SoC Modul Hyundai Ioniq PHEV
Verfasst: Do Mär 26, 2020 12:19 pm
So ich habe ich habe die Kommunikation zwischen App und Server mit geschnitten und folgendes Modul geschrieben.
Ordner: soc_bluelink
main.sh
bluelinksoc.py
Es ist ziemlich schmutzig, aber funktioniert mit einer Aufrufzeit von ca. 7 sec, solange sich das Auto nicht schlafen gelegt hat, sonst dauert es länger.
Die Login Daten sind aktuell in der main.sh definiert.
Und es wird das erste Auto aus der Server-Liste genommen, da sonst erst die Fahrzeug Profile einzeln geladen werden müssen um sie mit der Vin zu vergleichen und aktuell habe ich nur ein Auto im BlueLink Konto, kann daher nicht testen.
Aktuell wird die Abfrage alle 10 Minuten gestartet, da ich keine Info darüber habe wie oft abgefragt werden darf.
Ordner: soc_bluelink
main.sh
Code: Alles auswählen
#!/bin/bash
. /var/www/html/openWB/openwb.conf
soctimer=$(</var/www/html/openWB/ramdisk/soctimer)
soc_bluelink_email='xxx@xxx.xxx'
soc_bluelink_password='xxx'
soc_bluelink_pin='xxxx'
if (( soctimer < 60 )); then
soctimer=$((soctimer+1))
echo $soctimer > /var/www/html/openWB/ramdisk/soctimer
else
re='^-?[0-9]+$'
soclevel=$(sudo python3 /var/www/html/openWB/modules/soc_bluelink/bluelibksoc.py $soc_bluelink_email $soc_bluelink_password $soc_bluelink_pin)
if [[ $soclevel =~ $re ]] ; then
if (( $soclevel != 0 )) ; then
echo $soclevel > /var/www/html/openWB/ramdisk/soc
fi
fi
echo 0 > /var/www/html/openWB/ramdisk/soctimer
fi
Code: Alles auswählen
import sys
import requests
import uuid
import json
import urllib.parse as urlparse
from urllib.parse import parse_qs
email = str(sys.argv[1])
password = str(sys.argv[2])
pin = str(sys.argv[3])
#vin = str(sys.argv[4])
def main():
#diviceID
url = 'https://prd.eu-ccapi.hyundai.com:8080/api/v1/spa/notifications/register'
headers = {
'ccsp-service-id': '6d477c38-3ca4-4cf3-9557-2a1929a94654',
'Content-type': 'application/json;charset=UTF-8',
'Content-Length': '80',
'Host': 'prd.eu-ccapi.hyundai.com:8080',
'Connection': 'close',
'Accept-Encoding': 'gzip, deflate',
'User-Agent': 'okhttp/3.10.0'}
data = {"pushRegId":"1","pushType":"GCM","uuid": str(uuid.uuid1())}
response = requests.post(url, json = data, headers = headers)
if response.status_code == 200:
response = json.loads(response.text)
deviceId = response['resMsg']['deviceId']
#print(deviceId)
else:
print('NOK diviceID')
return
#cookie für login
session = requests.Session()
response = session.get('https://prd.eu-ccapi.hyundai.com:8080/api/v1/user/oauth2/authorize?response_type=code&state=test&client_id=6d477c38-3ca4-4cf3-9557-2a1929a94654&redirect_uri=https://prd.eu-ccapi.hyundai.com:8080/api/v1/user/oauth2/redirect')
if response.status_code == 200:
cookies = session.cookies.get_dict()
#print(cookies)
else:
print('NOK cookie für login')
return
#login
url = 'https://prd.eu-ccapi.hyundai.com:8080/api/v1/user/signin'
headers = {'Content-type': 'application/json'}
data = {"email": email,"password": password}
response = requests.post(url, json = data, headers = headers, cookies = cookies)
if response.status_code == 200:
response = json.loads(response.text)
response = response['redirectUrl']
parsed = urlparse.urlparse(response)
authCode = ''.join(parse_qs(parsed.query)['code'])
#print(authCode)
else:
print('NOK login')
return
#token
url = 'https://prd.eu-ccapi.hyundai.com:8080/api/v1/user/oauth2/token'
headers = {
'Authorization': 'Basic NmQ0NzdjMzgtM2NhNC00Y2YzLTk1NTctMmExOTI5YTk0NjU0OktVeTQ5WHhQekxwTHVvSzB4aEJDNzdXNlZYaG10UVI5aVFobUlGampvWTRJcHhzVg==',
'Content-type': 'application/x-www-form-urlencoded',
'Content-Length': '154',
'Host': 'prd.eu-ccapi.hyundai.com:8080',
'Connection': 'close',
'Accept-Encoding': 'gzip, deflate',
'User-Agent': 'okhttp/3.10.0'}
data = 'grant_type=authorization_code&redirect_uri=https%3A%2F%2Fprd.eu-ccapi.hyundai.com%3A8080%2Fapi%2Fv1%2Fuser%2Foauth2%2Fredirect&code=' + authCode
response = requests.post(url, data = data, headers = headers)
if response.status_code == 200:
response = json.loads(response.text)
access_token = response['token_type'] + ' ' + response['access_token']
#print(access_token)
else:
print('NOK token')
return
#vehicles
url = 'https://prd.eu-ccapi.hyundai.com:8080/api/v1/spa/vehicles'
headers = {
'Authorization': access_token,
'ccsp-device-id': deviceId,
'ccsp-application-id': '99cfff84-f4e2-4be8-a5ed-e5b755eb6581',
'offset': '1',
'Host': 'prd.eu-ccapi.hyundai.com:8080',
'Connection': 'close',
'Accept-Encoding': 'gzip, deflate',
'User-Agent': 'okhttp/3.10.0'}
response = requests.get(url, headers = headers)
if response.status_code == 200:
response = json.loads(response.text)
vehicleId = response['resMsg']['vehicles'][0]['vehicleId']
#print(vehicleId)
else:
print('NOK vehicles')
return
#vehicles/profile
#prewakeup
url = 'https://prd.eu-ccapi.hyundai.com:8080/api/v1/spa/vehicles/' + vehicleId + '/control/engine'
headers = {
'Authorization': access_token,
'ccsp-device-id': deviceId,
'ccsp-application-id': '99cfff84-f4e2-4be8-a5ed-e5b755eb6581',
'offset': '1',
'Content-Type': 'application/json;charset=UTF-8',
'Content-Length': '72',
'Host': 'prd.eu-ccapi.hyundai.com:8080',
'Connection': 'close',
'Accept-Encoding': 'gzip, deflate',
'User-Agent': 'okhttp/3.10.0'}
data = {"action":"prewakeup","deviceId": deviceId}
response = requests.post(url, json = data, headers = headers)
if response.status_code == 200:
#print(response.text)
response = ''
else:
print('NOK prewakeup')
return
#pin
url = 'https://prd.eu-ccapi.hyundai.com:8080/api/v1/user/pin'
headers = {
'Authorization': access_token,
'Content-type': 'application/json;charset=UTF-8',
'Content-Length': '64',
'Host': 'prd.eu-ccapi.hyundai.com:8080',
'Connection': 'close',
'Accept-Encoding': 'gzip, deflate',
'User-Agent': 'okhttp/3.10.0'}
data = {"deviceId": deviceId,"pin": pin}
response = requests.put(url, json = data, headers = headers)
if response.status_code == 200:
response = json.loads(response.text)
controlToken = 'Bearer ' + response['controlToken']
#print(controlToken)
else:
print('NOK pin')
return
#status
url = 'https://prd.eu-ccapi.hyundai.com:8080/api/v2/spa/vehicles/' + vehicleId + '/status'
headers = {
'Authorization': controlToken,
'ccsp-device-id': deviceId,
'ccsp-application-id': '99cfff84-f4e2-4be8-a5ed-e5b755eb6581',
'offset': '1',
'Host': 'prd.eu-ccapi.hyundai.com:8080',
'Connection': 'close',
'Accept-Encoding': 'gzip, deflate',
'User-Agent': 'okhttp/3.10.0'}
response = requests.get(url, headers = headers)
if response.status_code == 200:
#print(response.text)
response = json.loads(response.text)
soc = response['resMsg']['evStatus']['batteryStatus']
print(soc)
else:
print('NOK status')
return
if __name__ == '__main__':
main()
Die Login Daten sind aktuell in der main.sh definiert.
Und es wird das erste Auto aus der Server-Liste genommen, da sonst erst die Fahrzeug Profile einzeln geladen werden müssen um sie mit der Vin zu vergleichen und aktuell habe ich nur ein Auto im BlueLink Konto, kann daher nicht testen.
Aktuell wird die Abfrage alle 10 Minuten gestartet, da ich keine Info darüber habe wie oft abgefragt werden darf.