@paul53 natürlich!
NEWS
Latest posts made by mbe01
-
RE: Wärmepumpe steuern mit BSB-Lan und tibber
@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) -
RE: Wärmepumpe steuern mit BSB-Lan und tibber
@paul53 Alles klar, ich hatte das total übersehen. Ich arbeite mit einer niedrigen Auflösung an einem kleinen Notebook.
-
RE: Wärmepumpe steuern mit BSB-Lan und tibber
@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" } }
-
RE: Wärmepumpe steuern mit BSB-Lan und tibber
@paul53 ok, hab reloaded und es dann eingefügt. Noch iene kurze Frage. Wo ist "WP" definiert?
-
RE: Wärmepumpe steuern mit BSB-Lan und tibber
@paul53 oh super Sache danke dir das probier ich aus!!
-
RE: Wärmepumpe steuern mit BSB-Lan und tibber
@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. -
RE: Wärmepumpe steuern mit BSB-Lan und tibber
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. -
RE: Wärmepumpe steuern mit BSB-Lan und tibber
Wie zu erwarten war geht natürlich so nicht.
-
RE: 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(); });