NEWS
Brauche Hilfe bei Tibber Blockly
-
ich nutze dafür das script von @MCU
Dieses hat er auf seiner Blog-Seite erklärt, leider finde ich diesen gerade nicht.
Falls ich ihn finden sollte, reiche ich diesen nach.
//Edit:
hier die Quelle:
https://mcuiobroker.gitbook.io/jarvis-infos/jarvis-v3/tibber/tibbernext2cheapestDas Script sollte dennoch selbsterklärend sein:
// ****************************** // tibberNext2Cheapest v1.0.1 // ****************************** // Copyright ©MCU // v1.0.1 - numHours - Anzahl der zusammenhängenden Stunden eingeführt let tibberdataDP = '0_userdata.0.tibber.data' let cheapestNext2HoursDP = tibberdataDP + '.cheapestNext2Hours'; let cheapestNext2StartTSDP = tibberdataDP + '.cheapestNext2StartTS'; let cheapestNext2StartDP = tibberdataDP + '.cheapestNext2Start'; let cheapestSearchAreaDP = tibberdataDP + '.cheapestArea'; let startDP = tibberdataDP + '.startCalc'; let numHoursDP = tibberdataDP + '.numHours'; createStateAsync(cheapestNext2HoursDP, {read: true, write: false, name: "Günstigsten 2 Stunden im gewählten Bereich", desc:"Günstige-Stunden-DP", type: "string", role: "", def: "[]" }); createStateAsync(cheapestNext2StartTSDP, {read: true, write: false, name: "Start [TS] der nächsten günstigen 2 Stunden", desc:"Start-DP", type: "number", role: "", def: 0 }); createStateAsync(cheapestNext2StartDP, {read: true, write: false, name: "Start [Text] der nächsten günstigen 2 Stunden", desc:"Start-DP", type: "string", role: "", def: 0 }); createStateAsync(cheapestSearchAreaDP, {read: true, write: true, name: "Bereich für Suche in [h]", desc:"Bereich-DP", type: "number", role: "",unit:"Std.", def: 10 }); createStateAsync(startDP, {read: true, write: true, name: "Berechnung starten", desc:"Start-DP", type: "boolean", role: "button", def: false }); createStateAsync(numHoursDP, {read: true, write: true, name: "Anzahl der zusammenhängenden Stunde [h]", desc:"Anzahl Stunden-DP", type: "number", role: "",unit:"Std.", def: 2 }); let nowHour = new Date().getHours(); let tibberInst = '0'; let scheduleId ; if(getState(startDP).val){ scheduleId = schedule('00 * * * *', () => { getCheapest(); }) } on({id: cheapestSearchAreaDP, change: "any"}, function (obj) { getCheapest(); }); on({id: numHoursDP, change: "any"}, function (obj) { getCheapest(); }); on({id: startDP, change: "any"}, function (obj) { let value = obj.state.val; if(value){ getCheapest(); setState(startDP,false) } }); function getCheapest(){ let priceArr = ['PricesToday','PricesTomorrow']; let tibberData = []; let searchHours = getState(cheapestSearchAreaDP).val; for(let x=0;x< priceArr.length;x++){ let tibberLink = $('tibberlink.'+tibberInst+'.Homes.*.'+priceArr[x]+'.json') if(tibberLink[0] != undefined){ let tblLevel = levelObject(tibberLink[0]); let dpLeveltbl = getDPLevel(tblLevel,4); let tibberJSON = JSON.parse(getState(dpLeveltbl+'.json').val); // tibberJSON for(let i=0;i<tibberJSON.length;i++){ let obj = {}; obj.hour = parseInt(tibberJSON[i].startsAt.substring(11,13)); obj.start = tibberJSON[i].startsAt obj.startTS = new Date(obj.start).getTime(); obj.value = tibberJSON[i].total; tibberData.push(obj); } } } // log(tibberData) let cheapest = findCheapestHoursChange(tibberData.slice(nowHour+1,nowHour+1+searchHours),getState(numHoursDP).val); // log(cheapest) setState(cheapestNext2HoursDP,JSON.stringify(cheapest)); setState(cheapestNext2StartTSDP,cheapest[0].startTS); setState(cheapestNext2StartDP,formatDate(cheapest[0].startTS,'DD.MM.YYYY hh:mm:ss')); } function findCheapestHoursChange(data, numHours) { if (numHours < 1 || numHours > data.length) { console.error("Invalid number of hours"); return []; } let minPrice = Infinity; let result = []; for (let i = 0; i < data.length - numHours + 1; i++) { let priceSum = 0; const currentHours = data.slice(i, i + numHours); for (const hour of currentHours) { priceSum += hour.value; } if (priceSum < minPrice) { minPrice = priceSum; result = currentHours; } } return result; } function findCheapestHours(data) { let minPrice = Infinity; let result = []; for (let i = 0; i < data.length - 1; i++) { const priceSum = data[i].value + data[i + 1].value; if (priceSum < minPrice) { minPrice = priceSum; result = [data[i], data[i + 1]]; } } return result; } function levelObject(id){ // 0_userdata.0.jarvis.system.tabWidgetStateEffects.0.Desktop.0.Bad.0b5dd758-8d7d-4259-8945-821b1c942960.states.0.displayOff let idArr=id.split('.'); return idArr; //log(idArr[10]); } // log(getDPLevel(levelObject('0_userdata.0.jarvis.system.tabWidgetStateEffects.0.Desktop.0.Bad.0b5dd758-8d7d-4259-8945-821b1c942960.states.0.displayOff'),9)); function getDPLevel(idArr,level){ let id =''; for (let i=0;i<=level;i++){ id += idArr[i] +'.' } id = id.substr(0,id.length-1); // letzten Punkt wegnehmen return id; }
-
@paul53 said in Brauche Hilfe bei Tibber Blockly:
Versuche es mal so:
Habs grad nachgebaut und ausprobiert, so funktioniert das !!
Vielen Dank für deine schnelle Hilfe, ich werds mal beobachten , aber ich denke das ist genau das was ich haben wollte. Klein, schlank und nich soviel gedöns drum herum was man nicht braucht.
-
@icebear
Hallo und fein dass du in diesem Forum Hilfe bekommen hattest.
Ich habe das grundlegende Problem, dass ich mit einem einfachen script für den günstigsten Strompreis (per awattar - dürfte daselbe sein) keinen Schalter (schalte beim niedrigsten Strompreis die Steckdose X) hinbekomme, weil die Zeiten (Datum und Zeitpunkt) wohl anders als z.B. TT.MM.JJJJ oder SS:mm:ss in awattar formatiert sind. Ich habe viele der hier im forum angebotenen scripte (erfolglos) nachgebaut; zuletzt die Ursprungsdaten in Text und dann in Strings konvertiert - alles ohne Erfolg.
Script (mit den Hinweisen) macht nun, was es soll. Danke -
@karl sagte in Brauche Hilfe bei Tibber Blockly:
fein dass du in diesem Forum Hilfe bekommen hattest.
das klingt fast so, als ob du mit
@karl sagte in Brauche Hilfe bei Tibber Blockly:
Ich habe viele der hier im forum angebotenen scripte (erfolglos) nachgebaut;
keine Hilfe bekommen hättest.
Hast du denn dein Skript und die Logausgaben gezeigt?
Um helfen zu können brauchen die Helfenden auch die notwendigen Informationen!Mach bitte einen eigenen Thread dazu mit diesen Informationen auf, dann wird sicher auch dir geholfen.
-
@karl sagte: scripte (erfolglos) nachgebaut
Passt dieses Blockly nicht?
-
Ich hätte noch eine kleine Nachfrage,
Wie bekomm ich es hin das ich im Blockly prüfe Falls der Strompreis heute (13-23:59) guenstiger ist als der Strompreis 'Morgen' (00:00 -13:00) dann soll etwas passieren (also z.B schalten) und wenn der Strompreis nicht günstiger ist, dann soll Morgen um die Zeit wo er günstiger ist ewas schalten.
Also Heute 23:00 Strompreis 0,25 aber Morgen 04:00 0,21> dann warten bis 04:00 und dann soll erst das WWSchnell auf wahr gesetzt werden und das von Heute auf falsch.
Hier noch der Blockly Ansatz
Ich hoffe ich hab mich verständlich ausgedrückt
-
@icebear
Welcher Adapter? Tibberlink oder Awattar? Du hast die Frage bei beiden Adaptern gestellt, die sich erheblich unterscheiden. -
@icebear sagte: Heute 23:00 Strompreis 0,25 aber Morgen 04:00 0,21> dann warten bis 04:00
Da am frühen Abend die Preise hoch sind, kann man kurz vor 20:00 Uhr die Stunde mit dem niedrigsten Preis in den nächsten 24 Stunden ermitteln. Prinzip:
-
@paul53 said in Brauche Hilfe bei Tibber Blockly:
Welcher Adapter? Tibberlink oder Awattar?
Ich nutze Tiiberlink.
Das meinte ich aber nicht, das hab ich alles schon ermittelt usw.
Mir ging es darum wie ich das jetzt in meine Schaltung/Prüfung einbauen kann.
Ich Lege zuerst mit der Betriebsart fest ob mit PV oder EPEX das Warmwasser gemacht werden soll. Wenn keine PV-Leistung dann EPEX. Da ist es ja egal um wieviel UHR die WP läuft soll halt günstig sein.
So jetzt war ich an dem Punkt (wie oben in dem Blockly) wenn WWLow und Betriebsart EPEX
dann soll er prüfen, ist der Strompreis bis 23:59 "Heute" günstiger als "Morgen" bis 05:00 Uhr > dann Schalter WWSchnell auf 'WAHR' wenn die Stunde z.B 23:00 erreicht ist (und der Rest ist erstmal hinfällig da ich dann WW um 07:00 habe)
Was ist aber wenn der Strompreis bis 23:59 teurer ist als der bis 05:00Uhr , wie baue ich jetzt ein das er dann bei heute den Schalter WWSchnell auf 'FALSE' setzt und dann am nächsten Tag z.B. 'Aktuelle Zeit = 04:00 Uhr > Schalter WWSchnell auf 'WAHR'
-
@icebear sagte: am nächsten Tag z.B. 'Aktuelle Zeit = 04:00 Uhr > Schalter WWSchnell auf 'WAHR'
Das macht der rechte Trigger zu jeder vollen Stunde: Wenn die günstigste Startzeit 4:00 Uhr ist, wird um 4:00 Uhr eingeschaltet.
-