Posun spotřeby TČ do levnější cen vs. výhodnější COP přes den vůči noci

Se změnou tarifikace alá Vitásková II, různých flexibilních tarifů a počítání 1/4 h. nás asi všechny čeká přechod na smart odběry energie. Jinak než se spotem to nepůjde. Jsem rád na vše připraven a jelikož mě na zahradě letos přibyl žrout s názvem TČ je potřeba se nad vším zamyslet.
Mám na střeše FVE s roční výrobou cca 8,2 MWh. Celková plánovaná spotřeba domu s TČ bude někde kolem 13 MWh, tedy aspoň doufám.
Jedu již 4 rokem viruálku od ČEZu, f. baterii jsem měl, ale v důsledku požárů LG v Australii (měl jsem stejný typ) šla pro jistotu z domu. Pro SolarEdge moc komp. baterií není.
Následný AC coupling na Victronu jsem zatím odpískal.

Tedy úvaha je zatím taková, že bych mohl řídit spotřebu TČ dle spotu. S HA si již nějkolik let tykám, nějaké automatizace již mám zasebou. Stejně jako v PLC Unipi. TČ má Smart Grid, kdy se dá řidit externím příkazem.

Jen by mě zajímalo, zda někdo již TČ takto posouvá a zda proti tomu porovnával lepší COP přes den v důsledku vyšší teploty.

Díky

2 Likes

Udělal jsem rychlý výpočet z ceny z 7.2.2023. Teplota v 3.00 byla -8C, teplota v 13.00 byla -1C.
COP byl 2 a 3. Cena byla na spotu 140 a 151e, takže dost podobná. Jen COP v tom udělal docela velký neprospěch vůči noci.

Zajimavá úvaha! TC mam, ale k tomuhle detailu jsem se jeste nedostal… To COP je wild guess nebo to je od vyrobce? Asi by to chtelo napocitat na delsim vzorku dat, coz urcite udelame. Na rizeni TC se chystame, takze tohle je pro nas skvely napad!

Jo COP je od výrobce zatím z grafu. Letos pojedu TČ první sezonu, tak budu zaznamenávat údaje.
Chystám automatizaci v HA podle předpovědi počasí, chci vynechávat dvě hodiny s nejnižší předpovědí z 12. Reset vždy v 0.00 a 12.00, kontrola aktuálního času v seznamu každou hodinu. Uvidím, jak se to bude chovat. Pokud by byly velké rozdíly v teplotách přes noc a den, tak COP zmaří surf do nižších nočních cen. Jedu virtuálku, takže cena bude závyslá na mnoha faktorech. V HA s Vaší integrací porovnávám měsíční virtuální nákup/prodej na spotu bez odkládání spotřeby. Jsem moc zvědav na výsledek oproti virtuálce od ČEZu.

Budu moc rad za update! Ceka me taky prvni sezona s TC (ridim pres HA), tak jsem zvedavej, jak to bude nejlepsi ridit :slight_smile:

Jde o to, že po posledním update HA blbne hodinová předpověď, není vidět jako entita.
Zkoušíme udělat nějaké flow do NR, kde taháme data pomocí API z Met.no.
Ale kdyby někdo udělal :slight_smile: integraci, podobnou té Vaší s cenou spotu,kde by z ní vyšly entity na spínání jakéhokoliv zdroje, který je závyslý na okolní teplotě asi bych se nezlobil.
Podrobnosti bych dodal. A finále může být i kombinace s odkladem spotřeby jak dle spotu, tak i dle předpovědi počasí :slight_smile:

Tak už to testuju, zatím jen spínám relé :slight_smile:

ahoj, byl bys ochotny poskytnout flow? docela by se mi presne toto hodilo…
dekuji

Jasně. Prosím změň si API já jsem vymazal konec GPS.

[{"id":"6eff21b1065e821b","type":"tab","label":"Test - Forecast","disabled":false,"info":"","env":[]},{"id":"cff395a1865a8290","type":"config","z":"6eff21b1065e821b","name":"Flow variables","properties":[{"p":"metNoUrlParams","pt":"flow","to":"{\"lat\":\"50.1386825\",\"lon\":\"14.\"}","tot":"json"}],"active":true,"x":160,"y":100,"wires":[]},{"id":"7045b0865d8d4cdf","type":"cronplus","z":"6eff21b1065e821b","name":"Run at midnight/day","outputField":"payload","timeZone":"Europe/Prague","storeName":"default","commandResponseMsgOutput":"output1","defaultLocation":"","defaultLocationType":"default","outputs":1,"options":[{"name":"schedule1","topic":"topic","payloadType":"flow","payload":"metNoUrlParams","expressionType":"cron","expression":"0 1 0 * * * *","location":"","offset":"0","solarType":"all","solarEvents":"sunrise,sunset"},{"name":"schedule2","topic":"topic","payloadType":"flow","payload":"metNoUrlParams","expressionType":"cron","expression":"0 1 12 * * * *","location":"","offset":"0","solarType":"all","solarEvents":"sunrise,sunset"}],"x":160,"y":240,"wires":[["360a1cf52b4d6dd2"]]},{"id":"360a1cf52b4d6dd2","type":"http request","z":"6eff21b1065e821b","name":"","method":"GET","ret":"obj","paytoqs":"query","url":"https://api.met.no/weatherapi/locationforecast/2.0/compact","tls":"445fbf524156a600","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":390,"y":240,"wires":[["f21c3efa82b19b91","9f6c4c4e02d86395"]]},{"id":"4db6941b8877cd3f","type":"debug","z":"6eff21b1065e821b","name":"debug 5","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":830,"y":240,"wires":[]},{"id":"fdc49c7c518d43ba","type":"inject","z":"6eff21b1065e821b","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"trigger","payload":"schedule1","payloadType":"str","x":180,"y":340,"wires":[["7045b0865d8d4cdf"]]},{"id":"f21c3efa82b19b91","type":"function","z":"6eff21b1065e821b","name":"ProcessForecast","func":"let todayForecast = {};\nlet hourlyForecastArr = [];\n\nlet today = new Date();\ntodayForecast['today'] = today.getFullYear() + '-' + ('00' + today.getMonth()).slice(-2) + '-' + ('00' + today.getDate()).slice(-2);\n\nlet httpResponse = msg.payload;\n\nif (httpResponse && httpResponse.properties.timeseries && httpResponse.properties.timeseries.length > 0) {\n    for (let idx in httpResponse.properties.timeseries) {\n        let frc = httpResponse.properties.timeseries[idx];\n        let frcDate = new Date(frc.time);\n        if (today.getFullYear() == frcDate.getFullYear() && today.getMonth() == frcDate.getMonth() && today.getDate() == frcDate.getDate()) {\n            hourlyForecastArr.push({\n                \"hour\": frcDate.getHours(),\n                \"temp\": frc.data.instant.details.air_temperature\n            })\n        }\n    }\n}\n\n//node.warn(\"ProcessForecast / hourlyForecastArr (original): \" + JSON.stringify(hourlyForecastArr));\n\n// Sort by temperature - ascending\nhourlyForecastArr.sort(function (a, b) { return a.temp - b.temp });\n//node.warn(\"ProcessForecast / hourlyForecastArr (sorted): \" + JSON.stringify(hourlyForecastArr));\n\n// Remove X lowest values\nhourlyForecastArr = hourlyForecastArr.slice(2);\n//node.warn(\"ProcessForecast / hourlyForecastArr (lowest removed): \" + JSON.stringify(hourlyForecastArr));\n\n// Sort by hour - ascending\nhourlyForecastArr.sort(function (a, b) { return a.hour - b.hour });\n\ntodayForecast.hourly = hourlyForecastArr;\n\nnode.warn(\"ProcessForecast / todayForecast: \" + JSON.stringify(todayForecast));\n\nflow.set('todayForecast', todayForecast);\n\nmsg.payload = 'success';\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":610,"y":240,"wires":[["4db6941b8877cd3f","9f6c4c4e02d86395"]]},{"id":"ae574389518816cd","type":"inject","z":"6eff21b1065e821b","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":680,"wires":[["9604c7b01091037b"]]},{"id":"9604c7b01091037b","type":"function","z":"6eff21b1065e821b","name":"Print forecast","func":"node.warn(flow.get('todayForecast'));\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":330,"y":680,"wires":[[]]},{"id":"24cdc28e827bab36","type":"cronplus","z":"6eff21b1065e821b","name":"Run 1 min past the hour","outputField":"payload","timeZone":"Europe/Prague","storeName":"default","commandResponseMsgOutput":"output1","defaultLocation":"","defaultLocationType":"default","outputs":1,"options":[{"name":"schedule1","topic":"topic","payloadType":"default","payload":"","expressionType":"cron","expression":"0 1 * * * * *","location":"","offset":"0","solarType":"all","solarEvents":"sunrise,sunset"}],"x":190,"y":480,"wires":[["52058f7305cc307a"]]},{"id":"52058f7305cc307a","type":"function","z":"6eff21b1065e821b","name":"CheckHourMatch","func":"let currHour = new Date().getHours();\nnode.warn(\"CheckHourMatch / currHour: \" + currHour);\n\nlet todayFrc = flow.get('todayForecast') || {};\nnode.warn(\"CheckHourMatch / todayFrc: \" + JSON.stringify(todayFrc));\n\nfunction matchHour(arrItem) {\n    return arrItem.hour == currHour;\n}\n\nlet hourRec = todayFrc.hourly.find(matchHour);\nnode.warn(\"CheckHourMatch / hourRec: \" + JSON.stringify(hourRec));\n\nif (hourRec && hourRec.temp) {\n    msg.payload = 'match';\n\n} else {\n    msg.payload = 'no-match';\n}\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":450,"y":480,"wires":[["d460303b363e4cb5","4db6941b8877cd3f"]]},{"id":"e239130c3c520188","type":"inject","z":"6eff21b1065e821b","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"02 00 * * *","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":250,"y":540,"wires":[["52058f7305cc307a"]]},{"id":"d460303b363e4cb5","type":"switch","z":"6eff21b1065e821b","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"match","vt":"str"},{"t":"else"}],"checkall":"false","repair":false,"outputs":2,"x":650,"y":480,"wires":[["f149bd8788fa85e1"],["a1032edb0fc8a34c"]]},{"id":"05364b0dea66e8df","type":"comment","z":"6eff21b1065e821b","name":"Met.no API Parameters","info":"","x":140,"y":60,"wires":[]},{"id":"509fbac100dee645","type":"comment","z":"6eff21b1065e821b","name":"Retrieve forecast","info":"","x":120,"y":200,"wires":[]},{"id":"73a6ce072a523f87","type":"comment","z":"6eff21b1065e821b","name":"Check forecast & execute","info":"","x":150,"y":440,"wires":[]},{"id":"16a091e47192778a","type":"comment","z":"6eff21b1065e821b","name":"Print current forecast","info":"","x":130,"y":640,"wires":[]},{"id":"9f6c4c4e02d86395","type":"flogger","z":"6eff21b1065e821b","name":"DebugLog - Test Forecast","logfile":"hassio-node-red-test-forecast.log","inputchoice":"fullmsg","inputobject":"payload","inputobjectType":"msg","inputmoustache":"Recieved payload {{payload}} and topic {{topic}}","loglevel":"TRACE","logconfig":"ac267ea71d752dcd","sendpane":true,"x":1070,"y":140,"wires":[[]]},{"id":"a1032edb0fc8a34c","type":"api-call-service","z":"6eff21b1065e821b","name":"HDO ON","server":"32d979eb.46fec6","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":["switch.tc_switch_temperature_l2"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":840,"y":520,"wires":[[]]},{"id":"f149bd8788fa85e1","type":"api-call-service","z":"6eff21b1065e821b","name":"HDO OFF","server":"32d979eb.46fec6","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":["switch.tc_switch_temperature_l2"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":840,"y":380,"wires":[[]]},{"id":"445fbf524156a600","type":"tls-config","name":"","cert":"","key":"","ca":"","certname":"","keyname":"","caname":"Expert_Logic_CA_Bundle.crt","servername":"","verifyservercert":false,"alpnprotocol":""},{"id":"ac267ea71d752dcd","type":"config-log","logname":"Default","logdir":"/share/","stamp":"local","logstyle":"plain","logrotate":true,"logcompress":false,"logrotatecount":"5","logsize":"1000"},{"id":"32d979eb.46fec6","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30,"areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true}]

diky, pri pokusu o import mi to hlasi tyhle chyby
image

tak jsem vyresil vsechny krom api-call-service a server. zkousel jsem naimportovat palette node-red-contrib-home-assistant ale import mi skonci s unknown error :frowning:

Ve flow variables (nodka úplně nahoře) jsi změnil svoje GPS? Myslím, že http request tuhle nodku pak volá. A server je dle mého nastavení serveru Home asistant - musíš zadat ten svůj.

Dej sem pak fotku flow

Screenshot 2023-10-11 at 22-20-20 Node-RED – Home Assistant
Tam je i ten server

diky, uz se mi to povedlo a posila to commandy do home assistantu. Ze zacatku jsem zkousel spatnou paletu, pak jsem zkusil tu home-assistant-websocket a musel rucne zadat adresu serveru s HA. Ted jeste pochopit tu logiku, protoze mi to posila command OFF, i kdyz je teplo.

Logiku na konci si klidně prohod. Stačí predrarovat nodky. O půlnoci a ve 12 to načítá předpověď. Z předpovědi vždy vyřadí dvě hodiny s nejnižší teplotou. Následně porovnává aktuální hodinu s hodinou v seznamu zda je povolena. A dle toho buď sepne či vypne switch. Tam si taky dej identitu dle tvého ovládacího prvku

rozumim, diky moc, zkusim to jeste spojit se spotem, aby to eliminovalo vysokou cenu.

Právě na tom dělám, ale zatím se mě nedaří ty dvě podmínky propojit. Přes ty switche neproleze ta druhá zprávy, aby mohl ten druhý switch vykonat co se od něja očekává.

Mám to.


Tak nějaké update.
Nemá smysl řešit nějaké teplotní výkyvy 1-2C. O 10 by to bylo jiné, to se zatím neděje.
Co mě ale spíše “štve” je, že AKU o objemu 300L dokážu vybrat za 1-2 hod. dle venkovní teploty. Topím do rad. objem vody cca 150L. Mám bufer v AKU 11
C. Což je u 300L cca 4 kWh tepelné energie. Teplotní spád u rad. bývá kolem 8*C a právě zpátečka ochlazuje AKU více než jsem se myslel. TZ domu je někde kolem 10 kW.
Při myšlence na posun ohřevu dle možného spotu - jedu zatím virtuálku, nejsem moc v kladných myšlenkách. Šel by vypnout ohřev ve 4 nejdrahších hodinách, ale to je asi tak vše co by s tím šlo dělat.
Další možnost je AC coupling na stávající FVE s bateripackem o 30 kWh. Tím by se dalo rozšířit spotové sufrování, ale pokud budu počítat rozdíl v cenách 1,5Kč bylo by to z 25 kWh cc 40 Kč denně. Za možných 5 měsíců topné sezony je to cca 6000,- Kč.
Zatím to nevidím nadějně. Mám u nákupu v HA ceny ze spotu a počítám tím možnou cenu za energii, pokud bych byl na spotu a nic neřídil. Za minulý měsíc jsem na 2,9Kč.

@Beny44 aktualne to taky resim a nepodarilo se mi od vyrobce najit zavislost COP na venkovni teplote a teplote vody - podle ceho urcujete COP vy?