Sterowanie oddawaniem energii w zależności od cen RCE w Polsce
Flow pobiera dane z API PSE i kiedy w danych godzinach ceny energii są ujemne to wyłącza oddawanie nadwyżki do sieci. Skutkuje to ograniczeniem produkcji z MPPT lub falowników AC sparowanych z Victron i zgodnych z Sunspec (Fronius, Solaredge) do bieżącego zapotrzebowania. Aktualnie na szczęście jeszcze prosumenci nie muszą płacić cen ujemnych, ale oddawana energia w godzinach cen ujemnych jest całkowicie za darmo. Ten flow stara się w tych godzinach nie oddawać nic.
[{"id":"6db4dd3fbbeaf3f7","type":"inject","z":"fb53daaa04b19012","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"0 6-8 * * *","once":true,"onceDelay":0.1,"topic":"","payload":"iso","payloadType":"date","x":190,"y":220,"wires":[["4980eda1c8e18b02"]]},{"id":"274c4b7ee250381c","type":"http request","z":"fb53daaa04b19012","name":"Get from pse","method":"GET","ret":"obj","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":590,"y":220,"wires":[["e50d867da7f8a020","a4faee0d873583ea"]]},{"id":"4980eda1c8e18b02","type":"function","z":"fb53daaa04b19012","name":"Parse api data","func":"//msg.payload = new Date(msg.payload);\n//var temp = msg.payload.split('T')[0];\nmsg.payload = new Date(msg.payload);\nvar temp = msg.payload.toISOString().split('T')[0];\nmsg.url = \"https://api.raporty.pse.pl/api/rce-pln?$filter=doba eq '\" + temp + \"'\"; \nreturn msg;\n\n//https://api.raporty.pse.pl/api/rce-pln?$filter=doba eq '{day}'","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":380,"y":220,"wires":[["274c4b7ee250381c"]]},{"id":"3534c9319e78cbee","type":"debug","z":"fb53daaa04b19012","name":"Zakres cen ujemnych","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1100,"y":240,"wires":[]},{"id":"e50d867da7f8a020","type":"function","z":"fb53daaa04b19012","name":"Select negative periods","func":"// Pobierz dane z msg.payload\nconst data = msg.payload.value;\n\n// Inicjalizacja zmiennych\nlet negativePeriods = [];\nlet currentPeriod = null;\n\n// Przejdź przez każdy element w danych\ndata.forEach((item, index) => {\n if (item.rce_pln < 0) {\n // Jeśli cena jest ujemna, sprawdź czy zaczyna się nowy okres\n if (!currentPeriod) {\n currentPeriod = { start: item.udtczas_oreb.split(' - ')[0], end: item.udtczas_oreb.split(' - ')[1] };\n } else {\n // Jeśli okres już trwa, aktualizuj koniec okresu\n currentPeriod.end = item.udtczas_oreb.split(' - ')[1];\n }\n } else {\n // Jeśli cena nie jest ujemna, zakończ bieżący okres (jeśli istnieje)\n if (currentPeriod) {\n negativePeriods.push(currentPeriod);\n currentPeriod = null;\n }\n }\n});\n\n// Jeśli ostatni okres był ujemny, dodaj go do listy\nif (currentPeriod) {\n negativePeriods.push(currentPeriod);\n}\n\n// Przygotuj wynik\nmsg.payload = {\n negativePeriods: negativePeriods\n};\n\n// Zwróć wiadomość\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":830,"y":200,"wires":[["5b84c10bdf704354"]]},{"id":"d4392ad4860e1667","type":"function","z":"fb53daaa04b19012","name":"Feed control","func":"// Pobierz zakres czasu z kontekstu flow\nconst negativePeriods = flow.get(\"negativePeriods\");\n\nif (!negativePeriods || negativePeriods.length === 0) {\n // Jeśli nie ma zakresów, ustaw payload na 1 (poza zakresem)\n msg.payload = 1;\n return msg;\n}\n\n// Pobierz aktualny czas\nconst now = new Date();\nconst currentHours = now.getHours();\nconst currentMinutes = now.getMinutes();\n\n// Funkcja do konwersji czasu na minuty od północy\nfunction timeToMinutes(time) {\n const [hours, minutes] = time.split(':').map(Number);\n return hours * 60 + minutes;\n}\n\n// Sprawdź, czy aktualny czas mieści się w którymkolwiek z zakresów\nconst isInNegativePeriod = negativePeriods.some(period => {\n const startTime = timeToMinutes(period.start);\n const endTime = timeToMinutes(period.end);\n const currentTime = timeToMinutes(`${currentHours}:${currentMinutes}`);\n\n return currentTime >= startTime && currentTime < endTime;\n});\n\n// Ustaw payload na 0 (w zakresie) lub 1 (poza zakresem)\nmsg.payload = isInNegativePeriod ? 0 : 1;\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":450,"y":300,"wires":[["5cb6d9b0c5d583b4","3eb7aa0abf3302e8","e22a34e6302eb309"]]},{"id":"8afdba1bb56ae788","type":"inject","z":"fb53daaa04b19012","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"900","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":230,"y":300,"wires":[["d4392ad4860e1667"]]},{"id":"5b84c10bdf704354","type":"change","z":"fb53daaa04b19012","name":"","rules":[{"t":"set","p":"negativePeriods","pt":"flow","to":"payload.negativePeriods","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1090,"y":200,"wires":[["3534c9319e78cbee"]]},{"id":"5cb6d9b0c5d583b4","type":"debug","z":"fb53daaa04b19012","name":"Podgląd zakresu","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":890,"y":420,"wires":[]},{"id":"a4faee0d873583ea","type":"debug","z":"fb53daaa04b19012","name":"Tabela dobowa","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":800,"y":240,"wires":[]},{"id":"3eb7aa0abf3302e8","type":"victron-output-settings","z":"fb53daaa04b19012","service":"com.victronenergy.settings","path":"/Settings/CGwacs/OvervoltageFeedIn","serviceObj":{"service":"com.victronenergy.settings","name":"Venus settings"},"pathObj":{"path":"/Settings/CGwacs/OvervoltageFeedIn","type":"enum","name":"Feed excess DC-coupled PV into grid","enum":{"0":"Don’t feed excess DC-tied PV into grid","1":"Feed excess DC-tied PV into the grid"},"writable":true},"initial":"","name":"","onlyChanges":false,"x":1000,"y":320,"wires":[]},{"id":"e22a34e6302eb309","type":"victron-output-settings","z":"fb53daaa04b19012","service":"com.victronenergy.settings","path":"/Settings/CGwacs/PreventFeedback","serviceObj":{"service":"com.victronenergy.settings","name":"Venus settings"},"pathObj":{"path":"/Settings/CGwacs/PreventFeedback","type":"enum","name":"AC-coupled PV - grid feed in excess","enum":{"0":"Feed excess AC-tied PV into grid","1":"Don’t feed excess AC-tied PV into the grid"},"writable":true},"initial":"","name":"","onlyChanges":false,"x":1000,"y":360,"wires":[]}]