Ah, ok, das ist der Request für die Daten und nicht die Antwort. Schade.
Ich versuche auch schon seit Tagen mehr aus der Polestar App zu bekommen und spiele (leider ist es nicht mehr) mit einem Android-Telefon herum. Den Datenaustausch mitschneiden geht nicht (SSL Pinning), ich bin zwar insofern weitergekommen, dass ich mit Frida und objection einen Teil des SSL/Cert-Pinning ausschalten kann, aber der Teil, der für die SoC Übermittlung und Fahrzeugsteuerung zuständig ist, bleibt verschlüsselt.
Es gibt im Filesystem der App einen shared_prefs Ordner mit Vocmo_Secret_Shared_Preferences.xml und Vocmo_Shared_Preferences.xml - da klingen die Namen gut, aber scheinen mit dem Keystore von Android zu tun zu haben (androidx_security_crypto_encrypted_prefs_key_keyset), zweite XML ist eine ID aus den letzten Zahlen der VIN+Benutzername/Mailadresse_catalog (12345abcd@abcde.xy_catalog").
Was mir neu aufgefallen ist, ist diese Serveradresse, die sich in ein Zertifikat auflöst:
http://crl.volvocars.com/cc/torslanda/policy_server_v1.crl
in einem Logfile tauchte auch das auf http://ocsp.volvocars.com/cc/
(EDIT2: okay, das ist dafür gedacht, wenn ein Certificate zurückgezogen wird -deshalb als Antwort eine 0)
…vielleicht verhilft das zum Durchbruch, für mich sind es nur Puzzleteile, die ich nicht zusammen setzen kann.
Und so sieht es dann -leider- aus, wenn die App seit Stunden nicht erreichbar ist, weil wieder herumgefingert wird oder warum auch immer?!:
DAS ist der Nachteil, wenn man abhängig von der Polestar-App ist, leider.
Glücklicherweise steht das Auto bereits seit ein paar Tagen in der Garage mit erreichter Mobilitätsreserve.
das dürfte so sein. Wenn ich die App öffne, werden 2 Dateien neu im Android-keystore abgelegt (CACERT_xxxxdevicePairingKey und CACERT_xxxxcatalogKey.) Hier gibt es dann auch die Zuordnung von dem von mir erwähnten „User“ mit VIN+Benutzername_catalog.
Woher die Keys kommen, kann ich nicht sagen - die Verbindung aus der App passiert in einer Library (libvocmo-lib.so) und tiefer komme ich da nicht.
Im catalogKey steht „=signencrypt.catalogueexternal.caraccess.eu.prod.volvocars.com“ und weiter dann ein Link, der ein Zertifikat ergibt (aber würde das Sinn machen, wenn der Schlüssel/Cert von einem Server kommt, der dann die nachfolgende Verbindung en/decodiert??)
http://trust.volvocars.com/cc/torslanda/service_sign_and_encrypt_v2.crt
Ich habe mich darauf konzentriert, die Verbindung „abhören“ zu können, um an die Links zu kommen, aber die Links zu den API Endpunkten sind ja eigentlich schon im iobroker. Wenn ich wieder etwas Zeit habe, spiele ich weiter herum.
Edit-PS: ich hatte heute Kontakt mit dem Support und habe meinen Wunsch nach einer offenen API (wieder) vorgebracht… leider:
Es ist derzeit nicht geplant, APIs zu veröffentlichen, aber wir werden in Zukunft weitere Optionen prüfen. Wir können aber den Kauf einer smarten Wallbox empfehlen.
Update von meiner neuesten Implementierung … mit dem Car Stats Viewer ab Version 0.24.x kann man aktiv vom Polestar einen WebHook mit dem JSON Datenpaket nach Hause ( https funktioniert) senden lassen.
Ein einfacher Weg die Position und den SOC zu übertragen ist die Verwendung des vordefinierten Tracker Objects.
Im HA muss man dazu nur in der known_devices.yaml den Polstar2 als Tracking Object anlegen… (Edit / Comment : kann man offensichtlich weglassen; die Automation erstellt ggf selbst eine neue Entity.)
polestar2:
name: Polestar2
mac:
icon: mdi:CarHatchback
picture:
track: true
… und eine Automation auf den eingehenden WebHook setzen … (bitte die UI benutzen und den zufällig generierten WebHook Schlüssel benutzen… und nicht das hier 1:1 kopieren
alias: Garage Polestar2 CSV
description: WebHook from PS2
trigger:
- platform: webhook
webhook_id: my_unique_coded_webhook_key
condition: []
action:
- service: device_tracker.see
data_template:
dev_id: polestar2
battery: "{{ trigger.json.stateOfCharge }}"
gps:
- "{{ trigger.json.lat }}"
- "{{ trigger.json.lon }}"
mode: single
fertig.
BTW: Der SOC wird zuerst ins Objekt geschrieben, damit im Fehlerfall - ohne gültige GPS Daten - der Abbruch der Automation wegen ungültigem Lat/Lon keinen Effekt hat.
Wichtiger Hinweis aus der HA FAQ : dieser Weg ist nicht geeignet um mit der Positionsinformation Schaltfunktionen auszulösen; der WebHook ist nur über den statischen Schlüssel abgesichert.
Hier der Cross Link zum CSV :
CSV webhook Fortsetzung
Update / Edit / Version 2 : Eintrag geändert auf „most simple solution“ entsprechend dem Beispiel
https://www.home-assistant.io/integrations/template/#trigger-based-sensor-and-binary-sensor-storing-webhook-information
Möchte man mehr Informationen aus dem CSV JSON Object übertragen, nutzt man den Trigger direkt für Template Objekte.
Einfach im „config.yaml“ die Sensoren nach dem folgenden Beispiel definieren … webHook wie oben definieren.
# for Polestar2 webhook by https ....
template:
- trigger:
- platform: webhook
webhook_id: my_unique_coded_webhook_key
sensor:
- name: 'Polestar2 SOC'
unit_of_measurement: '%'
state: "{{ trigger.json.stateOfCharge }}"
icon : mdi:car-electric
- name: 'Polestar2 currentPower'
state: "{{ trigger.json.currentPower }}"
unit_of_measurement: 'kW'
icon : mdi:speedometer
- name: 'Polestar2 currentSpeed'
state : "{{trigger.json.currentSpeed}}"
unit_of_measurement: 'km/h'
icon: mdi:car-speed-limiter
- name: "Polestar2 Lat"
state: "{{ trigger.json.lat }}"
icon: mdi:latitude
- name: "Polestar2 Lon"
state: "{{ trigger.json.lon }}"
icon: mdi:longitude
- name: 'Polestar2 ambientTemperature'
unit_of_measurement: '°C'
state: "{{ trigger.json.ambientTemperature }}"
icon: mdi:coolant-temperature
binary_sensor:
- name: 'Polestar2 isParked'
state: "{{ trigger.json.isParked }}"
icon: mdi:car-brake-parking
- name: 'Polestar2 chargePortConnected'
state: "{{ trigger.json.chargePortConnected }}"
icon: mdi:ev-station
- name: 'Polestar2 isCharging'
state: "{{ trigger.json.isCharging }}"
icon: mdi:ev-plug-type2
- name: 'Polestar2 isFastCharging'
state: "{{ trigger.json.isFastCharging }}"
icon: mdi:ev-plug-ccs2
Und natürlich im CSV den webhook auf die eigene - am Besten HTTPS - Instanz setzen.
https://your-home-assistant:8123/api/webhook/my_unique_coded_webhook_key
Das wars; ab sofort sendet der CSV im aktiven Zustand die Daten aus dem JSON zur HA Instanz. Der Polestar / CSV beendet kurz nach dem Abschliessen und Sleep Mode den LTE Zugang, aber bis dahin wird fleissig übertragen.
Good luck!
Sehr schöne Beschreibung!
Leider hab ich keinen HomeAssistant und muss das für meine SmarthomeNG/SmartVisu Kombination adaptieren.
Einige Detailfragen noch:
Auf deinem Router ist irgendein DynDNS Service aktiv, für „your-home-assistant“ und du hast ne Portweiterleitung offen auf den Server wo HA läuft?
Auf deinem HA als Server hast du ein Zertifikat für die https Verbindung?
Dieser Webhook-Key ist als Ersatz für username/password zu sehen?
Hi Martin,
kann alle Fragen mit ja beantworten, lediglich ist der Service für DuckDNS auch im HA installiert, nicht im Router.
Im Detail gelöst mit dem DuckDNS Add-On
Home Assistant Add-on: DuckDNS
Automatically update your Duck DNS IP address with integrated HTTPS support via Let's Encrypt.
Supports aarch64 Architecture Supports amd64 Architecture Supports armhf Architecture Supports armv7 Architecture Supports i386 Architecture
About
Duck DNS is a free service that points a DNS (sub-domains of duckdns.org) to an IP of your choice. This add-on includes support for Let’s Encrypt and automatically creates and renews your certificates. You need to sign up for a Duck DNS account before using this add-on.
… und wie du beschreibst ist damit ein HTTPS mit Zertifikat etabliert - Port Weiterleitung im Router aktivieren. Done.
BTW : falls CSV dem Feature Request auf MQTT Anbindung nachkommt, gibt es ggf einen universellen Weg für alle Systeme.
Danke für die Zusammenfassung!
Eine Anmerkung hierzu: Die known_devices.yaml wird in HA seit vielen Versionen nicht mehr wirklich unterstützt. Der offiziell unterstützte Weg wäre, die Daten aus CSV über einen MQTT Broker an HA zu senden, bspw. mit NodeRed - bis CSV das selbst integriert.
Man kann die known_devices.yaml offenbar auch einfach weglassen, die Automation erstellt selbstständig die entsprechende Entität.
Ich hab Respekt für den Aufwand, den Du hier betreibst, aber zwei Voraussetzungen für die Nutzung sind mir einfach zuviel:
- Car Stats Viewer
- die Öffnung der Home Assistant Installation ins Internet.
Polestar soll einfach eine API anbieten, die man pollen kann, analog zu Volvo On-Call oder BMW Connected Drive.
Da stimme ich bei der Forderung zum API seitens Polestar voll zu! Verstehe dein Statement komplett.
HTTPS habe ich schon länger aktiviert, egal ob über den HomeAssistant Cloud Service oder selbst mit DuckDNS.
Hintergrund - nur ein einziger (mein eigener) sicherer Zugang - kein Apple HomeKit, kein Google, kein Amazon oder andere Services mehr.
CSV war erst nur zum rein schnuppern in die Live Daten vom PS2; jetzt halt aufgebohrt.
ok, habe ich nicht beachtet. Hatte schonmal ein Tracker Objekt benutzt und war nicht sicher. Wenn es von der Automation selbst angelegt wird, umso besser!
BTW: selbst der zweite Teil meiner Implementierung ist offensichtlich auch „zu kompliziert“.
Siehe Edit oben; teste gerade die einfachere Implementierung.
Werde berichten - update oben eingepflegt - ist jetzt ok für mich.
Sieht zum Beispiel so aus … Map verkleinert wegen ihr wisst schon.
Irgend eine API muss es wohl geben, denn Tibber (Dein Stromvertrag für das digitale Zeitalter ⚡️ Tibber) kann sowohl den SoC als auch Infos über das Auto abrufen. Wie man dran kommt? Kein Plan…
Super Lösung, vielen Dank dafür.
Jetzt warte ich sehnsüchtig auf meine Einladung in einen Testtrack für CSV.
Wir könnten vielleicht jemanden bei Tibber oder Polestar einschleusen, der die API-Definitionen durchsteckt. Gibt es freiwillige Praktikanten?
Mit der webhookrelay-integration kann man die Daten relativ simpel über CSV in Node-Red empfangen.
Ich habe nun eher das Problem die Werte aus dem json zu extrahieren um z.B. in eine Datenbank zu schreiben. Kennt sich damit jemand aus?
EDIT: Nach anfänglicher Begeisterung muss ich soeben feststellen, dass die freie Lösung auf 150 Aufrufe pro Monat begrenzt ist. Somit ist das Limit leider schnell erreicht. Schade.
Ich hab das nun so gelöst, dass CSV die Daten an einen Home-Assistant-Webhook sendet (da der ohnehin schon exposed und SSL-gesichert ist). Der Webhook schickt die Daten dann per MQTT an NodeRed, da ich hier zentral meine MQTT-Geräte verwalte. Dort werden dann die relevanten Infos extrahiert und wieder als MQTT-Topic an HA gesendet.
Könntest du exemplarisch zeigen wie die extract Funktionen bei dir aussehen?
Die sind sehr einfach gehalten bisher.
Extract Location:
msg.payload = {
"longitude": msg.payload.lon,
"latitude": msg.payload.lat,
"battery_level": msg.payload.stateOfCharge
}
return msg;
Extract state:
let status = "unavailable";
if (msg.payload.isParked) {
status = "geparkt";
} else if (msg.payload.isCharging) {
status = "lädt";
} else if (msg.payload.chargePortConnected) {
status = "eingesteckt"
} else if (msg.payload.driveState !== 2) {
status = "fährt";
}
msg.payload = status;
return msg;