Polestar SoC mittels Tibber und NodeRed

Für alle die den SoC vom Polestar gerne hätte und keine Ports nach außen öffnen wollen, habe ich jetzt die IOBroker Implementierung in eine NodeRed Version umgebaut.

Vorbedingung:

  • NodeRed sollte installiert sein
  • Tibber Account sollte erstellt sein
  • Polestar ist zu Tibber hinzugefügt

Wenn das alles passt, dann das JSON unten in NodeRed importieren, in der ersten Inject Node im JSON Username und Passwort vom Tibber setzen, dann sollte es eigentlcih auch schon funktionieren.

[{"id":"eead83edc52abe9d","type":"http request","z":"981980d8b7db0ea7","name":"Tibber getToken","method":"POST","ret":"obj","paytoqs":"ignore","url":"https://app.tibber.com/login.credentials","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":420,"y":2060,"wires":[["74d37211a81aaa87"]]},{"id":"fb6eab53b1a336f6","type":"inject","z":"981980d8b7db0ea7","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"300","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"{\"@type\":\"login\",\"email\":\"myusername\",\"password\":\"mypassword\"}","payloadType":"json","x":250,"y":2060,"wires":[["eead83edc52abe9d"]]},{"id":"74d37211a81aaa87","type":"function","z":"981980d8b7db0ea7","name":"getCorrectDataFromTibber","func":"var mytoken = msg.payload.token;\n\nmsg.headers = {\n        'Authorization': 'Bearer ' + mytoken\n    }\nmsg.url = 'https://app.tibber.com/v4/gql?query=%7Bme%7Bhomes%7BelectricVehicles%7BlastSeen%0A%20%20battery%20%7Bpercent%7D%7D%7D%7D%7D';\nmsg.mytoken = mytoken;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":820,"y":2060,"wires":[["1aa8379fbbb3a380"]]},{"id":"a83bd3e26f8f56ce","type":"function","z":"981980d8b7db0ea7","name":"get SoC","func":"msg.payload = msg.payload.data.me.homes[0].electricVehicles[0].battery.percent\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1260,"y":2060,"wires":[["cb2d4945a9613763"]]},{"id":"1aa8379fbbb3a380","type":"http request","z":"981980d8b7db0ea7","name":"Tibber getSoC","method":"GET","ret":"obj","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":1080,"y":2060,"wires":[["a83bd3e26f8f56ce"]]},{"id":"cb2d4945a9613763","type":"debug","z":"981980d8b7db0ea7","name":"SoC Data from Tibber","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1480,"y":2060,"wires":[]}]

8 Likes

Danke fürs Teilen. Der Flow funktioniert. Ich musste nur ein "" in meinem Passwort mit einem weiteren \ escapen.

1 Like

Super, vielen Dank!
In Tibber habe ich zwei Autos eingebunden. Was muss ich ggf. ändern, um beide Fahrzeug auszulesen?

Ich nutze kein Rednode. Habe aber schon diverse Dinge wie VictronEnergy, den Go-eCharger, Wetter, Netatmo, …in meine Gebäudesteuerung via JSON implementiert. Vielleicht kannst Du mir einen Hinweis geben, wie das JSON-Statement aussehen müsste. Ich finde einfach nichts um an den SoC vom Polestar zu kommen. In der Tibber- App sehe ich die Daten bereits, eingerichtet ist also alles.

Folgendes funktioniert, statt „MEIN TOKEN“ trägst Du Deinen ein. Testen kannst Du einfach hier: https://reqbin.com/curl

curl https://api.tibber.com/v1-beta/gql
-H „Authorization: Bearer MEIN TOKEN“
-H „Content-Type: application/json“
-X POST
-d ‚{ „query“: „{viewer {name} }“}‘

Nun die Frage, wie muss der query lauten, der die Postart SoC-Werte holt? Danke Dir und schönen Gruß aus dem Norden.

Ich habe mir das Ganze auch mal genauer angeschaut @Kiel

Wenn ich es richtig sehe, benutzt du https://api.tibber.com/v1-beta/gql in den Beispielen von @bausi2k wird aber https://app.tibber.com/v4/gql verwendet.

Rufe mal die zweite URL auf und die kommst auf einen Playground, bei dem folgende query zum Ziel führen sollte:

{ me { homes { electricVehicles { lastSeen battery { percent } } } }}

Sieht bei mir dann so aus:

Wenn du die Query zum ersten al ausführst, bekommst du einen Fehler, weil du nicht angemeldet bist. Was ich noch nicht herausgefunden habe, funktioniert die v4 URL auch mit den Tokens und wenn ja, wie?

EDIT:

Ok, jetzt funktioniert es, man braucht zwei POST requests:

https://app.tibber.com/login.credentials

Mit folgendem JSON

{
  "@type": "login",
  "email": "DEINE_EMAIL",
  "password": "DEIN_PW"
}

Als Antwort erhält man einen Token, den wiederum verwendet man im 2. Request:

https://app.tibber.com/v4/gql

Im Body:

{
  me {
    homes {
      electricVehicles {
        lastSeen
        battery {
          percent
        }
      }
    }
  }
}

Im Header:

Authorization: Bearer YOUR_TOKEN_FROM_1

So funktioniert es bei mir.

1 Like

Perfekt, da hast Du mir den richtigen Hinweis gegeben. Das ist ja wie Weihnachten und Ostern zusammen. Herzlichen Dank !!!

  1. Holst Du dir mit Deinen Login-Daten einen neuen Token:
    curl -X POST https://app.tibber.com/login.credentials
    -H „Content-Type: application/json“
    -d ‚{„email":"youmail@mail.de“,„password“:„youTibberPWD“}‘
    –user „login:password“

  2. Dann geht auch das Pollen des SOC mit Bearer Token:
    curl https://app.tibber.com/v4/gql
    -H „Authorization: Bearer PutYourTokenHere“
    -H „Content-Type: application/json“
    -X POST
    -d ‚{ „query“: „{ me { homes { electricVehicles { lastSeen battery { percent } } } }}“}‘

Bei mir sieht das Ergebnis gerade so aus. Die Werte stimmen:
{
„data“: {
„me“: {
„homes“: [{
„electricVehicles“: [{
„lastSeen“: „2023-09-23T08:31:07.000+00:00“,
„battery“: {
„percent“: 53
}
}]
}]
}

Und fertig in meiner UI sieht es dann so aus:

3 Likes

Die Einbindung des Polestar SoC in Tibber war ja super easy - da müsste es doch jetzt auch möglich sein für die OpenWB ein SoC Modul für den Polestar 2 zu schreiben, oder?
Die openWB kann das ja genauso machen wie Tibber!?

Ich habe den Go-eCharger und der ist meine Gebäudesteuerung integriert. Somit nutze ich nun dort auf den SoC vom Polestar. Möglich ist auch Überschussladen, Laden bis der Haus-Akku bis zum Wusch-SoC leer ist, über Nacht voll-laden und einiges mehr. Aber ja, vielleicht findest sich jemand, der Tibber samt Polestar auch in die openWB integriert.

Das Problem ist, dass die Schnittstelle, die Tibber nutzt, um den SoC anzurufen nicht öffentlich ist und nicht von anderen genutzt werden kann. Daher ja der Umweg über Tibber, da die eine offene Schnittstelle haben.

1 Like

Gute Frage, ich hätte mal gedacht, dass du sowieso beide Autos bekommst, nachdem nichts absolut abgefragt wird? Hast du es schon getestet?

Ja, habe ich getestet und ich bekomme nur das 1. Fahrzeug angezeigt.

Ich schätze mal das „[0]“ liefert nur den ersten Eintrag im Array.

ah, ich hab mit der ganzen Escaperei nix gesehen :slight_smile:

@Neandertaler
eine zweite Function Node mit

msg.payload = msg.payload.data.me.homes[0].electricVehicles[1].battery.percent

sollte helfen…

Wenn du dich auskennst schau dir einfach mal das ganze JSON an, dass zurück kommt.

Was ich noch nciht rausbekommen habe ist, ob es außer SoC und lastSeen noch Infos gibt, die man abfragen könnte…

Aber das ganze rennt sehr zuverlässig, weil ich schaue wegen dem SoC mittlerweile lieber in der Loxone nach, als in der App :slight_smile:

Es gibt noch einiges mehr, was man abfragen kann zum Auto:

type ElectricVehicle {
  id: String
  name: String
  shortName: String
  lastSeen: String
  lastSeenText: String
  isAlive: Boolean
  hasNoSmartChargingCapability: Boolean
  imgUrl: String
  schedule: ElectricVehicleSchedule
  battery: ElectricVehicleBattery
  batteryText: String
  chargingText: String
  consumptionText: String
  consumptionUnitText: String
  energyCostUnitText: String
  chargeRightAwayButton: String
  chargeRightAwayAlert: Alert
  scheduleSuspendedText: String
    @deprecated(
      reason: "Moved to settingsScreen.scheduleSuspendedText 2019-31-05"
    )
  backgroundStyle: ElectricVehicleBackgroundStyle
  energyDealCallToAction: CallToAction
  faqUrl: String
    @deprecated(
      reason: "Deprecated 2022-09-07. Has not returned anything but 'null' since 2018"
    )
  settingsScreen: ElectricVehicleSettingsScreen
  settingsButtonText: String
  settingsButton: CallToAction
  enterPincode: Boolean
  message: Message
}

Zum Schedule:

type ElectricVehicleSchedule {
  isSupported: Boolean @deprecated(reason: "Deprecated, not used anymore")
  isEnabled: Boolean
  isSuspended: Boolean
  localTimeTo: String
  minBatteryLevel: Int
}

Zu Battery:

type ElectricVehicleBattery {
  percent: Int
  percentColor: String
  timestamp: String @deprecated(reason: "Duplication of lastSeen 2019-31-01")
  isCharging: Boolean
  chargeLimit: Int
}

Hast du eine API Doku gefunden? finde nur das Graph ML zeugs, mit dem ich mich eigentlich nicht beschäftigen will…

Es gibt eine Doku zur GraphQL API:

1 Like

link bitte - danke

20202020

https://app.tibber.com/v4/gql

→ Rechts in der Leiste auf Docs klicken, dann kann man sich durch alle Queries/Mutations/Typen etc. klicken.

3 Likes

Vielen Dank für’s teilen.

Ich habe deine Lösung auch in HomeAssistant mit dem NodeRed Plugin und Handover per MQTT zum Test installiert. Läuft auf Anhieb; super dokumentiert. Grösster Vorteil gegenüber der CSV WeebHook Lösung - kein externer Port oder Server und permanent aktualisierte SoC.

Besten Dank!

2 Likes

deswegen habe ich auch diese Version eingesetzt → VPN(Handshake) Ports sind die einzigen, die nach außen offen sind :slight_smile: