question

john-5 avatar image
john-5 asked

Using Dynamic ESS in the UK

Can I configure Dynamic ESS to use in the UK?

I cannot find a setting for the UK.

dynamic ess
2 |3000

Up to 8 attachments (including images) can be used with a maximum of 190.8 MiB each and 286.6 MiB total.

8 Answers
nickdb avatar image
nickdb answered ·
2 |3000

Up to 8 attachments (including images) can be used with a maximum of 190.8 MiB each and 286.6 MiB total.

rod.peel avatar image
rod.peel answered ·

I am absolutely sure that you can. There may not be a pre programmed setting for the UK but neither was there one for Bolivia where I live. Fill in everything that you can. I advise you to select 'Green' mode rather than 'Trade' mode. I also advise that you don't need put in battery cost and life cycle details unless you really want the system to reduce the use of your batteries to zero. Just select optimise battery life.
I am about to change my Dynamic ESS settings as i am due to start 1 for 1 sales to the local electricity company. I wish I could have done that earlier as, apart from covering power cuts, I do not need batteries as the power company will act as an infine storage for any extra electricity I will generate.

2 |3000

Up to 8 attachments (including images) can be used with a maximum of 190.8 MiB each and 286.6 MiB total.

Dirk-Jan Faber (Victron Energy) avatar image
Dirk-Jan Faber (Victron Energy) answered ·

Well, the current problem with not being able to select the UK as a country, is the fact that we haven't got an API key for Octopus. Where, in other countries, the day ahead prices are freely available via Entso-e, Octopus only exposes those to its own customers.

In order to get support for Octopus added, we need to get an API key. So far we've only been referred to general mail addresses at Octopus, which then remain unanswered.

2 |3000

Up to 8 attachments (including images) can be used with a maximum of 190.8 MiB each and 286.6 MiB total.

rr-engineering avatar image
rr-engineering answered ·

Try emailing their CEO Greg Jackson, he makes his email address public (greg@octopus.energy) I would have thought this sort of thing would be right up their street you just need someone to connect you with their devs.

Octopus already offer tight integration with givenergy inverters on their "intelegent octopus flux" tariff where the user effectively hands control of their system to octopus and is handsomely rewarded for it. It would be amazing to see Victron end up working with the same integration. I know for a fact some people in the UK have selected givenergy hardware because of this integration.

2 comments
2 |3000

Up to 8 attachments (including images) can be used with a maximum of 190.8 MiB each and 286.6 MiB total.

Thanks. At the moment we are already moving ahead with integrating the API. It turns out that some of the calls can already be done without the need to be an actual customer. But there are a lot of different tariffs within Octopus, which we need to add to our system nicely. We expect the integration and testing to be done before the end of the month.
3 Likes 3 ·
Show more comments
nw24 avatar image
nw24 answered ·

Since Victron have now introduced 1/2 time slots for DESS, I have developed a Node-Red solution to integrating Octopus Agile import tariff prices, it doesnt make sense to export as I'm on the old FIT tariff with deemed export.


Which gives me the following for yesterday and today.

1719516490091.png1719516540443.png

The Node-Red flow looksl like:

1719516647039.png

The Trigger takes the data from the great work on this link https://community.home-assistant.io/t/octopus-agile-display-tariff-in-graphs-tables-best-import-export-periods-all-done-using-node-red-and-jsonata/518762 and adding an addional Build and Save Tariff array to return it as £ rather than pence ready to send using VRM API. It reads a global array.

1719517299861.png

This is then split and the times are converted to local time and rejoined and then sorted into time order and then times from 23:00 - 22:59 and sorted by time order or 17:00 - 16:59. Its then converted to a JSON and appended to other data to inject into VRM API for the prices. Note this uses the Fixed price model and changes it twice a day.

My Node Red code for my additional flow if its useful (you will neeed to replace nnnn) with your VRM site id )

[{"id":"ad02a0a637157bf0","type":"vrm-api","z":"45f00bad4d9375ae","vrm":"26857d65984e2624","name":"","api_type":"installations","idUser":"","users":"","idSite":"nnnn","installations":"patch-dynamic-ess-settings","attribute":"","stats_interval":"","show_instance":false,"stats_start":"","stats_end":"","use_utc":false,"widgets":"","instance":"","vrm_id":"","country":"","b_max":"","tb_max":"","fb_max":"","tg_max":"","fg_max":"","b_cycle_cost":"","buy_price_formula":"","sell_price_formula":"","green_mode_on":"","feed_in_possible":"","feed_in_control_on":"","b_goal_hour":"","b_goal_SOC":"","store_in_global_context":false,"verbose":false,"x":1080,"y":560,"wires":[[]]},{"id":"f602efd7caec1239","type":"inject","z":"45f00bad4d9375ae","name":"Trigger 22:55","props":[{"p":"payload"}],"repeat":"","crontab":"55 22 * * *","once":false,"onceDelay":"30","topic":"","payload":"OctAgileTariff1","payloadType":"global","x":120,"y":420,"wires":[["c0facf4b64b747dc"]]},{"id":"5480aa651015fe94","type":"moment","z":"45f00bad4d9375ae","name":"Conv UTC to Local FromTime","topic":"","input":"payload.fullfrom","inputType":"msg","inTz":"ETC/utc","adjAmount":0,"adjType":"days","adjDir":"add","format":"HH:mm","locale":"C","output":"payload.from","outputType":"msg","outTz":"Europe/London","x":550,"y":420,"wires":[["a9a1fe36f995f974"]]},{"id":"6b2b43e5b12afbea","type":"change","z":"45f00bad4d9375ae","name":"Sort into time order","rules":[{"t":"set","p":"payload","pt":"msg","to":"/* look at latest prices, sorted by ascending import cost */\t/* pick the lowest <sample size>, create new object for each */\t/* with {date, from, upto, cost} Sort by date & time */\t\tpayload[[0..95]]^(fullfrom).{\t \"date\": date,\t \"from\": from,\t \"to\": to,\t \"price\": price\t}","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":250,"y":500,"wires":[["5227185b1e8a081a"]]},{"id":"5227185b1e8a081a","type":"change","z":"45f00bad4d9375ae","name":"take 23:00 to 23:00","rules":[{"t":"set","p":"payload","pt":"msg","to":"/* look at latest prices, sorted by ascending import cost */\t/* pick the lowest <sample size>, create new object for each */\t/* with {date, from, upto, cost} Sort by date & time */\t\tpayload[[48..95]]^(from).{\t \"from\":from,\t \"to\":to,\t \"price\":price\t }","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":500,"wires":[["4fef81d6bda35386"]]},{"id":"c0facf4b64b747dc","type":"split","z":"45f00bad4d9375ae","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","property":"payload","x":330,"y":420,"wires":[["5480aa651015fe94"]]},{"id":"80f3c6b1f247af8b","type":"join","z":"45f00bad4d9375ae","name":"","mode":"auto","build":"merged","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"48","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":1070,"y":420,"wires":[["6b2b43e5b12afbea"]]},{"id":"a9a1fe36f995f974","type":"moment","z":"45f00bad4d9375ae","name":"Conv UTC to Local FromTime","topic":"","input":"payload.fullupto","inputType":"msg","inTz":"ETC/utc","adjAmount":0,"adjType":"days","adjDir":"add","format":"HH:mm","locale":"C","output":"payload.to","outputType":"msg","outTz":"Europe/London","x":850,"y":420,"wires":[["80f3c6b1f247af8b"]]},{"id":"4fef81d6bda35386","type":"json","z":"45f00bad4d9375ae","name":"","property":"payload","action":"str","pretty":false,"x":690,"y":500,"wires":[["b6e543d7a0e1e214"]]},{"id":"b6e543d7a0e1e214","type":"change","z":"45f00bad4d9375ae","name":"Apend input to VRM","rules":[{"t":"set","p":"payload","pt":"msg","to":"'{\t \"buyPriceSchedule\": [\t {\t \"days\":[0,1,2,3,4,5,6],\t \"schedule\":'\t & $.payload & '\t }\t ]\t}'","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":900,"y":500,"wires":[["ad02a0a637157bf0"]]},{"id":"d2fbcf1a96587afe","type":"inject","z":"45f00bad4d9375ae","name":"Triger 16:65","props":[{"p":"payload"}],"repeat":"","crontab":"55 16 * * *","once":false,"onceDelay":"30","topic":"","payload":"OctAgileTariff1","payloadType":"global","x":130,"y":700,"wires":[["24d8c08abd860a64"]]},{"id":"3f28e85712fab76c","type":"moment","z":"45f00bad4d9375ae","name":"Conv UTC to Local FromTime","topic":"","input":"payload.fullfrom","inputType":"msg","inTz":"ETC/utc","adjAmount":0,"adjType":"days","adjDir":"add","format":"HH:mm","locale":"C","output":"payload.from","outputType":"msg","outTz":"Europe/London","x":570,"y":700,"wires":[["f7db749c63690655"]]},{"id":"24d8c08abd860a64","type":"split","z":"45f00bad4d9375ae","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","property":"payload","x":350,"y":700,"wires":[["3f28e85712fab76c"]]},{"id":"20dc892e06835175","type":"join","z":"45f00bad4d9375ae","name":"","mode":"auto","build":"merged","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"48","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":1090,"y":700,"wires":[["f956d69c8b47142a"]]},{"id":"f7db749c63690655","type":"moment","z":"45f00bad4d9375ae","name":"Conv UTC to Local FromTime","topic":"","input":"payload.fullupto","inputType":"msg","inTz":"ETC/utc","adjAmount":0,"adjType":"days","adjDir":"add","format":"HH:mm","locale":"C","output":"payload.to","outputType":"msg","outTz":"Europe/London","x":870,"y":700,"wires":[["20dc892e06835175"]]},{"id":"f956d69c8b47142a","type":"change","z":"45f00bad4d9375ae","name":"Sort into time order","rules":[{"t":"set","p":"payload","pt":"msg","to":"/* look at latest prices, sorted by ascending import cost */\t/* pick the lowest <sample size>, create new object for each */\t/* with {date, from, upto, cost} Sort by date & time */\t\tpayload[[0..95]]^(fullfrom).{\t \"date\": date,\t \"from\": from,\t \"to\": to,\t \"price\": price\t}","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":250,"y":600,"wires":[["75cf42b81a268321"]]},{"id":"75cf42b81a268321","type":"change","z":"45f00bad4d9375ae","name":"take 17:00 to 17:00","rules":[{"t":"set","p":"payload","pt":"msg","to":"/* look at latest prices, sorted by ascending import cost */\t/* pick the lowest <sample size>, create new object for each */\t/* with {date, from, upto, cost} Sort by date & time */\t\tpayload[[36..83]]^(from).{\t \"from\":from,\t \"to\":to,\t \"price\":price\t }","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":600,"wires":[["4fef81d6bda35386"]]},{"id":"26857d65984e2624","type":"config-vrm-api","name":"Home Integration"}]


Also my Build and Save node export is:

[{"id":"50216fa86db98793","type":"change","z":"03e5198e519f6178","g":"e42010beae8f7fa5","name":"Build & Save Tariff Array","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.import#$i.{\t \"fullfrom\": valid_from,\t \"fullupto\": valid_to,\t \"date\": $substring(valid_from,0,10),\t \"from\": $substring(valid_from,11,5),\t \"to\": $substring(valid_to,11,5),\t \"price\": value_inc_vat /100\t}^(from)","tot":"jsonata"},{"t":"set","p":"OctAgileTariff1","pt":"global","to":"payload","tot":"msg","dc":true}],"action":"","property":"","from":"","to":"","reg":false,"x":810,"y":160,"wires":[[]]}]


I posted this on another thread but this thread seems more relevent.



2 |3000

Up to 8 attachments (including images) can be used with a maximum of 190.8 MiB each and 286.6 MiB total.

fellside avatar image
fellside answered ·

Hi nw24. I haven't tried it yet but just what we needed. Well done. It sounds like victron are already working on a similar solution.

Do we need to run the https://community.home-assistant.io/t/octopus-agile-display-tariff-in-graphs-tables-best-import-export-periods-all-done-using-node-red-and-jsonata/518762&amp;nbsp; code and your two pieces all within Home Assistant or just your two pieces published here in HA?

1 comment
2 |3000

Up to 8 attachments (including images) can be used with a maximum of 190.8 MiB each and 286.6 MiB total.

nw24 avatar image nw24 commented ·

Yes I run an indipentent home assistant and then it talks to my smart home devices, including Victron GX device. I run the Dispaly Octopus Agile display tariffs https://community.home-assistant.io/t/octopus-agile-display-tariff-in-graphs-tables-best-import-export-periods-all-done-using-node-red-and-jsonata/518762 and have added in my additional node to this - to convert prices to £ and create a global variable. Then run my code. I only developed it a couple of days ago and am about to post an update. but its in moderation.

0 Likes 0 ·
nw24 avatar image
nw24 answered ·

I've modified the flow slightly so that at 16:55 it takes the prices from 12 midday today to 12 midday tomorrow updating the prices from 23:00 today to 12:00 tomorrow. The 22:55 run now takes the period from 22:00 today to 22:00 tomorrow. updating the prices from 12 midday tomorrow to 23:00 tomorrow.

I've also updated some of the infomration notes in the nodes.The new flow looks like this:

1719655929056.png

The node red export for this is:

[{"id":"ad02a0a637157bf0","type":"vrm-api","z":"45f00bad4d9375ae","vrm":"26857d65984e2624","name":"","api_type":"installations","idUser":"","users":"","idSite":"NNNN","installations":"patch-dynamic-ess-settings","attribute":"","stats_interval":"","show_instance":false,"stats_start":"","stats_end":"","use_utc":false,"widgets":"","instance":"","vrm_id":"","country":"","b_max":"","tb_max":"","fb_max":"","tg_max":"","fg_max":"","b_cycle_cost":"","buy_price_formula":"","sell_price_formula":"","green_mode_on":"","feed_in_possible":"","feed_in_control_on":"","b_goal_hour":"","b_goal_SOC":"","store_in_global_context":false,"verbose":false,"x":1080,"y":560,"wires":[[]]},{"id":"f602efd7caec1239","type":"inject","z":"45f00bad4d9375ae","name":"Trigger 22:55","props":[{"p":"payload"}],"repeat":"","crontab":"55 22 * * *","once":false,"onceDelay":"30","topic":"","payload":"OctAgileTariff1","payloadType":"global","x":120,"y":420,"wires":[["c0facf4b64b747dc"]]},{"id":"5480aa651015fe94","type":"moment","z":"45f00bad4d9375ae","name":"Conv UTC to Local FromTime","topic":"","input":"payload.fullfrom","inputType":"msg","inTz":"ETC/utc","adjAmount":0,"adjType":"days","adjDir":"add","format":"HH:mm","locale":"C","output":"payload.from","outputType":"msg","outTz":"Europe/London","x":550,"y":420,"wires":[["a9a1fe36f995f974"]]},{"id":"6b2b43e5b12afbea","type":"change","z":"45f00bad4d9375ae","name":"Sort into time order","rules":[{"t":"set","p":"payload","pt":"msg","to":"/* look at latest prices, sorted by ascending date */\t\t\tpayload[[0..95]]^(fullfrom).{\t \"date\": date,\t \"from\": from,\t \"to\": to,\t \"price\": price\t}","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":250,"y":500,"wires":[["5227185b1e8a081a"]]},{"id":"5227185b1e8a081a","type":"change","z":"45f00bad4d9375ae","name":"take 23:00 to 23:00 @ 22:55","rules":[{"t":"set","p":"payload","pt":"msg","to":"/* look at latest prices, sorted by ascending time */\t/* pick the 24hr period 11pm to 11pm */\t\t\tpayload[[48..95]]^(from).{\t \"from\":from,\t \"to\":to,\t \"price\":price\t }","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":500,"y":500,"wires":[["4fef81d6bda35386"]]},{"id":"c0facf4b64b747dc","type":"split","z":"45f00bad4d9375ae","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","property":"payload","x":330,"y":420,"wires":[["5480aa651015fe94"]]},{"id":"80f3c6b1f247af8b","type":"join","z":"45f00bad4d9375ae","name":"","mode":"auto","build":"merged","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"48","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":1070,"y":420,"wires":[["6b2b43e5b12afbea"]]},{"id":"a9a1fe36f995f974","type":"moment","z":"45f00bad4d9375ae","name":"Conv UTC to Local FromTime","topic":"","input":"payload.fullupto","inputType":"msg","inTz":"ETC/utc","adjAmount":0,"adjType":"days","adjDir":"add","format":"HH:mm","locale":"C","output":"payload.to","outputType":"msg","outTz":"Europe/London","x":850,"y":420,"wires":[["80f3c6b1f247af8b"]]},{"id":"4fef81d6bda35386","type":"json","z":"45f00bad4d9375ae","name":"","property":"payload","action":"str","pretty":false,"x":690,"y":500,"wires":[["b6e543d7a0e1e214"]]},{"id":"b6e543d7a0e1e214","type":"change","z":"45f00bad4d9375ae","name":"Apend input to VRM","rules":[{"t":"set","p":"payload","pt":"msg","to":"'{\t \"buyPriceSchedule\": [\t {\t \"days\":[0,1,2,3,4,5,6],\t \"schedule\":'\t & $.payload & '\t }\t ]\t}'","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":900,"y":500,"wires":[["ad02a0a637157bf0"]]},{"id":"d2fbcf1a96587afe","type":"inject","z":"45f00bad4d9375ae","name":"Triger 16:65","props":[{"p":"payload"}],"repeat":"","crontab":"55 16 * * *","once":false,"onceDelay":"30","topic":"","payload":"OctAgileTariff1","payloadType":"global","x":130,"y":700,"wires":[["24d8c08abd860a64"]]},{"id":"3f28e85712fab76c","type":"moment","z":"45f00bad4d9375ae","name":"Conv UTC to Local FromTime","topic":"","input":"payload.fullfrom","inputType":"msg","inTz":"ETC/utc","adjAmount":0,"adjType":"days","adjDir":"add","format":"HH:mm","locale":"C","output":"payload.from","outputType":"msg","outTz":"Europe/London","x":570,"y":700,"wires":[["f7db749c63690655"]]},{"id":"24d8c08abd860a64","type":"split","z":"45f00bad4d9375ae","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","property":"payload","x":350,"y":700,"wires":[["3f28e85712fab76c"]]},{"id":"20dc892e06835175","type":"join","z":"45f00bad4d9375ae","name":"","mode":"auto","build":"merged","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"48","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":1090,"y":700,"wires":[["f956d69c8b47142a"]]},{"id":"f7db749c63690655","type":"moment","z":"45f00bad4d9375ae","name":"Conv UTC to Local FromTime","topic":"","input":"payload.fullupto","inputType":"msg","inTz":"ETC/utc","adjAmount":0,"adjType":"days","adjDir":"add","format":"HH:mm","locale":"C","output":"payload.to","outputType":"msg","outTz":"Europe/London","x":870,"y":700,"wires":[["20dc892e06835175"]]},{"id":"f956d69c8b47142a","type":"change","z":"45f00bad4d9375ae","name":"Sort into time order","rules":[{"t":"set","p":"payload","pt":"msg","to":"/* look at latest prices, sorted by date */\t\tpayload[[0..95]]^(fullfrom).{\t \"date\": date,\t \"from\": from,\t \"to\": to,\t \"price\": price\t}","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":250,"y":600,"wires":[["75cf42b81a268321"]]},{"id":"75cf42b81a268321","type":"change","z":"45f00bad4d9375ae","name":"take 12:00 to 12:00 @16:55","rules":[{"t":"set","p":"payload","pt":"msg","to":"/* look at latest prices, sorted by ascending time */\t/* pick 24 hours from 12 PM (Midday) */\t\tpayload[[26..73]]^(from).{\t \"from\":from,\t \"to\":to,\t \"price\":price\t }","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":500,"y":600,"wires":[["4fef81d6bda35386"]]},{"id":"26857d65984e2624","type":"config-vrm-api","name":"Home Integration"}]

Hope thius is useful.


1719655929056.png (63.0 KiB)
3 comments
2 |3000

Up to 8 attachments (including images) can be used with a maximum of 190.8 MiB each and 286.6 MiB total.

fellside avatar image fellside commented ·

I`m getting "invalid accesstoken received" from the installations patch-dynamic-ess-settings node.

Any help would be appreciated.

0 Likes 0 ·
givenmotorsport avatar image givenmotorsport fellside commented ·

Hiya,

I had this error at first. double click on the node called "installations - patch dynamic -ess settings"

You need to fill in the details relating to your own VRM site and VRM Token. :)

screenshot-2024-07-01-at-125122.png


1 Like 1 ·
simongrey avatar image simongrey commented ·
Sorry for being thick - I am new to Node-RED and this stuff, but when I load your flow I have several unrecognised nodes. e.g. 'moment' and 'vrm-api' nodes.


Any help appreciated!



0 Likes 0 ·
fellside avatar image
fellside answered ·

I have inputed both and "invalid accesstoken received" has gone.

Maybe relabel VRM to VRM token.

I now have Red triangle "invalid input pattern"

I don't have the option in the Installation drop-down "Modify Dynamic ESS config" as show in your screenshot. Could this be the problem?

sorry being a pain:)

1 comment
2 |3000

Up to 8 attachments (including images) can be used with a maximum of 190.8 MiB each and 286.6 MiB total.

nw24 avatar image nw24 commented ·
I think you need to update the Node Red Pallete for the Victron - VRM - API there is a recent update. This should give you the additional parameters.
0 Likes 0 ·