top of page
Domotics_logo_600x500-removebg-preview.png

Home Assistant - Strømpriser visualisert og som styring av enheter

  • Forfatterens bilde: Mads Nedrehagen
    Mads Nedrehagen
  • 30. nov. 2023
  • 15 min lesing

Oppdatert: 17. jan.

I dette innlegget skal vi se nærmere på en løsning for å hente stømpriser inn i Home Assistant via Nordpool integrasjon og litt beregning i Node-RED. VI skal også få på plass grafisk visning av strømpriser i et Apex kort samt trekke inn Powersaver for å kunne styre enheter etter strømpris. F.eks. kan vi sette VVB til maksimalt å kjøre de 6 billigste timene i et døgn.


Løsningen kan brukes for alle strømsoner og beregner effektiv strømpris, nettleie og strømstøtte.

ree

Det er fullt mulig å gjøre det både enklere eller mer avansert enn vi viser i dette innlegget. Bruk dette til inspirasjon eller veiledning for å komme i gang med styring slik DU vil ha det, eller bruk det som det er (på egen risiko og regning).


I vår løsning har vi valgt å lage en egen funksjon hvor du ved hjelp av nedtrekk kan velge den strømsonen du vil se og styre etter.


Forutsetninger


Forutsetningen for å kunne følge denne veiviseren er at du har fått på plass Node-RED Companion, Nordpool integrasjon, Apex charts og Mushroom card i Home Assistant. Du finner alle i HACS.


Vi skal også bruke Node-RED, denne finner du i tilleggsbutikken i Home Assistant.


I tillegg skal vi bruke noen hjelpere i Home Assistant, disse kommer vi tilbake til snart.



Installasjon og oppsett i Home Assistant


Nordpool


Installer Nordpool integrasjonen. Den finner du i HACS.

ree

Gå deretter til Innstillinger -> Enher & tjenester og velg Legg til integrasjon og velg Nordpool

Sett opp Nordpool sensorer for alle regioner. PS! Ingen MVA for sone 04 Nord

Bruk 4 desimaler når du legger inn sensorene, og pris i kr!

Gi gjerne nytt navn til sensorene, men ikke endre id'ene, vi bruker dem igjen i Node-RED.

ree


Node-RED Companion

ree

Denne brukes for at Home Assistant og Node-RED skal kunne kommunisere sammen. Installeres fra HACS.


Husk at denne må aktivers via Instilling -> Enheter & tjenster -> Installer integrasjon og søk etter Node-RED


Apex Chart

ree

Denne bruker vi for å kunne generere grafer i Home Assistant. Du installerer den fra HACS.


Mushroom card

ree

Dette er en samling ekstra kort til bruk i Lovelace dashbord. Ikke en absulutt nødvendighet. Men oversiktskortet vi har brukt i dette eksemplet bruker et kort fra denne samlingen for valg av strømsone. Du finner også denne i HACS.


Hjelpere i Home Assistant


I vårt eksempel har vi brukt 3 hjelpere i Home Assistant, så vi starter med å få dem på plass.


Strømsoner


Gå til Innstillinger -> Enheter & tjenester og velg Hjelper øverst i menyen.


Lag en hjelper av typen nedtrekksmeny (input_select)

ree

Legg inn følgende verdier og lagre

ree

Knapper for oppdatering av Node-RED priser eller omstart av Nordpool

Lag så 2 hjelpere av typen knapp som kan brukes til å tvangsoppdatere Node-RED flyten eller trigge automasjon som tvangsoppdaterer Nordpool integrasjonene.

ree

En knapp for å oppdatere Norpool

ree

Og en knapp for å oppdatere nye data fra Node-RED

ree

Så over til Node-RED og Powersaver installasjon og oppsett


Node-RED og Powersaver


Mangler du Node-RED kan den installeres direkte som tillegg fra menyen i Home Assistant.


I Node-RED må vi også installere Paletten Powersaver for å kunne bruke nodene de har publisert. Denne paletten finner du fra menyen i Node-RED. Søk etter contrib-power-saver

ree

Vi trenger også disse palettene, søk dem opp i Node-RED og installer dem om du mangler dem.


contrib-calc

contrib-home-assistant-websocket

contrib-cron-plus



Når du har fått dette på plass kan du importere denne flyten direkte til Node-RED. Du finner funksjonen for å importere i menyen.

ree

Node-RED flow

[{"id":"f94e6838ea295ae6","type":"tab","label":"Strømpriser","disabled":false,"info":"","env":[]},{"id":"2b32e96c52fa4f4d","type":"group","z":"f94e6838ea295ae6","name":"","style":{"fill":"none","label":true,"stroke":"#0070c0"},"nodes":["443a219ae2fc05cf","985d5173cac8bb8a","edc506dd8321670c","9a88833d3709ee29","6d8dbeb71f743074","4dc5e50857367f4e"],"x":34,"y":359,"w":1312,"h":142},{"id":"93cb6e6098c78ecb","type":"group","z":"f94e6838ea295ae6","name":"","style":{"fill":"none","label":true,"stroke":"#92d04f"},"nodes":["161ad5e35391398f","7550d8e2d49ad4e8","073f8783c9a275cf","d2f73db02d6c3fb3","6a05631d41ffdd82","b5e6210cfdbedda6","24c02f3cc2c748da","8d847b18ad9ee6f9","1541b13462255f62"],"x":34,"y":519,"w":1312,"h":262},{"id":"27ecc21d356a287f","type":"group","z":"f94e6838ea295ae6","name":"","style":{"stroke":"#92d04f","fill":"none","label":true},"nodes":["26d3c4f7f74d90f7","b48658175bb49a37","51ec252af8da1fbf","a15644986f8e6108","fc10d1c692f561c3","f7f8c202944b65ad","b8fa0d8266e2a1fe","a86e50e3630c0de6","eb60512cdc73332a","85571b0a8d72278a","0c03428369051a88","27b75f6fad3d8e3f"],"x":34,"y":999,"w":1312,"h":362},{"id":"7ad142a183ef65f9","type":"group","z":"f94e6838ea295ae6","name":"","style":{"stroke":"#92d04f","label":true,"fill":"#000000","fill-opacity":"0.94"},"nodes":["bc2f2196fcc24f16","b62d7fd328ab704b","8d406c90ef3b5f25","7dd0f6f41bc95024","71ea9eea2bdb3731","fd7d76bcbfa9439a","d64fe62a742e7c39","1fd1dd120a45b2fb","51e49f4424d40b05","54c33a660d6ea331","70015d049d7aa71a","26917e72242f60a7","a3fe80621fc24355","c6b6246465e1c9fd","5a670b3655d166dd","fb70a11c53828b34"],"x":34,"y":19,"w":1312,"h":322},{"id":"0b5ef129958f9de4","type":"group","z":"f94e6838ea295ae6","name":"","style":{"fill":"none","label":true,"stroke":"#0070c0"},"nodes":["c1f82d8727ad980d","08a7464bac59853a","053a675d14e77896","b38c63cd98f03cf0","d98fc1a906d8fab4","8ecb74d156f7c994","7fcc7f70bc75c708","ef65f8c3f1264b86","cb9050e88ea72366"],"x":24,"y":799,"w":1322,"h":182},{"id":"c9b61bf8849ca55a","type":"group","z":"f94e6838ea295ae6","name":"","style":{"stroke":"#0070c0","label":true,"fill":"none","fill-opacity":"0.9"},"nodes":["e7943f6ff3099b52","1dd995e3eadc407c","b10c4cf94df25f98","130057e897701718","ae602b8b3663b25b","b344750f024d7e79","c1cdf6fcef33f400"],"x":474,"y":1399,"w":872,"h":362},{"id":"bc2f2196fcc24f16","type":"ps-receive-price","z":"f94e6838ea295ae6","g":"7ad142a183ef65f9","name":"Priser ink. MVA","x":1160,"y":60,"wires":[["26917e72242f60a7"]]},{"id":"26d3c4f7f74d90f7","type":"ps-general-add-tariff","z":"f94e6838ea295ae6","g":"27ecc21d356a287f","name":"Nettleie uke (verdi i kroner)","periods":[{"start":"22","value":"0,4"},{"start":"06","value":"0,5"}],"validFrom":"","validTo":"","days":{"Mon":true,"Tue":true,"Wed":true,"Thu":true,"Fri":true,"Sat":false,"Sun":false},"x":250,"y":1260,"wires":[["b48658175bb49a37"]]},{"id":"b48658175bb49a37","type":"ps-general-add-tariff","z":"f94e6838ea295ae6","g":"27ecc21d356a287f","name":"Nettleie helg (verdi i kroner)","periods":[{"start":"22","value":"0,4"},{"start":"06","value":"0,4"}],"validFrom":"","validTo":"","days":{"Mon":false,"Tue":false,"Wed":false,"Thu":false,"Fri":false,"Sat":true,"Sun":true},"x":260,"y":1320,"wires":[["a15644986f8e6108","e7943f6ff3099b52"]]},{"id":"51ec252af8da1fbf","type":"ps-general-add-tariff","z":"f94e6838ea295ae6","g":"27ecc21d356a287f","name":"Påslag (verdi i kroner)","periods":[{"start":"22","value":"0,02"},{"start":"06","value":"0,02"}],"validFrom":"","validTo":"","days":{"Mon":true,"Tue":true,"Wed":true,"Thu":true,"Fri":true,"Sat":true,"Sun":true},"x":240,"y":1200,"wires":[["26d3c4f7f74d90f7"]]},{"id":"161ad5e35391398f","type":"function","z":"f94e6838ea295ae6","g":"93cb6e6098c78ecb","name":"Nullstill timepriser","func":"msg.payload.priceData.forEach(function (hour) {\n hour.value = 0;\n});\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":230,"y":620,"wires":[["7550d8e2d49ad4e8"]],"icon":"node-red-contrib-calc/calculator.png"},{"id":"c1f82d8727ad980d","type":"ha-sensor","z":"f94e6838ea295ae6","g":"0b5ef129958f9de4","name":"Strømpris støtte","entityConfig":"e8ec76a566ddfb1a","version":0,"state":"payload","stateType":"str","attributes":[{"property":"Hours","value":"payload.hours","valueType":"msg"}],"inputOverride":"allow","outputProperties":[],"x":700,"y":920,"wires":[["053a675d14e77896"]]},{"id":"a15644986f8e6108","type":"function","z":"f94e6838ea295ae6","g":"27ecc21d356a287f","name":"List alle timer","func":"let priceData = msg.payload.priceData;\nlet hours = [];\n\n// Iterer over hvert element i priceData og legg det til i hours-listen\npriceData.forEach(hourData => {\n // Opprett et objekt med starttid og pris\n let hourObj = {\n start: hourData.start, // Bruker starttiden\n price: hourData.value // Prisen\n };\n\n // Legg til objektet i hours-listen\n hours.push(hourObj);\n});\n\n// Oppdater meldingen slik at hours er direkte under msg.payload\nmsg.payload = { hours: hours };\n\n// Returner den oppdaterte meldingen\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":510,"y":1320,"wires":[["fc10d1c692f561c3"]]},{"id":"fc10d1c692f561c3","type":"ha-sensor","z":"f94e6838ea295ae6","g":"27ecc21d356a287f","name":"Strømpris effektiv","entityConfig":"1adcd9d742d5b658","version":0,"state":"payload","stateType":"str","attributes":[{"property":"Hours","value":"payload.hours","valueType":"msg"}],"inputOverride":"allow","outputProperties":[],"x":710,"y":1320,"wires":[["f7f8c202944b65ad"]]},{"id":"08a7464bac59853a","type":"function","z":"f94e6838ea295ae6","g":"0b5ef129958f9de4","name":"List alle timer","func":"let priceData = msg.payload.priceData;\nlet hours = [];\n\n// Iterer over hvert element i priceData og legg det til i hours-listen\npriceData.forEach(hourData => {\n // Opprett et objekt med starttid og pris\n let hourObj = {\n start: hourData.start, // Bruker starttiden\n price: hourData.value // Prisen\n };\n\n // Legg til objektet i hours-listen\n hours.push(hourObj);\n});\n\n// Oppdater meldingen slik at hours er direkte under msg.payload\nmsg.payload = { hours: hours };\n\n// Returner den oppdaterte meldingen\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":510,"y":920,"wires":[["c1f82d8727ad980d"]]},{"id":"053a675d14e77896","type":"function","z":"f94e6838ea295ae6","g":"0b5ef129958f9de4","name":"Hent tid og pris","func":"// Hent nåværende tidspunkt og konverter til tekst.\nvar now = new Date();\nvar yyyy = now.getFullYear();\nvar mm = now.getMonth() < 9 ? \"0\" + (now.getMonth() + 1) : (now.getMonth() + 1); // getMonth() is zero-based\nvar dd = now.getDate() < 10 ? \"0\" + now.getDate() : now.getDate();\nvar hh = now.getHours() < 10 ? \"0\" + now.getHours() : now.getHours();\nvar mmm = now.getMinutes() < 10 ? \"0\" + now.getMinutes() : now.getMinutes();\nvar ss = now.getSeconds() < 10 ? \"0\" + now.getSeconds() : now.getSeconds();\n\nvar lokal_tid = hh + \":00:00\";\nvar pris = null;\nvar tidspunkt = null;\n\n// Lag en teller og sett den til null\nvar count = 0;\n\nfor (let i of msg.payload.hours) {\n if (count < 24) {\n i.timestamp = new Date(i.start).toLocaleTimeString('DE');\n // Sett prisen til 4 desimaler og konverter tilbake til et tall\n i.price = parseFloat(i.price.toFixed(4));\n if (i.timestamp === lokal_tid) {\n pris = i.price;\n tidspunkt = i.timestamp;\n }\n count++;\n } else {\n break;\n }\n}\n\nif (pris !== null) {\n var current_saving = {\n \"pris\": pris,\n \"time\": tidspunkt\n };\n msg.payload = current_saving;\n} else {\n return null;\n}\n\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":940,"y":920,"wires":[["b38c63cd98f03cf0"]]},{"id":"b38c63cd98f03cf0","type":"ha-sensor","z":"f94e6838ea295ae6","g":"0b5ef129958f9de4","name":"Strømpris støtte denne time","entityConfig":"f22668aa573dfa90","version":0,"state":"payload.pris","stateType":"msg","attributes":[],"inputOverride":"allow","outputProperties":[],"x":1200,"y":920,"wires":[[]]},{"id":"f7f8c202944b65ad","type":"function","z":"f94e6838ea295ae6","g":"27ecc21d356a287f","name":"Hent tid og pris","func":"// Hent nåværende tidspunkt og konverter til tekst.\nvar now = new Date();\nvar yyyy = now.getFullYear();\nvar mm = now.getMonth() < 9 ? \"0\" + (now.getMonth() + 1) : (now.getMonth() + 1); // getMonth() is zero-based\nvar dd = now.getDate() < 10 ? \"0\" + now.getDate() : now.getDate();\nvar hh = now.getHours() < 10 ? \"0\" + now.getHours() : now.getHours();\nvar mmm = now.getMinutes() < 10 ? \"0\" + now.getMinutes() : now.getMinutes();\nvar ss = now.getSeconds() < 10 ? \"0\" + now.getSeconds() : now.getSeconds();\n\nvar lokal_tid = hh + \":00:00\";\nvar pris = null;\nvar tidspunkt = null;\n\n// Lag en teller og sett den til null\nvar count = 0;\n\nfor (let i of msg.payload.hours) {\n if (count < 24) {\n i.timestamp = new Date(i.start).toLocaleTimeString('DE');\n // Sett prisen til 4 desimaler og konverter tilbake til et tall\n i.price = parseFloat(i.price.toFixed(4));\n if (i.timestamp === lokal_tid) {\n pris = i.price;\n tidspunkt = i.timestamp;\n }\n count++;\n } else {\n break;\n }\n}\n\nif (pris !== null) {\n var current_saving = {\n \"pris\": pris,\n \"time\": tidspunkt\n };\n msg.payload = current_saving;\n} else {\n return null;\n}\n\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":940,"y":1320,"wires":[["b8fa0d8266e2a1fe"]]},{"id":"b8fa0d8266e2a1fe","type":"ha-sensor","z":"f94e6838ea295ae6","g":"27ecc21d356a287f","name":"Strømpris effektiv denne time","entityConfig":"939b2c2e962ba7a3","version":0,"state":"payload.pris","stateType":"msg","attributes":[],"inputOverride":"allow","outputProperties":[],"x":1200,"y":1320,"wires":[[]]},{"id":"7550d8e2d49ad4e8","type":"ps-general-add-tariff","z":"f94e6838ea295ae6","g":"93cb6e6098c78ecb","name":"Nettleie uke (verdi i kroner)","periods":[{"start":"22","value":"0,4444"},{"start":"06","value":"0,5555"}],"validFrom":"","validTo":"","days":{"Mon":true,"Tue":true,"Wed":true,"Thu":true,"Fri":true,"Sat":false,"Sun":false},"x":250,"y":680,"wires":[["073f8783c9a275cf"]]},{"id":"073f8783c9a275cf","type":"ps-general-add-tariff","z":"f94e6838ea295ae6","g":"93cb6e6098c78ecb","name":"Nettleie helg (verdi i kroner)","periods":[{"start":"22","value":"0,4444"},{"start":"06","value":"0,4444"}],"validFrom":"","validTo":"","days":{"Mon":false,"Tue":false,"Wed":false,"Thu":false,"Fri":false,"Sat":true,"Sun":true},"x":260,"y":740,"wires":[["6a05631d41ffdd82"]]},{"id":"d2f73db02d6c3fb3","type":"ha-sensor","z":"f94e6838ea295ae6","g":"93cb6e6098c78ecb","name":"Strømpris nettleie","entityConfig":"3bb5ad11c8c5da5a","version":0,"state":"payload","stateType":"str","attributes":[{"property":"Hours","value":"payload.hours","valueType":"msg"}],"inputOverride":"allow","outputProperties":[],"x":720,"y":740,"wires":[["b5e6210cfdbedda6"]]},{"id":"6a05631d41ffdd82","type":"function","z":"f94e6838ea295ae6","g":"93cb6e6098c78ecb","name":"List alle timer","func":"let priceData = msg.payload.priceData;\nlet hours = [];\n\n// Iterer over hvert element i priceData og legg det til i hours-listen\npriceData.forEach(hourData => {\n // Opprett et objekt med starttid og pris\n let hourObj = {\n start: hourData.start, // Bruker starttiden\n price: hourData.value // Prisen\n };\n\n // Legg til objektet i hours-listen\n hours.push(hourObj);\n});\n\n// Oppdater meldingen slik at hours er direkte under msg.payload\nmsg.payload = { hours: hours };\n\n// Returner den oppdaterte meldingen\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":740,"wires":[["d2f73db02d6c3fb3"]]},{"id":"b5e6210cfdbedda6","type":"function","z":"f94e6838ea295ae6","g":"93cb6e6098c78ecb","name":"Hent tid og pris","func":"// Hent nåværende tidspunkt og konverter til tekst.\nvar now = new Date();\nvar yyyy = now.getFullYear();\nvar mm = now.getMonth() < 9 ? \"0\" + (now.getMonth() + 1) : (now.getMonth() + 1); // getMonth() is zero-based\nvar dd = now.getDate() < 10 ? \"0\" + now.getDate() : now.getDate();\nvar hh = now.getHours() < 10 ? \"0\" + now.getHours() : now.getHours();\nvar mmm = now.getMinutes() < 10 ? \"0\" + now.getMinutes() : now.getMinutes();\nvar ss = now.getSeconds() < 10 ? \"0\" + now.getSeconds() : now.getSeconds();\n\nvar lokal_tid = hh + \":00:00\";\nvar pris = null;\nvar tidspunkt = null;\n\n// Lag en teller og sett den til null\nvar count = 0;\n\nfor (let i of msg.payload.hours) {\n if (count < 24) {\n i.timestamp = new Date(i.start).toLocaleTimeString('DE');\n // Sett prisen til 4 desimaler og konverter tilbake til et tall\n i.price = parseFloat(i.price.toFixed(4));\n if (i.timestamp === lokal_tid) {\n pris = i.price;\n tidspunkt = i.timestamp;\n }\n count++;\n } else {\n break;\n }\n}\n\nif (pris !== null) {\n var current_saving = {\n \"pris\": pris,\n \"time\": tidspunkt\n };\n msg.payload = current_saving;\n} else {\n return null;\n}\n\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":950,"y":740,"wires":[["24c02f3cc2c748da"]]},{"id":"24c02f3cc2c748da","type":"ha-sensor","z":"f94e6838ea295ae6","g":"93cb6e6098c78ecb","name":"Strømpris nettleie denne time","entityConfig":"8a294585ae707fdd","version":0,"state":"payload.pris","stateType":"msg","attributes":[],"inputOverride":"allow","outputProperties":[],"x":1200,"y":740,"wires":[[]]},{"id":"b62d7fd328ab704b","type":"api-current-state","z":"f94e6838ea295ae6","g":"7ad142a183ef65f9","name":"Stømsone","server":"548a408d.14f22","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_select.stromsoner","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":390,"y":160,"wires":[["8d406c90ef3b5f25"]]},{"id":"8d406c90ef3b5f25","type":"switch","z":"f94e6838ea295ae6","g":"7ad142a183ef65f9","name":"","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"01","vt":"num"},{"t":"cont","v":"02","vt":"num"},{"t":"cont","v":"03","vt":"num"},{"t":"cont","v":"05","vt":"num"},{"t":"cont","v":"04","vt":"num"}],"checkall":"true","repair":false,"outputs":5,"x":590,"y":180,"wires":[["7dd0f6f41bc95024"],["71ea9eea2bdb3731"],["fd7d76bcbfa9439a"],["1fd1dd120a45b2fb"],["d64fe62a742e7c39"]]},{"id":"7dd0f6f41bc95024","type":"api-current-state","z":"f94e6838ea295ae6","g":"7ad142a183ef65f9","name":"Nordpool 01 Øst","server":"548a408d.14f22","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.nordpool_kwh_no1_nok_4_10_025","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":860,"y":60,"wires":[["bc2f2196fcc24f16"]]},{"id":"71ea9eea2bdb3731","type":"api-current-state","z":"f94e6838ea295ae6","g":"7ad142a183ef65f9","name":"Nordpool 02 Sør","server":"548a408d.14f22","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.nordpool_kwh_no2_nok_4_10_025","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":860,"y":120,"wires":[["bc2f2196fcc24f16"]]},{"id":"fd7d76bcbfa9439a","type":"api-current-state","z":"f94e6838ea295ae6","g":"7ad142a183ef65f9","name":"Nordpool 03 Midt","server":"548a408d.14f22","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.nordpool_kwh_no3_nok_4_10_025","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":860,"y":180,"wires":[["bc2f2196fcc24f16"]]},{"id":"d64fe62a742e7c39","type":"api-current-state","z":"f94e6838ea295ae6","g":"7ad142a183ef65f9","name":"Nordpool 04 Nord","server":"548a408d.14f22","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.nordpool_kwh_no4_nok_4_10_0","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":870,"y":300,"wires":[["70015d049d7aa71a"]]},{"id":"1fd1dd120a45b2fb","type":"api-current-state","z":"f94e6838ea295ae6","g":"7ad142a183ef65f9","name":"Nordpool 05 Vest","server":"548a408d.14f22","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.nordpool_kwh_no5_nok_4_10_025","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":870,"y":240,"wires":[["bc2f2196fcc24f16"]]},{"id":"51e49f4424d40b05","type":"server-state-changed","z":"f94e6838ea295ae6","g":"7ad142a183ef65f9","name":"Endring sone","server":"548a408d.14f22","version":6,"outputs":1,"exposeAsEntityConfig":"","entities":{"entity":["input_select.stromsoner"],"substring":[],"regex":[]},"outputInitially":false,"stateType":"str","ifState":"","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":150,"y":220,"wires":[["b62d7fd328ab704b"]]},{"id":"54c33a660d6ea331","type":"server-state-changed","z":"f94e6838ea295ae6","g":"7ad142a183ef65f9","name":"Oppdater","server":"548a408d.14f22","version":6,"outputs":1,"exposeAsEntityConfig":"","entities":{"entity":["input_button.oppdater_strompriser_fra_node_red"],"substring":[],"regex":[]},"outputInitially":false,"stateType":"str","ifState":"","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":false,"for":"","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":140,"y":280,"wires":[["b62d7fd328ab704b"]]},{"id":"d98fc1a906d8fab4","type":"function","z":"f94e6838ea295ae6","g":"0b5ef129958f9de4","name":"Strømstøtte med MVA","func":"msg.payload.priceData.forEach(function (hour) {\n if (hour.value > 0.9125) {\n hour.value = ((hour.value - 0.9125) * 0.9);\n }\n else {\n hour.value = 0.00;\n }\n});\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":240,"y":900,"wires":[["08a7464bac59853a"]],"icon":"node-red-contrib-calc/calculator.png"},{"id":"70015d049d7aa71a","type":"ps-receive-price","z":"f94e6838ea295ae6","g":"7ad142a183ef65f9","name":"Priser eks. MVA","x":1160,"y":300,"wires":[["a3fe80621fc24355"]]},{"id":"8ecb74d156f7c994","type":"function","z":"f94e6838ea295ae6","g":"0b5ef129958f9de4","name":"Strømstøtte uten MVA","func":"msg.payload.priceData.forEach(function (hour) {\n if (hour.value > 0.73) {\n hour.value = ((hour.value - 0.73) * 0.9);\n }\n else {\n hour.value = 0.00;\n }\n});\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":240,"y":940,"wires":[["08a7464bac59853a"]],"icon":"node-red-contrib-calc/calculator.png"},{"id":"26917e72242f60a7","type":"link out","z":"f94e6838ea295ae6","g":"7ad142a183ef65f9","name":"link out 1","mode":"link","links":["4dc5e50857367f4e","8d847b18ad9ee6f9","ef65f8c3f1264b86","a86e50e3630c0de6"],"x":1305,"y":60,"wires":[]},{"id":"a3fe80621fc24355","type":"link out","z":"f94e6838ea295ae6","g":"7ad142a183ef65f9","name":"link out 2","mode":"link","links":["4dc5e50857367f4e","8d847b18ad9ee6f9","cb9050e88ea72366","85571b0a8d72278a"],"x":1305,"y":300,"wires":[]},{"id":"8d847b18ad9ee6f9","type":"link in","z":"f94e6838ea295ae6","g":"93cb6e6098c78ecb","name":"link in 2","links":["26917e72242f60a7","a3fe80621fc24355"],"x":85,"y":620,"wires":[["161ad5e35391398f"]]},{"id":"443a219ae2fc05cf","type":"comment","z":"f94e6838ea295ae6","g":"2b32e96c52fa4f4d","name":"Videresender priser uten endring til Home Assistant","info":"","x":250,"y":400,"wires":[]},{"id":"1541b13462255f62","type":"comment","z":"f94e6838ea295ae6","g":"93cb6e6098c78ecb","name":"Beregner og videresender nettleie til Home Assistant","info":"","x":250,"y":560,"wires":[]},{"id":"7fcc7f70bc75c708","type":"comment","z":"f94e6838ea295ae6","g":"0b5ef129958f9de4","name":"Beregner og videresender strømstøtte til Home Assistant","info":"","x":260,"y":840,"wires":[]},{"id":"ef65f8c3f1264b86","type":"link in","z":"f94e6838ea295ae6","g":"0b5ef129958f9de4","name":"link in 3","links":["26917e72242f60a7"],"x":85,"y":900,"wires":[["d98fc1a906d8fab4"]]},{"id":"cb9050e88ea72366","type":"link in","z":"f94e6838ea295ae6","g":"0b5ef129958f9de4","name":"link in 4","links":["a3fe80621fc24355"],"x":85,"y":940,"wires":[["8ecb74d156f7c994"]]},{"id":"a86e50e3630c0de6","type":"link in","z":"f94e6838ea295ae6","g":"27ecc21d356a287f","name":"link in 5","links":["26917e72242f60a7"],"x":85,"y":1100,"wires":[["0c03428369051a88"]]},{"id":"985d5173cac8bb8a","type":"ha-sensor","z":"f94e6838ea295ae6","g":"2b32e96c52fa4f4d","name":"Strømpris Nordpool","entityConfig":"c16c3a98adb7bb41","version":0,"state":"payload","stateType":"str","attributes":[{"property":"Hours","value":"payload.hours","valueType":"msg"}],"inputOverride":"allow","outputProperties":[],"x":720,"y":460,"wires":[["9a88833d3709ee29"]]},{"id":"edc506dd8321670c","type":"function","z":"f94e6838ea295ae6","g":"2b32e96c52fa4f4d","name":"List alle timer","func":"let priceData = msg.payload.priceData;\nlet hours = [];\n\n// Iterer over hvert element i priceData og legg det til i hours-listen\npriceData.forEach(hourData => {\n // Opprett et objekt med starttid og pris\n let hourObj = {\n start: hourData.start, // Bruker starttiden\n price: hourData.value // Prisen\n };\n\n // Legg til objektet i hours-listen\n hours.push(hourObj);\n});\n\n// Oppdater meldingen slik at hours er direkte under msg.payload\nmsg.payload = { hours: hours };\n\n// Returner den oppdaterte meldingen\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":460,"wires":[["985d5173cac8bb8a"]]},{"id":"9a88833d3709ee29","type":"function","z":"f94e6838ea295ae6","g":"2b32e96c52fa4f4d","name":"Hent tid og pris","func":"// Hent nåværende tidspunkt og konverter til tekst.\nvar now = new Date();\nvar yyyy = now.getFullYear();\nvar mm = now.getMonth() < 9 ? \"0\" + (now.getMonth() + 1) : (now.getMonth() + 1); // getMonth() is zero-based\nvar dd = now.getDate() < 10 ? \"0\" + now.getDate() : now.getDate();\nvar hh = now.getHours() < 10 ? \"0\" + now.getHours() : now.getHours();\nvar mmm = now.getMinutes() < 10 ? \"0\" + now.getMinutes() : now.getMinutes();\nvar ss = now.getSeconds() < 10 ? \"0\" + now.getSeconds() : now.getSeconds();\n\nvar lokal_tid = hh + \":00:00\";\nvar pris = null;\nvar tidspunkt = null;\n\n// Lag en teller og sett den til null\nvar count = 0;\n\nfor (let i of msg.payload.hours) {\n if (count < 24) {\n i.timestamp = new Date(i.start).toLocaleTimeString('DE');\n // Sett prisen til 4 desimaler og konverter tilbake til et tall\n i.price = parseFloat(i.price.toFixed(4));\n if (i.timestamp === lokal_tid) {\n pris = i.price;\n tidspunkt = i.timestamp;\n }\n count++;\n } else {\n break;\n }\n}\n\nif (pris !== null) {\n var current_saving = {\n \"pris\": pris,\n \"time\": tidspunkt\n };\n msg.payload = current_saving;\n} else {\n return null;\n}\n\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":950,"y":460,"wires":[["6d8dbeb71f743074"]]},{"id":"6d8dbeb71f743074","type":"ha-sensor","z":"f94e6838ea295ae6","g":"2b32e96c52fa4f4d","name":"Strømpris Nordpool denne time","entityConfig":"22fe4db603f1be9d","version":0,"state":"payload.pris","stateType":"msg","attributes":[],"inputOverride":"allow","outputProperties":[],"x":1190,"y":460,"wires":[[]]},{"id":"4dc5e50857367f4e","type":"link in","z":"f94e6838ea295ae6","g":"2b32e96c52fa4f4d","name":"link in 1","links":["26917e72242f60a7","a3fe80621fc24355"],"x":85,"y":460,"wires":[["edc506dd8321670c"]]},{"id":"eb60512cdc73332a","type":"comment","z":"f94e6838ea295ae6","g":"27ecc21d356a287f","name":"Beregner effektiv strømpris og videresender til Home Assistant","info":"","x":280,"y":1040,"wires":[]},{"id":"c6b6246465e1c9fd","type":"comment","z":"f94e6838ea295ae6","g":"7ad142a183ef65f9","name":"Henter priser fra Nordpool sensor etter valgt strømsone","info":"","x":270,"y":60,"wires":[]},{"id":"5a670b3655d166dd","type":"comment","z":"f94e6838ea295ae6","g":"7ad142a183ef65f9","name":"Prisene blir deretter viderebehandlet i de øvrige gruppene","info":"","x":270,"y":100,"wires":[]},{"id":"85571b0a8d72278a","type":"link in","z":"f94e6838ea295ae6","g":"27ecc21d356a287f","name":"link in 6","links":["a3fe80621fc24355"],"x":85,"y":1140,"wires":[["27b75f6fad3d8e3f"]]},{"id":"0c03428369051a88","type":"function","z":"f94e6838ea295ae6","g":"27ecc21d356a287f","name":"Trekk fra strømstøtte med MVA","func":"msg.payload.priceData.forEach(function (hour) {\n if (hour.value > 0.9125) {\n hour.value = hour.value - ((hour.value - 0.9125) * 0.9);\n }\n else {\n hour.value = hour.value;\n }\n});\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":270,"y":1100,"wires":[["51ec252af8da1fbf"]],"icon":"font-awesome/fa-minus"},{"id":"27b75f6fad3d8e3f","type":"function","z":"f94e6838ea295ae6","g":"27ecc21d356a287f","name":"Trekk fra strømstøtte uten MVA","func":"msg.payload.priceData.forEach(function (hour) {\n if (hour.value > 0.73) {\n hour.value = hour.value - ((hour.value - 0.73) * 0.9);\n }\n else {\n hour.value = hour.value;\n }\n});\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":270,"y":1140,"wires":[["51ec252af8da1fbf"]],"icon":"font-awesome/fa-minus"},{"id":"fb70a11c53828b34","type":"cronplus","z":"f94e6838ea295ae6","g":"7ad142a183ef65f9","name":"Loop 10 min","outputField":"payload","timeZone":"","storeName":"","commandResponseMsgOutput":"output1","defaultLocation":"","defaultLocationType":"default","outputs":1,"options":[{"name":"schedule1","topic":"topic1","payloadType":"default","payload":"","expressionType":"cron","expression":"1-59/10 * * * *","location":"","offset":"0","solarType":"all","solarEvents":"sunrise,sunset"}],"x":150,"y":160,"wires":[["b62d7fd328ab704b"]]},{"id":"e7943f6ff3099b52","type":"ps-strategy-lowest-price","z":"f94e6838ea295ae6","g":"c9b61bf8849ca55a","name":"Laveste pris - 6 timer/døgn","fromTime":"00","toTime":"00","hoursOn":"13","maxPrice":"","doNotSplit":false,"sendCurrentValueWhenRescheduling":true,"outputValueForOn":"true","outputValueForOff":"false","outputValueForOntype":"bool","outputValueForOfftype":"bool","outputIfNoSchedule":"true","outputOutsidePeriod":"true","contextStorage":"memory","x":620,"y":1520,"wires":[["b344750f024d7e79"],["c1cdf6fcef33f400"],["ae602b8b3663b25b"]]},{"id":"1dd995e3eadc407c","type":"ha-sensor","z":"f94e6838ea295ae6","g":"c9b61bf8849ca55a","name":"Powersaver Payload","entityConfig":"9da2acfb4a624041","version":0,"state":"payload","stateType":"str","attributes":[{"property":"Schedule","value":"payload.schedule","valueType":"msg"},{"property":"Hours","value":"payload.hours","valueType":"msg"},{"property":"Control","value":"payload.hours[0].onOff","valueType":"str"},{"property":"Current","value":"payload.current","valueType":"str"}],"inputOverride":"allow","outputProperties":[],"x":1220,"y":1720,"wires":[[]]},{"id":"b10c4cf94df25f98","type":"comment","z":"f94e6838ea295ae6","g":"c9b61bf8849ca55a","name":"Sender AV/PÅ verdier for powersaver til Home Assistant","info":"","x":1060,"y":1660,"wires":[]},{"id":"130057e897701718","type":"comment","z":"f94e6838ea295ae6","g":"c9b61bf8849ca55a","name":"Slår av og på enheter i Home Assistant","info":"","x":650,"y":1440,"wires":[]},{"id":"ae602b8b3663b25b","type":"function","z":"f94e6838ea295ae6","g":"c9b61bf8849ca55a","name":"Konverter til 1/0 for AV/PÅ","func":"msg.payload.hours.forEach(h => h.onOff = h.onOff ? \"1\" : \"0\")\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":970,"y":1720,"wires":[["1dd995e3eadc407c"]]},{"id":"b344750f024d7e79","type":"api-call-service","z":"f94e6838ea295ae6","g":"c9b61bf8849ca55a","name":"Turn on","server":"548a408d.14f22","version":7,"debugenabled":false,"action":"input_boolean.turn_on","floorId":[],"areaId":[],"deviceId":[],"entityId":["input_boolean.powersaver"],"labelId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","blockInputOverrides":false,"domain":"input_boolean","service":"turn_on","x":920,"y":1500,"wires":[[]]},{"id":"c1cdf6fcef33f400","type":"api-call-service","z":"f94e6838ea295ae6","g":"c9b61bf8849ca55a","name":"Turn off","server":"548a408d.14f22","version":7,"debugenabled":true,"action":"input_boolean.turn_off","floorId":[],"areaId":[],"deviceId":[],"entityId":["input_boolean.powersaver"],"labelId":[],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","blockInputOverrides":false,"domain":"input_boolean","service":"turn_off","x":920,"y":1560,"wires":[[]]},{"id":"e8ec76a566ddfb1a","type":"ha-entity-config","server":"548a408d.14f22","deviceConfig":"","name":"Strømpris støtte","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Strømpris støtte"},{"property":"icon","value":""},{"property":"entity_picture","value":""},{"property":"entity_category","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":""},{"property":"state_class","value":""}],"resend":false,"debugEnabled":false},{"id":"1adcd9d742d5b658","type":"ha-entity-config","server":"548a408d.14f22","deviceConfig":"","name":"Strømpris effektiv","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Strømpris effektiv"},{"property":"icon","value":""},{"property":"entity_picture","value":""},{"property":"entity_category","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":""},{"property":"state_class","value":""}],"resend":false,"debugEnabled":false},{"id":"f22668aa573dfa90","type":"ha-entity-config","server":"548a408d.14f22","deviceConfig":"","name":"Strømpris støtte denne time","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Strømpris støtte denne time"},{"property":"icon","value":""},{"property":"entity_picture","value":""},{"property":"entity_category","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":""},{"property":"state_class","value":""}],"resend":false,"debugEnabled":false},{"id":"939b2c2e962ba7a3","type":"ha-entity-config","server":"548a408d.14f22","deviceConfig":"","name":"Strømpris effektiv denne time","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Strømpris effektiv denne time"},{"property":"icon","value":""},{"property":"entity_picture","value":""},{"property":"entity_category","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":""},{"property":"state_class","value":""}],"resend":false,"debugEnabled":false},{"id":"3bb5ad11c8c5da5a","type":"ha-entity-config","server":"548a408d.14f22","deviceConfig":"","name":"Strømpris nettleie","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Strømpris nettleie"},{"property":"icon","value":""},{"property":"entity_picture","value":""},{"property":"entity_category","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":""},{"property":"state_class","value":""}],"resend":false,"debugEnabled":false},{"id":"8a294585ae707fdd","type":"ha-entity-config","server":"548a408d.14f22","deviceConfig":"","name":"Strømpris nettleie denne time","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Strømpris nettleie denne time"},{"property":"icon","value":""},{"property":"entity_picture","value":""},{"property":"entity_category","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":""},{"property":"state_class","value":""}],"resend":false,"debugEnabled":false},{"id":"548a408d.14f22","type":"server","name":"Home Assistant","addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"","connectionDelay":false,"cacheJson":false,"heartbeat":false,"heartbeatInterval":"","statusSeparator":"","enableGlobalContextStore":false},{"id":"c16c3a98adb7bb41","type":"ha-entity-config","server":"548a408d.14f22","deviceConfig":"","name":"Strømpris Nordpool","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Strømpris Nordpool"},{"property":"icon","value":""},{"property":"entity_picture","value":""},{"property":"entity_category","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":""},{"property":"state_class","value":""}],"resend":false,"debugEnabled":false},{"id":"22fe4db603f1be9d","type":"ha-entity-config","server":"548a408d.14f22","deviceConfig":"","name":"Strømpris Nordpool denne time","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Strømpris Nordpool denne time"},{"property":"icon","value":""},{"property":"entity_picture","value":""},{"property":"entity_category","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":""},{"property":"state_class","value":""}],"resend":false,"debugEnabled":false},{"id":"9da2acfb4a624041","type":"ha-entity-config","server":"548a408d.14f22","deviceConfig":"","name":"Powersaver Payload","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Powersaver Payload"},{"property":"icon","value":""},{"property":"entity_picture","value":""},{"property":"entity_category","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":""},{"property":"state_class","value":""}],"resend":false,"debugEnabled":false}]


Etter at du har importert denne er det viktig at du sjekker oppsett for server og sikrer at det er koblet mot din Home Assistant instans.

Gå inn på hver enkelt av de BLÅ nodene og endre server til din egen.


De 2 BLÅ nodene for "Turn on" og "Turn off" er eksempler på hvordan du kan slå av eller på f.eks. en bryter. Her bytter du ut med en av dine enheter som passer med ditt behov. Eks. din VVB.

ree

Deretter kan du justere nodene for nettleie, eventuelt påslag (eks. Tibber 2 øre), og nettleie. Det er nå de ORANGE nodene vi skal justere litt på. De er rimelig selvforklarende, bare dobbeltklikk for å åpne dem og endre til dine foretrukne verdier. Du kan fjerne den ene noden om din nettleverandør har lik sats hele uken.


I "Lavest pris" noden setter du verdien for hvor mange timer du vil at Powersaver skal være aktiv. Det vil si hvor mange timer du f.eks. skal la en VVB stå på.


Alle orange noder med grønn bakgrunn må gjennomgås og endres slik at de passer med din strømavtale og egne ønsker.

ree

Husk at du må publisere flyten din i Node-RED ved å velge Deploy knappen oppe til høyre.


Vi nevner også at det er mulig å bruke Tibber API i Node-Red som inngang til noden Price Receiver i Node-RED. Vår erfaring er at Tibber API har vært mer stabil enn Nordpool integrasjonen i Home Assistant.


Da har vi fått på plass flyten i Node-Red som sender oss priser til Home Assistant.

I home assistant skal vi nå finne igjen dette som sensorer.

ree

De som inneholder verdien Payload er array som returnerer alle priser for 24 eller 48 timer i attributtene til sensoren. Disse skal vi bruke som utgangspunkt for apex kort som viser detaljerte priser.

Powersaver Payload returnerer informasjon om pris per time, samt ON/OFF data for når vi har valgt at VVB skal være på i vårt eksempel. Denne bruker vi også i et apex kort.

De andre sensorene viser aktuelle priser nåværende time og kan brukes til f.eks. beregning av kostnad på dine stømsensorer ved hjelp av f.eks. template sensor som ganger forbruk med kostnad.

Eksempel på en slik sensor


- platform: template sensors: kostnad_per_time_vvb: friendly_name: "Kostnad per time VVB" unique_id: kostnad.per.time.vvb unit_of_measurement: "NOK" value_template: >- {% set EffektivPris = states('sensor.effektiv_pris_etter_stotte_nr') | float %} {% set ForbrukTime = states('sensor.vvb_time') |float %} {{ EffektivPris*ForbrukTime | round(3) }}



La oss vise produksjonen vår i et dashbord


Om alt har gått fint hittil skal vi ha alt vi trenger for å kunne sette opp Apex kort i et dashbord.

Har du ikke allerede Apex kort tilgjengelig for å legge ut i dashbord finner du dette i HACS, søk etter apexcharts-card


Sjekk også om du har installert Mushroom Card. Du finner de eventuelt i HACS. Da tester vi! Lykke til! Legg til et nytt kort på et dashbord, velg manuell og kopier inn denne koden!

Kort for strømpriser

type: vertical-stack

cards:

- type: vertical-stack

cards:

- type: custom:mushroom-select-card

entity: input_select.stromsoner

name: Strømsone

- type: custom:apexcharts-card

graph_span: 48h

header:

title: ''

show: true

span:

start: day

apex_config:

chart:

height: 300px

now:

show: true

label: Nå

experimental:

color_threshold: true

yaxis:

- id: pris

opposite: false

decimals: 2

min: 0

apex_config:

tickAmount: 5

labels:

show: true

legend:

- show: false

- id: powersaver

opposite: true

decimals: 0

apex_config:

tickAmount: 7

labels:

show: false

legend:

- show: false

series:

- entity: sensor.strompris_effektiv

name: Effektiv Strømpris

opacity: 1

float_precision: 2

extend_to: now

yaxis_id: pris

curve: stepline

color: tomato

stroke_width: 2

show:

legend_value: false

in_header: true

name_in_header: false

datalabels: false

data_generator: |

const data = entity.attributes.hours.map(hour => {

return [new Date(hour.start), hour.price];

});

if (data.length > 0) {

const lastDataPoint = data[data.length - 1];

const lastTime = new Date(lastDataPoint[0]);

const nextTime = new Date(lastTime.getTime() + 60 * 60 * 1000); // Legger til en time

data.push([nextTime, lastDataPoint[1]]); // Kopierer prisen fra siste datapunkt

}

return data;

- entity: sensor.strompris_nordpool

name: Nordpool

opacity: 1

float_precision: 2

extend_to: now

yaxis_id: pris

curve: stepline

color: 6B9EFF

stroke_width: 1

show:

legend_value: false

in_header: true

name_in_header: false

datalabels: false

data_generator: |

const data = entity.attributes.hours.map(hour => {

return [new Date(hour.start), hour.price];

});

if (data.length > 0) {

const lastDataPoint = data[data.length - 1];

const lastTime = new Date(lastDataPoint[0]);

const nextTime = new Date(lastTime.getTime() + 60 * 60 * 1000); // Legger til en time

data.push([nextTime, lastDataPoint[1]]); // Kopierer prisen fra siste datapunkt

}

return data;

- entity: sensor.strompris_stotte

name: Strømstøtte

opacity: 1

float_precision: 2

extend_to: now

yaxis_id: pris

curve: stepline

color: green

stroke_width: 1

show:

legend_value: false

in_header: true

name_in_header: false

datalabels: false

data_generator: |

const data = entity.attributes.hours.map(hour => {

return [new Date(hour.start), hour.price];

});

if (data.length > 0) {

const lastDataPoint = data[data.length - 1];

const lastTime = new Date(lastDataPoint[0]);

const nextTime = new Date(lastTime.getTime() + 60 * 60 * 1000); // Legger til en time

data.push([nextTime, lastDataPoint[1]]); // Kopierer prisen fra siste datapunkt

}

return data;

- entity: sensor.strompris_nettleie

name: Nettleie

opacity: 1

float_precision: 2

extend_to: now

yaxis_id: pris

curve: stepline

color: DDA20D

stroke_width: 1

show:

legend_value: false

in_header: true

name_in_header: false

datalabels: false

data_generator: |

const data = entity.attributes.hours.map(hour => {

return [new Date(hour.start), hour.price];

});

if (data.length > 0) {

const lastDataPoint = data[data.length - 1];

const lastTime = new Date(lastDataPoint[0]);

const nextTime = new Date(lastTime.getTime() + 60 * 60 * 1000); // Legger til en time

data.push([nextTime, lastDataPoint[1]]); // Kopierer prisen fra siste datapunkt

}

return data;

- type: vertical-stack

cards:

- type: custom:apexcharts-card

header:

show: true

title: Pris i dag + Forbruk + Powersaver

now:

show: true

label: Nå

graph_span: 2d

span:

start: day

apex_config:

chart:

height: 400px

stroke:

width: 2

dataLabels:

enabled: true

fill:

type: gradient

gradient:

shadeIntensity: 1

inverseColors: true

opacityFrom: 0.8

opacityTo: 0.2

legend:

show: true

yaxis:

- id: price

show: true

min: 0

max: 2.5

tickAmount: 6

opposite: true

decimalsInFloat: 1

floating: false

forceNiceScale: true

extend_to: end

- id: usage

show: true

min: 0

max: 10

tickAmount: 6

decimalsInFloat: 1

floating: false

forceNiceScale: true

extend_to: end

- id: powersaver

show: false

decimalsInFloat: 0

floating: false

extend_to: now

series:

- entity: sensor.strompris_effektiv

yaxis_id: price

extend_to: now

name: Faktisk strømpris

type: area

curve: stepline

color: tomato

float_precision: 2

show:

legend_value: false

data_generator: |

return entity.attributes.hours.map((entry) => {

return [new Date(entry.start), entry.price];

});

- entity: sensor.forbruk_aquara_smart_plugg_time

yaxis_id: usage

type: column

name: Forbruk

time_delta: +30m

group_by:

func: max

show:

legend_value: false

- entity: sensor.powersaver_payload

data_generator: |

return entity.attributes.hours.map((entry) => {

return [new Date(entry.start), entry.onOff];

});

yaxis_id: powersaver

name: Power Saver

type: area

color: rgb(0, 255, 0)

opacity: 0.1

stroke_width: 1

curve: stepline

group_by:

func: max

show:

legend_value: false

in_header: false

name_in_header: false

datalabels: false

view_layout:

position: main



Gikk dette bra da?


Du har kanskje fått alt til, men sitter allikevel igjen med denne feilen?

ree

I vårt eksempel har vi brukt switch.aquara_smart_plugg for å illustrere hvordan du kan slå av og på en bryter ved hjelp av Powersaver i Node-RED.

Denne henter vi igjen i Apex kortet, men nå som en forbruks-sensor for å vise forbruket som søyler.


Her må du bytte ut slik at det passer med ditt oppsett.

Til slutt kan vi om ønskelig sette litt automasjon ved hjelp av reload automasjon og sette funksjoner til knappene vi har laget. Her er en blueprint plukket opp fra Erlend Sellie som kan brukes for å forenkle automasjon og auto-oppdatering av Nordpool sensorene.

Nordpool Blueprint


blueprint: name: Nordpool - Reload Integration description: Reload Nordpool Integration When the API fails to fetch new data, or the sensor becomes unavailable or unknown. domain: automation input: entity: name: Nordpool Sensor description: Your Nordpool Sensor selector: entity: integration: nordpool domain: sensor multiple: false notify: name: Notify description: Notify with a Persistent Notification in Home Assistant whenever the Nordpool integration is reloaded. default: true selector: boolean: {} source_url: https://github.com/erlendsellie/HomeAssistantConfig/blob/master/blueprints/automation/erlendsellie/nordpool_reload.yaml mode: single max_exceeded: silent trigger_variables: entity: !input 'entity' trigger: - platform: template value_template: "{%set nordpool = states[entity]%} {%if nordpool.attributes.tomorrow\ \ is defined %}\n {%set tomorrow = nordpool.attributes.tomorrow %}\n {%set tomorrowvalue\ \ = tomorrow[1] or 0 | float(default=0) %}\n{%else%}\n {%set tomorrowvalue =\ \ 0 %}\n{%endif%} {%set shouldBeValid = (now().hour > 13) and (now().minute\ \ > 0)%} {{shouldBeValid and tomorrowvalue < 0.01}}" for: minutes: 1 - platform: template value_template: "{%set nordpool = states[entity]%} {%if nordpool.attributes.tomorrow\ \ is defined %}\n {%set tomorrow = nordpool.attributes.tomorrow %}\n {%set tomorrowvalue\ \ = tomorrow[1] or 0 | float(default=0) %}\n{%else%}\n {%set tomorrowvalue =\ \ 0 %}\n{%endif%} {%set shouldBeValid = (now().hour > 12) and (now().minute\ \ > 45)%} {{shouldBeValid and tomorrowvalue < 0.01}}" for: minutes: 1 - platform: template value_template: "{%set nordpool = states[entity]%} {%if nordpool.attributes.tomorrow\ \ is defined %}\n {%set tomorrow = nordpool.attributes.tomorrow %}\n {%set tomorrowvalue\ \ = tomorrow[1] or 0 | float(default=0) %}\n{%else%}\n {%set tomorrowvalue =\ \ 0 %}\n{%endif%} {%set shouldBeValid = (now().hour > 12) and (now().minute\ \ > 30)%} {{shouldBeValid and tomorrowvalue < 0.01}}" for: minutes: 1 - platform: template value_template: "{%set nordpool = states[entity]%} {%if nordpool.attributes.tomorrow\ \ is defined %}\n {%set tomorrow = nordpool.attributes.tomorrow %}\n {%set tomorrowvalue\ \ = tomorrow[1] or 0 | float(default=0) %}\n{%else%}\n {%set tomorrowvalue =\ \ 0 %}\n{%endif%} {%set shouldBeValid = (now().hour > 12) and (now().minute\ \ > 15)%} {{shouldBeValid and tomorrowvalue < 0.01}}" for: minutes: 1 - platform: template value_template: "{%set nordpool = states[entity]%} {{\n nordpool == 'unknown' or\n\ \ nordpool == 'unavailable'\n}}" for: minutes: 1 action: - variables: entity: !input 'entity' notify: !input 'notify' - service: homeassistant.reload_config_entry entity_id: !input 'entity' - condition: '{{ notify == true }}' - delay: seconds: 10 - service: persistent_notification.create data: title: Nordpool var utilgjengelig, relastet integrasjonen message: State nå er {{states(entity)}}


Bruk dette blueprint til å opprette egne automasjoner for hver av de 5 strømsonene så skal den i teorien oppdatere Nordpool når den mister data.

ree


Du kan også lage en "Master" automasjon som trigger alle de individuelle for hver sensor. Det er også denne som trigges ved "Klikk" på knappen oppdater Nordpool priser vi laget tidligere.

Nordpool Omstart Alle


alias: Norpool Reload ALL

description: ""

trigger:

- platform: state

entity_id:

- input_button.oppdater_nordpool

condition: []

action:

- service: automation.trigger

data:

skip_condition: true

target:

entity_id:

- automation.nordpool_reload_01

- automation.nordpool_reload_02

- automation.nordpool_reload_03

- automation.nordpool_reload_04

- automation.nordpool_reload_05

mode: single



Det er mulig du må sjekke og endre litt i hvordan disse automasjonene skal brukes hos deg, men har du kommet hit antar vi at du er i stand til å få i mål dette også om du ønsker.


Domotics leverer ferdig installerte løsniger for Home Assistant. Våre bokser har tilsvarende denne løsnig for strømstyring allerede installret.



Takk for at du tok deg tid til å lese gjennom vår blogg! Har du innspill til endringer eller andre kommentarer ser vi frem til å se din kommentar under.


Denne bloggen skrives som inspirasjon til andre smarthus entusiaster og er tett knyttet opp til Domotics. Vi kan desverre ikke tilby support på denne bloggen, men hører gjerne fra deg om du trenger hjelp til ditt smart-hus prosjekt.


Takk!


Domotics

Comments


bottom of page