[Script] Tibber / aWATTar usw. : Victron, Sonnenbatterie, Shelly Plug S & AVM-Fritz-DECT200-210 Spotmarket-Switcher

Super, danke dir. Teste das vermutlich heute Abend oder morgen.

Gruß Matthias

So, ich bin ja echt schlecht in dem Kram. Bei mir kommt folgendes. Liegt es an mir oder meiner Konfiguration?

root@raspberrypi4:~# sh /data/etc/Spotmarket-Switcher/controller.sh
Spotmarket-Switcher crontab entry successfully updated to 15-minute intervals.
"/tmp/tmp.hV2hId":1: bad minute
errors in crontab file, can't install.
/data/etc/Spotmarket-Switcher/controller.sh: line 1103: syntax error near unexpected token <' /data/etc/Spotmarket-Switcher/controller.sh: line 1103: mapfile -t sorted_prices < <(grep -E '[1]+.[0-9]+$' "$file7")'
root@raspberrypi4:~#

Es wäre nett, wenn du mir da helfen kannst.


  1. 0-9 ↩︎

chmod +x /data/etc/Spotmarket-Switcher/controller.sh
/data/etc/Spotmarket-Switcher/controller.sh

Hast Du das Script als ausführbar markiert mit chmod?

Moin,

ne hatte ich natürlich nicht.

Ich habe nun noch eine Frage und ein Problem. Zunächst die Frage. Am Anfang schreibt er folgendes:

root@raspberrypi4:~# /data/etc/Spotmarket-Switcher/controller.sh
Spotmarket-Switcher crontab entry successfully updated to 15-minute intervals.
"/tmp/tmp.pK31II":1: bad minute
errors in crontab file, can't install.
[|] Loading...Config validation passed.
I: Bash Version: GNU bash, version 5.0.18(1)-release (arm-ve-linux-gnueabi)
I: Spotmarket-Switcher - Version 2.5.3
I: Please be patient. A delay of 3 seconds will help avoid overloading the Solarweather-API.
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 159 100 159 0 0 250 0 --:--:-- --:--:-- --:--:-- 250
I: Sunrise today will be 07:37 and sunset will be 18:52. Suntime will be 675 minutes.
I: Solarenergy today will be 1.9 megajoule per sqaremeter with 1.9 percent clouds. The temperature is 12.2°C with 0cm snowdepth.
I: Solarenergy tomorrow will be 5.5 megajoule per squaremeter with 5.5 percent clouds. The temperature will be 14°C with 0cm snowdepth.
I: No cached Tibber today-data, fetching new data.
I: Please be patient. First we wait 29 seconds in case the system clock is not synchronized and not to overload the API.

Ist das mit dem crontab file normal?

Mein Problem ist aber noch ein anderes. Bisher habe ich immer die Daten von Awattar bezogen. Nun habe ich in der config.txt tibber ausgewählt und habe dann über den Link und meinen Tibber Account den api key erstellt. Wenn ich das tue und nur "price" auswähle, dann nimmt der automatisch noch den "tibber_graph" hinzu. Ist das ein Problem? Denn wenn ich dann das script starte, dann passiert weiter unten nach dem oberen text dann folgendes:

E: Tibber prices cannot be extracted to '/tmp/tibber_prices_sorted.txt', falling back to aWATTar API.

Den api key habe ich an die entsprechende Stelle zwischen den "" gesetzt.

Gruß Matthias

Achso nochwas:

  1. Das gerade beschriebene Problem hatte ich in der vorherigen Version auch, daher hatte ich die Awattar Daten genutzt.
  2. In deiner Matrix schreibst du bei den Werten für 48h "192-point configuration". Wenn ich mich nicht verrechnet habe, dann führst du aber nur 184 Werte auf?
    Bei den 24h Werten passt die Matrix zur "96-Point Configuration"
  3. Wenn er die Tibber daten nicht verarbeitet, greift er auf die Awattar daten zu und macht daraus 15min werte. Im Log steht, dass die bereits vergangenen Werte "ignoriert" werden? Wenn er aber dann zum Beispiel um 21 Uhr für die verbliebenen 27h inkl. des Folgetages 108 Werte berücksichtigt, wie verhält sich das dann zur matrix?
  4. Und meine letzte Frage bezieht sich nochmal auf die Matrix. Aktuell ist bei mir alles noch so wie in der Beispiel Config. Mein Speicher ist aktuell noch 52% voll. Die Entladung ist aber gesperrt und würde jetzt Stand 22Uhr nur bei den Preisen 93-104 freigegeben. Das wiederum bedeutet, dass nur während der drei teuersten vollen Stunden entladen werden könnte. Nun reduzieren sich jede Stunde die Werte weiter und der Preis 93 wird immer teurer, weil sich die teursten Preise immer weiter nach vorne schieben. In diesem Fall könnte es dazu kommen, dass mein Speicher gar nicht oder erst bei der teuersten Stunde entladen wird?
    Vielleicht wird das aus diesen beiden logs klar:


Hier war Preis 93 noch bei 39,498 ct/kWh

Zwei stunden später sah es dann so aus:


Hier ist der Preis Nummer 93 bei 40,7903 ct/kWh, weil sich die teuren Stunden weiter nach vorne verschieben, wenn diese nicht "zeitlich vorbei" sind.

Das ist doch nicht richtig oder?

Gruß
Matthias

Hi,

Tibber-API funktioniert nicht / „Tibber prices cannot be extracted“

Wenn diese Meldung erscheint, liegt das fast immer am API-Schlüssel (Token).
Entweder ist er ungültig, hat nicht die richtigen Rechte oder wurde falsch eingetragen.

So prüfst du das:

  1. Öffne ein Terminal auf deinem Raspberry Pi.
  2. Gib ein (ersetze "DEIN_TIBBER_TOKEN"):
    curl -s -H "Authorization: Bearer DEIN_TIBBER_TOKEN"
    -H "Content-Type: application/json"
    -d '{"query":"{ viewer { homes { currentSubscription { priceInfo { today { total startsAt } } } } } }"}'
    https://api.tibber.com/v1-beta/gql
  3. Wenn du Zahlen wie "total" oder "startsAt" siehst → Token funktioniert.
    Wenn „401“, „403“ oder „error“ kommt → Token ungültig oder falsche Rechte.
  • Auf "developer.tibber.com/settings/access-token" ( Tibber Developer ) neuen Token erstellen.
  • Rechte aktivieren:
    • "price"
    • "tibber_graph" (wird automatisch mit ausgewählt – ist korrekt).
  • Dann in der "config.txt" eintragen:
    tibber_api_key="dein_neuer_token"
  • Script neu starten:
    /data/etc/Spotmarket-Switcher/controller.sh

Matrix-Verhalten (24/48 h) – warum sich die Matrix verkürzt

Die Matrix im Spotmarket-Switcher entscheidet, wie viele günstige Stunden für Laden/Entladen genutzt werden dürfen.

Sie wird bei jedem Script-Lauf automatisch neu berechnet.
Dabei gilt:

  • Vergangene Stunden (also Preise aus der Vergangenheit) werden rausgefiltert.
  • Nur zukünftige Stunden ab jetzt bleiben aktiv.
  • Wenn also weniger Zeit übrig ist, verkürzt sich die Matrix automatisch.

Das ist so gewollt – das Script schaut immer „nach vorne“ und berücksichtigt keine alten Preisstunden mehr.

  • Tibber-API-Probleme kommen fast immer vom Token → einfach neu erstellen.
  • Die Matrix kürzt sich automatisch, sobald Stunden vergangen sind.

Zu dem Crobtab Problem erstelle ich ein Update, das scheint zu deinem System nicht kompatibel zu sein. Das alte stündliche Intervall wird mit der Funktion auf 15 Minuten verkürzt. Version 2.5.4 behebt das nun hoffentlich. Jedenfalls kannst Du mit crontab -e deine crontab bearbeiten und Du solltest Dort eine Zeile mit */15 * * * * /data/etc/Spotmarket-Switcher/controller.sh finden, die dafür sorgt das das Script alle 15 Minuten ausgeführt wird.

Gruß Christian

Hi,

erstmal danke für deine Mühe. Ist ja nicht selbstverständlich.

Wenn ich in das Terminal das von dir genannten eintrage, so erscheint folgende Zeile:

{"data":{"viewer":{"homes":[{"currentSubscription":null}]}}}

Zahlen usw. sehe ich gar nicht.

Nur zur Erklärung was ich getan habe. Ich habe über Putty auf den raspberry Pi zugegriffen und dort deine Zeilen (direkt in einer Zeile geschrieben) eingetragen. Natürlich mit meinem Token. Wenn ich dort auch nur eine Zahl ändere, dann steht dort:

{"errors":[{"message":"invalid token","locations":[{"line":1,"column":3}],"path":["viewer"],"extensions":{"code":"UNAUTHENTICATED"}}],"data":null}

Also so ganz falsch kann mein vorgehen nicht gewesen sein.

Es steht bei mir aber nach dem eintragen des gleichen Tokens aber immer noch:

Achso. Ich habe mehrfach einen neuen Token erstellt. Immer das gleiche.

So sieht es bei mir aus.
Dein Token funktioniert also nicht. Also ein Fall für den Tibber Support wenn Du soweit nicht kommst.

root@raspberrypi4:~#
curl -s -H "Authorization: Bearer Vemjrq_K_GgK_MEINTOKEN_GEKÜRZT_lI9Q" -H "Content-Type: application/json" -d '{"query":"{ viewer { homes { currentSubscription { priceInfo { today { total startsAt } } } } } }"}' https://api.tibber.com/v1-beta/gql

{"data":{"viewer":{"homes":[{"currentSubscription":{"priceInfo":{"today":[{"total":0.3344,"startsAt":"2025-10-07T00:00:00.000+02:00"},{"total":0.327,"startsAt":"2025-10-07T01:00:00.000+02:00"},{"total":0.322,"startsAt":"2025-10-07T02:00:00.000+02:00"},{"total":0.3217,"startsAt":"2025-10-07T03:00:00.000+02:00"},{"total":0.3258,"startsAt":"2025-10-07T04:00:00.000+02:00"},{"total":0.3302,"startsAt":"2025-10-07T05:00:00.000+02:00"},{"total":0.3756,"startsAt":"2025-10-07T06:00:00.000+02:00"},{"total":0.4871,"startsAt":"2025-10-07T07:00:00.000+02:00"},{"total":0.5574,"startsAt":"2025-10-07T08:00:00.000+02:00"},{"total":0.4676,"startsAt":"2025-10-07T09:00:00.000+02:00"},{"total":0.3992,"startsAt":"2025-10-07T10:00:00.000+02:00"},{"total":0.3697,"startsAt":"2025-10-07T11:00:00.000+02:00"},{"total":0.3472,"startsAt":"2025-10-07T12:00:00.000+02:00"},{"total":0.3415,"startsAt":"2025-10-07T13:00:00.000+02:00"},{"total":0.3405,"startsAt":"2025-10-07T14:00:00.000+02:00"},{"total":0.3498,"startsAt":"2025-10-07T15:00:00.000+02:00"},{"total":0.3604,"startsAt":"2025-10-07T16:00:00.000+02:00"},{"total":0.3958,"startsAt":"2025-10-07T17:00:00.000+02:00"},{"total":0.456,"startsAt":"2025-10-07T18:00:00.000+02:00"},{"total":0.4689,"startsAt":"2025-10-07T19:00:00.000+02:00"},{"total":0.3893,"startsAt":"2025-10-07T20:00:00.000+02:00"},{"total":0.3618,"startsAt":"2025-10-07T21:00:00.000+02:00"},{"total":0.343,"startsAt":"2025-10-07T22:00:00.000+02:00"},{"total":0.3312,"startsAt":"2025-10-07T23:00:00.000+02:00"}]}}}]}}}
root@raspberrypi4:~#

Kannst Du auch hier sehen ob es geht oder nicht: Tibber Developer

Unter Approved scopes steht bei mir:

  • tibber_graph

  • user

  • homes

  • price

  • consumption

  • full

  • write_access

Bitte stell auf Version 2.5.4 um, dann sollte das Problem mit Deiner Crontab behoben sein.

Ich bin auch selten dämlich...

Jetzt hat es funktioniert. Ich hatte aus damaligen Zeiten einen zweiten Tibber account, den ich mal angelegt hatte, da ich früher mal dachte, dass man einfach so an die Daten ran kommt. Nun habe ich aber einen Vertrag mit denen abgeschlossen auf einem anderern Account. Natürlich habe ich den Api Token immer mit dem falschen Account versucht zu bekommen. Mit dem richtigen Zugang funktioniert es....

Sorry...

Aber ich habe deine Matrix noch nicht verstanden.

Wenn du die bereits abgelaufenen Preise "wegfallen" lässt und nur noch die kommenden Preise anschaust und nur noch diese in deiner Matrix berücksichtigst, dann kann doch folgendes passieren.

Beispiel mit Stundenpreisen:

Am morgen hast du 12 Preise unter 30 ct/kWh bis zum Mittag und dann meinetwegen nur noch teure Preise bis 24:00.

Am morgen sagt die Matrix noch, dass ab 12 Uhr die Preise so hoch sind, dass der Speicher entladen werden soll.

Wenn die 12 günstigen Preise dann aber ab mittag "weg" sind und der nur noch die 12 teuren Preise miteinander vergleicht, dann sind davon einige ab diesem Moment die "günstigsten" und er sperrt den Speicher wieder, da er auf die noch kommenden teuersten Preise wartet?

Ich habs noch nicht geblickt.


Ich habe meine Crontab manuell geändert, auf

*/15 * * * * /data/etc/Spotmarket-Switcher/controller.sh

Der Austausch gegen Version 2.5.4 hat wiederum eine Zeile mit

0 * * * * /data/etc/Spotmarket/controller.sh

eingefügt.

Die manuelle Änderung läuft aktuell ohne Fehlermeldung.

Momentan ist noch das Problem das bei abnehmendem Preisniveu die teuersten Preise möglicherweise schon in der Vergangenheit liegen und noch kaum Entladeslots übrig sind obwohl der Akku möglicherweise noch gut geladen ist. Ich bin damit auch unzufrieden und baue das gerade um zu einer dynamischen Entladefunktion abhängig vom Akkufüllstand um. Je voller der Akku ist, desto mehr teure zukünftige Preise werden zur Entladung aktiviert. Ab Version 2.5.5 wird das enthalten sein.

Ja genau. So ähnlich meinte ich das.

Danke dir erstmal und wünsche dir noch einen schönen Abend!

Gruß Matthias.

Moin,

Nur so als Idee. Ist bestimmt zu komplex, aber cool wäre ja wenn man ein Standardlastprofil hinterlegen könnte und man die stündlichen Verbräuche für einen Standard Tag festlegen könnte. Dann könnte das Skript aus Speichergröße, Strombedarf und dem Strompreis entscheiden, ob bei Preis x noch entladen darf oder ob man die Menge y noch für Stunde z aufbewahren muss.

Gruß
Matthias