NEWS
Diagramm mit festen Werten in VIS - nur wie?
-
Für alle, die den ECharts-Adapter bereits am Laufen haben, hier eine Blockly-Lösung für die grafische Darstellung der Preise heute und Preise Morgen:
Nachtrag 25.12.2023: Hier ein Foto des zugehörigen Pop-up-Views in vis:-
Der Tibber-Adapter legt seine Daten im Objektbaum unter ‚tibberlink.0.Homes.xxx.PricesToday‘ und ‚tibberlink.0.Homes.xxx.PricesTomorrow‘ ab. Dort gibt es jeweils einen JSON-Datenpunkt, in dem die Werte für den ganzen Tag gespeichert sind.
-
Der ECharts-Adapter kann optional einen JSON-Datenpunkt einlesen und darstellen, wenn die Daten im Format
[{„ts“: 1675887847000, „val“: 45}, {„ts“: 1675887848000, „val“: 77}, {„ts“: 1675887849000, „val“: 180} ]
vorliegen (siehe https://github.com/ioBroker/ioBroker.echarts#readme).
Damit benötigt es ein Skript, das die beiden JSON-Datenpunkte aus Tibber in einen JSON-Datenpunkt für ECharts konvertiert.
Hier eine schnelle Skript-Lösung (mit Ablage des Ergebnisses im String-Datenpunkt ‚0_userdata.0.Stromversorgung.Tibber-Preise‘; der Wert xxx im Skript ist vor dem Import durch die jeweilige Tibber-ID zu ersetzen):
[Nachtrag 01.12.2023: Das zugrunde liegende Blockly-Script konnte ich aufgrund seiner Größe hier nicht hochladen; ich stelle es auf Nachfrage aber gerne per Mail zur Verfügung. Im nachfolgenden Skript wird noch zusätzlich der Datenpunkt ‚0_userdata.0.Stromversorgung.Tibber-Mittelwerte‘ befüllt, um im Chart auch Linien für die jeweiligen Tages-Mittelwerte einzublenden.]var nur_Daten_fuer_heute, Quelldaten, JSON_fuer_ECharts, letzte_Laenge, average_price, Schleifenzaehler; // Daten von Tibber auf Änderung prüfen on({ id: [].concat(['tibberlink.0.Homes.xxx.PricesToday.json']).concat(['tibberlink.0.Homes.xxx.PricesTomorrow.json']), change: 'ne' }, async (obj) => { // warten bis alle Daten stabil sind: await wait(5000); // prüfen, für welche Tage Daten da sind: // Prices.Tomorrow if (getState('tibberlink.0.Homes.xxx.PricesTomorrow.json').val == '[]') { nur_Daten_fuer_heute = true; } else { nur_Daten_fuer_heute = false; } // Daten von Tibber holen: Quelldaten = getState('tibberlink.0.Homes.xxx.PricesToday.json').val; if (!nur_Daten_fuer_heute) { // Zusammenführung in eine Variable: // zuerst Daten von heute rechtsbündig bereinigen: while (Quelldaten.charAt((Quelldaten.length - 1)) != '}') { Quelldaten = Quelldaten.slice(0, Quelldaten.length - 1); // Zwangsabbruch, falls Endlosschleife droht: if (Quelldaten.length < 20) { break; } } Quelldaten = [Quelldaten,', ',getState('tibberlink.0.Homes.xxx.PricesTomorrow.json').val.slice(1, getState('tibberlink.0.Homes.xxx.PricesTomorrow.json').val.length)].join(''); } // Datenformat umwandeln: JSON_fuer_ECharts = '[{"ts": '; while (Quelldaten.indexOf('startsAt') + 1 > 0) { letzte_Laenge = Quelldaten.length; JSON_fuer_ECharts = [JSON_fuer_ECharts,getDateObject(getAttr((function () { try { return JSON.parse(Quelldaten); } catch (e) { return {}; }})(), '0.startsAt')).getTime(),', "val": '].join(''); JSON_fuer_ECharts = [JSON_fuer_ECharts,getAttr((function () { try { return JSON.parse(Quelldaten); } catch (e) { return {}; }})(), '0.total'),'}, {"ts": '].join(''); if (Quelldaten.indexOf('},') + 1 < 2) { break; } Quelldaten = '[' + String(Quelldaten.slice(((Quelldaten.indexOf('},') + 1 + 2) - 1), Quelldaten.length)); // Zwangsabbruch, falls Endlosschleife droht: if (Quelldaten.length == letzte_Laenge) { break; } } JSON_fuer_ECharts = String(JSON_fuer_ECharts.slice(0, JSON_fuer_ECharts.lastIndexOf('}, {"ts":') + 1)) + ']'; if (nur_Daten_fuer_heute) { // kein Datensatz für Morgen --> Werte generieren: average_price = getAttr((function () { try { return JSON.parse(JSON_fuer_ECharts); } catch (e) { return {}; }})(), '23.val'); Quelldaten = JSON_fuer_ECharts; JSON_fuer_ECharts = String(Quelldaten.slice(0, Quelldaten.length - 1)) + ', {"ts": '; while (Quelldaten.indexOf('ts') + 1 > 0) { letzte_Laenge = Quelldaten.length; // Fortschreiben des letzten Tageswerts: JSON_fuer_ECharts = [JSON_fuer_ECharts,getAttr((function () { try { return JSON.parse(Quelldaten); } catch (e) { return {}; }})(), '0.ts') + 86400000,', "val": ',average_price,'}, {"ts": '].join(''); if (Quelldaten.indexOf('},') + 1 < 2) { break; } Quelldaten = '[' + String(Quelldaten.slice(((Quelldaten.indexOf('},') + 1 + 2) - 1), Quelldaten.length)); // Zwangsabbruch, falls Endlosschleife droht: if (Quelldaten.length == letzte_Laenge) { break; } } JSON_fuer_ECharts = String(JSON_fuer_ECharts.slice(0, JSON_fuer_ECharts.lastIndexOf('}, {"ts":') + 1)) + ']'; } setState('0_userdata.0.Stromversorgung.Tibber-Preise' /* Tibber-Preise */, JSON_fuer_ECharts, true); // Datensatz für die Mittelwerte generieren: Quelldaten = JSON_fuer_ECharts; JSON_fuer_ECharts = '[{"ts": '; average_price = getState('tibberlink.0.Homes.xxx.PricesToday.average.total').val; Schleifenzaehler = 0; while (Quelldaten.indexOf('ts') + 1 > 0) { if (Schleifenzaehler == 24) { if (nur_Daten_fuer_heute) { // letzter Tageswert bleibt stehen; danach Abbruch } else { average_price = getState('tibberlink.0.Homes.xxx.PricesTomorrow.average.total').val; } } if (Schleifenzaehler == 25 && nur_Daten_fuer_heute) { break; } letzte_Laenge = Quelldaten.length; JSON_fuer_ECharts = [JSON_fuer_ECharts,getAttr((function () { try { return JSON.parse(Quelldaten); } catch (e) { return {}; }})(), '0.ts'),', "val": ',average_price,'}, {"ts": '].join(''); if (Quelldaten.indexOf('},') + 1 < 2) { break; } Quelldaten = '[' + String(Quelldaten.slice(((Quelldaten.indexOf('},') + 1 + 2) - 1), Quelldaten.length)); // Zwangsabbruch, falls Endlosschleife droht: if (Quelldaten.length == letzte_Laenge) { break; } Schleifenzaehler = (typeof Schleifenzaehler === 'number' ? Schleifenzaehler : 0) + 1; } JSON_fuer_ECharts = String(JSON_fuer_ECharts.slice(0, JSON_fuer_ECharts.lastIndexOf('}, {"ts":') + 1)) + ']'; setState('0_userdata.0.Stromversorgung.Tibber-Mittelwerte' /* Tibber-Mittelwerte */, JSON_fuer_ECharts, true); })
Im EChart muss dann lediglich als Quelle 'JSON' und ID '0_userdata.0.Stromversorgung.Tibber-Preise' angegeben werden; als Diagramm-Typ sollte 'Schritte' gewählt werden.
Viel Erfolg! -
-
@familienvater
Danke dir für das Skript und Widget ! Nutze das mit dem euen Tibberlink Adapter.Klappt Prima. Ich musste nur bei Zeile 144 das "0" + entfernen, damit auch die einstelligen Stunden ausgelesen werden.
-
@vowill Danke für die tolle Anregung. Habe das in Blockly umgesetzt. Errechne mir zusätzlich noch bezogen auf einen definierten "Triggerpreis" ein JSON das alle Stunden unterhalb des Preises mit 1 und oberhalb mit 0 enthält und überlagere das im eChart. Dann kann man dynamisch im VIS den Triggerpreis über Tasten einstellen (Triggerpreiswert als Markierung im eChart überlagert) und sieht graphisch (grün), in welchen Stunden der Preis unterhalb des Triggers liegt und ein Zähler zeigt wieviel Stunden das insgesamt sind. Jetzt noch ein kleiner Script der in diesen Stunden die Wallbox aktiviert (nutze dafür dass "best price" feature von Tibberlink). Und fertig
Sieht bei mir im VIS dann so aus:
-
@vowill Kannst Du mir bitte das zugrunde liegende Blockly-Script per Mail zusenden.
-
@lui1307
Gerne per privater Mail; siehe Chat. -
@vowill blank
-
Hi,
bei mir wird der JSON offenbar nicht richtig ins bar chart gelesen.
Was kann ich tun?JSON string:
bar chart im vis:
bar chart widget:
-
-
Danke.
Aber ich bin ja gar nicht im eCharts Adapter.
Ich versuche das JSON per Widget ins bis zu bringen -
@aleks-83 okay; mein Fehler.
-
@vowill Könntest du mir das Blockly zukommen lassen
-
@vowill
Ich habe es noch nicht hin bekommen.
Könntest du mir (und Beerle1968 auch) das Blockly zukommen lassen?
Dann könnte ich deine Möglichkeit ja mal testen. -
@aleks-83 Beerle1968 hat das Blockly bereits - ging über private Mailadresse.
-
@vowill
Hallo vowill könntest Du mir bitte auch das Script zur Verfügung stellen?
Vielen Dank -
@vowill würdest Du mir bitte auch das Skript zur Verfügung stellen?
Dankeschön -
@vowill
Hallo, könntest Du mir bitte auch das Skript zur Verfügung stellen?
Vielen Dank! -
@iwi sagte in Diagramm mit festen Werten in VIS - nur wie?:
@vowill würdest Du mir bitte auch das Skript zur Verfügung stellen?
Dankeschönerl. am 13.04. über private Mail
-
@mrpetz
erl. am 10.05. über private Mail -
@vowill
Hallo, könntest Du mir bitte auch das Skript zur Verfügung stellen?
Vielen Dank. -
@flaterick Bitte schick mir deine Mailadresse (per Chatfunktion).