NEWS
Wärmepumpe steuern mit BSB-Lan und tibber
-
Ich hab mal bisschen rumprobiert und das Skript läuft durch. Ist nur die Frage, ob es "sinnig" ist. Vllt könnte ein Experte drüberlesen und die Fehler aufzeigen.
Ich sollte noch erwähnen, dass das Skript einen Durchschnittstagespreis aus 6h errechnen soll und während diesen Zeitraums die WP auf Komfort [3] stellen./* MIT License - see LICENSE.md Copyright (c) [2020] [Matthias Boettger <mboe78@gmail.com>] */ // Get Tibber Data (Awattar alternative) const url = 'https://api.tibber.com/v1-beta/gql' const token = "XXX" function requestData() { const options = { uri: url, method: 'POST', body: '{"query": "{ viewer { homes { currentSubscription{ priceInfo{ today{ total startsAt } tomorrow{ total startsAt } } } } } }" }', headers: { 'Authorization': token, 'Content-Type': 'application/json' } } request(options, (error, response, body) => { if(error) return console.log(error); if(response.statusCode == 200) { let array = JSON.parse(body).data.viewer.homes[0].currentSubscription.priceInfo.today array = array.concat(JSON.parse(body).data.viewer.homes[0].currentSubscription.priceInfo.tomorrow) var jetzt = new Date(), midn = new Date( jetzt.getFullYear(), jetzt.getMonth(), jetzt.getDate(), 0,0,0), diffhr = Math.floor((jetzt.getTime() - midn.getTime())/3600000) for(let i = diffhr; i < array.length; i++) { let a = i-diffhr let billigsterTagesDurchschnittspreis = Infinity; // Setze auf ein hohes Anfangswert for (let i = 0; i < array.length - 6; i++) { let tagesDurchschnittspreisSumme = 0; // Berechne den Durchschnittspreis über 6 Stunden für den aktuellen Zeitpunkt for (let j = i; j < i + 6; j++) { tagesDurchschnittspreisSumme += Number(array[j].total); } let tagesDurchschnittspreis = tagesDurchschnittspreisSumme / 6; // Überprüfe, ob der aktuelle Tagesdurchschnittspreis der günstigste ist if (tagesDurchschnittspreis < billigsterTagesDurchschnittspreis) { billigsterTagesDurchschnittspreis = tagesDurchschnittspreis; billigsterZeitraum = i; } } // Setze die Betriebsart entsprechend des billigsten Zeitraums const gewuenschterZustand = billigsterZeitraum === diffhr ? 3 : 0; setState('bsblan.0.Betriebsart_(1000)', gewuenschterZustand); createState(stateBaseName + "startTime", "", { read: true, write: true, name: "Gultigkeitsbeginn (Uhrzeit)", type: "string", def: false }); createState(stateBaseName + "startDate", "", { read: true, write: true, name: "Gultigkeitsbeginn (Datum)", type: "string", def: false }); createState(stateBaseName + "endTime", "", { read: true, write: true, name: "Gultigkeitsende (Uhrzeit)", type: "string", def: false }); createState(stateBaseName + "price", 0, { read: true, write: true, name: "Preis", type: "number", def: 0 }); let start = new Date(Date.parse(array[i].startsAt)); var options = { hour12: false, hour: '2-digit', minute:'2-digit'}; let startTime = start.toLocaleTimeString('de-DE', options); let startDate = start.toLocaleDateString('de-DE'); let end = new Date(Date.parse(array[i].startsAt)).getTime()+3600000 let endTime = new Date(end).toLocaleTimeString('de-DE', options); let mwhprice = array[i].total; let price = Number(mwhprice); //console.log(startTime + ',' + startDate + ',' + startTime + ',' + endTime + ',' + price ) setState(stateBaseName + "startTime", startTime); setState(stateBaseName + "startDate", startDate); setState(stateBaseName + "endTime", endTime); setState(stateBaseName + "price", price*100); }; }; }); } requestData(); schedule("0 * * * *", function () { requestData(); });
-
Wie zu erwarten war geht natürlich so nicht.
-
@mbe01 sagte in Wärmepumpe steuern mit BSB-Lan und tibber:
Wie zu erwarten war geht natürlich so nicht.
heisst unchiffriert was?
https://forum.iobroker.net/topic/51555/hinweise-für-gute-forenbeiträge/1
-
@mbe01 sagte: Skript einen Durchschnittstagespreis aus 6h errechnen soll und während diesen Zeitraums die WP auf Komfort [3] stellen.
Müssen es 6 zusammenhängende Stunden sein? Genügen 6 Stunden für die WP?
Du nutzt nicht den Tibberlink-Adapter? -
sorry, war heute etwas beschäftigt.
Tibberlink hab ich ja.
Ja es sollten zusammenhängende Stunden sein. Das heisst nicht unbedingt, dass die WP dann an ist, sondern nur im Komfort Modus drin ist.
Es gibt sicherlich intelligentere Lösungen, aber ich dachte das wäre zunächst die einfachere Lösung. Dh sie läuft sicherlich dann keine 6h durch (hängt von der Temp ab), aber das ist in etwa das was ich maximal an WP-Zeit bräuchte um meine Hütte warm zu bekommen. Meine WP ist recht alt, kennt nur on/off und volle Leistung, also es ist keine InverterWP. -
@mbe01 sagte: das ist in etwa das was ich maximal an WP-Zeit bräuchte um meine Hütte warm zu bekommen.
Dann ist sie erheblich überdimensioniert.
Weshalb 6 zusammenhängende Stunden? Es sind nicht unbedingt die billigsten Stunden. -
@paul53 ja das ist richtig. Ich dachte nur, dass es vllt einfacher sei, weil ich nicht programmieren kann. Ausserdem wollte ich die Takte reduzieren, da die Heizungsbauer die die damals eingebaut haben ganz schön "sch...." gebaut haben.
Aber wenn das nicht allzu kompliziert ist, dann kann ich das auch mal mit den billigsten Zeiten ausprobieren und nicht zusammenhängend. -
@mbe01 sagte: wenn das nicht allzu kompliziert ist, dann kann ich das auch mal mit den billigsten Zeiten ausprobieren
Als Blockly aus dem Tibberlink-Adapter:
"xyz" ersetzen und DP-ID für die WP selektieren.
-
@paul53 oh super Sache danke dir das probier ich aus!!
-
@mbe01 sagte: das probier ich aus!!
Ich habe das Blockly nach dem ersten Post geändert: Es wird jede Stunde eingelesen und nur der Pfad angepasst.
-
@paul53 ok, hab reloaded und es dann eingefügt. Noch iene kurze Frage. Wo ist "WP" definiert?
-
@mbe01 sagte: Wo ist "WP" definiert?
Die Variable
WP
muss in den Datenpunkt "bsblan.0.Betriebsart_(1000)" geschrieben werden ("steuere"-Block). -
@paul53 said in Wärmepumpe steuern mit BSB-Lan und tibber:
bsblan.0.Betriebsart
Super! Danke dir! Dass das so funktioniert ist ja klasse. Mit blocky muss ich mich mal beschäftigen!
Das kann ich dann direkt auch mal für die WW Bereitung anwenden. Wobei das nur dann 1x am Tag gemacht werd muss. Das geht recht schnell (30min etwa).
"WP" müsste dann hier irgendwo rein oder?{ "type": "state", "common": { "name": "Betriebsart (1000)", "type": "number", "role": "value", "read": true, "write": true, "unit": "", "states": { "0": "Schutzbetrieb", "1": "Automatik", "2": "Reduziert", "3": "Komfort", "65535": "---" } }, "native": { "id": "1000", "bsb": { "name": "Betriebsart", "dataType_name": "ENUM", "dataType_family": "ENUM", "possibleValues": [ { "enumValue": 65535, "desc": "---" }, { "enumValue": 0, "desc": "Schutzbetrieb" }, { "enumValue": 1, "desc": "Automatik" }, { "enumValue": 2, "desc": "Reduziert" }, { "enumValue": 3, "desc": "Komfort" } ], "isswitch": 0, "dataType": 1, "readonly": 0, "readwrite": 0, "unit": "" } }, "from": "system.adapter.bsblan.0", "user": "system.user.admin", "ts": 1703425633330, "_id": "bsblan.0.Betriebsart_(1000)", "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" } }
-
@mbe01 sagte: "WP" müsste dann hier irgendwo rein oder?
Nein, dieser Datenpunkt muss im Block "steuere" ausgewählt werden (auf "Object ID" klicken).
-
@paul53 Alles klar, ich hatte das total übersehen. Ich arbeite mit einer niedrigen Auflösung an einem kleinen Notebook.
-
@mbe01
Schau bitte mal auf die Zeitstempel, wann die Datenpunkte unter "PricesToday" und "PricesTomorrow" aktualisiert werden - besonders kurz nach Mitternacht.
Ich bin davon ausgegangen, dass - wie im Adapter "apg-info" - die Preise erst einige Sekunden nach Mitternacht aktualisiert werden. Im Quelltext des Tibberlink-Adapters habe ich gesehen, dass der CRON-Job ein paar Minuten vor Mitternacht triggert, aber Kommentar//"20 56 23 * * *" = 5 minuten vor 00:01:20
-
@paul53 langer Arbeitstag ehute gehabt. Ich hab dummerweise das log weggedrückt, aber der hatte einen Fehler ausgespuckt. Ich weiss nicht ob das nochmalirgendwo hinterlegt wird auch wenn ich das auf der GUI das gelöscht hab. Ich such mal.
Es war irgendwas mit tibberlink.0.Homes."KEY".PricesTomorrow not found oder so.
EDIT gefunden:at processTicksAndRejections (node:internal/process/task_queues:95:5)
javascript.0
2024-01-02 18:00:00.341 warn at Object.<anonymous> (script.js.common.WP_nachTibber:27:13)
javascript.0
2024-01-02 18:00:00.339 warn getState "tibberlink.0.Homes.blabla.PricesToday23.total" not found (3)
javascript.0
2024-01-02 18:00:00.339 warn at processTicksAndRejections (node:internal/process/task_queues:95:5)
javascript.0
2024-01-02 18:00:00.339 warn at Object.<anonymous> (script.js.common.WP_nachTibber:27:13)
javascript.0
2024-01-02 18:00:00.337 warn getState "tibberlink.0.Homes.BLABLA.PricesToday22.total" not found (3) -
@mbe01 sagte: tibberlink.0.Homes."KEY".PricesTomorrow not found oder so.
Das kann nur um Mitternacht gewesen sein, denn zu den anderen Zeiten wird nur auf "PricesToday" zugegriffen. Wenn die Preise kurz vor Mitternacht aktualisiert werden, muss immer "PricesToday" verwendet werden.
-
@mbe01 sagte: "tibberlink.0.Homes.BLABLA.PricesToday22.total"
Wurde hinter "PricesToday" der Punkt vergessen?
"tibberlink.0.Homes.BLABLA.PricesToday.22.total"
-
@paul53 natürlich!