Tibber Strompreise einlesen und Aktoren schalten

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

Tyfys
Beiträge: 551
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 125 Mal

Re: Tibber Strompreise einlesen und Aktoren schalten

Beitrag von Tyfys » 13.12.2023, 10:39

Hallo
mic4rd hat geschrieben:
12.12.2023, 18:25
Eine Sortierfunktion habe ich in der Skript-Doku leider nicht gefunden
Ist leider auch nicht vorhanden, muss man also selbst schreiben.

Falls du keine bessere Lösung gefunden hast, hier mal ein Beispiel für so etwas.

Da werden die Preise der Stunden auf- oder absteigend (ascend) sortiert. Bei gleichen Preisen dann auch nach der Stunde.
Die entsprechenden Werte einfach wie in der Beispiel-Stringvariablen arr in diese ausgeben.
Nach der Sortierung werden dann die gewünschten 5 höchsten/niedrigsten Werte (only_top) ausgegeben.

Code: Alles auswählen

! Sortliste  Pärchen  Preis/bis Std. Semikolin nächstes Pärchen
object arr  ="8.805/1;8.706/2;8.562/3;8.442/4;8.701/5;8.903/6;10.741/7;12.109/8;14.633/9;13.194/10;12.985/11;12.290/12;12.457/13;12.718/14;12.370/15;12.014/16;11.793/17;11.088/18;10.500/19;9.422/20;9.215/21;8.814/22;8.337/23;7.750/24";
!Element Art  n=numerisch / a=alphanumerisch
object arrtyp  ="n;n";
!Tauschstrings von > nach
string av;
string an;
!Trennzeichen für Array 1. / 2.Dimension
var sep1=";";
var sep2="/";
!damit auch erstes und letztes Element Begrenzungen mit Trennzeichen haben
arr = sep1#arr.Trim(sep1)#sep1;
integer len = web.webGetValueListCount(arr).ToInteger() - 2;
boolean swapped = true;
boolean ascend = true;

var elemart = "a";

string index;
integer von = 0;
integer bis = 1;
integer only_top = 5;

foreach(index, system.GenerateEnum(von, bis)) {
    integer x = (von + bis) - index.ToInteger();
    elemart = arrtyp.StrValueByIndex(sep1, x);
    swapped = true;
    while (swapped) {
        integer i = 2;
        swapped = false;
        while (i <= len) {
            if (((elemart <> "n") && ((arr.StrValueByIndex(sep1, i).StrValueByIndex(sep2, x).ToUpper()) < (arr.StrValueByIndex(sep1, i - 1).StrValueByIndex(sep2, x).ToUpper())))
                 || ((elemart == "n") && ((arr.StrValueByIndex(sep1, i).StrValueByIndex(sep2, x).ToFloat()) < (arr.StrValueByIndex(sep1, i - 1).StrValueByIndex(sep2, x).ToFloat())))) {
                av = arr.StrValueByIndex(sep1, i - 1) # sep1 # arr.StrValueByIndex(sep1, i);
                an = arr.StrValueByIndex(sep1, i) # sep1 # arr.StrValueByIndex(sep1, i - 1);
                av = sep1 # av # sep1;
                an = sep1 # an # sep1;
                arr = arr.Replace(av, an);
                swapped = true;
            }
            i = i + 1;
        }
    }
}
!Trennzeichen für erstes und letztes Element wieder entfernen
arr = arr.Trim(sep1);
string ix;
if (ascend) {
    WriteLine("Wert aufsteigend");
    foreach(ix, system.GenerateEnum(0, only_top-1)) {
        WriteLine((ix.ToInteger() + 1) # ".  " # (arr.StrValueByIndex(sep1, ix).StrValueByIndex(sep2, 0)) # ": " # (arr.StrValueByIndex(sep1, ix).StrValueByIndex(sep2, 1)));
    }

} else {
    object arr2 = "";
    string elem;
    foreach(elem, arr.Split(";")) {
        arr2 = elem # sep1 # arr2;
    }
    arr = arr2;
    WriteLine(" ");
    WriteLine("**********************");
    WriteLine("Wert absteigend");
    foreach(ix, system.GenerateEnum(0, only_top -1)) {
        WriteLine((ix.ToInteger() + 1) # ".  " # (arr.StrValueByIndex(sep1, ix).StrValueByIndex(sep2, 0)) # ": " # (arr.StrValueByIndex(sep1, ix).StrValueByIndex(sep2, 1)));
    }
}
Eventuell hilf dir das weiter.
Zuletzt geändert von Tyfys am 05.03.2024, 13:09, insgesamt 1-mal geändert.
Gruß
Harry

TomTB
Beiträge: 73
Registriert: 18.11.2018, 15:30
Danksagung erhalten: 4 Mal

Re: Tibber Strompreise einlesen und Aktoren schalten

Beitrag von TomTB » 02.01.2024, 10:43

TomTB hat geschrieben:
06.12.2023, 09:55
Hat es schon jemand geschafft, die Echtzeitdaten (aktueller Verbrauch, Zählerstand) über die Tibber-API abzurufen? Ich bin da bisher grandios gescheitert. Muss kein HM-Script sein. Shell oder Javascript geht auch.
Tom
Habe mich über die Feiertage dran gemacht. Ich habe keine Infos gefunden, wie ich mich über eine Websocket-Verbindung authentisieren kann. Weder was im Netz noch direkt von Tibber. Die API-Dokumentation bleibt allgemein und eine Anfrage beim Tibber-Support ergab nur "müsste gehen".

Ich habe das jetzt so gelöst, dass ich lokal den Pulse auslese. Dazu war diese Anleitung hilfreich:
https://forum.fhem.de/index.php?topic=133358.0

Nach dem der Pulse so konfiguriert war, dass die die Daten im lokalen Netzwerk abrufbar waren, habe ich mich im zweiten Schritt um die Dekodierung der Datentelegramme (SML-Telegramm) gekümmert. Dazu hat mir diese Anleitung geholfen:
https://www.stefan-weigert.de/php_loader/sml.php

Dann musste ein Raspi her. Auf dem habe ich dann ein nodejs-Serverscript implementiert, welches die Daten vom Pulse alle 2 Sekunden holt, dekodiert und dann in jeweils eine Systemvariable der CUU schreibt (TibberZaehlerstand, TibberVerbrauch, TibberPreis). Wie man das per http-Request macht, steht hier im Forum. Die Preisliste (maximal aktueller und nächster Tag, jeweils ein Preis (Euro/kWh) pro Stunde) hole ich mir über die Tibber-API (dazu braucht man keine Websocket-Verbindung) und immer dann, wenn sie leer ist, hole ich mir eine neue.

Über die CCU wandern die Tibber-Daten ganz automatisch auch in den CCU-Historian. Damit kann ich dann auch historische Daten abrufen und darstellen.

Abschließend habe ich mir eine Webseite auf dem Raspi eingerichtet, die mir im 2-Sekunden-Takt die Daten des Tibber-Pulse anzeigt und zusätzlich dann noch die historischen Daten der letzten 24 Stunden. Außerdem habe ich mir eine Lade-Erkennung für das Elektroauto eingebaut. Wenn der Verbrauch über einem gewissen Schwellwert liegt, den ich so im Haushalt nicht erreichen kann (9kW), dann markiere ich das als Laden des Autos. Damit kann ich dann den jeweiligen Preis für den letzten Ladevorgang berechnen und darstellen.
Die Webseite kannn ich beliebig weiter ausbauen und grafisch weiter aufpeppen aber mir reicht es erstmal. Wie ich mich kenne, kommen mir immer mal wieder neue Gedanken und dann baue ich die eben ein.

In der Tabelle stehen von links nach recht die Stunde, der Zählerstand zu Beginn der Stunde, der Preis pro kWh in Euro, der Verbrauch über die Stunde in kWh (abgeschnitten auf 2 Kommastellen) und die Kosten über die Stunde in Euro.
tibberwebsite.jpg
Tom

mic4rd
Beiträge: 11
Registriert: 04.02.2023, 20:59
System: CCU
Hat sich bedankt: 6 Mal
Danksagung erhalten: 1 Mal

Re: Tibber Strompreise einlesen und Aktoren schalten

Beitrag von mic4rd » 04.01.2024, 20:03

Heute hatte ich endlich etwas Zeit und habe das Sortierskript von Tyfys integriert. Man kann nun die maximale Sperrzeit begrenzen.

Die neue V1.2 findet sich in meinem ursprünglichen Post auf der vorherigen Seite.

Bild

Vielen Dank an alle!

LCB89
Beiträge: 2
Registriert: 29.10.2023, 19:39
System: CCU

Re: Tibber Strompreise einlesen und Aktoren schalten

Beitrag von LCB89 » 07.02.2024, 09:02

Moin,
vielen Dank für das tolle Scrip leider bin ich dafür scheinbar zu blöd, ich bekomme folgende Fehler Meldung aus dem stündlichen Skript.

Code: Alles auswählen

[eval]:2
.data.viewer.homes[0].currentSubscription.priceInfo.today[08].total );
                                          ^

TypeError: Cannot read property 'priceInfo' of null
    at [eval]:2:43
    at ContextifyScript.Script.runInThisContext (vm.js:50:33)
    at Object.runInThisContext (vm.js:139:38)
    at Object.<anonymous> ([eval]-wrapper:6:22)
    at Module._compile (module.js:652:30)
    at evalScript (bootstrap_node.js:466:27)
    at startup (bootstrap_node.js:167:9)
    at bootstrap_node.js:612:3
Kann mir jemand helfen?

mic4rd
Beiträge: 11
Registriert: 04.02.2023, 20:59
System: CCU
Hat sich bedankt: 6 Mal
Danksagung erhalten: 1 Mal

Re: Tibber Strompreise einlesen und Aktoren schalten

Beitrag von mic4rd » 07.02.2024, 10:51

Wie sieht denn deine Systemvariable "TIBBER_Strompreise" aus? Scheint so als könne das Skript die nicht lesen.

LCB89
Beiträge: 2
Registriert: 29.10.2023, 19:39
System: CCU

Re: Tibber Strompreise einlesen und Aktoren schalten

Beitrag von LCB89 » 07.02.2024, 11:50

Code: Alles auswählen

{"data":{"viewer":{"homes":[{"currentSubscription":null},{"currentSubscription":{"priceInfo":{"today":[{"startsAt":"2024-02-07T00:00:00.000+01:00","total":0.228,"level":"NORMAL"},{"startsAt":"2024-02-07T01:00:00.000+01:00","total":0.2213,"level":"NORMAL"},{"startsAt":"2024-02-07T02:00:00.000+01:00","total":0.2196,"level":"NORMAL"},{"startsAt":"2024-02-07T03:00:00.000+01:00","total":0.2344,"level":"NORMAL"},{"startsAt":"2024-02-07T04:00:00.000+01:00","total":0.2438,"level":"NORMAL"},{"startsAt":"2024-02-07T05:00:00.000+01:00","total":0.2499,"level":"NORMAL"},{"startsAt":"2024-02-07T06:00:00.000+01:00","total":0.268,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T07:00:00.000+01:00","total":0.2821,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T08:00:00.000+01:00","total":0.2825,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T09:00:00.000+01:00","total":0.2808,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T10:00:00.000+01:00","total":0.2756,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T11:00:00.000+01:00","total":0.2718,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T12:00:00.000+01:00","total":0.2694,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T13:00:00.000+01:00","total":0.2733,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T14:00:00.000+01:00","total":0.2718,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T15:00:00.000+01:00","total":0.284,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T16:00:00.000+01:00","total":0.2948,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T17:00:00.000+01:00","total":0.3218,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T18:00:00.000+01:00","total":0.3411,"level":"VERY_EXPENSIVE"},{"startsAt":"2024-02-07T19:00:00.000+01:00","total":0.3095,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T20:00:00.000+01:00","total":0.2979,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T21:00:00.000+01:00","total":0.2833,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T22:00:00.000+01:00","total":0.2785,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T23:00:00.000+01:00","total":0.2732,"level":"NORMAL"}]}}}]}}}
Zuletzt geändert von alchy am 07.02.2024, 19:35, insgesamt 1-mal geändert.
Grund: Code in Codetags posten

mic4rd
Beiträge: 11
Registriert: 04.02.2023, 20:59
System: CCU
Hat sich bedankt: 6 Mal
Danksagung erhalten: 1 Mal

Re: Tibber Strompreise einlesen und Aktoren schalten

Beitrag von mic4rd » 07.02.2024, 12:20

Das erste {"currentSubscription":null} scheint das Problem zu sein, der Fall, dass da zwei Einträge sind (eben einer mit null und der zweite mit den richtigen Werten) ist im Skript nicht abgedeckt.

Bin leider auch kein Experte bei der Tibber API. Kannst du testweise manuell den currentSubscription null Eintrag löschen, es sollte dann so aussehen:

Code: Alles auswählen

{"data":{"viewer":{"homes":[{"currentSubscription":{"priceInfo":{"today":[{"startsAt":"2024-02-07T00:00:00.000+01:00","total":0.228,"level":"NORMAL"},{"startsAt":"2024-02-07T01:00:00.000+01:00","total":0.2213,"level":"NORMAL"},{"startsAt":"2024-02-07T02:00:00.000+01:00","total":0.2196,"level":"NORMAL"},{"startsAt":"2024-02-07T03:00:00.000+01:00","total":0.2344,"level":"NORMAL"},{"startsAt":"2024-02-07T04:00:00.000+01:00","total":0.2438,"level":"NORMAL"},{"startsAt":"2024-02-07T05:00:00.000+01:00","total":0.2499,"level":"NORMAL"},{"startsAt":"2024-02-07T06:00:00.000+01:00","total":0.268,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T07:00:00.000+01:00","total":0.2821,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T08:00:00.000+01:00","total":0.2825,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T09:00:00.000+01:00","total":0.2808,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T10:00:00.000+01:00","total":0.2756,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T11:00:00.000+01:00","total":0.2718,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T12:00:00.000+01:00","total":0.2694,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T13:00:00.000+01:00","total":0.2733,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T14:00:00.000+01:00","total":0.2718,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T15:00:00.000+01:00","total":0.284,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T16:00:00.000+01:00","total":0.2948,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T17:00:00.000+01:00","total":0.3218,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T18:00:00.000+01:00","total":0.3411,"level":"VERY_EXPENSIVE"},{"startsAt":"2024-02-07T19:00:00.000+01:00","total":0.3095,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T20:00:00.000+01:00","total":0.2979,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T21:00:00.000+01:00","total":0.2833,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T22:00:00.000+01:00","total":0.2785,"level":"EXPENSIVE"},{"startsAt":"2024-02-07T23:00:00.000+01:00","total":0.2732,"level":"NORMAL"}]}}}]}}}
Wenn das Skript dann läuft, schauen wir weiter was es da in der Tibber API mit auf sich hat.
Zuletzt geändert von alchy am 07.02.2024, 19:35, insgesamt 1-mal geändert.
Grund: Code in Codetags posten

dovogt
Beiträge: 11
Registriert: 26.02.2021, 18:03
System: CCU
Hat sich bedankt: 2 Mal

Re: Tibber Strompreise einlesen und Aktoren schalten

Beitrag von dovogt » 27.02.2024, 17:41

Erst einmal vielen Dank für das bestehende Script. ich konnte er problemlos einbinden.

Ich würde gerne noch den Verbrauch mit einbeziehen und würde diesen alle 5 Minuten in eine Variable schreiben und anschließend Geräte danach steuern. Habt Ihr so was schon gemacht. Das bestehende Script konnte ich nicht werweitern, da eine andere Abfrage erstellt werden muss, Die bestehende kann nur einmal pro Stunde ausgeführt werden, oder verstehe ich es falsch?

Code: Alles auswählen

subscription{
  liveMeasurement(homeId:){
    timestamp
    power
    accumulatedConsumption
    accumulatedCost
    currency
    minPower
    averagePower
    maxPower
  }
}

mic4rd
Beiträge: 11
Registriert: 04.02.2023, 20:59
System: CCU
Hat sich bedankt: 6 Mal
Danksagung erhalten: 1 Mal

Re: Tibber Strompreise einlesen und Aktoren schalten

Beitrag von mic4rd » 27.02.2024, 20:38

dovogt hat geschrieben:
27.02.2024, 17:41
Erst einmal vielen Dank für das bestehende Script. ich konnte er problemlos einbinden.

Ich würde gerne noch den Verbrauch mit einbeziehen und würde diesen alle 5 Minuten in eine Variable schreiben und anschließend Geräte danach steuern. Habt Ihr so was schon gemacht. Das bestehende Script konnte ich nicht werweitern, da eine andere Abfrage erstellt werden muss, Die bestehende kann nur einmal pro Stunde ausgeführt werden, oder verstehe ich es falsch?

Code: Alles auswählen

subscription{
  liveMeasurement(homeId:){
    timestamp
    power
    accumulatedConsumption
    accumulatedCost
    currency
    minPower
    averagePower
    maxPower
  }
}
Die Livedaten lassen sich meines Wissens nur als Websocket-Subscription abrufen (siehe hier: https://developer.tibber.com/docs/guides/calling-api), die simple CURL Methode meines Skripts funktioniert da nicht.

Inwiefern sich das über ein CCU Skript machen lässt, weiss ich leider nicht :cry: Vielleicht kann jemand anders helfen?

TomTB
Beiträge: 73
Registriert: 18.11.2018, 15:30
Danksagung erhalten: 4 Mal

Re: Tibber Strompreise einlesen und Aktoren schalten

Beitrag von TomTB » 28.02.2024, 07:43

Da bin ich auch sehr gespannt. Meine diesbezügliche Frage dazu wurde hier mit "steht doch in der API-Doku" abgebügelt.
Ich habe mir damit geholfen, den Verbrauch direkt am Pulse abzufragen.
Tom

Antworten

Zurück zu „HomeMatic allgemein“