Vinnerliste
Populært innhold
Viser innholdet med mest poeng siden 21. nov. 2024 i alle områder
-
Hei! Det jobbes kontinuerlig med oppdateringer for komfyrvakt. Komfyrvakten følger også Zigbee standard så langt det lar seg gjøre. Da komfyrvakt ikke har noen egen standard i Zigbee 3.0 må det dessverre noen egne tilpasninger til for å få dette så nært optimalt som mulig. Når det er sagt så er det hovedsakelig rapportering som er fokus for produktet (sensortemperatur, strømforbruk, alarm og relé status). Kontroll av selve reléet er begrenset til kun å kunne slå dette av via Zigbee protokollen (krav for sertifisering - Vi har også vurdert å fjerne dette i fremtidig oppdatering og kun ha rapportering om status). Det jobbes med en firmware oppdatering for produktet som skal rette kWt oppdateringen (Rapporteres kun 1 gang pr døgn via Zigbee) samt generelle stabilitetsendringer. Vi jobber også med en OTA oppdateringsløsning via BT for de plattformer som ikke har OTA via Zigbee innebygget som gjør det enklere å få de nyeste oppdateringene på produktet. Vi har tidligere vært i dialog med Nabucasa direkte for en "Works with Home Assistant" sertifisering uten at vi kom i mål den gangen. Det er en del praktiske ting samt kostnadsspørsmål som må på plass. Når det er sagt så tar jeg dette absolutt med videre. Hva er deres foretrukne løsning for integrasjon i HA? Z2M eller ZHA?5 poeng
-
Samme størrelse som de vanlige pluggene og en bugg som gjør at de bare viser feil effekt over 1000w. Spenningen på de 2 jeg har er også for høy, ca 2,5% feil. Så effekt og forbruk blir litt for høy. Men har ikke hatt noe ustabilt med dem overhode. Her er en beskrivelse av en template for å korrigere effekt feilen over 1000w. Har vurdert å legge inn en korrekst for spenning/effekt/forbruksfeilen også her. https://community.home-assistant.io/t/ikea-inspelning-weird-power-values/773612/8 Spenningen her er ca 226.5V og effekt er 1910W. Du ser her også feilen med 200w i stedet for 2000w2 poeng
-
Hvorfor skal en alltid utjevne forbruk? En bør helller ha en modell som bidrar til å flytte last fra tider der nettet er hardt belastet til tider der nettet er lite belastet. Da nytter det ikke med en modell som straffer høyt forbruk på tider der nettet er lite belastet.2 poeng
-
Jeg har hatt min Homey 2019 i 3 år nå, og jeg har kjørt den (alt direktekoblet om jeg ikke skriver noe annet) med Philips Hue (via hub), Fibaro (først via hub, senere direkte), HeatIT, ELKO, Sonos, Logitech Harmony, Denon receiver, Samsung TVer, Bosch & Siemens Home Connect (tørketrommel og stekeovn), Tibber, iSmartGate, Aqara, Connecte, Yale Home, Netatmo, Mill, Ring og til slutt Audi (og tidligere en eGolf). Jeg har aldri opplevd ustabilitet på selve Homey, men har av og til opplevd noe ustabilitet på enkelte automasjoner på lysene som har løst seg ved å restarte Hue hubbene (jeg har 2 stk pga antall automasjoner). I tillegg har jeg hatt litt trøbbel med Mill, men det virker som om det er blitt bedre det siste året. Av regelmessig "housekeeping" har jeg valgt å kjøre automatisk restart hver lørdag morgen kl 05:00 på Homey, noe som jo forebygger heng og annet strul ved f.eks. minnelekkasjer og slikt. Min erfaring er jo da ikke ensbetydende med at @JoeHugin sin erfaring er feil, men det er greit å vite at det er forskjellige erfaringer der ute 😉 Jeg har ikke oversikt over hvor mange enheter jeg har koblet til min Homey, men det er trolig > 200.2 poeng
-
Løsningen jeg bruker i verkstedet var bare å ta en gammel ruter med wifi bridge funksjon, jeg brukte en gammel asus RT-N66u, der heter funksjonen "Media-Bridge" og da kobler den opp ruteren opp til TP-link Wifiet mitt, og du kan bruke lan portene i den for å få nettverkskobling og du får IP addresse som vanlig fra hovedruteren din (så det blir ikke et separat nettverk). Veldig mange av ihvertfall asus sine rutere har denne funksjonen. Her er hvordan man gjør det med asus routere https://www.asus.com/support/faq/1043884/ Fordelen med å bruke en gammel ruter er jo at man ofte har de hjemme hvis man er skrotnisse, evt kan kjøpe på finn for en hundrelapp.2 poeng
-
Daikin sine kontrollere har åpen lokalt api, selv om noen av kontrollerne dems nå har cloud only. For disse har du også https://github.com/revk/ESP32-Faikin?tab=readme-ov-file2 poeng
-
Å ikke ha varsling på rottefellen på loftet. Skulle opp på loftet og hente ned julepynt, der har jeg en rottefelle som har stått i 2 sesonger med en baconbit. Har tenkt lenge på at jeg skulle hatt en varsling på om fellen var klappet eller stod fortsatt klar. Men siden jeg ikke var nevneverdig plaget med rotter så har jo den bare stått klar i 2 år. Har ikke vært der siden september hvertfall så når jeg kom opp idag lå det rester av rotte i fellen, rimelig flat, altså tørket ut. Og litt av en lukt. Så nå må den vaskes og gjøres klar igjen. Denne gangen med varsling 😆2 poeng
-
"hva skal vi med all informasjonen?" toget gikk nok på 90-tallet engang. Eller kanskje før? Mulig det kan tidfestes til at "folk flest" fikk et barometer på veggen?2 poeng
-
Har hatt et litt for komplisert program for å finne de laveste strømpristimene (etter litt for mange strømprisleverandører som dukker opp for så å forsvinne igjen...) så nå har jeg skrevet om og koden er blitt delelig med andre... Det kan fremdeles se litt komplisert ut men flyten er stort sett ovenfra og ned men om en gjør endringer i f.eks. timevalg må en gå litt tilbake og oppdatere uten å lage en endeløs loop. Funksjonen er rimelig enkel: Strømpriser hentes fra hvakosterstrommen.no (med manuelt alternativ fra NordPool) kl 13:02 og gjentas hvert 5. minutt inntil strømdata er mottatt. En kan velge et antall billige timer en trenger (2 alternativer) og er en innenfor de valgte timer slås der på globale variabler: lavPris og lavLavPris som kan benyttes fritt til å styre f.eks bereder. Systemet forholder seg kun til totalpris inkl avgifter og strømstøtte siden det er den vi virkelig betaler men de andre prisene vises også for informasjon. Systemet lagrer strømpriser for 72 timer og har en "Planleggingsperiode" fra kl 22:00 til 22:00. Denne perioden er valgt siden nettleien faller kl 22:00 i ukedagene og det kan være greit å få med seg. Det hele vises grafisk på en rimelig oversiktlig måte (mener jeg...). Om/Når nettleien endrer seg må det endres i noden "Lagre nettleie" og aktiviseres med trykk på "timestamp". Pr i dag ligger nettleie inne med 0.7 og 0.6 for hhv dag og natt/helg. Flowen ser slik ut: Skjermbilde med betjening (i dette bildet er med noen få tilleggselementer som er viktig i mitt system men som ikke har noe med strømpris å gjøre): Ant lave timer og Ant LavLav timer er valg for hvor mange timer en vil ha. Listboksene under viser de utvalgte timene inkl strømpris for hver time. Over listboksene vises status: Om en er innenfor eller utenfor de valgte timene. De utvalgte timene vises i grafen som lilla. "Vis kun resttimer" er et valg for å fjerne timer som er "brukt" fra listboksene. Dette er kun et visuelt valg og påvirker ikke annen funksjon. Graf Blå er planleggingsperioden og også markert inneværende time. Graf Oransje er total strømpris som vi betaler og resten i grafen sier seg selv med etikettene øverst. Visning av "Vis kun resttimer" og overgang til ny planperiode: Visning av når nye prisdata ankommer kl 13:02: [{"id":"8a9326e69a043d08","type":"delay","z":"b468e89a030cb946","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":1040,"y":840,"wires":[["143924fdaab67cff","cb7159478bedaaf1"]]},{"id":"178c4f3e51c168f5","type":"function","z":"b468e89a030cb946","name":"Refresh Dashboard items","func":"var m1 = {reset:true};\nreturn [[m1,msg]];","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":850,"y":840,"wires":[["8a9326e69a043d08"]]},{"id":"19314273e31cb034","type":"group","z":"b468e89a030cb946","name":"Strømpris chart","style":{"fill":"#e3f3d3","label":true,"color":"#000000"},"nodes":["d45591226bb68efc","1366923163fe3133","cb7159478bedaaf1","08a9ac90d5a7da54"],"x":14,"y":549,"w":752,"h":122},{"id":"d45591226bb68efc","type":"ui_chart","z":"b468e89a030cb946","g":"19314273e31cb034","name":"","group":"a51799506567a0f3","order":2,"width":"0","height":"0","label":"Strømplan 24/72 timer.","chartType":"line","legend":"true","xformat":"dd HH","interpolate":"step","nodata":"wait","dot":false,"ymin":"","ymax":"","removeOlder":"48","removeOlderPoints":"100","removeOlderUnit":"3600","cutout":0,"useOneColor":true,"useUTC":false,"colors":["#ff7f0e","#62a0ea","#edd400","#f7f7f7","#98df8a","#62a0ea","#813d9c","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":640,"y":590,"wires":[["b6089f059556a469","45a6be97437e5578","143924fdaab67cff"]]},{"id":"1366923163fe3133","type":"inject","z":"b468e89a030cb946","g":"19314273e31cb034","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[]","payloadType":"json","x":590,"y":630,"wires":[["d45591226bb68efc"]]},{"id":"cb7159478bedaaf1","type":"function","z":"b468e89a030cb946","g":"19314273e31cb034","name":"Prepare for 72h chart","func":"let markPlanPer = flow.get(\"prisMax\") + 0.2 || 1.5; // Høyde på markør for planperiode og inneværende time\nlet markSelHours = markPlanPer * 0.08; // Høyde på markør for planperiode og inneværende time\nlet markCurrentHour = markPlanPer * 0.98;\n\nlet prisMax = -99;\nlet prisMin = 99;\nlet prisSnitt = 0;\nlet dt = new Date();\n//Ny periode kl 22:00: Flytt dato til over midnatt for å sette periodestart og slutt.\nif (dt.getHours() >= 22) dt = new Date(Number(dt) + 4*60*60*1000);\n\nlet dt2 = Number(new Date(dt.getFullYear() + \".\" + (dt.getMonth()+1) + \".\" + dt.getDate() + \" 00:00\"));\nlet dtPerStart = dt2 - 2*60*60*1000;\nlet dtPerEnd = dt2 + 22*60*60*1000;\n\n//node.warn(dtPerStart);\n//node.warn(dtPerEnd);\n\n// Resett dt til riktig tid.\ndt = new Date();\n\n\ndt.setDate(dt.getDate());\nlet currHour = dt.getHours();\nlet currDate = dt.getDate();\nlet currMonth = dt.getMonth() + 1; // Mnd er 0-11 i utgangspunktet\nlet currYear = dt.getFullYear();\nlet currPlanPerStart = new Date()\n\nlet timerValgtLav = []\ntimerValgtLav = flow.get(\"timerValgtLav\");\nlet timerValgtLavLav = []\ntimerValgtLavLav = flow.get(\"timerValgtLavLav\");\n\nlet pdt=0; //PrisDenneTime for kalkulasjoner\nlet msg2 = [[],[],[],[]];\nmsg2.payload = [{ \"series\": [\"Jonaspris\", \"\", \"Råpris+nettleie og avgifter\",\"Råpris\",\"Nettleie\",\"\",\"Lave priser\",\"LavLave priser\"], \"data\": [[],[],[],[],[],[],[],[]], \"labels\": []}];\nlet pris72 = flow.get(\"Prisdata72\");\nlet i = 0;\n\nif (pris72 != null) {\n for (i = 0; i < pris72.length; i++){\n pdt = Number(pris72[i].pris);\n var priceHourTimestamp = new Date(pris72[i].ts);//new Date(pris48[i].timestamp);\n msg2.payload[0].data[0][i] = {\"x\": Number(priceHourTimestamp), \"y\": Number(pris72[i].jonaspris).toFixed(2)};\n msg2.payload[0].data[2][i] = {\"x\": Number(priceHourTimestamp), \"y\": Number(pris72[i].pristot).toFixed(2)};\n msg2.payload[0].data[3][i] = {\"x\": Number(priceHourTimestamp), \"y\": Number(pris72[i].pris).toFixed(2)};\n msg2.payload[0].data[4][i] = {\"x\": Number(priceHourTimestamp), \"y\": Number(pris72[i].nettleie).toFixed(2)};\n\n // Add \"Now\" marker\n if (Number(currDate) === Number(priceHourTimestamp.getDate() ) && Number(currHour) === Number(priceHourTimestamp.getHours())){\n msg2.payload[0].data[1][i] = {\"x\": Number(priceHourTimestamp), \"y\": markCurrentHour};}\n else{\n msg2.payload[0].data[1][i] = {\"x\": Number(priceHourTimestamp), \"y\": 0};}\n \n // Add \"Planning period\" marker\n if (pris72[i].ts >= dtPerStart && pris72[i].ts < dtPerEnd){\n msg2.payload[0].data[5][i] = {\"x\": Number(priceHourTimestamp) + 1, \"y\": markPlanPer};\n // Finn max, min og gjennomsnittspris\n if (Number(pris72[i].jonaspris) < prisMin) prisMin = Number(pris72[i].jonaspris);\n if (Number(pris72[i].jonaspris) > prisMax) prisMax = Number(pris72[i].jonaspris);\n prisSnitt += Number(pris72[i].jonaspris);\n //node.warn(i);\n }\n else{\n msg2.payload[0].data[5][i] = {\"x\": Number(priceHourTimestamp) + 2, \"y\": 0};\n }\n\n // Add \"Selected low hours\" marker\n let phts = Number(new Date(priceHourTimestamp));\n// let phtsFormatted = phts.getFullYear() + \"-\" + (\"00\" + (phts.getMonth() + 1)).slice(-2) + \"-\" + (\"00\" + phts.getDate()).slice(-2) + \" \" + (\"00\" + phts.getHours()).slice(-2) + \":\" + (\"00\" + phts.getMinutes()).slice(-2);\n// let exists = timerValgtLav.some(c => c.timestamp === phtsFormatted); //\"2024-11-06 02:00\");\n let exists = timerValgtLav.some(c => c.ts === phts); //\"2024-11-06 02:00\");\n if (exists){\n // node.warn(\"På\");\n msg2.payload[0].data[6][i] = {\"x\": Number(priceHourTimestamp), \"y\": markSelHours};}\n else{\n // node.warn(\"Av\");\n msg2.payload[0].data[6][i] = {\"x\": Number(priceHourTimestamp), \"y\": 0};\n }\n\n // Add \"Selected LowLow hours\" marker\n phts = Number(new Date(priceHourTimestamp));\n// phtsFormatted = phts.getFullYear() + \"-\" + (\"00\" + (phts.getMonth() + 1)).slice(-2) + \"-\" + (\"00\" + phts.getDate()).slice(-2) + \" \" + (\"00\" + phts.getHours()).slice(-2) + \":\" + (\"00\" + phts.getMinutes()).slice(-2);\n exists = timerValgtLavLav.some(c => c.ts === phts); //\"2024-11-06 02:00\");\n// exists = timerValgtLavLav.some(c => c.timestamp === phtsFormatted); //\"2024-11-06 02:00\");\n //node.warn(exists);\n if (exists){\n // node.warn(\"På\");\n msg2.payload[0].data[7][i] = {\"x\": Number(priceHourTimestamp), \"y\": markSelHours*.6};}\n else{\n // node.warn(\"Av\");\n msg2.payload[0].data[7][i] = {\"x\": Number(priceHourTimestamp), \"y\": 0};\n }\n \n\n }\n // Legg til time # 73 for bedre lesbarhet\n priceHourTimestamp = Number(priceHourTimestamp) + (1000 * 60 * 60)\n //node.warn(Number(priceHourTimestamp));\n msg2.payload[0].data[0][i] = { \"x\": Number(priceHourTimestamp), \"y\": Number(pris72[i-1].jonaspris).toFixed(2)};\n msg2.payload[0].data[1][i] = { \"x\": Number(priceHourTimestamp), \"y\": 0};\n msg2.payload[0].data[2][i] = { \"x\": Number(priceHourTimestamp), \"y\": Number(pris72[i-1].pristot).toFixed(2)};\n msg2.payload[0].data[3][i] = { \"x\": Number(priceHourTimestamp), \"y\": Number(pris72[i-1].pris).toFixed(2)};\n msg2.payload[0].data[4][i] = { \"x\": Number(priceHourTimestamp), \"y\": Number(pris72[i-1].nettleie).toFixed(2)};\n msg2.payload[0].data[5][i] = { \"x\": Number(priceHourTimestamp), \"y\": 0 };\n msg2.payload[0].data[6][i] = { \"x\": Number(priceHourTimestamp), \"y\": 0 };\n msg2.payload[0].data[7][i] = { \"x\": Number(priceHourTimestamp), \"y\": 0 };\n}\n\nprisSnitt = prisSnitt/24;\nflow.set(\"prisMin\", prisMin);\nflow.set(\"prisMax\", prisMax);\nflow.set(\"prisSnitt\", prisSnitt);\n\n// Fjern unødvendige/gamle data fra chart\nlet msg3 = [[],[]]\nmsg3.payload = msg2.payload;\nfor (i = 0; i < 20; i++){\n for (let j = 0; j<=7;j++){\n msg3.payload[0].data[j].shift();\n }\n}\n\n//node.warn(msg3.payload);\n\nmsg.payload = msg3.payload;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":360,"y":590,"wires":[["d45591226bb68efc"]]},{"id":"08a9ac90d5a7da54","type":"inject","z":"b468e89a030cb946","g":"19314273e31cb034","name":"Refresh charts","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"0 0-23 * * *","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":590,"wires":[["cb7159478bedaaf1"]]},{"id":"a51799506567a0f3","type":"ui_group","name":"Charts","tab":"a73dc047b0befb9e","order":3,"disp":false,"width":"30","collapse":false,"className":""},{"id":"a73dc047b0befb9e","type":"ui_tab","name":"Prisgraf v2","icon":"euro_symbol","order":7,"disabled":false,"hidden":false},{"id":"bb1f6387ef45151f","type":"group","z":"b468e89a030cb946","name":"Tabell laveste timer for batterilading","style":{"fill":"#e3f3d3","label":true,"color":"#000000"},"nodes":["3ea6f148d6030a9f","45a6be97437e5578","f944761036305ed5","7cc2fd4a050bccdd","3f26c24b2f14e081","60c75de6263a8794","50456aa1e7ddea01"],"x":14,"y":679,"w":1042,"h":142},{"id":"3ea6f148d6030a9f","type":"ui_table","z":"b468e89a030cb946","g":"bb1f6387ef45151f","group":"e9e1f6f856a0ef75","name":"Laveste LavLav priser tbl","order":9,"width":"5","height":"10","columns":[{"field":"timestamp","title":"Time","width":"65%","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"jonaspris","title":"Pris","width":"28%","align":"right","formatter":"plaintext","formatterParams":{"target":"_blank"}}],"outputs":0,"cts":false,"x":920,"y":780,"wires":[]},{"id":"45a6be97437e5578","type":"function","z":"b468e89a030cb946","g":"bb1f6387ef45151f","name":"Hent valgte pristimer","func":"let liste2 = flow.get(\"liste2\") || false // Vis kun resttimer i listbox Lav og LavLav\nlet pdLow = flow.get(\"lavpris\");\nlet nmax = flow.get(\"AntLavLavTimer\");\nlet pdSelected = []\nlet pdSelDisp = []\nlet i = 0;\n// Klon objekt for å bryte forbindelsen til opprinnelige data for ellers vil opprinnelige data endres\nlet newpdLow = RED.util.cloneMessage(pdLow); \nlet dt = new Date();\n\n\nfor (i = 0; i < nmax;i++){\n pdSelected.push(newpdLow[i]);\n}\nflow.set(\"timerValgtLavLav\", pdSelected);\n\n// Fjern foregående timer fra tabell dersom valgt\nfor (i = 0; i < nmax;i++){\n if (liste2){\n if (pdLow[i].ts >= (Number(dt) - 60*60*1000)){\n pdSelDisp.push(newpdLow[i]);\n }\n }else{\n pdSelDisp.push(newpdLow[i]);\n }\n//node.warn(pdLow[i].ts);\n//node.warn(Number(dt));\n\n}\n\n// Pynt dataene for tabellvisning\nfor (i = 0; i < pdSelDisp.length;i++){\n pdSelDisp[i].timestamp = new Date(pdSelDisp[i].ts).toLocaleString(\"nb-NO\").slice(0,-3) ;\n pdSelDisp[i].jonaspris = parseFloat(pdSelDisp[i].jonaspris).toFixed(2);\n}\n//node.warn(pdSelDisp),\nmsg.payload = pdSelDisp;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":430,"y":780,"wires":[["60c75de6263a8794"]]},{"id":"f944761036305ed5","type":"ui_numeric","z":"b468e89a030cb946","g":"bb1f6387ef45151f","name":"","label":"Ant LavLav timer","tooltip":"Velg antall laveste pristimer for batterilading","group":"e9e1f6f856a0ef75","order":5,"width":"5","height":"1","wrap":false,"passthru":false,"topic":"topic","topicType":"msg","format":"{{value}}","min":"0","max":"24","step":1,"className":"","x":330,"y":720,"wires":[["3f26c24b2f14e081"]]},{"id":"7cc2fd4a050bccdd","type":"change","z":"b468e89a030cb946","g":"bb1f6387ef45151f","name":"get LavLav#","rules":[{"t":"set","p":"payload","pt":"msg","to":"AntLavLavTimer","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":110,"y":720,"wires":[["f944761036305ed5"]]},{"id":"3f26c24b2f14e081","type":"change","z":"b468e89a030cb946","g":"bb1f6387ef45151f","name":"set LavLav#","rules":[{"t":"set","p":"AntLavLavTimer","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":520,"y":720,"wires":[["7cc2fd4a050bccdd","45a6be97437e5578","178c4f3e51c168f5"]]},{"id":"60c75de6263a8794","type":"sort","z":"b468e89a030cb946","g":"bb1f6387ef45151f","name":"","order":"ascending","as_num":false,"target":"payload","targetType":"msg","msgKey":"timestamp","msgKeyType":"jsonata","seqKey":"payload","seqKeyType":"msg","x":650,"y":780,"wires":[["3ea6f148d6030a9f"]]},{"id":"50456aa1e7ddea01","type":"inject","z":"b468e89a030cb946","g":"bb1f6387ef45151f","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"300","crontab":"","once":true,"onceDelay":"10","topic":"","payload":"","payloadType":"date","x":150,"y":780,"wires":[["7cc2fd4a050bccdd","4bcea84cb9e1dcd0"]]},{"id":"e9e1f6f856a0ef75","type":"ui_group","name":"Tabeller","tab":"a73dc047b0befb9e","order":2,"disp":false,"width":"10","collapse":false,"className":""},{"id":"a6bf2d9c44840471","type":"group","z":"b468e89a030cb946","name":"Sett global.lavPris & lavLavPris for bruk over alt.","style":{"fill":"#e3f3d3","label":true,"color":"#000000"},"nodes":["c37c0f4b7371feab","143924fdaab67cff","6782814db0d4c03a","f4934fafce556690","d4e405705b11b8ea","32bbe8db8e28a1fb"],"x":14,"y":1009,"w":772,"h":172},{"id":"c37c0f4b7371feab","type":"cronplus","z":"b468e89a030cb946","g":"a6bf2d9c44840471","name":"","outputField":"payload","timeZone":"","storeName":"","commandResponseMsgOutput":"output1","defaultLocation":"","defaultLocationType":"default","outputs":1,"options":[{"name":"schedule1","topic":"topic1","payloadType":"default","payload":"","expressionType":"cron","expression":"0 0 * * * * *","location":"","offset":"0","solarType":"all","solarEvents":"sunrise,sunset"}],"x":120,"y":1080,"wires":[["143924fdaab67cff"]]},{"id":"143924fdaab67cff","type":"function","z":"b468e89a030cb946","g":"a6bf2d9c44840471","name":"Set global.lavPris & global.lavLavPris","func":"let msg2 = {}\nlet msg3 = {}\nlet msg4 = {}\nlet timerValgtLav = []\ntimerValgtLav = flow.get(\"timerValgtLav\");\nlet phts = new Date();\nlet phtsFormatted = phts.getFullYear() + \"-\" + (\"00\" + (phts.getMonth() + 1)).slice(-2) + \"-\" + (\"00\" + phts.getDate()).slice(-2) + \" \" + (\"00\" + phts.getHours()).slice(-2) + \":\" + (\"00\" + phts.getMinutes()).slice(-2);\nphtsFormatted = phtsFormatted.slice(0,-2) + \"00\";\nlet phts2 = Number(new Date(phtsFormatted));\nlet exists = timerValgtLav.some(c => c.ts === Number(phts2)); //\"2024-11-06 02:00\")\n//node.warn(exists);\n\nglobal.set(\"lavPris\", exists);\nif (exists)\n msg.payload = \"<font color=lime>Ok\";\nelse\n msg.payload = \"<font color=red>-----\";\n\n\nlet timerValgtLavLav = []\ntimerValgtLavLav = flow.get(\"timerValgtLavLav\");\nphts = new Date();\nphtsFormatted = phts.getFullYear() + \"-\" + (\"00\" + (phts.getMonth() + 1)).slice(-2) + \"-\" + (\"00\" + phts.getDate()).slice(-2) + \" \" + (\"00\" + phts.getHours()).slice(-2) + \":\" + (\"00\" + phts.getMinutes()).slice(-2);\nphtsFormatted = phtsFormatted.slice(0, -2) + \"00\";\nphts2 = Number(new Date(phtsFormatted));\nexists = timerValgtLavLav.some(c => c.ts === phts2); //\"2024-11-06 02:00\")\n//node.warn(exists);\n\nglobal.set(\"lavLavPris\", exists);\nif (exists)\n msg2.payload = \"<font color=lime>Ok\";\nelse\n msg2.payload = \"<font color=red>-----\";\n\n// Send prisdata til \"Solar\" for bruk i headline\nmsg4.topic = \"prisMin\";\nmsg4.payload = flow.get(\"prisMin\").toFixed(2);\nnode.send([null,null,null,msg4]);\nmsg4.topic = \"prisSnitt\";\nmsg4.payload = flow.get(\"prisSnitt\").toFixed(2);\nnode.send([null, null, null, msg4]);\nmsg4.topic = \"prisMax\";\nmsg4.payload = flow.get(\"prisMax\").toFixed(2);\nnode.send([null, null, null, msg4]);\n\nmsg3.payload = \"<font size=5 color=orange>Min:\" + flow.get(\"prisMin\").toFixed(2) + \"/sn:\" + flow.get(\"prisSnitt\").toFixed(2) + \"/max:\" + flow.get(\"prisMax\").toFixed(2);\nreturn [msg,msg2,msg3];","outputs":4,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":400,"y":1070,"wires":[["6782814db0d4c03a"],["f4934fafce556690"],["d4e405705b11b8ea"],["32bbe8db8e28a1fb"]]},{"id":"6782814db0d4c03a","type":"ui_text","z":"b468e89a030cb946","g":"a6bf2d9c44840471","group":"e9e1f6f856a0ef75","order":6,"width":"5","height":"1","name":"Vis Lav nå","label":"","format":"Nå: <font size = 6>{{msg.payload}}","layout":"row-left","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":670,"y":1050,"wires":[]},{"id":"f4934fafce556690","type":"ui_text","z":"b468e89a030cb946","g":"a6bf2d9c44840471","group":"e9e1f6f856a0ef75","order":7,"width":"5","height":"1","name":"Vis LavLav nå","label":"","format":"Nå: <font size = 6>{{msg.payload}}","layout":"row-left","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":680,"y":1080,"wires":[]},{"id":"d4e405705b11b8ea","type":"ui_text","z":"b468e89a030cb946","g":"a6bf2d9c44840471","group":"e9e1f6f856a0ef75","order":10,"width":0,"height":0,"name":"MinSnMax","label":"","format":"{{msg.payload}}","layout":"row-center","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":670,"y":1110,"wires":[]},{"id":"32bbe8db8e28a1fb","type":"link out","z":"b468e89a030cb946","g":"a6bf2d9c44840471","name":"Strompris_Out","mode":"link","links":["c6012e7bbe73f35f"],"x":615,"y":1140,"wires":[]},{"id":"5d782f6a3df9efea","type":"group","z":"b468e89a030cb946","name":"Tabell lave timer for direkte forbruk","style":{"fill":"#e3f3d3","label":true,"color":"#000000"},"nodes":["9486fc1a301c466d","b6089f059556a469","52e50cf1d1089267","4bcea84cb9e1dcd0","031c1a6834f7945d","7bf74d11170a6864"],"x":14,"y":859,"w":1022,"h":142},{"id":"9486fc1a301c466d","type":"ui_table","z":"b468e89a030cb946","g":"5d782f6a3df9efea","group":"e9e1f6f856a0ef75","name":"Laveste Lav priser tbl","order":8,"width":"5","height":"10","columns":[{"field":"timestamp","title":"Time","width":"65%","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"jonaspris","title":"Pris","width":"28%","align":"right","formatter":"plaintext","formatterParams":{"target":"_blank"}}],"outputs":0,"cts":false,"x":910,"y":960,"wires":[]},{"id":"b6089f059556a469","type":"function","z":"b468e89a030cb946","g":"5d782f6a3df9efea","name":"Hent valgte pristimer","func":"let liste2 = flow.get(\"liste2\") || false // Vis kun resttimer i listbox Lav og LavLav\nlet pdLow = flow.get(\"lavpris\");\nlet nmax = flow.get(\"AntLavTimer\");\nlet pdSelected = []\nlet pdSelDisp = []\nlet i = 0;\n// Klon objekt for å bryte forbindelsen til opprinnelige data for ellers vil opprinnelige data endres\nlet newpdLow = RED.util.cloneMessage(pdLow);\n\nlet dt = new Date();\n\nfor (i = 0; i < nmax;i++){\n pdSelected.push(newpdLow[i]);\n}\n\nflow.set(\"timerValgtLav\", pdSelected);\n\n\n// Fjern foregående timer fra tabell dersom valgt\nfor (i = 0; i < nmax;i++){\n if (liste2){\n if (pdLow[i].ts >= (Number(dt) - 60*60*1000)){\n pdSelDisp.push(newpdLow[i]);\n }\n }else{\n pdSelDisp.push(newpdLow[i]);\n }\n//node.warn(pdLow[i].ts);\n//node.warn(Number(dt));\n\n}\n\n// Pynt dataene for tabellvisning\nfor (i = 0; i < pdSelDisp.length;i++){\n pdSelDisp[i].timestamp = new Date(pdSelDisp[i].ts).toLocaleString(\"nb-NO\").slice(0,-3) ;\n pdSelDisp[i].jonaspris = parseFloat(pdSelDisp[i].jonaspris).toFixed(2);\n}\n//node.warn(pdSelDisp),\nmsg.payload = pdSelDisp;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":430,"y":960,"wires":[["7bf74d11170a6864"]]},{"id":"52e50cf1d1089267","type":"ui_numeric","z":"b468e89a030cb946","g":"5d782f6a3df9efea","name":"","label":"Ant lave timer","tooltip":"Velg antall lavpristimer for direkte forbruk","group":"e9e1f6f856a0ef75","order":4,"width":"5","height":"1","wrap":false,"passthru":false,"topic":"topic","topicType":"msg","format":"{{value}}","min":"0","max":"24","step":1,"className":"","x":320,"y":900,"wires":[["031c1a6834f7945d"]]},{"id":"4bcea84cb9e1dcd0","type":"change","z":"b468e89a030cb946","g":"5d782f6a3df9efea","name":"get Lav#","rules":[{"t":"set","p":"payload","pt":"msg","to":"AntLavTimer","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":100,"y":900,"wires":[["52e50cf1d1089267"]]},{"id":"031c1a6834f7945d","type":"change","z":"b468e89a030cb946","g":"5d782f6a3df9efea","name":"set Lav#","rules":[{"t":"set","p":"AntLavTimer","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":510,"y":900,"wires":[["4bcea84cb9e1dcd0","b6089f059556a469","178c4f3e51c168f5"]]},{"id":"7bf74d11170a6864","type":"sort","z":"b468e89a030cb946","g":"5d782f6a3df9efea","name":"","order":"ascending","as_num":false,"target":"payload","targetType":"msg","msgKey":"timestamp","msgKeyType":"jsonata","seqKey":"payload","seqKeyType":"msg","x":650,"y":960,"wires":[["9486fc1a301c466d"]]},{"id":"f3eadd1725385808","type":"group","z":"b468e89a030cb946","name":"Innhenting og behandling av strømpriser.","style":{"label":true,"color":"#000000"},"nodes":["bed0051986a10b75","a14d52fac2cf7941","4ce0f27b155c6831","eecf1a11e64a8746"],"x":8,"y":13,"w":1058,"h":504},{"id":"bed0051986a10b75","type":"group","z":"b468e89a030cb946","g":"f3eadd1725385808","name":"Sorter priser etter laveste pris i tidsrommet kl 22:00-22:00","style":{"fill":"#e3f3d3","label":true,"color":"#000000"},"nodes":["f4c0539b6cc55b55","0a56154a01aa97c9","eda587539ada5352","36db9c6b1167cf77"],"x":514,"y":209,"w":392,"h":142},{"id":"f4c0539b6cc55b55","type":"inject","z":"b468e89a030cb946","g":"bed0051986a10b75","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"00 22 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":630,"y":250,"wires":[["0a56154a01aa97c9"]]},{"id":"0a56154a01aa97c9","type":"function","z":"b468e89a030cb946","g":"bed0051986a10b75","name":"Velg tidsperiode","func":"//flow.set(\"Prisdata48Work\", flow.get(\"Prisdata48\"));\nlet pd72 = flow.get(\"Prisdata72\") || []\nlet lowprice = []\nlet i = 0;\nlet pdDate = Number(new Date(pd72[22].ts));\nlet today = Number(new Date());\n//today += 6 * 60 * 60 * 1000;\n//node.warn(pdDate - today);\nlet dt = new Date();\n//Ny periode kl 22:00: Flytt dato til over midnatt for å sette periodestart og slutt.\nif (dt.getHours() >= 22) dt = new Date(Number(dt) + 4*60*60*1000);\nlet dt2 = Number(new Date(dt.getFullYear() + \".\" + (dt.getMonth()+1) + \".\" + dt.getDate() + \" 00:00\"));\n//node.warn(dt2);\n\n\nlet dt3 = new Date();\n\n//node.warn(dt3.getHours());\nif (pd72.length == 72) { // Enkel sjekk at fullt datasett er tilgjengelig\n if (dt3.getHours() < 22){\n for (i = 22; i <= 45; i++){ // Plukk ut aktuell tidsperiode\n //node.warn(pd72[i]);\n lowprice.push(pd72[i]);\n }\n }\n else{\n for (i = 46; i < 70; i++){ // Plukk ut aktuell tidsperiode fra kl 22:00 og utover til i morgen\n lowprice.push(pd72[i]);\n //node.warn(pd72[i]);\n }\n }\n \n}\nmsg.payload = lowprice;\nreturn msg; \n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":800,"y":270,"wires":[["eda587539ada5352"]]},{"id":"eda587539ada5352","type":"sort","z":"b468e89a030cb946","g":"bed0051986a10b75","name":"","order":"ascending","as_num":true,"target":"payload","targetType":"msg","msgKey":"jonaspris","msgKeyType":"jsonata","seqKey":"payload","seqKeyType":"msg","x":640,"y":310,"wires":[["36db9c6b1167cf77"]]},{"id":"36db9c6b1167cf77","type":"change","z":"b468e89a030cb946","g":"bed0051986a10b75","name":"","rules":[{"t":"set","p":"lavpris","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":800,"y":310,"wires":[["cb7159478bedaaf1"]]},{"id":"a14d52fac2cf7941","type":"group","z":"b468e89a030cb946","g":"f3eadd1725385808","name":"Nettleie inkl alle avgifter dag: nld, natt og helg: nlnh. Endres manuelt her ved behov.","style":{"fill":"#92d04f","label":true,"color":"#000000"},"nodes":["d915fc95bcdb617b","599d5c07932ddd54"],"x":514,"y":39,"w":526,"h":82},{"id":"d915fc95bcdb617b","type":"change","z":"b468e89a030cb946","g":"a14d52fac2cf7941","name":"Lagre nettleie","rules":[{"t":"set","p":"nld","pt":"flow","to":".7","tot":"num"},{"t":"set","p":"nlnh","pt":"flow","to":".6","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":790,"y":80,"wires":[[]]},{"id":"599d5c07932ddd54","type":"inject","z":"b468e89a030cb946","g":"a14d52fac2cf7941","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":620,"y":80,"wires":[["d915fc95bcdb617b"]]},{"id":"4ce0f27b155c6831","type":"group","z":"b468e89a030cb946","g":"f3eadd1725385808","name":"Opprett flow.Prisdata72","style":{"fill":"#c8e7a7","label":true,"color":"#000000"},"nodes":["d51b8abd1f8b0102","06b3fdadafe92af4","20507782eea7238f","d68c7c64b4396e88","68dedc7c5f6d81bd","ba37809882e5a246","845af2cac241faae","7a2d84c871bfca40","7ad93125a55d7c60"],"x":34,"y":39,"w":462,"h":312},{"id":"289686ae32e9ac0c","type":"subflow","name":"Konv til eget format m nettleie og sst","info":"","category":"","in":[{"x":60,"y":70,"wires":[{"id":"4ab1c86d5f9c7f0a"}]}],"out":[{"x":640,"y":70,"wires":[{"id":"4ab1c86d5f9c7f0a","port":0}]}],"env":[],"meta":{},"color":"#DDAA99"},{"id":"4ab1c86d5f9c7f0a","type":"function","z":"289686ae32e9ac0c","name":"Konverter til kompakt format med nettleie o.l.","func":"/* Plukker kun ut råpris (Kr/kWh uten avgifter) og starttidspunkt fra inndata og legger på \nnettleie og avgifter her. Resultatet blir:\n.ts Timestamp (millisekund siden 01.01.1970) hentet fra starttidspunkt for strømprisen\n.pris Råpris uten avgifter o.l.\n.pristot Strømpris inkl avgifter og nettleie\n.jonaspris Strømpris inkl avgifter og nettleie minus strømstøtte\n.nettleie\n\[email protected]\n*/\nlet ny = []\nlet msg2 = {}\nlet nld = flow.get(\"$parent.nld\") || 0.7\nlet nlnh = flow.get(\"$parent.nlnh\") || 0.6\nlet pristot = 0;\nlet nl = 0;\n\nfor (var i = 0; i < msg.payload.length; i++ ){\n // Legg til Jonaspris (strømpris + nettleie + forbruksavgift + Enovastøtte med verdier fra flow)\n let dato = new Date(msg.payload[i].time_start);\n let ukedag = (dato.getDay()+6)%7; // Endre ukedag fra søndag=0 til mandag = 0\n let time = dato.getHours();\n let raapris = msg.payload[i].NOK_per_kWh;\n let jonaspris = raapris;\n if (raapris > 0.73) jonaspris = 0.73 + (raapris - 0.73) * 0.1; // Beregn strømstøtte\n \n // Beregn nettleie\n if (ukedag >= 5 || time < 6 || time >= 22){\n pristot = raapris * 1.25 + nlnh;\n jonaspris = jonaspris * 1.25 + nlnh;\n nl = nlnh;\n }\n else {\n pristot = raapris * 1.25 + nld;\n jonaspris = jonaspris * 1.25 + nld;\n nl = nld;\n } \n let ts = Number(new Date(msg.payload[i].time_start));\n ny.push({ \"ts\": ts, \"pris\": msg.payload[i].NOK_per_kWh, \"pristot\": pristot, \"jonaspris\": jonaspris, \"nettleie\": nl });\n}\nmsg2.payload = ny;\nreturn msg2;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":300,"y":70,"wires":[[]]},{"id":"d51b8abd1f8b0102","type":"http request","z":"b468e89a030cb946","g":"4ce0f27b155c6831","name":"Prisdata fra hvakosterstrømmen.no","method":"GET","ret":"obj","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":220,"y":190,"wires":[["d68c7c64b4396e88"]]},{"id":"06b3fdadafe92af4","type":"function","z":"b468e89a030cb946","g":"4ce0f27b155c6831","name":"set url i morgen","func":"var msg2 = {};\n\nvar d2 = new Date();\nd2.setDate(d2.getDate() + 1);\nvar nextYear = d2.getFullYear();\nvar nextMonth = (\"00\" + (d2.getMonth() + 1)).slice(-2);\nvar nextDate = (\"00\" + d2.getDate()).slice(-2);\nvar url2 = \"https://www.hvakosterstrommen.no/api/v1/prices/\" + nextYear + \"/\" + nextMonth + \"-\" + nextDate + \"_NO2.json\";\n//var url2 = \"https://www.hvakosterstrommen.no/api/v1/prices/\" + nextYear + \"/\" + nextMonth + \"-\" + \"07\" + \"_NO2.json\";\n//node.warn(nextYear + \" \" + nextMonth + \" \" + nextDate);\nmsg2.url = url2;\n//console.log(url);\n//console.log(url2);\n\nreturn msg2;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":160,"y":150,"wires":[["d51b8abd1f8b0102","7ad93125a55d7c60"]]},{"id":"20507782eea7238f","type":"function","z":"b468e89a030cb946","g":"4ce0f27b155c6831","name":"Fyll inn pris på riktig plass i Prisdata72","func":"let pd72 = flow.get(\"Prisdata72\") || []\nlet dt = new Date();\n// Offset to prev midnight\nlet dt2 = Number(new Date(dt.getFullYear() + \".\" + (dt.getMonth()+1) + \".\" + dt.getDate() + \" 00:00\"));\n\n// Opprett flow.Prisdata72 om den ikke eksisterer\nif (pd72.length < 71){\n for (let i = 0;i < 72;i++) pd72.push([\"-\"]);\n flow.set(\"Prisdata72\", pd72);}\n\n// Sjekk at data er leselige\nif (msg.payload[0].ts != null){\n let msgStartTs = msg.payload[0].ts - dt2;\n // Fyll inn prisdata i riktig tredjedel av Prisdata72\n if (msgStartTs < 0){ // I går ------------------------------------------------\n node.warn(\"<0 Prisdata for i går mottatt\");\n for (let i = 0;i <= 23;i++){\n pd72[i] = msg.payload[i];}}\n if (msgStartTs == 0){ // I dag ------------------------------------------------\n node.warn(\"0 Prisdata for i dag mottatt\");\n for (let i = 0;i <= 23;i++){\n pd72[i+24] = msg.payload[i];}}\n if (msgStartTs > 0){ // I morgen ------------------------------------------------\n node.warn(\">0 Prisdata for i morgen mottatt\");\n // Hvis data 48-71 er for i dag: Skift array 24 plasser tilbake\n if ((pd72[48].ts - dt2) == 0){\n for (let i = 0;i <= 47; i++){\n pd72[i] = pd72[i+24];}\n }\n // ...og så legg inn morgendagens data\n for (let i = 0;i <= 23;i++){\n pd72[i+48] = msg.payload[i];}}\n}else{\n node.warn(\"Strømdata ikke tilgjengelige...\")}\n\n// Marker at prisdata for i morgen er ankommet.\nif ((pd72[48].ts - dt2) == 86400000){\n flow.set(\"pdMorgenOk\", true);}\nelse{\n flow.set(\"pdMorgenOk\", false);}\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":230,"y":270,"wires":[["0a56154a01aa97c9","68dedc7c5f6d81bd"]]},{"id":"d68c7c64b4396e88","type":"subflow:289686ae32e9ac0c","z":"b468e89a030cb946","g":"4ce0f27b155c6831","name":"","x":230,"y":230,"wires":[["20507782eea7238f"]]},{"id":"68dedc7c5f6d81bd","type":"debug","z":"b468e89a030cb946","g":"4ce0f27b155c6831","name":"debug 187","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":350,"y":310,"wires":[]},{"id":"ba37809882e5a246","type":"inject","z":"b468e89a030cb946","g":"4ce0f27b155c6831","name":"13:02","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"02 13 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":110,"wires":[["06b3fdadafe92af4"]]},{"id":"845af2cac241faae","type":"inject","z":"b468e89a030cb946","g":"4ce0f27b155c6831","name":"hver 5 min","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"*/5 13-21 * * *","once":false,"onceDelay":0.1,"topic":"xx","payload":"","payloadType":"date","x":150,"y":80,"wires":[["7a2d84c871bfca40"]]},{"id":"7a2d84c871bfca40","type":"switch","z":"b468e89a030cb946","g":"4ce0f27b155c6831","name":"Data for i morgen mottatt?","property":"pdMorgenOk","propertyType":"flow","rules":[{"t":"false"}],"checkall":"true","repair":false,"outputs":1,"x":360,"y":80,"wires":[["06b3fdadafe92af4"]]},{"id":"7ad93125a55d7c60","type":"debug","z":"b468e89a030cb946","g":"4ce0f27b155c6831","name":"debug 192","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"url","targetType":"msg","statusVal":"","statusType":"auto","x":350,"y":150,"wires":[]},{"id":"eecf1a11e64a8746","type":"group","z":"b468e89a030cb946","g":"f3eadd1725385808","name":"Prisdata fra NordPool","style":{"fill":"#c8e7a7","label":true,"color":"#000000"},"nodes":["6ce4aa06b498cbbe","62687955c7aa4efe","0b9a6c13ac4210bc","35e0d54c5ac618c8"],"x":34,"y":359,"w":592,"h":132},{"id":"6ce4aa06b498cbbe","type":"nordpool-api-plus","z":"b468e89a030cb946","g":"eecf1a11e64a8746","name":"I morgen","area":"NO2","currency":"NOK","action":"dayAhead","x":140,"y":400,"wires":[["62687955c7aa4efe"]]},{"id":"62687955c7aa4efe","type":"function","z":"b468e89a030cb946","g":"eecf1a11e64a8746","name":"if exist NOK/MWh --> NOK/kWh","func":"let today = new Date()\nlet tomorrow = new Date(today)\ntomorrow.setDate(tomorrow.getDate() + 1)\nlet ddate = new Date(msg.payload[6].timestamp)\n\n// Sjekk at data for i morgen er tilstede\nif (Number(ddate.getDate()) == Number(tomorrow.getDate())){\n for (var i = 0; i < msg.payload.length; i++ ){\n msg.payload[i].NOK_per_kWh = msg.payload[i].price/1000;\n msg.payload[i].time_start = Number(new Date(msg.payload[i].timestamp));\n //node.warn(i);\n }\n return msg;\n}\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":430,"y":400,"wires":[["0b9a6c13ac4210bc"]]},{"id":"0b9a6c13ac4210bc","type":"subflow:289686ae32e9ac0c","z":"b468e89a030cb946","g":"eecf1a11e64a8746","x":450,"y":440,"wires":[["20507782eea7238f"]]},{"id":"35e0d54c5ac618c8","type":"inject","z":"b468e89a030cb946","g":"eecf1a11e64a8746","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":450,"wires":[["6ce4aa06b498cbbe"]]},{"id":"e4c19e487e8287f7","type":"group","z":"b468e89a030cb946","name":"Betjening: Vis kun resttimer i listbokser.","style":{"fill":"#e3f3d3","label":true,"color":"#000000"},"nodes":["b51d06a21038e464","5ab88c22ad7b601e","a9ad0882e1fb8f2b","1f96c7a359c6fede"],"x":14,"y":1189,"w":572,"h":122},{"id":"b51d06a21038e464","type":"ui_switch","z":"b468e89a030cb946","g":"e4c19e487e8287f7","name":"","label":"Vis kun resttimer","tooltip":"","group":"e9e1f6f856a0ef75","order":15,"width":"3","height":"1","passthru":true,"decouple":"false","topic":"topic","topicType":"msg","style":"","onvalue":"true","onvalueType":"bool","onicon":"check_box","oncolor":"lime","offvalue":"false","offvalueType":"bool","officon":"check_box_outline_blank","offcolor":"grey","animate":true,"className":"","x":320,"y":1270,"wires":[["5ab88c22ad7b601e"]]},{"id":"5ab88c22ad7b601e","type":"change","z":"b468e89a030cb946","g":"e4c19e487e8287f7","name":"flow.liste2","rules":[{"t":"set","p":"liste2","pt":"flow","to":"payload","tot":"msg"},{"t":"delete","p":"socketid","pt":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":500,"y":1270,"wires":[["b6089f059556a469","45a6be97437e5578"]]},{"id":"a9ad0882e1fb8f2b","type":"change","z":"b468e89a030cb946","g":"e4c19e487e8287f7","name":"flow.liste2","rules":[{"t":"set","p":"payload","pt":"msg","to":"liste2","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":110,"y":1270,"wires":[["b51d06a21038e464"]]},{"id":"1f96c7a359c6fede","type":"inject","z":"b468e89a030cb946","g":"e4c19e487e8287f7","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"300","crontab":"","once":true,"onceDelay":"5","topic":"","payload":"","payloadType":"date","x":130,"y":1230,"wires":[["a9ad0882e1fb8f2b"]]}] Tror det skal klare seg å installere node-red-dashboard, node-red-contrib-nordpool-api-plus, og node-red-contrib-cron-plus i paletten utover standard.2 poeng
-
Høstens første frost krever alltid litt ekstra arbeid så det er greit å få et varsel noen dager i forkant. Hjul på bil må skiftes, vannslange må innendørs, utekrane må sjekkes at den er tom for vann og campingvogn sine vannbeholdere må tømmes. Så da er et varsel i HA laget slik som dette Det er kun et lett synlig bilde som har en betingelse for synlighet. Først laget jeg en sensor som viser laveste temperatur meldt de nærmeste dagene. - template: - trigger: - trigger: state entity_id: weather.orstad_utsyn action: - action: weather.get_forecasts data: type: daily target: entity_id: weather.orstad_utsyn response_variable: wd sensor: - unique_id: laveste_temperatur_framover name: "Laveste temperatur framover" unit_of_measurement: "°C" state: "{{ [state_attr('weather.orstad_utsyn', 'temperature')|float(0), (wd['weather.orstad_utsyn'].forecast | rejectattr('templow', 'undefined') | map(attribute='templow')|list|min)]|min|round(1) }}" Deretter en binær sensor som bruker laveste temperatur sammen med måned. Jeg trenger ikke varsel om høstens første frost i desember til mai. -template: - binary_sensor: - unique_id: bbb82639-7432-4f3f-8950-a5c860a6ede0 name: frostvarsel state: "{{ states('sensor.laveste_temperatur_framover')|float < 2 and (now().month == 9 or now().month == 10 or now().month == 11) }}" Selve kortet er lagd som dette2 poeng
-
Ok nå har jeg lekt ganske mye. Laget meg en template sensor som bruker Nordpool input, og så har jeg satt opp en gjeng med hjelpere for å ha data om nettpriser for dag/natt, moms, strømselskap osv osv. Alt kan nå konfigureres via GUI, eneste som blir litt massivt er selve template sensoren men den setter man jo opp bare en gang. Synes det ble ganske bra! Nå skal jeg bare se over litt tid om det fungerer stabilt.2 poeng
-
Dette er en generisk alibaba hub med stor upsell, praktisk talt drop shipping. Ingenting nytt med den, den finnes i tonnesvis med white label1 poeng
-
Absolutt. Og skal en først dra på med større forskjeller så er jo både fastledd og abonnementsavgift det første som skulle forsvinne. Slik det er i dag så kan du jo skru ned forbruket helt til null og ender likevel opp med å betale ikke så rent få hundrelapper pr mnd.1 poeng
-
I tillegg er de løsningene som lages til smarthus systemer, også mitt eget, kun lagd for å holde seg under et trinn på nettleien. Hvis jeg i mitt hus har et stort varmebehov samtidig som jeg lager middag, da justeres varmekildene ned i inneværende time for å ikke komme over 5kWt. Men så snart timen er over så er det full effekt på ovnene igjen. Energibruken min mellom 16:00 og 19:00 er akkurat den samme og jeg har bare flyttet litt av effekten jeg tar ut. Og her spiller igjen samtidighetsfaktoren inn og min flytting av effekt har null og niks å si for netteier. De ser større på det og ser på hvor mye energi de må overføre i løpet av en ettermiddag og kveld. Om noen flytter forbruket slik at det ikke blir samtidig med noe annet i samme hus, så ender det opp med å bli samtidig med naboen sitt maks forbruk. Det betyr heller ingenting om jeg lader bilen mellom 0200 og 0400 raskt eller om jeg gjør det saktere mellom 0000 og 0700. Jeg får lavere maks effekt, men energien er den samme. Og i en by blir effekten uansett jevnet ut fordi jeg ville ladet mellom 0200 og 0400, mens noen andre lader mellom 0400 og 0600. Det koker ned til at det som ville vært lurt, var å flytte forbruk mellom feks 1500 - 2200 til natt. Det ligger det et insentiv til i og med at både strømpris og nettleie er billig på natt. Men effekttrinnene har motsatt virkning. De er utformet slik at en helst ikke skal flytte for mye forbruk til natt. Selv om belastningen på nettet er liten, for det er jo gjenspeilt i strømprisen som er lav.1 poeng
-
Og DETTE er viktig å ikke glemme. Ingenting er feilfritt, selvom noen opplever mye eller lite feil. 🙂 Homey for meg var iallefall en fin progresjon, som nå ser slik ut: XComfort->Hue->Smartthings->Homey->HomeAssistant (Jeg har fremdeles noe Xcomfort, da dette er usaklig stabilt og aldri feiler, så sitter det langt inne å bytte det ut med Zigbee og noe som "føles dårligere" 😆)1 poeng
-
Hei @JoeHugin, Det er mest pga. batterilevetid. Dersom vi skulle hentet ut temperaturinfo jevnlig, ville det ha redusert batterilevetiden såpass mye at vi valgte å ikke legge inn denne funksjonaliteten. Vi regner også verdien av dataen som relativt liten for de fleste brukerne, da de ofte monteres i taket i f.eks. gang. Varmen stiger, så man vil få mest presise målinger med dedikerte temperatursensorer i oppholdsområder. Fibaro har en batterilevetid på 2-3 år, mens vår er på 10 år. Så det avhenger av om batteri eller temperaturmåling er viktigst for deg😊 Hei @Elektromontøren, Vi har temperaturmåler i våre røykvarslere, men temperaturen oppdateres ikke jevnlig, så det er tryggest å bruke dedikerte temperatursensorer i oppholdsrom😊1 poeng
-
Vi forstår at det kan være vanskelig å velge. Dersom du har ELKO Smart-produkter hjemme fra før, vil vi anbefale deg å fortsette med RS-serien og ELKO Smart. Da har du muligheten til å utvide til flere smarte ELKO-produkter i etterkant også (SmartTags, sensorer osv.). Men om du kun ønsker smart varmestyring (og en mer budsjettvennlig løsning), vil ELKO One med Matter-termostat være et godt valg. Hvis du fortsatt er usikker på noe er det bare å spørre😊1 poeng
-
Du kan ha høy strømpris pga spekulasjon eller produksjonsutfordringer uten at det er kapasitetsproblemer i nettet. Og motsatt kan det godt tenkes at ditt lokale nett blir overbelastet når alle skal lade elbilen sin på negativ strømpris midt på natta. For oss som bor i et vannkraftland gir det mye mer mening med variabel nettleie enn variabel strømpris. De ekstreme prisforskjellene som skapes av det mislykkede markedseksperimentet skaper nok mer trøbbel for netteierne enn de vil ut med.1 poeng
-
Hei @Joakim S, Vi beklager at du opplevde problemer med vår VVB puck, men så bra at det løste seg!😊1 poeng
-
Må ikke glemme at 16A ikke er 16A, det er avhengig av belastningstype også. Ved å begrense til 1.5mm2 begrenser de også egentlig hvor stor last man kan dra (så lenge man følger installasjonsteknisk gode anlegg..) 16A er liksom bare "testet med 16A", det er lite sannsynlig at den takler 16A over tid. Litt som Schuko-stikk. De tåler heller ikke maksbelastning over tid.1 poeng
-
Dagens effektledd er ganske rigid. Det betyr at hvis du har én dag i måneden der strømforbruket ditt er høyt, for eksempel 10,2 kW, kan det gjøre at du havner i en høyere prisgruppe, selv om forbruket ditt er lavt resten av tiden. Dette kan føles urettferdig. Fremover ser vi dessverre at nettleien og kostnader knyttet til høyt strømforbruk vil øke kraftig. Derfor er det viktig å skape smartere løsninger som gir deg fordeler hvis du bruker strøm når belastningen på nettet er lav. Målet er at du skal betale en mer rettferdig pris, der nettleien er lavere når få bruker strøm, i stedet for en fast og statisk modell som i dag. Dette kan gi deg mulighet til å spare penger ved å tilpasse forbruket ditt på en annen måte enn i dag. Vi er med i et test prosjekt her der kundene til Alva får betalt for å ikke bruke strøm på gitte tidspunkt. En av funksjonene vi jobber med, som vi bruker mest tid på, er å bruke målingene våre til å identifisere enheter og om de er av eller på. Vi har kommet et godt stykke i gang med dette arbeidet. Diverse vil du på sikt ikke bare kunne se strømmen som brukes på kretsen men hvilke enheter som bruker strøm, hvor mye strøm hver enhet bruker og når enhet er av eller på. Uavhengig om enheten er dum eller smart.1 poeng
-
HAN leser eksakt de data som danner grunnlag for din strømregning. Jeg synes det er den beste løsningen.1 poeng
-
De integrasjonene som er skybasert er sårbare for endringer, men som regler blir de fort oppdatert (enten av den som har laget integrasjonen opprinnelig eller andre bidragsytere. Derfor forsøker jeg å gjøre så mye som mulig lokalt, f.eks ved montering av spesialtilpasset ESP32 i Panasonic varmepumpene i huset. Ventilasjonsanlegget styres med Ethernet til RS485 konverter tilkoblet modbus inngang på enheten, dermed er den også lokalt styrt. Og det blir uansett ikke driftsstans i den forstand. Målet er at grunnfunksjonen skal fungere også om smarthuset ikke fungerer. Lysbryterne og dimmerne virker som normalt. Ventilasjonen vil gå på den hastigheten den sist var satt til (som lett merkes om den er unormal og kan endres på enheten styrepanel), gulvvarme og panelovner følger sitt normale ukeprogram osv. Det er kun vv-berederen som per i dag er sårbar. Om systemet går ned når den er skrudd av vil vi ikke oppdage det før vannet er kaldt. Derfor vurdere jeg et separat system som bakcup på denne, f.eks en servo styrt av ESP enheten som har temperaturprobene som kan trykke på den fysiske knappen på Aeotec Heavy Duty Switchen som styrer strømmen. Endringer i automasjoner blir det når man oppdater situasjoner som man ikke har tenkt på. Da blir det enten redigering eller å bygge nye automasjoner for de spesielle situasjonene - eller si at dette er godt nok. Som andre har skrevet, så lenge dere støtter Matter og oppdatere dette etterhvert som Matter utvikles vil deres løsning fungere med alle som også følger utviklingen til Matter standarden. Helt enig. Ingen av mine gulvtermostater (Nobø) rapporterer noe jeg kan bruke til å måle faktisk energiforbruk, hverken forbruk eller om varmen faktisk er aktiv i øyeblikket eller ikke. Dersom jeg hadde hatt måler på hver kurs ville jeg i rimelig stor grad kunne se hvilken enhet som er på, basert på endringen i forbruk, så lenge det ikke er flere enheter på samme kurs med identisk forbruk. Spesielt etter at Home Assistant innførte eget dashbord for energi har det blitt interessant å se hva det er i huset som bidrar til grunnforbruket og hva jeg evt kan gjøre noe med. På hytta har jeg klart å komme ned på 60-70 watt, hjemme er det ca 500watt. Og siden det ble lagt inn en egen enhet i energi dashbordet som viser uidentifisert forbruk har jakten på dette uidentifiserte blitt enda mer interessant. 😉1 poeng
-
Når jeg satte opp dette første gangen tok jeg og lagde et nytt dashboard (under settings/dashboard) og så limte jeg inn alt i det nye. Da ødelegger du ikke noe og så kan du kontrollert flytte over når du har fått det til å fungere som du ønsker. Si ifra om det ikke fungerer @Teknor1 poeng
-
Bruker det for å administrere ting hjemme når jeg er borte. Har installert det på ruteren (pfsense), dermed trenger jeg ikke installere det på servere og klienter på nettverket.1 poeng
-
Du bør også forsikre seg om at de kommer til å oppdatere termostaten med ny firmware for å støtte strømmåling som kom i Matter 1.3. Kjekt å vite hvor mye strøm som trekkes.1 poeng
-
Jeg bruker det og synes det ble en enkel og fin integrering av hytta bak mobil nettverksruter. Funker fra mobilen også. Forbløffende enkelt å sette opp.1 poeng
-
Ja, Tailscale fungerer flott. Jeg har satt opp HA som exit-node og bruker det blant annet til å ha tilgang til videoer med geofencing og for å unngå ip-ban på div. streamingtjenester. Husk bare å slå av key-expire sånn at du ikke låser deg ute fra maskiner du ikke bruker så ofte.1 poeng
-
Det er nok en konsekvens av at Ikea satser på oppladbare batterier, de nye bruker AAA.1 poeng
-
Ja, du gjør det ved å tilbakestille til fakbrikkinnstilling, bilde 30, side 58-59 i manualen du lenket til. Mener å ha lest at det kun er Yales egne RFID brikker som aksepteres, men har ikke testet. Jeg bruker Verisure modul for styring av mine Yale Doorman. Alt du trenger er en Verisure Vbox mini/micro. Du oppretter bruker selv på Verisure sine nettsider, det er ingen kostnader knyttet til å kun styre Yale Doorman på denne måten. Det åpner også for integrasjon med både Home Assistant og Homey Pro. Ulempen er at kommunikasjonen går via Verisure sin skytjeneste. Hvis du ønsker en enklet mulig bruk av smartlås (den låser seg opp når du nærmer deg) er Yale sin egen modul en mulig løsning, men den har jeg ikke funnet integrasjon til for Home Assistant. Ikke testet, men er i tvil pga lavere spenning på oppladbare batterier.1 poeng
-
Hentet mine i dag og fått opp noen av dem. For de som lurer: Disse sklir rett inn i z2m når du følger "Koble til ELKO smart hub" instruksjonene. Og de blir da også automagisk seriekoblet. Det er altså ikke nødvendig med noen manuell seriekobling så lenge du bruker z2m. Kikket litt på z2m-koden og tror magien er relatert til at z2m setter "iasCieAddr" og "zoneId" attributtene i "ssIasZone" klynga. iasCieAddr blir satt til koordinator-adressen mens zoneId er hardkodet til 23. Vet ikke om det er noen grunn til det valget, men de fleste ønsker vel uansett å seriekoble alle røykvarslere som er i samme zigbee-nett. Skrur du på debug-logging under join så ser du at dette skjer i løpet av "intervjuet". Du ser også attributtene i "state", f.eks i z2m web-frontend. Der heter de "ias_cie_address" og "zone_id". Slik ser en av mine ut: { "ac_status": false, "battery": 100, "battery_defect": false, "battery_low": false, "enrolled": true, "ias_cie_address": "0x00124b00deadbeef", "linkquality": 25, "restore_reports": true, "smoke": false, "supervision_reports": true, "tamper": false, "temperature": 21, "test": false, "trouble": false, "update": { "installed_version": 34014975, "latest_version": 34014975, "state": "idle" }, "voltage": 3000, "zone_id": 23 }1 poeng
-
Herk? Bytt fra supervised til docker så kan du gå frem og tilbake på versjoner uten at ting er et jævla herk1 poeng
-
Ikke dumt, personlig bruker jeg Cloudflared pluginen. I Cloudflare har jeg satt opp at kun norske IP- adresser får tilgang. Det hjelper en god del, ser i Cloudflare dashbordet at det er tusenvis av klienter som prøver seg, men blitt blokkert.1 poeng
-
1 poeng
-
Jeg fant ut av problemet med at Z-Wave ikke virker! Eller rettere sagt jeg spurte ChatGPT som har blitt min nye venn. Jeg må bare venne meg til at den er mye bedre enn Google som nå mest serverer reklame. Sorry Google, jeg slår opp vårt mangeårige kjærlighetsforhold. Jeg hentet inn config.txt på CD kortet og la inn dette: dtoverlay=disable-bt enable_uart=1 Puttet i kortet som allerede hadde backup lagt inn fr forrige forsøk. Og det var alt jeg trengte å gjøre. Nå virker det. Så får jeg se om den slutter å selvmyrde seg. Jeg håper jo på at årsaken nå ligger på bordet foran meg, og jeg ikke trenger watchdog.1 poeng
-
Den enkleste måten å flytte et zwave nettverk er vel å ta backup av eksisterende kontroller, for så å laste den over på ny kontroller. Om dette virker på tvers av systemer er jo ikke sikkert, men jeg ville undersøkt det først.1 poeng
-
Jeg har samme systemet hos meg. Jeg bruker en fibaro zwave plugg for å styre vannet av og på, samt detektere om det er feil. Jeg gir feil status når strømforbruk er under 1.6W i 2min. Det er ikke mye strøm den ventilen trekker, men pluggen klarer å måle forskjell. Med noen dagers mellomrom stenger/åpner systemet ventilen noen sekunder. Antar det er for at ikke ventilen skal sette seg.1 poeng
-
Nå vet ikke jeg hva slags problemer du har hatt, men jeg vil anta at 140 enheter ikke skal være noe stort problem for nye Homey Pro 2023 da den har relativt greit med minne og datakraft (selv har jeg den gamle fra 2019). I tillegg vet jeg for lite om Futurehome til å kunne gjøre noen sammenligning. Dette er det jeg ser er tilgjengelige enheter fra Futurehome på min Homey Pro: Det er mulig at man kan legge til andre ting også da det ofte er samme chipset i flere slike produkter, men muligens ikke når det kommer til røykvarslerne fra Futurehome. Det står litt i denne tråden på Homey forum om akkurat den problemstillingen.1 poeng
-
samma her. Kjøpte en Amina S i mai, men fikk ikke elbil før i oktober. Og siden laderen står på hytta så har det så langt bare blitt én ladeøkt. Litt begrenset erfaring, altså. Men jeg liker alt jeg har sett så langt. Amina har kommet med en del nye firmware-versjoner, der de også har lagt til og forbedret funksjonalitet. Både firmware og dokumentasjon av denne gjøres tilgjengelig på Internett. zigbee2mqtt-støtten har fungert greit fra dag 1, også mens den var under utvikling. Den er nå med i z2m fom versjon 1.41.0 så det er ikke nødvendig å bruke ekstern konverter lenger. Dette er selvsagt smak og behag, men boksen faller i smak fysisk også. Diskret og praktisk design, der du f.eks. kan bruke selve ladeboksen som opphengskrok for ladekabelen. Og fast ladekabel passer meg utmerket. Det gjør at den alltid er der og ikke stikker mer ut fra boksen i noen retning enn nødvendig. Det eneste ønsket jeg har på lista er støtte for zigbee OTA. Dvs, firmwaren deres støtter det jo. Men foreløpig distribuerer de ikke firmware i en form som er forberedt for dette så jeg aner ikke om det funker. Den dokumenterte metoden for firmware-oppdatering benytter blåtann per idag. Det virker forsåvit helt greit, men krever at du er i nærheten med en telefon og app.1 poeng
-
Hva skal hentes denne uka er et gjentagende SPM hjemme hos oss. Så jeg fant APPEN "Min renovasjon.". Men en app er jo ikke løsningen på noe. For man vil jo ha denne informasjonen inn i homeseer. MinRenovasjon.vb Sub Main(ByVal parameters As Object) 'Clio75 All Credits to [email protected] 'Inspired and based on Moskus scrip NewsReader.vb Dim DevID As Integer = parameters.ToString.Split("|")(0) Dim KommuneNr As String = parameters.ToString.Split("|")(1) Dim Gatekode As String = parameters.ToString.Split("|")(2) Dim GateNavn As String = parameters.ToString.Split("|")(3) Dim GateNr As String = parameters.ToString.Split("|")(4) 'Sette sammen URL: Dim kommuneURL as string = "kommunenr=" & KommuneNr Dim GateKodeURL as string = "gatekode=" & Gatekode Dim GateNavnURL as string = "gatenavn=" & GateNavn Dim GateNrURL as string = "husnr=" & GateNr Dim url As String = "https://komteksky.norkart.no/komtek.renovasjonwebapi/api/tommekalender/?" & kommuneURL & "&" & GateNavnURL & "&" & GateKodeURL & "&" & GateNrURL 'hs.WriteLog("Soppel Error", "url " & url) Dim source As String = "" Try Using client As New System.Net.WebClient 'Sette Headers client.headers.set("Kommunenr", KommuneNr ) client.headers.set("RenovasjonAppKey", "AE13DEEC-804F-4615-A74E-B4FAC11F0A30") Net.ServicePointManager.SecurityProtocol = Net.SecurityProtocolType.Tls12 client.Encoding = System.Text.Encoding.UTF8 source = client.DownloadString(url) End Using Catch ex As Exception hs.WriteLog("Soppel Error", "Net Feil: " & ex.Message) End Try If source = "" Then hs.WriteLog("soppel Error", "Got no response from url: " & url) Exit Sub End If Try 'Dim json as Newtonsoft.Json.string = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(source) Dim json as Object = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(source) Dim numMembers As Integer = json.Count -1 Dim DeviceText As String = "" For i As Integer = 0 To numMembers Dim output As String = "" Dim output2 As String = "" output = json(i)("FraksjonId") output2 = json(i)("Tommedatoer")(0) & " Neste :" Try output2 &= json(i)("Tommedatoer")(1) Catch ex As Exception output2 &= " -- " End Try Select Case Output Case "1" output = Replace(output, "1", "<b>Restavfall : </b><br>") Case "2" output = Replace(output, "2", "<b>Papiravfall : </b><br>") Case "3" output = Replace(output, "3", "<b>Matavfall : </b> <br>") Case "4" output = Replace(output, "4", "<b>Glass/Metall : </b><br>") Case "5" output = Replace(output, "5", "<b>Drikkekartonger </b><br>") Case "6" output = Replace(output, "6", "<b>Grovavfall : </b><br>") Case "7" output = Replace(output, "7", "<b>Plastavfall : </b><br>") End Select DeviceText &= "" & output & " " & output2 & "<br>" Next hs.SetDeviceString(DevID, DeviceText , True) Catch ex As Exception hs.WriteLog("Soppel Error", "Net Feil: " & ex.Message) End Try End Sub Så en event : Parameters : DevieRef | Kommunenummer | Gatenummer | GataNavn | Husnummer Ser jeg forsatt har manuell trigger i screenshot, men en gang i døgnet burde vel holde i de fleste tilfeller. SOM ga meg denne : Instalering : VeiNummer: For å finne vegnummeret kan du gå inn på https://www.vegvesen.no/vegkart zoom deg inn på vegen din og nærmest mulig huset ditt klikker du på veien, Så finner du de 5 sifferene du trenger(Rødt). Kommune Nummeret var de fire første her i Blått : 0710 HomeSeer trenger en referanse til Newtonsoft.Json.Dll, det kan du sette opp ved å lese under "Installasjon" i denne tråden: https://www.hjemmeautomasjon.no/forums/topic/4338-script-enturvb-få-inn-data-fra-entur/ Takk Til: Dette hadde jeg ikke klart alene. @Moskus skal ha en stor takk for sine delinger av script. Tatt utgangspunktet i hans NewsReader.VB @Marhil Takk for tipset om Min renovasjons app eller hvordan jeg fant Gatenummer Og alle de andre som deler kode og eksempler åpnet på nett1 poeng
-
Gjorde noen endringer for å få det til å virke som jeg ønsket 😃 Legger koden ut her, om det andre som ser nytten i den 😃 'Enable or disable debug logging Const DEBUG_LOGGING_ENABLED As Boolean = False Sub Main(ByVal parameters As Object) 'Clio75 All Credits to [email protected] 'Inspired and based on Moskus scrip NewsReader.vb 'Parse parameters Dim DevID As Integer = parameters.ToString.Split("|")(0) Dim KommuneNr As String = parameters.ToString.Split("|")(1) Dim Gatekode As String = parameters.ToString.Split("|")(2) Dim GateNavn As String = parameters.ToString.Split("|")(3) Dim GateNr As String = parameters.ToString.Split("|")(4) 'Base URLs and Headers Dim baseURL As String = "https://norkartrenovasjon.azurewebsites.net/proxyserver.ashx?server=" Dim tommekalenderURL As String = baseURL & "https://komteksky.norkart.no/MinRenovasjon.Api/api/tommekalender/?kommunenr=" & KommuneNr & "&gatenavn=" & GateNavn & "&gatekode=" & Gatekode & "&husnr=" & GateNr Dim fraksjonerURL As String = baseURL & "https://komteksky.norkart.no/MinRenovasjon.Api/api/fraksjoner/" Dim appKey As String = "AE13DEEC-804F-4615-A74E-B4FAC11F0A30" Dim iconFolder As String = "html\images\renovasjon\" 'Ensure icon folder exists If Not IO.Directory.Exists(iconFolder) Then IO.Directory.CreateDirectory(iconFolder) End If WriteDebugLog(DEBUG_LOGGING_ENABLED, "Starting script execution with parameters: " & parameters.ToString()) 'Fetch fraksjoner data Dim fraksjoner As Object = GetJsonResponse(fraksjonerURL, KommuneNr, appKey) If fraksjoner Is Nothing Then hs.WriteLog("Soppel Error", "Failed to fetch fraksjoner data.") Exit Sub End If WriteDebugLog(DEBUG_LOGGING_ENABLED, "Fetched fraksjoner data.") 'Fetch tommekalender data Dim tommekalender As Object = GetJsonResponse(tommekalenderURL, KommuneNr, appKey) If tommekalender Is Nothing Then hs.WriteLog("Soppel Error", "Failed to fetch tommekalender data.") Exit Sub End If WriteDebugLog(DEBUG_LOGGING_ENABLED, "Fetched tommekalender data.") 'Look up the parent device by its reference (DevID) Dim parentDevice As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(DevID) If parentDevice Is Nothing Then WriteDebugLog(DEBUG_LOGGING_ENABLED, "Parent device not found, exiting.") Exit Sub End If 'Declare childDevice outside the loop to reuse Dim childDevice As Scheduler.Classes.DeviceClass = Nothing Dim iconFilePath As String = "" 'Process each item in tommekalender For Each calendarItem As Object In tommekalender Try Dim fraksjonId As Integer = calendarItem("FraksjonId") Dim tommedatoer As Object = calendarItem("Tommedatoer") Dim fraksjonName As String = GetFraksjonName(fraksjoner, fraksjonId) Dim fraksjonIcon As String = GetFraksjonIcon(fraksjoner, fraksjonId) WriteDebugLog(DEBUG_LOGGING_ENABLED, "Processing item: FraksjonId=" & fraksjonId & ", Name=" & fraksjonName) 'Look for an existing child device under the parent device Dim childDeviceExists As Boolean = False Dim deviceRef As Integer = -1 For Each associatedDeviceRef As Integer In parentDevice.AssociatedDevices(hs) Dim device As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(associatedDeviceRef) If device IsNot Nothing AndAlso device.Name(hs) = fraksjonName Then childDeviceExists = True deviceRef = device.Ref(hs) Exit For End If Next 'If the device does not exist, create a new device If Not childDeviceExists Then WriteDebugLog(DEBUG_LOGGING_ENABLED, "Creating new child device for " & fraksjonName) deviceRef = hs.NewDeviceRef(fraksjonName) childDevice = hs.GetDeviceByRef(deviceRef) If childDevice IsNot Nothing Then childDevice.Device_Type_String(hs) = "Renovasjon Fraksjon" childDevice.Interface(hs) = "Renovasjon" childDevice.Name(hs) = fraksjonName childDevice.Location(hs) = parentDevice.Location(hs) childDevice.Location2(hs) = parentDevice.Location2(hs) childDevice.Relationship(hs) = HomeSeerAPI.Enums.eRelationship.Child parentDevice.AssociatedDevice_Add(hs, deviceRef) hs.SaveEventsDevices() End If Else childDevice = hs.GetDeviceByRef(deviceRef) End If 'Update device properties If childDevice IsNot Nothing Then If tommedatoer.Count > 0 Then Dim firstDate As DateTime = DateTime.Parse(tommedatoer(0)) 'hs.SetDeviceString(deviceRef, "2024-12-31", True) 'hardcode date test hs.SetDeviceString(deviceRef, firstDate.ToString("yyyy-MM-dd"), True) hs.SetDeviceValue(deviceRef, 0) End If 'Download and set the icon if needed If fraksjonIcon <> "" Then iconFilePath = iconFolder & fraksjonId & ".png" If Not IO.File.Exists(iconFilePath) Then Try Dim client As New System.Net.WebClient client.DownloadFile(fraksjonIcon, iconFilePath) Catch ex As Exception hs.WriteLog("Soppel Error", "Failed to download icon: " & ex.Message) End Try End If If IO.File.Exists(iconFilePath) Then Dim pair As New HomeSeerAPI.VSVGPairs.VGPair With { .Graphic = "images/renovasjon/" & fraksjonId & ".png", .Set_Value = 0, .PairType = HomeSeerAPI.VSVGPairType.SingleValue } hs.DeviceVGP_AddPair(deviceRef, pair) End If End If End If Catch ex As Exception WriteDebugLog(DEBUG_LOGGING_ENABLED, "Error processing item: " & ex.Message) End Try Next WriteDebugLog(DEBUG_LOGGING_ENABLED, "Script execution completed.") End Sub Function GetJsonResponse(ByVal url As String, ByVal kommuneNr As String, ByVal appKey As String) As Object Dim client As New System.Net.WebClient client.Headers.Add("Kommunenr", kommuneNr) client.Headers.Add("RenovasjonAppKey", appKey) client.Encoding = System.Text.Encoding.UTF8 'Log before attempting to fetch the data WriteDebugLog(DEBUG_LOGGING_ENABLED, "Fetching JSON from URL: " & url) Try Dim response As String = client.DownloadString(url) ' Log the response before deserialization WriteDebugLog(DEBUG_LOGGING_ENABLED, "Response: " & response) Return Newtonsoft.Json.JsonConvert.DeserializeObject(response) Catch ex As Exception ' Log the error message WriteDebugLog(DEBUG_LOGGING_ENABLED, "Error fetching URL: " & ex.Message) Return Nothing End Try End Function Function GetFraksjonName(ByVal fraksjoner As Object, ByVal fraksjonId As Integer) As String If fraksjoner Is Nothing Then WriteDebugLog(DEBUG_LOGGING_ENABLED, "fraksjoner is Nothing") Return "Unknown" End If WriteDebugLog(DEBUG_LOGGING_ENABLED, "Searching for fraksjon with ID: " & fraksjonId) For Each fraksjon As Object In fraksjoner WriteDebugLog(DEBUG_LOGGING_ENABLED, "Checking fraksjon ID: " & fraksjon("Id")) If fraksjon("Id") = fraksjonId Then WriteDebugLog(DEBUG_LOGGING_ENABLED, "Found fraksjon: " & fraksjon("Navn")) Return fraksjon("Navn").ToString() End If Next WriteDebugLog(True, "No matching fraksjon found.") Return "Unknown" End Function Function GetFraksjonIcon(ByVal fraksjoner As Object, ByVal fraksjonId As Integer) As String If fraksjoner Is Nothing Then WriteDebugLog(DEBUG_LOGGING_ENABLED, "fraksjoner is Nothing") Return "" End If WriteDebugLog(DEBUG_LOGGING_ENABLED, "Searching for icon for fraksjon ID: " & fraksjonId) For Each fraksjon As Object In fraksjoner WriteDebugLog(DEBUG_LOGGING_ENABLED, "Checking fraksjon ID: " & fraksjon("Id")) If fraksjon("Id") = fraksjonId Then WriteDebugLog(DEBUG_LOGGING_ENABLED, "Found icon: " & fraksjon("NorkartStandardFraksjonIkon")) Return fraksjon("NorkartStandardFraksjonIkon").ToString() End If Next WriteDebugLog(DEBUG_LOGGING_ENABLED, "No matching icon found.") Return "" End Function 'Function to log debug messages to a file Sub WriteDebugLog(ByVal enabled As Boolean, ByVal message As String) If Not enabled Then Exit Sub Dim logFilePath As String = "C:\Program Files (x86)\HomeSeer HS4\Logs\renovasjon_debug.txt" Try Dim logMessage As String = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") & " - " & message & vbCrLf System.IO.File.AppendAllText(logFilePath, logMessage) Catch ex As Exception hs.WriteLog("Soppel Error", "Failed to write to log file: " & ex.Message) End Try End Sub Denne versjonen laster ned fraksjonene og bilder fra apiet og oppretter en sub device pr. fraksjon. Det blir da seende ut slik: Konfigureres slik som @clio75 har beskrevet 😃1 poeng
-
Det er greit å vite hvor mye strømforbruk du slår av / på.1 poeng
-
For å kunne skru av lasten om en nærmere seg effektleddet på nettleien.1 poeng
-
@molefonken Har du panel ovn så gjøres det på denne måten, finnes også knapper på den og gjøre på denne måte: 1: Slå av ovnen 2: Slå på ovnen og hold inne tannhjul knappen 3: Du vil etter 20+ sekunder se "Ra" dukke opp på display 4:Slipp knappen, ovnen vil resette seg til Mill firmware igjen etter noen sekunder1 poeng
-
Dette er Home Assistant seksjonen for hjemmeautomasjon. Det er en egen seksjon for Nodered: https://www.hjemmeautomasjon.no/forums/forum/102-node-red/1 poeng
-
ser veldig rar ut herfra iaffal. Svarer konsekvent med HTTP/1.1 med en Upgrade: h2 header selv om jeg tvinger på den HTTP/2 request: bjorn@miraculix:~$ curl --http2-prior-knowledge -D - https://www.tronika.no HTTP/1.1 301 Moved Date: Mon, 25 Nov 2024 12:34:59 GMT Server: Apache/2.4.57 (Ubuntu) Cache-Control: no-cache Strict-Transport-Security: max-age=63072000; includeSubdomains; preload Upgrade: h2,h2c Connection: Upgrade Location: https://www.tronika.no/no/ Content-Length: 0 Content-Type: text/html; charset=utf-8 Og når jeg følger den redirecten så får jeg bare 404: bjorn@miraculix:~$ curl --http2-prior-knowledge -D - https://www.tronika.no/no/ HTTP/1.1 404 Not Found Date: Mon, 25 Nov 2024 12:36:32 GMT Server: Apache/2.4.57 (Ubuntu) Set-Cookie: PrestaShop-29ecf8f7503b4bd780ac4d1bb0b03dfa=def502002823f94c1c4ce34ec8f965fb41fb1e0fbdddf8ae12792cc975e3147f31f0c3450514bdc762a9ece2e8f4d4452551acc645e86b576861a07f04938ad9a51e4aa90d80b91425b1e03e937a87af766ea9ff9db7a7b433b947a9f70a4245a264495f93538b572d7c4b1f6c08c1c3ad9f3e1f49f74d7cb9f7a15fa7b0116e2afa2366e9a30f0a097d7771ff9466528ceb0bf669e5622058cc409c85044dd5242aff75ffbfbccae9a980ab0f75e801793687b20e4a0f360c7865066e84a65672395c3f5f0906736a869be6801c06a9b5a14e4537f1a8c0beef39df42a914f1bd1adf6b279acdef5eb1844414360b0c81206ee27125db7183ffc92d8f98c33a70bbbac84bc712e9fb9a5fc2af95c638; expires=Sun, 15-Dec-2024 12:36:32 GMT; Max-Age=1728000; path=/; domain=www.tronika.no; HttpOnly; SameSite=Lax Set-Cookie: PrestaShop-29ecf8f7503b4bd780ac4d1bb0b03dfa=def502002105ce04cc64a12240dd163208a920948998fc42111189d913258a9ff815deb86eafdd6f78f801e0850931681c0a5fdb50694e10ab1b36c8677c7ec9cb150a4cec6e6ff879eea7c641c601e64ea6a74c93cd355eeceb67dac4521fee85414f5c3d074a634d796e123eae7e1c9b44bd23abfb06a5b9ab7a68ff1cf2c88b10a6680cbbb6c21584a731e0161dc51394516fbd3f2cfc2ab9c539d3cc9d603a8f9d4eec9c4f66f5173af0f0929e2d46c2ec49190a3ec8bbc84ad8336329f2b6555b2e46569ab76138341233dcb366a4d035a18a1cb4882a5a8ed28054dec8e6c125850f1f365b6bccaf739fe505eb3e23812a3e2acc29ed95121b56ba3d36d16bcafcf13eb7660b0bc6e76a434b112092cc89f5b748e3b10e92e0ea5ed66cd6ac7dc913e1279baa05e74d26b687da4c36; expires=Sun, 15-Dec-2024 12:36:32 GMT; Max-Age=1728000; path=/; domain=www.tronika.no; HttpOnly; SameSite=Lax Set-Cookie: PrestaShop-6c4bd792258ec4c57a768be2afe766ba=def50200c9340412ea15bb931899f6d14719e8b981529e4defbe9ef1b0a17b82a1f2aed9a4080aa87f7bfc6db8a8e80f09a43352bbbe9e24e7c6f90c11b61f14743c29304ebe9b249eceaa1cf38065fdefcf7c86a15205d47dc2e61a321b6e2fb27d4193f78ebdbb5c80870089f3ee639c59a01cfc2472373191987339f9a3bdffe609861a959b3ccf5a6b89630c04d333336bb607285d3dcffbf28e5295abfa8faf7478eb368e69ed4efba86603102837bd038a08344cd97449013b54de3ab04bf42d086a48ac8556b26dc3969ef37b8100f0baf5143e1f7cc2931baa1b5919a9814e6b3de297e91c6e; expires=Sun, 15-Dec-2024 12:36:32 GMT; Max-Age=1728000; path=/; domain=www.tronika.no; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: max-age=63072000; includeSubdomains; preload Upgrade: h2,h2c Connection: Upgrade Content-Length: 0 Content-Type: text/html; charset=utf-8 enda mer pussig er det at de tydeligvis skulle hadde en annen 404, for om jeg prøver noe som slutter på html så får jeg denne redirecten: bjorn@miraculix:~$ curl --http2-prior-knowledge -D - https://www.tronika.no/no/foo.html HTTP/1.1 302 Found Date: Mon, 25 Nov 2024 12:37:15 GMT Server: Apache/2.4.57 (Ubuntu) Set-Cookie: PrestaShop-6c4bd792258ec4c57a768be2afe766ba=def50200e0666148968f3b8cf76618ae88c2c1aeb0765ee5c9c8affdbf8bb10721d068d5f84820ee7ed007e49224f6609deccb86285a0bef12601fd504ad53c4004dc76909ed69ced0a7859753cbbb3f7cbcef6d8a239427da8f8780188c565dd67200dea52c573f9a17103ea7426f3d20b11d55be8149e612530547e5db697167ffc5c97ef5b94bd20ebf7e1b89ad994e40d7a644eafa9cad97e66bc79b6aa91267424db82aa095d04ade18408596d0311a5aaff253f6dc24d67b94813b94b375abfad16092; expires=Sun, 15-Dec-2024 12:37:15 GMT; Max-Age=1728000; path=/; domain=www.tronika.no; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: max-age=63072000; includeSubdomains; preload Upgrade: h2,h2c Connection: Upgrade Location: https://www.tronika.no/no/fant-ikke-siden Content-Length: 0 Content-Type: text/html; charset=utf-8 som igjen gir en 404. Herlig. Lenger en det gidder normalt ikke jeg før jeg finner meg en annen butikk. Sorry. Enten får de klare å sette opp en fungerende web-tjeneste eller så får de kjøpe det av noen som kan slikt1 poeng
-
Da har jeg tatt avskjed med HomeSeer etter snart 20 år til fordel for Home Assistant. Jeg må si at jeg er mektig imponert over hvor enkelt integrasjoner bare popper inn. Har nå fått flyttet over alle Z-wave, Zigbee og RFXCom, samt fått opp Reolink kameraer, varmepumper, Nissan-tilkobling, Tibber, Yr, Sonos, TP-link mesh, Yale dørlås og en del andre Wi-Fi enheter jeg har i huset. Har ikke hatt noen problemer med å få dette satt opp overhodet. Z-wave var så enkelt som å flytte over USB-stick'en, siden den inneholder hele nettverket. For Zigbee valgte jeg å kjøpe en ny USB-stick (Sonoff 3.0) og legge til device på nytt inn i ZHA-integrasjonen. Dermed kunne den gamle PC'en fortsatt styre de enhetene jeg ikke hadde fått flyttet over. Skal sies at det gamle Zigbee-oppsettet kjørte på en Raspberry Pi med en Conbee stick. Kommer ikke til å savne noen av delene. Nå kjører alt på en Gigabyte Brix GB-BRR5H-4500 med 16 GB RAM (tenker å oppgradere til 32). Så nå er det bare å bygge noen kule dashboard og se på flere muligheter for å koble sammen enheter i forskjellige automasjoner.1 poeng
-
Fant denne tråden først nå men tenkte dele min erfaring hvis noen annen støtter på den. Jeg har hatt Namron med artikkelnuimmer 4512737 gjennom ZHA i et år, og det har fungert veldig bra, og jeg har vært kjempefornøyd. Jeg bestilte derfor 4 stk til, men noen gang etter jeg kjøpte mine, er artikkelnummer byttet til 4512752. Design er forandret og jeg har ingen sensorer, eller kontroller. Er på utkikk å bytte alle termostater i mitt hus, og tips tar mot med glede på noe som fungerer bra med ZHA.1 poeng
-
Jeg har lekt litt med dette siste dagene og kommet frem til en løsning som jeg liker. Kort fortalt har jeg nordpool satt opp med virkelige priser, med strømstøtte og natt-tarriff osv osv. Så den viser hva det faktisk koster. Se her (takk til @stigvi for masse inspirasjon): Jeg har tidligere brukt priceanalyzer og Node-Red men ikke vært fornøyd fordi jeg får plutselige problemer pga feil på integrasjon eller annet. Nå har jeg brukt bare rene HA automasjoner som skal sikre at det ikke blir et problem. Neste krav er at du har satt opp VVB som en climate sensor. Jeg har en temperatur sensor på VVB og et smart relé for å bryte strømmen. Temp sensor er ESP32 med en dallas_temp sensor styrt av ESPHome. Koden for ESPhome er som følger: one_wire: - platform: gpio pin: GPIO21 sensor: - platform: dallas_temp address: 0xXXXXXXXXXXXXXXXX name: "Water Heater Temperature" unit_of_measurement: "°C" force_update: true bluetooth_proxy: active: true Climate sensor settes opp i configuration.yaml (fordi du får ikke satt maks/min temp i GUI). Unique_id setter du til hva du vil, da kan du endre navn o.l. i GUI om du ønsker, men ikke påkrevd. Fordelen med at det er en climate sensor er at jeg aldri skrur av VVB. Den vil ha en "failsafe" på low temp. Det betyr at man er ganske trygg på at det aldri blir helt iskaldt vann. For å ytterligere sikre mot dette kan du redusere utslagene i automasjonen (juster ned / opp med bare 5 eller 10 grader f.eks.). climate: - platform: generic_thermostat unique_id: 123nn342wwkjnee234 name: Varmtvannsbereder heater: switch.varmtvannsbereder target_sensor: sensor.water_heater_temperature min_temp: 30 max_temp: 80 ac_mode: false target_temp: 65 Min automasjon akkurat nå er å sjekke prisen kvart på hver time, for å se om neste timen er veldig dyr, eller veldig billig sammenlignet med denne timen ( mer enn 20% differanse opp eller ned). Dersom det er tilfelle pusher vi temperaturen kraftig opp eller ned siste kvarteret. Så når Nordpool integrasjonen setter ny pris på hel time så sjekker automasjonen igjen. Dersom det er en billig time (low_price fra nordpool) så setter den ned temperaturen. Dyre timer er valgt som de 12 dyreste timene i døgnet og da setter vi ned temperaturen på climate sensoren. Jeg har også en nedjustering av temperaturen fra 00 til 05, da lader typisk også elbilen (egen automasjon for å passe på effektmaks) men dette kan jo droppes eventuelt. Til sist, dersom ingen av de andre tingene slår inn så setter man "default temperatur". Default temperatur er basert på egen hjelper som jeg kaller VVB Target. Den har jeg satt opp som hjelper i HA. I denne automasjonen bruker jeg 2 hjelpere, en input number for target temperatur, og en input_boolean for å kunne gjøre det slik at brukeren kan endre target temperatur selv på climate sensoren. Når automasjonen kjører og justerer temperaturen så slår den på input_boolean.vvb_auto_update, så "vet" den neste automasjonen at det er automatisk justering av VVB temp som pågår. Dersom brukeren skifter temperatur på climate sensoren manuelt så skjer ikke dette og da justeres Måltemp input_number. Automasjon for å justere temp automatisk på VVB: alias: Optimal styring av varmtvannsbereder basert på strømpriser trigger: - platform: time_pattern minutes: 45 id: kvart-på - platform: state entity_id: sensor.nordpool attribute: current_price id: ny-pris - platform: homeassistant event: start id: ny-pris condition: [] action: - variables: current_price: "{{ states('sensor.nordpool') | float }}" next_price: > {% set now = now().hour %} {% set next_price = state_attr('sensor.nordpool', 'today')[now + 1] if now < 23 else state_attr('sensor.nordpool', 'tomorrow')[0] %} {{ next_price }} low_price_threshold: "{{ state_attr('sensor.nordpool', 'off_peak_2') }}" high_price_threshold: "{{ state_attr('sensor.nordpool', 'max') }}" current_setpoint: "{{ states('input_number.vvb_target') | float }}" price_change_threshold: 0.2 today_prices: "{{ state_attr('sensor.nordpool', 'today') }}" sorted_prices: "{{ today_prices | sort(reverse=True) }}" top_12_prices: "{{ sorted_prices[:12] }}" - service: input_boolean.turn_on target: entity_id: - input_boolean.vvb_auto_update data: {} - choose: - conditions: - condition: trigger id: kvart-på - condition: template value_template: "{{ next_price / current_price <= (1 - price_change_threshold) }}" sequence: - service: climate.set_temperature data: entity_id: climate.varmtvannsbereder temperature: "{{ current_setpoint - 20 }}" - conditions: - condition: trigger id: kvart-på - condition: template value_template: "{{ next_price / current_price >= (1 + price_change_threshold) }}" sequence: - service: climate.set_temperature data: entity_id: climate.varmtvannsbereder temperature: "{{ current_setpoint + 20 }}" - conditions: - condition: trigger id: kvart-på sequence: [] alias: Når utløst kvart på og ingenting skal gjøres (unngå at default handling kjøres) - conditions: - condition: trigger id: ny-pris - condition: template value_template: > {% set now = now().hour %} {{ today_prices[now] in top_12_prices }} sequence: - service: climate.set_temperature data: entity_id: climate.varmtvannsbereder temperature: "{{ current_setpoint - 15 }}" - conditions: - condition: trigger id: ny-pris - condition: state entity_id: sensor.nordpool attribute: low_price state: true sequence: - service: climate.set_temperature data: entity_id: climate.varmtvannsbereder temperature: "{{ current_setpoint + 15 }}" - conditions: - condition: time after: "00:00:00" before: "05:00:00" sequence: - service: climate.set_temperature data: entity_id: climate.varmtvannsbereder temperature: "{{ current_setpoint - 15 }}" default: - service: climate.set_temperature data: entity_id: climate.varmtvannsbereder temperature: "{{ current_setpoint }}" - service: input_boolean.turn_off target: entity_id: - input_boolean.vvb_auto_update data: {} mode: single Automasjon for å justere måltemp sensor hjelper. Denne lagrer så en ny måltemp med samme offset som gjeldende innstilling. Så f.eks., dersom vi nå er på en dyr time og vi har justert ned varmen med 15 grader så kan input_number.vvb_target stå på 65 grader, climate sensoren er da på 50 grader. Dersom du justerer climate opp med 5 grader, til 55, så vil input_number.vvb_target lagres til 55+15, altså 70 grader. alias: Oppdater varmtvannsbereder måltemp hjelper description: >- Denne automasjonen endrer hjelperen som er måltemperaturen til varmtvannsberederen. Den sjekker at ikke automasjonen har endret prisen først, og så setter den setpunkt med samme offset som climate sensoren har i øyeblikket. trigger: - platform: state entity_id: climate.varmtvannsbereder attribute: temperature condition: - condition: state entity_id: input_boolean.vvb_auto_update state: "off" action: - variables: current_setpoint: "{{ state_attr('climate.varmtvannsbereder', 'temperature') | float }}" previous_setpoint: "{{ trigger.from_state.attributes.temperature | float }}" stored_target: "{{ states('input_number.vvb_target') | float }}" - choose: - conditions: - condition: template value_template: "{{ previous_setpoint == stored_target }}" sequence: - service: input_number.set_value data: entity_id: input_number.vvb_target value: "{{ current_setpoint }}" - conditions: - condition: template value_template: "{{ previous_setpoint != stored_target }}" sequence: - service: input_number.set_value data: entity_id: input_number.vvb_target value: "{{ current_setpoint + (stored_target - previous_setpoint) }}" mode: single Dette er work-in-progress, men så langt fungerer det ganske godt. Neste skritt er at jeg skal sette opp samme logikk på to varmekabler på badene, og så kan det brukes på varme i andre rom slik som stue, kjøkken, soverom osv. Fordelen med å gjøre det på denne måten er at du får god WAF. Dersom kona skifter temp på climate sensorene i GUI eller på veggen, så fungerer det som forventet. Håper dette kan være nyttig for noen. 🙂1 poeng
Vinnerlisten er satt til Oslo/GMT+01:00