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":[]}]

Flow Info

Created 4 months, 1 week ago
Rating: not yet rated

Owner

Actions

Rate:

Node Types

Core
  • change (x1)
  • debug (x3)
  • function (x3)
  • http request (x1)
  • inject (x2)
Other
  • victron-output-settings (x2)

Tags

  • RCE
  • PSE
  • Energia
  • Victron
  • MPPT
  • Fronius
  • Solar
  • Edge
Copy this flow JSON to your clipboard and then import into Node-RED using the Import From > Clipboard (Ctrl-I) menu option