HomeAssistant Integration für Ladezustand, PV Charging, Überschussladung etc

@tombox

Danke für die Links.
Was sind die Probleme mit MQTT genau? Allgemein, weil du das noch nie verwendet hast und somit das Protokoll ansich noch nicht verstehst?
Oder MQTT selber ist eigentlich nicht das Problem, in diesem speziellen Fall aber schon?
MQTT ist ein sehr einfaches Protokoll, fast schon ZU einfach. Da könnte ich evtl. helfen, bräuchte aber deutlich mehr Input.

Schade für mich ist, dass die IoBroker Lösung Java Script ist. Das blick ich nun leider gar nicht. Hab es mir mal angesehen, wie die Oauth lösen und die Daten abfragen. Zumindest kann man die URL’s zur Polestar API finden.
Ich würde das gerne in Python nachbauen, dann läuft es auch auf meiner SmartHomeNG/smartVISU Umgebung.
Das ganze Oauth Gedöhns ist eigentlich kein Thema, wenn man exakt weiß, wie die URL’s und die Header Daten aussehen müssen. Habe ich hier schon für meine Miele Geräte und die Abfrage des Wasserqualität-Sensors für den Whirlpool. MQTT selbst läuft bei mir eh schon für die Wallbox und die Steuerung selbiger.

1 „Gefällt mir“

MQTT ist kein Problem aber die Daten die über MQTT gesendet werden sind nicht MQTT konform und binär oder encrypted

Ok, verstanden, danke.
Wird Zeit, dass Polestar die API von Volvo übernimmt. Einfacher geht es kaum. Fast exakt so wie Miele das macht.

1 „Gefällt mir“

Das wird bestimmt das binäre Google ProtoBuf sein. Wird ja überall in AAOS verwendet.

Steck doch mal einen Payload bspw. hier rein: https://protobuf-decoder.netlify.app/

Meinst Du die Message oder auch den Topic?

Ein binär codierter Topic wäre in derTat nicht Standard-Konform. Standard ist UTF-8.

Hat sich gekreuzt! :nerd_face: Cool, muss ich mir mal anschauen.

Habe ich auch schon geguckt kommt nichts sinnvolles raus

Sorry, ich komm’ nicht mit: Die (undokumentierte) Polestar API ist eine REST-API, zumindest liest es sich im Source von https://github.com/TA2k/ioBroker.polestar so. Wo kommt jetzt MQTT ins Spiel?

1 „Gefällt mir“

Kannst mal ein Beispiel zeigen? Vielleicht ist es Schwedisch :slight_smile:

1 „Gefällt mir“

Ist das aktuell von deinem Polestar?
Hast mal geschaut ob du in den Hex-Codes deinen aktuellen SoC Wert findest? Wäre schon mal ein Anhaltspunkt. Reichweite wäre noch ein möglicher Wert.
Ich weiß, mühsam, aber manchmal reicht das. Wenn du z.B. nur den SoC brauchst um die Wallbox Steuern zu können. Mehr angezeigte Daten sind nett, aber erst mal nicht so wichtig.

2 „Gefällt mir“

Das ist der Request um Daten abzufragen. Ich gehe davon aus das es mit einem Zertifikat signiert ist weil sonst keine Authentifierungsdaten übermittel werden

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.

2 „Gefällt mir“

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.

Wieder von den Toten auferstanden nach weit über 24 Stunden (die App):

2 „Gefällt mir“

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.
2 „Gefällt mir“

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 :wink:

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 :

5 „Gefällt mir“

CSV webhook Fortsetzung :slight_smile:

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!

9 „Gefällt mir“

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?

1 „Gefällt mir“