Moin,
Ganz herzlichen Dank Dir für das Modul! Ich habe nach langer Update-Pause (meine Bugfixes kommen ja einfach nicht in die Software rein, aber das ist nicht Dein Problem) endlich mal wieder geupdated, Dein Modul gesehen: Und es funzt auf Anhieb!
Nun "mein" Problem, das ich für ein allgemeines Problem halte:
Wir stimmen ja m.W. bei VW irgendwie zu, dass wir brav sind und insbesondere nicht mit Scripten irgendwelchen Unfug treiben, der die Systeme belastet. Genau genommen ist aber die jetztige Implementierung ziemlich ressourcenbelastend bei VW:
- Jedesmal erfolgt ein Login
- ... der dann zu einem Refresh-Token (mit mutmaßlich "ewiger" Lebenszeit) führt
- ... und zur Anforderung eines Accesstokens
Halt der OAuth-Mechanismus. Wir produzieren doch damit tonnenweise (bei jedem Aufruf) gültige Refresh-Tokens bei VW!
Das Problem ist, dass die Library halt für den "Permanentbetrieb" in HomeAssistant geschrieben wurde, während das OpenWB-Modell halt die Einzelaufrufe sind. Die Library hat ja auch von Haus aus keinen State-Saving-Mechanismus.
Ich habe mich gerade mal hingesetzt und meinen absolut minimalen Python-Kenntnissen (und sehr viel Google) folgende Erweiterung geschrieben:
libvwid.py (am Ende eingefügt):
Code: Alles auswählen
def save_tokens(self, filepath):
pickle.dump(self.tokens, open(filepath, "wb"))
return True
def load_tokens(self, filepath):
try:
self.tokens = pickle.load(open(filepath,"rb"))
self.headers['Authorization'] = 'Bearer %s' % self.tokens["accessToken"]
self.log.debug("Tokens loaded")
return True
except:
return False
Und in Deinem Code die beiden Funktionen eingebunden:
Code: Alles auswählen
async with aiohttp.ClientSession() as session:
w = libvwid.vwid(session)
w.set_vin(vin)
w.set_credentials(id, pw)
w.load_tokens("/tmp/vwid.tokens")
data = await w.get_status()
if (data):
print (data['data']['batteryStatus']['currentSOC_pct'])
try:
f = open(replyFile, 'w', encoding='utf-8')
except:
os.system("sudo rm "+replyFile)
f = open(replyFile, 'w', encoding='utf-8')
json.dump(data, f, ensure_ascii=False, indent=4)
f.close()
w.save_tokens("/tmp/vwid.tokens")
Ich könnte mir vorstellen, dass das potentiellen Ärger mit VW einspart, und vermutlich ist es auch deutlich schneller und ggf. stabiler. Bei mir gehen nur 0,7 Sekunden auf die eigentliche Abfrage drauf (der Rest ist meinem lahmen Raspi geschuldet):
Code: Alles auswählen
pi@openwb:/var/www/html/openWB/modules/soc_vwid $ time ./soc_vwid.py --user $USER --password $PW --vin $FIN --chargepoint 1
73
real 0m1.870s
user 0m1.192s
sys 0m0.071s
pi@openwb:/var/www/html/openWB/modules/soc_vwid $ time ./soc_vwid.py --user $USER --password $PW --vin $FIN --chargepoint 1
73
real 0m1.965s
user 0m1.275s
sys 0m0.050s
pi@openwb:/var/www/html/openWB/modules/soc_vwid $ time ./soc_vwid.py --user $USER --password $PW --vin $FIN --chargepoint 1
73
real 0m1.869s
user 0m1.238s
sys 0m0.070s
Wie schon erwähnt: Nicht meine Sprache, und das Error-Handling ist unter aller Sau (keine Meldung, etc).
Aber vielleicht guckst Du es Dir mal bei Gelegenheit an...