SoC Modul Hyundai Ioniq PHEV

Anfragen zum Erstellen von Modulen, Fragen zu Modulen
Ulli268
Beiträge: 6
Registriert: Do Mär 19, 2020 6:15 pm
Wohnort: Bad Zwischenahn

Re: SoC Modul Hyundai Ioniq PHEV

Beitrag 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.
openWB
Site Admin
Beiträge: 7906
Registriert: So Okt 07, 2018 1:50 pm

Re: SoC Modul Hyundai Ioniq PHEV

Beitrag 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?
Supportanfragen bitte NICHT per PN stellen.
Hardwareprobleme bitte über die Funktion Debug Daten senden mitteilen oder per Mail an support@openwb.de
Ulli268
Beiträge: 6
Registriert: Do Mär 19, 2020 6:15 pm
Wohnort: Bad Zwischenahn

Re: SoC Modul Hyundai Ioniq PHEV

Beitrag 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()
openWB
Site Admin
Beiträge: 7906
Registriert: So Okt 07, 2018 1:50 pm

Re: SoC Modul Hyundai Ioniq PHEV

Beitrag von openWB »

In der nightly implementiert, bitte testen!
Supportanfragen bitte NICHT per PN stellen.
Hardwareprobleme bitte über die Funktion Debug Daten senden mitteilen oder per Mail an support@openwb.de
Pritt500
Beiträge: 11
Registriert: Mi Mär 20, 2019 2:10 pm

Re: SoC Modul Hyundai Ioniq PHEV

Beitrag von Pritt500 »

Ich habe es probiert. Bei mir tut sich nichts... Anzeige 0%.

openWB 1.7.306Nightly
OS: Linux 4.19.75-v7+
Pritt500
Beiträge: 11
Registriert: Mi Mär 20, 2019 2:10 pm

Re: SoC Modul Hyundai Ioniq PHEV

Beitrag von Pritt500 »

Habe es gerade noch einmal probiert. Es funktioniert! Danke!
openWB
Site Admin
Beiträge: 7906
Registriert: So Okt 07, 2018 1:50 pm

Re: SoC Modul Hyundai Ioniq PHEV

Beitrag von openWB »

Super, klappt das auch mit Electric?
Supportanfragen bitte NICHT per PN stellen.
Hardwareprobleme bitte über die Funktion Debug Daten senden mitteilen oder per Mail an support@openwb.de
Pritt500
Beiträge: 11
Registriert: Mi Mär 20, 2019 2:10 pm

Re: SoC Modul Hyundai Ioniq PHEV

Beitrag 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
foobar123
Beiträge: 11
Registriert: Di Jun 16, 2020 9:09 pm

Re: SoC Modul Hyundai Ioniq PHEV

Beitrag 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.
aiole
Beiträge: 6779
Registriert: Mo Okt 08, 2018 4:51 pm

Re: SoC Modul Hyundai Ioniq PHEV

Beitrag von aiole »

zu 1)
Die Ist-SoC-Werte werden rechts unter dem Diagramm in der Hauptseite angezeigt.
Antworten