Polestar-API zu MQTT im Container (openWB-V1-Anbindung möglich)

Danke, man kann es nun runterladen. Bei Synology funktioniert das aber sehr gekapselt, das heißt, wenn ich den Container das erste Mal starte, dann muss ich schon sagen, wo die Konfig Datei(oder andere Folder) liegt und brauche auch schon eine „Demo Datei“ die ich anpassen kann.
Beispiel:

Wenn es eine „/opt/cooleapp/settings.cfg“ Datei gibt, dann muss ich vor dem ersten Start die settings.cfg schon haben, anpassen und auf einen - für mich als User sichtbaren - Ordner/File mappen. Hab ich das nicht, dann muss der Container starten und laufen können, damit ich mit eine Terminal Emulation im SynologyOS(Browser) hinkomme.
Es gibt natürlich die Version, sich über die Kommandozeile einzuloggen und dort auch zu editieren, aber das können 98% der User normal nicht. Ich schaue es mir mal an, dann kann ich dir vielleicht noch eine Hilfestellung geben, das ist meist nur als Doku nötig.

1 „Gefällt mir“

Braucht es nicht. Polestar_2_MQTT_Docker/docker-compose_example.yml at main · CONSULitAS/Polestar_2_MQTT_Docker · GitHub

Datei umbenennen und anpassen, fertig.

Welchen Pfad hat sie im Dateiverzeichnis? ich kann auf den Inhalt nicht zugreifen über die normale Container Verwaltung im Synology OS.

Sie ist ja oben verlinkt.

Ich habe mich mal schlau gemacht für Dich:

Aber im Synology läuft der Hase anders: Mit den Eingaben in der Oberfläche baut sich Synology im Hintergrund automatisch eine eigene docker-compose.yml (Erstellen eines Containers | Docker - Synology Knowledge Center).

Also muss man die richtigen Daten in der Synology-Oberfläche eingeben um den richtigen Effekt zu erreichen.

Für meinen Container musst Du im Wesentlichen nur

  • das Image consulitas/polestar_2_mqtt_docker:latest herunterladen
  • die Umgebungsvariaben (Environment) setzen
  • Volume, Network, Port und Links kannst Du ignorieren

Für die Umgebungsvariablen muss Du in den Container-Einstellungen auf „Erweiterte Einstellungen“ / „Advanced Settings“ gehen und dort nach „Umgebung“ / „Environment“ (siehe verlinkte Anleitung oben).

Dort erfasst Du die Variablen aus der docker-compose.yml jeweils mit Name und Wert, so wie folgt (ohne die Doppelpunkte und die # mit den Kommentaren dahinter). Die Anführungszeichen musst Du offensichtlich ebenfalls entfernen:

  TZ:                "Europe/Berlin"
  POLESTAR_EMAIL:    "xx@xxx"
  POLESTAR_PASSWORD: "XXX"
  POLESTAR_VIN:      "LPSVSEDEEMLxxxxxx"
  POLESTAR_CYCLE:    300 # seconds
  MQTT_BROKER:       "192.168.1.100"
  MQTT_PORT:         "1883"
  MQTT_USER:         "" # has to be empty ("") if broker has no password
  MQTT_PASSWORD:     "" # has to be empty ("") if broker has no password
  MQTT_BASE_TOPIC:   "polestar2"

Natürlich musst Du die Daten für Dich anpassen.

Dann sollte der Container eigentlich auch auf einer Synology laufen.

PS: Ich habe mal das ganze gleich im GitHub hinterlegt:

1 „Gefällt mir“

Glückwunsch!

Ja, wenn du ˋdocker compose -dˋ für Daemon (Dienst im Hintergrund) zum Starten nimmst. Geht so bei allen Containern.

Wenn du den Dienst stoppen willst, ˋdocker compose stopˋ. Einfach mal ausprobieren und die Doku zu docker compose lesen.

Wenn das ja dein erster Container ist, solltest du in die ˋdocker-compose.ymlˋ auf jeden Fall Watchtower aufnehmen. Das liefert vollautomatisch Updates.


services:
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock # Zugriff auf Docker-API
    environment:
      - WATCHTOWER_CLEANUP=true # Alte Images entfernen
      - WATCHTOWER_NO_STARTUP_MESSAGE=true # Startmeldung unterdrücken

Bitte in der Datei nur 1x ˋservicesˋ. Die Einrückung muss so bleiben.

1 „Gefällt mir“

Jetzt überforderst du mich… :face_with_head_bandage:

Lesen geht, verstehen geht nicht… :kissing_smiling_eyes:

Was ich verstehe:

  • den Block „services: …unterdrücken“ in ‚docker-compose.yml‘ ohne Veränderung einbauen
  • ‚docker-compose.yml‘ ist die gleiche Datei in der ich Zugangsdaten, MQTT Adresse etc. eingetragen habe.

Aber was mache ich mit dem Befehl ˋdocker compose -dˋ? Einfach nach den Änderungen so aufrufen oder muss ich vorher nochmal ‚docker compose up --build‘ ausführen?

…ich bin verwirrt (weil ich ja auch einfach nur Anweisungen abtippe und nicht wirklich verstehe was ich da tue…)

OK, hier mal ein kleiner Docker-Crashkurs für alle Einsteiger. @Nerds: Bitte nicht über die Vereinfachungen schimpfen!

Docker ist eine Umgebung, die „leichte virtuelle Computer“ ausführt.

Im Prinzip ist ein Docker-Container ein komplett installierter Computer mit Betriebssystem, Anwendungen etc., der in einen Sandkasten gesteckt wird und benutzt werden kann, ohne irgendetwas (außer Docker) installieren zu müssen.

Eine docker-compose.yml ist eine Auflistung von Containern mit den vom Anwender gewünschten Einstellungen, die ich in einem Paket starten möchte (englisch ‚to compose‘: zusammenstellen, also eine Zusammenstellung von Containern). Das Format YML ist relativ einfach und beruht darauf, dass man durch Einrückung der Zeilen Blöcke bilden kann.

Mit dem Befehl docker compose sagt man Docker, dass es in die Datei docker-compse.yml im aktuellen Pfad schauen und die dort stehenden Anweisungen ausführen soll. Dazu gibt es verschiedene Sub-Befehle:

  • docker compose up: Container hochfahren (up halt)
  • docker compose up -d: Container hochfahren und im Hintergrund laufen lassen (auch bei Neustart des Rechners)
  • docker compose stop: Container herunterfahren und entfernen

Jetzt pflücken wir mal die YML auseinander:

services:

hier kommt der Abschnitt mit den Diensten (Containern) die laufen sollen

  watchtower:

der Name des ersten Dienstes (2 Leerzeichen eingerückt, da Unterpunkt zu services:)

    image: containrrr/watchtower

Jetzt kommen die Eigenschaften des Containers. Wieder 2 Leerzeichen eingerückt, da Unterpunkt zu watchtower:, also insgesamt 4 Leerzeichen.

Welcher Container soll verwendet werden, lädt das Image mit diesem Namen von docker.com herunter (Pfad https://hub.docker.com/r/containrrr/watchtower wird automatisch gebildet)

    container_name: watchtower

Mein Name für den Container. Wird z.B. verwendet, wenn ich nur einen einzelnen Container stoppen will und nicht alle (docker compose stop watchtower)

    restart: unless-stopped

Was soll getan werden, wenn der Container abstürzt; hier: neu starten, außer der Anwender hat explizit docker compose stop watchtower eingegeben.

Und jetzt aus meinem Container:

    environment:

In diesem Abschnitt werden die „Umgebungsvariablen“ definiert, die der Container als Konfiguration mitgegeben bekommt. Die Variablen werden beim Start im Container ausgelesen und machen alle wichtigen Einstellungen, da das Image ja universell sein soll. Achtung: Das ist bei jedem Container anders, da muss man die Anleitung des Container-Bauers lesen oder eine Bespieldatei, die meist dabei ist anpassen.

      TZ:                "Europe/Berlin"

Und auch hier wieder die Unterpunkte 2 Zeichen eingerückt, damit insgesamt 6 Leerzeichen.
Zeitzone, sollte für uns passen

      POLESTAR_EMAIL:    "xx@xxx"
      POLESTAR_PASSWORD: "XXX"
      POLESTAR_VIN:      "LPSVSEDEEMLxxxxxx"

Zugangsdaten

ÜBRIGENS: Wenn man mehr als einen Polestar hat, muss man einfach 2 Container bauen. Also Konfiguration in der YML verdoppeln, VIN bei der Kopie anpassen und BASE-Topic anpassen bei der Kopie. Fertig

      POLESTAR_CYCLE:    300 # seconds

Intervall für die Wiederholung

      MQTT_BROKER:       "192.168.1.100"
      MQTT_PORT:         "1883"

Adresse meines MQTT-Brokers (Nachrichtenzentrale für MQTT), kann auch ein Name wie raspi.fritz.box sein. Mein Broker (mosquitto) läuft auch in einem Container auf dem Raspi. Der Port ist für MQTT der Standard und muss in der Regel nicht angepasst werden.

      MQTT_USER:         "" # has to be empty ("") if broker has no password
      MQTT_PASSWORD:     "" # has to be empty ("") if broker has no password

Zugangsdaten

      BASE_TOPIC:        "polestar2"

Basis-Pfad, der vor die Daten unseres Autos gehängt wird sieht dann so aus:

image

    labels:
      # automatic update using Watchtower (https://github.com/containrrr/watchtower) highly recommended
      - "com.centurylinklabs.watchtower.enable=true"

Labels sind Eigenschaften des Containers, die für die Steuerung gesetzt werden können. Dieses Label hier sagt: mach automatische Updates mit Watchtower. Dafür muss aber ein Watchtower-Container laufen, der das übernimmt, siehe oben.

3 „Gefällt mir“

OK, dann jetzt zu Deinen Fragen:

gemeint war alles, was unter „services:“ steht

genau, die kann nämlich beliebig viele Container enthalten/beschreiben

Achtung: Da fehlt das up! docker compose up -d

Der Befehl startet die in der docker-compose.yml beschriebenen Container und sorgt dafür, dass sie im Hintergrund laufen, auch bei Neustart.

Ja.

Nein, docker compose up --build braucht es nicht mehr, da ich mittlerweile das Image bei docker.com bereitgestellt habe und es automatisch heruntergeladen wird. Also braucht Dein Raspi den Container nicht selbst bauen, sondern bekommt ihn als Service von mir.

Das hatte ich Anfang der Woche gemacht. Damit ist für den „einfachen Anwender“ das --build Geschichte.

Läufts? Fragen?

Übrigens noch ein Tipp: Gib solche Fragen einfach mal bei ChatGPT ein. Das Ding erklärt mindestens genau so gut wie ich und spuckt sogar Beispielcode aus.

Hier zu unserem Thema ein Beispiel: https://chatgpt.com/share/6739f44e-c1d8-800a-a09f-2245c9d55106

2 „Gefällt mir“

Vielen Dank, es läuft - aber anders…

Durch meine ständige YT-Guckerei zur Installation bin ich über „Portainer“ gestolpert. Auch da weiß ich Nafti nicht wirklich was ich tue, aber es geht Menu-geführt mit einer (für mich) halbwegs verständlichen Hilfe.
Dort konnte ich mein (zunächst fiktives) Restart-Problem relativ einfach lösen:


„Always“ bedeutet wohl, dass der Container bei jedem Neustart mit hochgezogen wird.

Ob automatsiche Updates auch funktionieren habe ich noch nicht herausgefunden - aber dazu kann ich mich ja dann durch Jochen’s @CONSULitAS Beschreibung kämpfen.
Nochmals Danke dafür Jochen - mit deiner Anleitung werde sogar ich das schaffen :muscle:

1 „Gefällt mir“

Ja, das ist eine gute Idee! Sicher einfach in der Bedienung, kommt aber der Nerd nicht so schnell drauf. :grin:

Ja, und auch wenn er abstürzt!

1 „Gefällt mir“

Leider tut sich seit dem Benutzen des letzten Update der Polestar-App nichts mehr an den Daten. Fehlermeldung:

Edit: Polestar hat wohl wieder etwas geändert - auf der „Auto-Seite“ gibt eine Rubrik „undefined“ deren Link zur Betriebsanleitung führt.

Kannst du dein Fahrzeug hier sehen: Pure progressive performance | Polestar

Ja, und auch mit dem aktuellem Zustand (derzeit „Laden“) und korrekten Daten.

Bestätigt. Sie haben schon wieder an der API geschraubt.
Also langsam…
Noch habe ich nicht rausgefunden, was es diesmal ist.

1 „Gefällt mir“

…aber Tibber geht (batterypercent) noch, lastSeen ist der Zeitpunkt der Abfrage :face_with_thermometer:

Ich bekomme das hier:

2024-11-19 13:43:57 ERROR logics.Polestar In der Logik ist ein Fehler aufgetreten:
Logik ‚Polestar‘, Datei ‚/usr/lib/python3.11/json/decoder.py‘, Zeile 355
function raw_decode(), Exception: Expecting value: line 1 column 1 (char 0)

Das sagt mir leider gar nichts.

Edit: Die OAuth2 Authorization klappt. Auch ich bekomme bei der Abfrage der VIN und einiger anderer Daten einen klassischen 404 Page not found error.

Die url war bisher ‚https://pc-api.polestar.com/eu-north-1/my-star/
Wenn die geändert wurde, weiß ich noch nicht wie die neue aussieht.

@CONSULitAS: Ich habe einen PR erstellt: Updated query URL by loebse · Pull Request #10 · CONSULitAS/Polestar_2_MQTT_Docker · GitHub

Danach sollte es wieder gehen.

4 „Gefällt mir“

gerade blind „merged“, Actions haben Container neu gebaut

also bitte alle einmal:

  • wenn Ihr schon auf das neue Image nutzt
    • docker compose pull zum aktualisieren
    • docker compose up -d zum neu starten
  • sonst ein
    • git pull zum aktualisieren
    • docker compose up --build zum neu bauen

5 Minuten nach Pull Request, 2h nach Fehlermeldung und 4,5 h nach Problem ist doch ganz nett!

2 „Gefällt mir“

Und gerade getestet: LÄUFT!

:heart: :heart: :heart: :heart: :heart: :heart: :heart: :heart: :heart: :heart: :heart: :heart: :heart: :heart: :heart: :heart: :heart: :heart:

3 „Gefällt mir“