Seite 2 von 3

Re: SoC Modul Hyundai Ioniq PHEV

Verfasst: Do Mär 26, 2020 12:19 pm
von Ulli268
So ich habe ich habe die Kommunikation zwischen App und Server mit geschnitten und folgendes Modul geschrieben.

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
bluelinksoc.py

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()
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.

Re: SoC Modul Hyundai Ioniq PHEV

Verfasst: Do Mär 26, 2020 12:26 pm
von openWB
7 Sekunden ist ziemlich lang.
Idee:
alle 10 Sekunden ramdisk/soc einlesen und alle $intervall die Python triggern mit & am Ende das sie parallel läuft.
die Python dann nach ramdisk/soc schreiben lassen.

Einverstanden?

Re: SoC Modul Hyundai Ioniq PHEV

Verfasst: Do Mär 26, 2020 2:20 pm
von Ulli268
Ja, Parallel laufen lassen macht sinn.
Ist abgeändert und Ich habe noch ein Parameter hinzugefügt für den Intervall in Minuten.

Parameter für openwb.conf:

soc_bluelink_email
E-Mail Adresse zum BlueLink Konte

soc_bluelink_password
Passwort zum BlueLink Konte

soc_bluelink_pin
Pin zum BlueLink Konte

soc_bluelink_interval
Abfrage Intervall in Minuten

Hier die angepassten Dateien:

/var/www/html/openWB/modules/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='xxx'
#soc_bluelink_interval='5'

tmpintervall=$(( soc_bluelink_interval * 6 ))

if (( soctimer < tmpintervall )); then
	soctimer=$((soctimer+1))
	echo $soctimer > /var/www/html/openWB/ramdisk/soctimer
else
	sudo python3 /var/www/html/openWB/modules/soc_bluelink/bluelibksoc.py $soc_bluelink_email $soc_bluelink_password $soc_bluelink_pin &
	echo 0 > /var/www/html/openWB/ramdisk/soctimer
fi
/var/www/html/openWB/modules/soc_bluelink/bluelinksoc.py

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)
        f = open('/var/www/html/openWB/ramdisk/soc', 'w')
        f.write(str(soc))
        f.close()
    else:
        print('NOK status')
        return

if __name__ == '__main__':
    main()

Re: SoC Modul Hyundai Ioniq PHEV

Verfasst: Do Apr 02, 2020 3:53 am
von openWB
In der nightly implementiert, bitte testen!

Re: SoC Modul Hyundai Ioniq PHEV

Verfasst: So Apr 05, 2020 6:57 am
von Pritt500
Ich habe es probiert. Bei mir tut sich nichts... Anzeige 0%.

openWB 1.7.306Nightly
OS: Linux 4.19.75-v7+

Re: SoC Modul Hyundai Ioniq PHEV

Verfasst: So Apr 05, 2020 4:14 pm
von Pritt500
Habe es gerade noch einmal probiert. Es funktioniert! Danke!

Re: SoC Modul Hyundai Ioniq PHEV

Verfasst: So Apr 05, 2020 6:15 pm
von openWB
Super, klappt das auch mit Electric?

Re: SoC Modul Hyundai Ioniq PHEV

Verfasst: Mo Apr 06, 2020 4:03 pm
von Pritt500
Hallo Kevin,
nachdem gestern Abend ein Wert im SoC war, dachte ich es funktioniert. Heute hat er aber den ganzen Tag kein update gemacht, obwohl ich denn Akku fast leer gefahren habe. Ich bin mir auch gar nicht sicher, ob der gestern angezeigte Wert tatsächlich vom Ioniq war, zufällig hatte meine Zoe auch genau 91%.
Auf der Ramdisk habe ich nur zoereq und zoereplydateien gefunden, ist das richtig? Oder gibt es extra Dateien für das Bluelinkmodul?

Grüße,
Thomas

Re: SoC Modul Hyundai Ioniq PHEV

Verfasst: Sa Okt 17, 2020 8:42 pm
von foobar123
Wie kann ich prüfen ob bei mir das Modul richtig funktioniert? In der Modulkonfiguration habe ich alle Werte eingetragen. Bin aber noch neu beim Thema OpenWB. D.h.
1) wo kann ich als Nutzer die Werte sehen? SoC LP1?
2) Wie kann ich Logs mit potentiellen Fehlern finden?
3) Wie könnte ich selbst Verbesserungen einbringen auf meiner WB?

Danke für die Hilfe.

Re: SoC Modul Hyundai Ioniq PHEV

Verfasst: Mi Okt 21, 2020 6:46 pm
von aiole
zu 1)
Die Ist-SoC-Werte werden rechts unter dem Diagramm in der Hauptseite angezeigt.