InfluxDB service limit reached

Hello everyone,
I’m trying to send OpenEMS data to an Influx bucket in the cloud. The data points are received on Influx on the first entry, but no history is made. The following error is what is logged in the Eclipse IDE:

[influx0] Unable to write to InfluxDB: HTTP status code: 400; Message: dml handler error: service limit reached: couldn't create columns in table `data`; table contains 183 existing columns, applying this write would result in 459 columns, limit is 200

I’m able to send and receive data if I turn of some points, such as the battery (for now from the simulation), but this is what I want to log.

Any ideas on how to solve this problem or how to split the data in chunks? (If I’m correct I’m using the latest version of OpenEMS, Eclipse and Influx.)

Hi,
I think splitting up the data would not give you better results, since your cloud provider restricted the number of columns to 200.

You could look into the package io.openems.edge.timedata.influxdb. The file InfluxTimedataImpl.java is responsible for taking measurements and send them to the cloud server.
Especially the method collectAndWriteChannelValues collects and writes the value of all channels in the system. You could modify this method to write less values to align with your providers limit.

Best

@hydroid7 , Thank you for your reply.
You are right about the provider restrictions. I found the same error notification on the following site:
IOx storage engine limits | InfluxDB Cloud (IOx) Documentation (influxdata.com)

I tried to modify the file you are referring too, collectAndWriteChannelValues, but I’m not sure what to edit. I feel like I’ve to rearrange the way namespaces, tables and columns are collected in OpenEMS. Do you have any ideas on how to do this?

Kind regards.

Yes, you’re absolutely right. I’d suggest you to switch the provider.
In case you do not want to change it, you can modify the method collectAndWriteChannelValues, as mentioned by you.

For example you can insert some other filter condition to filter which components you want to write.
Here is an example for to modify line 121 to include only components with a given class name:

this.componentManager.getEnabledComponents().stream()
    .filter(OpenemsComponent::isEnabled)
    .filter(c -> List.of("io.openems.edge.etc", "io.openems.edge.etc1").contains(c.getClass().toString())
...

Let me know if this helps you.

Best