# Info about json format for ancillary costs in timeOfUseTarrif entsoe

**URL:** <https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261>\
**Category:** English Forum\
**Created:** [July 1, 2025, 7:11am UTC](https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261 "2025-07-01T07:11:01Z")\
**Posts on this page:** 17\
**Page:** 1

<div class="post-metadata">

**Author:** ![sjjh](https://community.openems.io/user_avatar/community.openems.io/sjjh/32/2296_2.png) [@sjjh](https://community.openems.io/u/sjjh)\
**Post date:** [July 1, 2025, 7:11am UTC](https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261/1 "2025-07-01T07:11:01Z")

</div>

I did find the component _Time-Of-Use Tariff ENTSO-E_ in the UI. I’m wondering how to configure it. It expects as a mandatory field a `json` string for ancillary costs. I did find below code, where the string seems to get parsed. Unfortunately I fail to understand the format of the expected `json` string. Could someone give me an example or hint to some documentation, how the `json` string is expected to look like? Thanks in advance!

> <https://github.com/OpenEMS/openems/blob/0f7119c2c1d3028c968f8556ef526f5fcfa16244/io.openems.edge.timeofusetariff.entsoe/src/io/openems/edge/timeofusetariff/entsoe/AncillaryCosts.java#L232>

---

<div class="post-metadata">

**Author:** ![Sn0w3y](https://community.openems.io/user_avatar/community.openems.io/sn0w3y/32/636_2.png) [@Sn0w3y](https://community.openems.io/u/Sn0w3y)\
**Post date:** [July 1, 2025, 12:01pm UTC](https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261/2 "2025-07-01T12:01:20Z")

</div>

![Screenshot_20250701_140037_Chrome](https://community.openems.io/uploads/default/original/2X/7/76d526eec468556498b17b5b60d233f3e160e821.jpeg)

It is there.

---

<div class="post-metadata">

**Author:** ![sjjh](https://community.openems.io/user_avatar/community.openems.io/sjjh/32/2296_2.png) [@sjjh](https://community.openems.io/u/sjjh)\
**Post date:** [July 1, 2025, 1:13pm UTC](https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261/3 "2025-07-01T13:13:24Z")

</div>

sry, can you elaborate? I don’t find information about the structure of the `json` file.

---

<div class="post-metadata">

**Author:** ![stefan.feilmeier](https://community.openems.io/user_avatar/community.openems.io/stefan.feilmeier/32/2585_2.png) [@stefan.feilmeier](https://community.openems.io/u/stefan.feilmeier)\
**Post date:** [July 1, 2025, 7:44pm UTC](https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261/4 "2025-07-01T19:44:01Z")

</div>

Hi @sjjh,

the feature for ancillary costs is designed (for Germany) to support two different ways of providing the additional costs. In Germany those “zeitvariable Netzentgelte” are provided by the DSOs in “Preisblätter”.

1. Predefined Costs in the `GermanDSO` enum → [openems/io.openems.edge.timeofusetariff.entsoe/src/io/openems/edge/timeofusetariff/entsoe/GermanDSO.java at develop · OpenEMS/openems · GitHub](https://github.com/OpenEMS/openems/blob/develop/io.openems.edge.timeofusetariff.entsoe/src/io/openems/edge/timeofusetariff/entsoe/GermanDSO.java)

- `biddingZone`: `GERMANY`

- `ancillaryCosts`: `{"dso":"BAYERNWERK"}`

1. Define the costs via manual JSON configuration.

Hope this helps. As this is still a quite new feature I am happy to receive feedback.

Regards,  
Stefan

(@venu-sagar FYI)

---

<div class="post-metadata">

**Author:** ![stefan.feilmeier](https://community.openems.io/user_avatar/community.openems.io/stefan.feilmeier/32/2585_2.png) [@stefan.feilmeier](https://community.openems.io/u/stefan.feilmeier)\
**Post date:** [July 1, 2025, 7:54pm UTC](https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261/5 "2025-07-01T19:54:13Z")

</div>

In German: ein paar Hintergrundinformationen warum wir dieses Feature für FEMS implementiert haben, zeige ich in diesem Video:

[![](https://img.youtube.com/vi/-pdx44EZAuU/hqdefault.jpg "Abregelung bei PV Anlage umgehen. Das muss der Batteriespeicher können.") ](https://www.youtube.com/watch?v=-pdx44EZAuU)

---

<div class="post-metadata">

**Author:** ![sjjh](https://community.openems.io/user_avatar/community.openems.io/sjjh/32/2296_2.png) [@sjjh](https://community.openems.io/u/sjjh)\
**Post date:** [July 1, 2025, 8:15pm UTC](https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261/6 "2025-07-01T20:15:59Z")

</div>

> [@stefan.feilmeier](#):
>
> In Germany those “zeitvariable Netzentgelte” are provided by the DSOs in “Preisblätter”.

I did find the _Preisblatt_ of our DSO **Netze ODR** :

> **[Anlage\_1\_Preisblatt\_Strom.pdf](https://www.netze-odr.de/fileadmin/Netze-ODR/Dokumente/Partner/Strom-_und_Gaslieferanten/Anlage_1_Preisblatt_Strom.pdf)**
>
> 170.82 KB

> [@stefan.feilmeier](#):
>
> If your DSO is not yet in the list, I’d ask you to add a Pull-Request with the price definition in `GermanDSO.java`

Netze ODR is not yet in the list. The PDF contains different price information. Can you give me a hint which one is the relevant one? I’ll then happily try to provide a PR.  
Thanks!

---

<div class="post-metadata">

**Author:** ![stefan.feilmeier](https://community.openems.io/user_avatar/community.openems.io/stefan.feilmeier/32/2585_2.png) [@stefan.feilmeier](https://community.openems.io/u/stefan.feilmeier)\
**Post date:** [July 2, 2025, 6:37am UTC](https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261/7 "2025-07-02T06:37:53Z")

</div>

The relevant data for your DSO is on page 4:

 ![grafik](https://community.openems.io/uploads/default/original/2X/0/082f5f19926ffb27048f46663483fcce9c50873b.png)

You should then convert those dates and prices (“Arbeitspreis Brutto”) to `DateRange`s in `GermanDSO`.

---

<div class="post-metadata">

**Author:** ![sjjh](https://community.openems.io/user_avatar/community.openems.io/sjjh/32/2296_2.png) [@sjjh](https://community.openems.io/u/sjjh)\
**Post date:** [July 2, 2025, 6:02pm UTC](https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261/8 "2025-07-02T18:02:34Z")

</div>

I wasn’t sure, if I had to add any other prices from other tables to it… 😕

So I created a PR (first on code in this repo), please review: [Update GermanDSO.java: added DSO Netze ODR by sjjh · Pull Request #3224 · OpenEMS/openems · GitHub](https://github.com/OpenEMS/openems/pull/3224). 🙂  
Thanks!

---

<div class="post-metadata">

**Author:** ![sjjh](https://community.openems.io/user_avatar/community.openems.io/sjjh/32/2296_2.png) [@sjjh](https://community.openems.io/u/sjjh)\
**Post date:** [July 2, 2025, 8:58pm UTC](https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261/9 "2025-07-02T20:58:26Z")

</div>

Thanks for the explanation. Great feature.

> [@stefan.feilmeier](#):
>
> As this is still a quite new feature I am happy to receive feedback.

I believe, especially if the community gets bigger and more end users (less developers) use it, the two use cases of how to add new DSOs and update (yearly – if I understood correctly) prices could maybe made easier. I could imagine some web form to add these data, either on [openems.io](http://openems.io) or maybe embedded in the OpenEMS UI. The UI should IMHO automatically pull updates if the time frame of the data ends, and maybe a manual refresh via a button/trigger is sensible, e.g., on first initialization, in case a before missing DSO is included, or if the user changes their DSO (moving).

The selection of the DSO could be made easier by offering a drop-down with all available DSOs in the component in the OpenEMS UI. As soon as it is implemented to manually add a `json` string, the drop-down could include an element `other`which would enable a free text field (ideally with either a dummy blueprint or some context help)

So far feedback from a first time user. 🙂

---

<div class="post-metadata">

**Author:** ![venu-sagar](https://community.openems.io/user_avatar/community.openems.io/venu-sagar/32/67_2.png) [@venu-sagar](https://community.openems.io/u/venu-sagar)\
**Post date:** [July 3, 2025, 11:40am UTC](https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261/10 "2025-07-03T11:40:38Z")

</div>

Dear @sjjh ,

That’s amazing! We were thinking along the same lines and have already started working on this. The implementation is currently in progress, though everything is still local for now. Once it’s ready, I’ll link it to the PR. In the meantime, you can check out the progress through the attached screenshots.

 ![image](https://community.openems.io/uploads/default/original/2X/2/28b6a4204e9a466d1c45bc476269b2e56b373995.png)

 ![image](https://community.openems.io/uploads/default/original/2X/0/00c4dc4931b055bd40fdf541d68b5334a95848ad.png)

 ![image](https://community.openems.io/uploads/default/original/2X/f/feb8cb8ead77985f74b9fdf9f87d899f3223eaf3.png)

 ![image](https://community.openems.io/uploads/default/original/2X/5/5da726fff47c86582232f767d20c897b79b22084.png)

 ![image](https://community.openems.io/uploads/default/original/2X/a/a3be9321c76203f17afb27ea0034f226a672ad42.png)

 ![image](https://community.openems.io/uploads/default/original/2X/f/ff0a3aa3ccf53a8e51bbb3e04436c27c9cea52cd.png)

Note: there are still some adjustments here and there, but final version would look something close to this.

Thank you,  
Sagar

---

<div class="post-metadata">

**Author:** ![sjjh](https://community.openems.io/user_avatar/community.openems.io/sjjh/32/2296_2.png) [@sjjh](https://community.openems.io/u/sjjh)\
**Post date:** [July 4, 2025, 12:16pm UTC](https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261/11 "2025-07-04T12:16:41Z")

</div>

Cool, looks great. I could imagine adding a String _name_ to the DSO `enum`, to make it look a little bit less technical. E.g., displaying _SH Netz_ instead of `SH_NETZ` to the user in the drop-down (this could also enable l10n, `OTHER` → _anderer_). For the price items, I might be wondering if VAT should be included or not, adding _brutto_ to the `label` could avoid this question.

Not sure about the logic in the background – if a new entry is added by a user, it obviously would be great to push it upstream and distribute it to other users. I don’t know enough about the domain, but it seems that typically the prices are only valid for a year. Thus I could imagine, that it would be interesting to:

- remind users to update their prices at the end of the year
- offer an update of prices independently of OpenEMS update

BTW, I think the UI of the drop-downs could be improved in general. In landscape mode adding a `max-width` (e.g., `80 em`) could improve the usability a bit. But that’s unrelated to the entsoe implementation. 🙂

Thanks for your work!  
Simon

---

<div class="post-metadata">

**Author:** ![stefan.feilmeier](https://community.openems.io/user_avatar/community.openems.io/stefan.feilmeier/32/2585_2.png) [@stefan.feilmeier](https://community.openems.io/u/stefan.feilmeier)\
**Post date:** [July 12, 2025, 10:26pm UTC](https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261/12 "2025-07-12T22:26:02Z")

</div>

FYI: the JSON parser for custom ancilliary costs has been merged with

> <https://github.com/OpenEMS/openems/pull/3236/commits/397878c4787d3d221bedc8a4d58c8c4b2a389926>
>
> Co-authored-by: Stefan Feilmeier \<3515268+sfeilmeier@users.noreply.github.com\>
> R…eviewed-by: Michael Grill \<59126309+michaelgrill@users.noreply.github.com\>
> Reviewed-by: Stefan Feilmeier \<3515268+sfeilmeier@users.noreply.github.com\>
> Co-authored-by: Sagar Venu \<32655208+venu-sagar@users.noreply.github.com\>
> Co-committed-by: Sagar Venu \<32655208+venu-sagar@users.noreply.github.com\>

> displaying _SH Netz_ instead of `SH_NETZ` to the user in the drop-down (this could also enable l10n, `OTHER` → _anderer_).

This has been implemented as well.

---

<div class="post-metadata">

**Author:** ![HeFa](https://community.openems.io/letter_avatar_proxy/v4/letter/h/f07891/32.png) [@HeFa](https://community.openems.io/u/HeFa)\
**Post date:** [July 31, 2025, 9:43am UTC](https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261/13 "2025-07-31T09:43:44Z")

</div>

Hi All,

It would be great if an additional field could be implemented: the additional fix surcharge that the energy supplier charges per kw/h. Then the real price would be taken into account.

---

<div class="post-metadata">

**Author:** ![stefan.feilmeier](https://community.openems.io/user_avatar/community.openems.io/stefan.feilmeier/32/2585_2.png) [@stefan.feilmeier](https://community.openems.io/u/stefan.feilmeier)\
**Post date:** [August 1, 2025, 6:49am UTC](https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261/14 "2025-08-01T06:49:55Z")

</div>

Hi @HeFa,

yes - ultimately the ENTSO-E Time-of-use-Tariff provider should then reflect the real gross price, i.e. the price that the customer really has to pay on his invoice.

Unfortunately calculating that price is not so easy - for Germany, and even more for Europe/the world. As you seem to have deeper knowledge on the topic: Could you suggest the actual fields, their descriptions (e.g. in App Center) and calculation formula?

Thanks in advance!

---

<div class="post-metadata">

**Author:** ![Tommatheussen](https://community.openems.io/user_avatar/community.openems.io/tommatheussen/32/2588_2.png) [@Tommatheussen](https://community.openems.io/u/Tommatheussen)\
**Post date:** [April 23, 2026, 12:35pm UTC](https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261/15 "2026-04-23T12:35:19Z")

</div>

Hi!

I’m sorry to bring up this older topic, but I wanted to ask if there is any progress on this?  
There are a lot of different formulas to calculate the actual price, I’m sure, so I can give you my 2 calculations if it helps:

Grid buying: `((1.04 * price) + 0.50) c€/kWh * 6%(VAT) `

Grid selling: `((1 * price) - 0.98) c€/kWh (No VAT applies)`

My provider doesn’t really specific what those values represent, but I have added them as follows in Home Assistant templates:

- Price markup: The value which the spot price is multiplied by (1.04 and 1 in my case)

- Fixed markup: The value that is added for each kWh, regardless of price (0.50 and -0.98 in my case)

- VAT: Speaks for itself, optional VAT to be applied, for my case, VAT is only applied to buying from the grid

---

<div class="post-metadata">

**Author:** ![stefan.feilmeier](https://community.openems.io/user_avatar/community.openems.io/stefan.feilmeier/32/2585_2.png) [@stefan.feilmeier](https://community.openems.io/u/stefan.feilmeier)\
**Post date:** [April 24, 2026, 11:51am UTC](https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261/16 "2026-04-24T11:51:41Z")

</div>

Thanks @Tommatheussen for bringing this up again. I had an internal PR which never got tested and finalized.

Would this solve your requirements - at least for “grid buy”?

> <https://github.com/OpenEMS/openems/pull/3699>
>
> \- Adds Javaluator library and wrapper
> \- Adds configurable calculateExpression t…o calculate gross price per period from EPEX spot price and ancillary cost
> \- Fallback to x + y as before if no expression is given
> 
> Relates to https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261/15

---

<div class="post-metadata">

**Author:** ![Tommatheussen](https://community.openems.io/user_avatar/community.openems.io/tommatheussen/32/2588_2.png) [@Tommatheussen](https://community.openems.io/u/Tommatheussen)\
**Post date:** [April 24, 2026, 2:14pm UTC](https://community.openems.io/t/info-about-json-format-for-ancillary-costs-in-timeofusetarrif-entsoe/10261/17 "2026-04-24T14:14:36Z")

</div>

Thanks for the quick reply @stefan.feilmeier !  
Had a short look through the PR, I think that would indeed solve the case mostly, a great start nonetheless.

I haven’t gotten in depth yet on the dynamic tariff option in openEMS, especially around selling, but the formulas used by my provider mostly show the buying and selling curves following each other, with a little bit more penalty on the selling side.
