Batterie-Ladezustand mit einem Arduino ESP32 auslesen, möglich ?

Hallo aus dem heissen Elsass !

Ich suche einen Weg mit einem ESP 32 (mit Arduino IDE programmiert) den Ladezustand meines Springs auszulesen.
Ich habe gesehen es ist mit solchen Sachen wie Node-RED möglich aber ich möchte das mit einem ESP 32 (vielleicht mit einem HTTP Request ?) machen, aber ich weiss nicht was für eine Adresse abrufen und wie mann drankommt.
Hat jemand vielleicht eine Idee ?

P.S. Wenn Ihr nix verstanden habt macht euch keinen Kummer, es ist nicht schlimm ! 😄

Roland
 

masahuku

eDacia-Interessierter
Ort
Rendsburg
Version
Extreme
Motor
65 PS (48kW)
Baujahr
2023
Details
CCS
Moin, da könnte man fast fragen - warum einfach, wenn es auch kompliziert geht...

Ich mache es mit dem Android-Handy, der App CanZE Plus und einem stinknormalen ELM 327
Bluetooth - Adapter. Geht wunderbar, man muss sich natürlich in der Reichweite des Adapters befinden.
Fernabfrage geht übrigens mit der My Dacia App, es sei denn, Du brauchst mehr oder spezielle Daten, da kann ich leider nicht weiter helfen.

Grüße,

masahuku
 
G

Gast1118

Guest
Hi,

die renault-api ist per http-requests erreichbar.
Zu der renault-api gibt's ne recht gute Doku:

Als Beispiel, wie die API verwendet werden kann bzw. muss (login etc.), könnte der Sourcecode des NodeRed-Plugins hilfreich sein:
In der ZEServices.ts passiert das Wichtigste.

Viele Grüße
 

-dP-

eDacia-Angesehener
Ort
NDS LK Hildesheim
Version
Comfort+
Motor
45 PS (33 kW)
Baujahr
2021
Details
CCS
Ich hatte mal angefangen (und wieder eingestellt), ein Zusatz-Touchdisplay mit raspi zu basteln.

Das wäre dann über einen odb gegangen und funktionierte auch etwas. Aber es war ein Zeitfresser für zu wenig Zweck (bspw. per Touchscreen die Max Geschwindigkeit einzustellen oder den Scheibenwischer Intervall zu justieren, Verbrauch und Batterie Zustand). Odb ist halt offline und wäre dafür ganz cool.

Mit dem angesprochenen Services musst du halt online sein. Was zuhause sicher kein Problem sein dürfte. Aber unterwegs? Ggfs. mit dem Smartphone einen Hotspot erzeugen... Aber die Frage ist dann wieder nach der Zuverlässigkeit (in Echtzeit).
 

Rollmops67

eDacia-Begeisterter
Also für die die sich Fragen warum die Arbeit..
Natürlich kann ich den Ladezustand über die MyDacia-App abfragen.
Aber ich habe mir ein Display gebastellt wo ich ablesen kann was meine Solarpannele produzieren, vieviel Strom das Haus verbraucht, wie warm es drinnen und draussen ist, wie heiss das Wasser im Speicher ist, usw...
Und da möchte ich die Anzeige des Ladezustands des Springs dazumachen.
Und wenn das mal gemacht ist, wird es dann ein Kinderspiel sein den Ladevorgang bei xx% abzubrechen !
Ist es nötig ?
Natürlich nein, aber da ich halt gerne basttle (ob mich echten Werkzeugen oder über den Umweg einer Tastatur) will ich es versuchen !
Auf dem Foto ist übrigens der Spring dabei mit 6 A zu laden, grösstenteils solar.

Roland
 

Anhänge

  • IMG_20230823_150311.jpg
    IMG_20230823_150311.jpg
    598,3 KB · Aufrufe: 108

-dP-

eDacia-Angesehener
Ort
NDS LK Hildesheim
Version
Comfort+
Motor
45 PS (33 kW)
Baujahr
2021
Details
CCS
Falls dich der offline Weg interessiert (höherer Aufwand und vermutlich nicht auf einem esp32 machbar - eher raspi): python-OBD

Weil ich fürs Frontend mit Python nicht vertraut bin, hatte ich dann noch socketio genutzt und asynchron mit uvicorn. Damit konnte ich dann auf dem Frontend per js zugreifen und per html/css die Ausgabe machen...
 

-dP-

eDacia-Angesehener
Ort
NDS LK Hildesheim
Version
Comfort+
Motor
45 PS (33 kW)
Baujahr
2021
Details
CCS

Rollmops67

eDacia-Begeisterter
Hui hui, ich habe ein bisschen geschaut was ich machen kann, das schwerste schein eine "account_id" zu bekommen, da muss man wenn ich es recht verstanden habe über 2 verschiedene Webserver um das zu bekommen.
Mal darüber schlafen...

Roland
 

-dP-

eDacia-Angesehener
Ort
NDS LK Hildesheim
Version
Comfort+
Motor
45 PS (33 kW)
Baujahr
2021
Details
CCS
import requests
import urllib.parse

# definitions
myLocation = 'de_DE'
# maybe for you 'fr_FR' but for now, i can't see country specific values (of course not, because it's just about to get the credentials for KAMEREON
myUsername = 'your_mail_adresse_at_mydacia'
myPassword = 'your_password_at_mydacia'
myVIN = 'your_vin_not_for_now_but_for_later_LOL'

# definitions, normally not needed to change
myURLkeysBase = 'https://renault-wrd-prod-1-euw1-myrapp-one.s3-eu-west-1.amazonaws.com/configuration/android/config_'
myURLkeys = myURLkeysBase+myLocation+'.json'
URLgigya = 'https://accounts.eu1.gigya.com'

# initialize = not in the loop
myUsernameURL = urllib.parse.quote(myUsername)
myPasswordURL = urllib.parse.quote(myPassword)
myURLheaders = {
"content-type": "application/json",
}
apiKeys = requests.request("GET", myURLkeys, headers=myURLheaders)
apiKeysServers = apiKeys.json()['servers']
apiKeyServerWired = {"target": apiKeysServers['wiredProd']['target'], "apikey": apiKeysServers['wiredProd']['apikey']}
apiKeyServerGigya = {"target": apiKeysServers['gigyaProd']['target'], "apikey": apiKeysServers['gigyaProd']['apikey']}
print(f"apiKeyServerWired {apiKeyServerWired}")
print(f"apiKeyServerGigya {apiKeyServerGigya}")
URLaccountMethod = '/accounts.login'
URLaccount = URLgigya+URLaccountMethod+'?loginID='+myUsernameURL+'&password='+myPasswordURL+'&apiKey='+apiKeyServerGigya["apikey"]

# loop = not for now... but you'll need to refresh the session data...

# refresh(?) session or not
URLaccountJson = requests.request("GET", URLaccount, headers=myURLheaders)
sessionGigyaToken = URLaccountJson.json()["sessionInfo"]["cookieValue"]
sessionGigyaUID = urllib.parse.quote(URLaccountJson.json()["UID"])

# get the person id with the help of the token
URLaccountInfoMethod = '/accounts.getAccountInfo'
URLaccountInfo = URLgigya+URLaccountInfoMethod
URLaccountInfoHeaders = {
'Content-Type': 'application/x-www-form-urlencoded'
}
URLaccountInfoData = {
'ApiKey': urllib.parse.quote(apiKeyServerGigya["apikey"]),
'login_token': urllib.parse.quote(sessionGigyaToken)
}
URLaccountInfoResult = requests.request("POST", URLaccountInfo, headers=URLaccountInfoHeaders, data=URLaccountInfoData)
URLaccountPersonID = URLaccountInfoResult.json()["data"]["personId"]

# get the gigya gwt token

URLaccountGwtMethod = '/accounts.getJWT'
URLaccountGwt = URLgigya+URLaccountGwtMethod
URLaccountGwtHeaders = {
'Content-Type': 'application/x-www-form-urlencoded'
}
URLaccountGwtData = {
'ApiKey': urllib.parse.quote(apiKeyServerGigya["apikey"]),
'login_token': urllib.parse.quote(sessionGigyaToken),
'fields': 'data.personId,data.gigyaDataCenter',
'expiration': 900
}

URLaccountGwtResult = requests.request("POST", URLaccountGwt, headers=URLaccountGwtHeaders, data=URLaccountGwtData)

URLaccountGWTtoken = URLaccountGwtResult.json()["id_token"]


print(f"sessionGigyaToken {sessionGigyaToken}")
print(f"URLaccountPersonID {URLaccountPersonID}")
print(f"URLaccountGWTtoken {URLaccountGWTtoken}")
 
Zuletzt bearbeitet:

-dP-

eDacia-Angesehener
Ort
NDS LK Hildesheim
Version
Comfort+
Motor
45 PS (33 kW)
Baujahr
2021
Details
CCS
Hui hui, ich habe ein bisschen geschaut was ich machen kann, das schwerste schein eine "account_id" zu bekommen, da muss man wenn ich es recht verstanden habe über 2 verschiedene Webserver um das zu bekommen.
Mal darüber schlafen...

Roland
hi @Rollmops67 . also das ist jetzt mal ein script ohne fehlerbehandlung oder sonst was.
by #definitions ist eigentlich für diesen schritt nur username und password von mydacia notwendig

und im moment hört es vor dem kamereon auf. muss ich heute abend mal schauen, ob ich da zeit finde :)

naja. und weil ich mich in python auch nicht so sicher bewege: das müsste dann noch gegen micropython geprüft werden...
 

-dP-

eDacia-Angesehener
Ort
NDS LK Hildesheim
Version
Comfort+
Motor
45 PS (33 kW)
Baujahr
2021
Details
CCS
Und ganz klar: OHNE diese Beschreibung hätte ich dabei auch keinen Spaß gehabt. Hier wurde enorm gute Arbeit geleistet und das öffentlich. Vielen Dank dafür:


Ich denke nur, dass fürs Optimieren/Konvertieren fürs MicroPython der Ablauf Schritt-für-Schritt verstanden werden muss und vermutlich reicht als Fehler-Abfrage jeweils ein "error=true" und dann auf den nächsten Loop warten :)
 

Godehard

eDacia-Wissendurstiger
Version
Extreme
Motor
65 PS (48kW)
Baujahr
2023
Details
CCS, Frunk, Oxxo-Telesto-185er
Moin zusammen.
Ich arbeite mich in node-red ein. Es läuft auf meinem orangepi zero3 ohne Probleme. Die entsprechende renault-api habe ich installiert. Das Beispielprogramm habe ich auch installiert. Meine Anmeldedaten habe ich eingegeben, das Anmelden funzt auch. Gebe ich falsche Daten ein kommt eine Fehlermeldung.
Wenn ich jetzt eine Aktion auslöse dann wird mir im Ddbugfenster viel angezeigt. Ds werden auch die verwendeten Variablennamen ausgegeben. Jedoch der Inhalt leider nicht. Beispiel:

battery-status : msg : Object
{ _msgid: "720c115ff2c39e37", topic: "battery-status", payload: object }

Ich habe auch eine Chart erzeugt, habe aber keine Ahnung wie ich es damit verknüpfe. Die Linie habe ich natürlich vom Renaultobjekt zum Chart gezogen, angezeigt wird aber nix.

Das Ziel soll soll sein das Laden auf 80% zu begrenzen und div. Werte auf einer Seite anzuzeigen.

Danke für Eure Hilfe.
 
Zuletzt bearbeitet:
G

Gast1118

Guest
Hi,
um den Inhalt des Objekts im Debug-Tab von NodeRed zu sehen, musst du das objekt "aufklappen":
1693063903804.png


Für die Begrenzung auf 80% hat @matzzz schon einmal einen Flow für NodeRed gebaut:

Wegen des Charts kann ich dir leider nicht helfen, das hab ich selbst so nicht in Verwendung.
 

Godehard

eDacia-Wissendurstiger
Version
Extreme
Motor
65 PS (48kW)
Baujahr
2023
Details
CCS, Frunk, Oxxo-Telesto-185er
@lksp1 Danke, Du hast mir sehr geholfen. Die kann man nur so Deppert sein🥴😵‍💫🤣
Das mit dem Chart bekomme ich jetzt sicher ihn. Ich muß nur den Variablennamen einsetzen der angezeigt wird. Wenn man zu oft den Spring abfragt bekommt man übrigens folgende Nachricht:
"err.func.wired.overloaded"

message: "You have reached your quota limit"
Also wird morgen weitergetestet.
 
G

Gast1118

Guest
Gerne und kein Problem, das graue Dreieck kann man leicht übersehen 🙈
Das mit dem Abfragelimit ist interessant, hatte ich tatsächlich bisher noch nicht.
Wünsche für morgen dann viel Erfolg 😁
 

hupferlFahrer

eDacia-Neuling
Hallo @-dP-.
Vielen Dank für Deine klasse Arbeit in Python auf die Renault-API hin.
Kenn mich zwar ein wenig mit Python aus, aber bzgl. dem 'HTTP'-Zugriff mit der Renault-API stehe ich an;
heißt: welchen 'Request' schickt man nun nach den apiKeys, sessionGigyaToken, .. -Erzeugungen um z.B. den BatteryStatus (siehe Renault endpoints — Renault API documentation) zu erhalten ?

(m)eine 1. aber so nicht funktionierende Idee:
URLcontent = '/commerce/v1/accounts/'+URLaccountPersonID+'/kamereon/kca/car-adapter/v2/cars/'+myVIN+'/battery-status'

URL4get = URLaccount + URLcontent

r = requests.get(URL4get)

.. und dann das 'r' mit json o.ä. inhaltlich auswerten


Leider hab ich nirgendswo einen Beispiel-Zugriff in der Renault-API -Dokumentation (und dbzgl. im Internet) gefunden.
Würd mich echt freuen Renault-API-fachkundige Unterstützung zu erhalten, um endlich den letzten Baustein in der PV-Lade-Vernetzung zu schaffen (Kommunikation zu Hauskraftwerk und Wallbox steht .. jetzt gilt es 'nur' noch entsprechend des Ladestands passend zu laden).
Vielen Dank
Martin
 
Zuletzt bearbeitet:

Empfohlene Communitys



Oben