Published October 30, 2025
| Version 2025.11.0
Software
Open
OpenEMS/openems: 2025.11.0
Creators
- Stefan Feilmeier1
- wgerbl
- ebakir
- fabianfnc
- Hüseyin Sahutoglu
- pooran-c2
- Max Obermeier3
- da Kai4
- Sebastian Asen
- Johannes Haller
- Sagar5
- Lukas Rieger6
- Hiromasa Ihara7
- Thomas Sicking8
- Kyle9
- Felix S10
- luzpaz
- Christian Lehne
- dependabot-support
- sjjh
- Michael Grill
- DerWahreKlinki
- Lisa Kaindl2
- ahummelsberger11
- parapluplu
- lukas-bender-rodriguez
- Simon Fey
- iammahdi96
- 1. FENECON GmbH, OpenEMS Association e.V.
- 2. FENECON GmbH
- 3. Apple Inc.
- 4. @OpenEMS
- 5. Fenecon
- 6. University Deggendorf
- 7. @girasolenergy
- 8. opernikus GmbH
- 9. Microcare
- 10. @opernikus-common
- 11. KATEK
Description
Release Highlights
- Time-of-Use-Tariff: App for Dynamic Ancillary costs
- Time-of-Use-Tariff Tibber: switch to QUARTER_HOURLY prices
- Compatibility with FENECON Commercial 50
- New Predictor for Consumption forecasting based on historical load profiles
- UI: Add Weather Widget in Live-View
- KOSTAL PIKO PV inverter (via HTTP/HTML)
- UI: Major Update and migration to Angular 20
Details
Common/General
- FEMS Backports 2025-10-02 in https://github.com/OpenEMS/openems/pull/3339
- CI:
- Update Unit Tests
- Reduce Java build Log output: Reduce the log output to make errors clearer.
- Print test summaries
- Gradle:
- Allow more than 2 Tests to run in parrallel
- Enable parallel build by default
- Remove
failOnNoDiscoveredTests = false
- Fix 'Configuration file ... is marked executable'
- Fix warnings like: "Configuration file /usr/lib/systemd/timesyncd.conf.d/fems.conf is marked executable. Please remove executable permission bits. Proceeding anyway."
- CI:
- Update Gradle + Plugins by @da-Kai in https://github.com/OpenEMS/openems/pull/3337
- Extend auto Stale and Close messages by @da-Kai in https://github.com/OpenEMS/openems/pull/3345
- Update Node.Js to 22 by @da-Kai in https://github.com/OpenEMS/openems/pull/3347
- Update MyModbusDeviceImpl.java by @sjjh in https://github.com/OpenEMS/openems/pull/3315
- Update MyConfig.java: removed import by @sjjh in https://github.com/OpenEMS/openems/pull/3318
- Improve UI docker by @da-Kai in https://github.com/OpenEMS/openems/pull/3366
- Change console output format from plan to colored in gradle build of ci by @miettal in https://github.com/OpenEMS/openems/pull/3364
OpenEMS Backend
- FEMS Backports 2025-10-02 in https://github.com/OpenEMS/openems/pull/3339
- Dummy AppCenter Metadata
- Remove UiWebsocketValidator
- MetadataOdoo: handle uncached Edges
- Solves throwing an Exception when an Edge is missing in EdgeCache
OpenEMS Edge
- FEMS Backports 2025-10-02 in https://github.com/OpenEMS/openems/pull/3339
- my-PV + ASKOMA Apps: update names
- KACO Battery Inverter: introduce SunSpec EnumField16
- Sunspec channels are automatically created based on EnumField16 enums.
- These channels are visible as StateChannels in the system.
- Each channel's status (OK, Warning, or Failure) is defined during setup—by default, channels are OK unless specifically configured as warnings.
- FENCON Commercial 50 App
- Time-of-Use-Tariff:
- App.TimeOfUseTariff.AncillaryCosts: App for Dynamic Ancillary costs
- OperatingSystemDebianSystemd: Fix parseIpJson for Debian 9
- Before a IndexOutOfBoundsException was thrown, which caused App Center install to fail
- AppCenter:
- Added a new formly field which handles links and redirects
- run deactivation async: fixed exception while deactivating multiple nested checkables in
CheckOr - Add JSONRPC Request for getting App Instances by Filter
- KEBA ChargePoint: fix JUnit-Test
- Use fixed DateTime reference, instead of
.now(), for reproducability - Remove duplicate
ReadWorkerTest
- Use fixed DateTime reference, instead of
- BridgeModbusTcpImplTest: delete JUnit test failing in CI
- Introduced in #2879
- PredictorProductionLinearModel: add channels to track prediction quality
- Added new channels to track predicted production values from the PredictorProductionLinearModel
- For each forecast run, predicted values at fixed horizons (1 hour, 6 hours, 12 hours, 24 hours, and 36 hours ahead) are stored in the respective channels
- This enables precise monitoring and evaluation of the prediction accuracy over these time intervals
- Meta-App: manage Maximum Grid Feed In Limit settings
- Moves MAXIMUM_GRID_FEED_IN_LIMIT (GridOptimizeCharge) and FEED_POWER_PARA_SET (GoodWeBatteryInverter) to Meta Component
- Both controllers use the same value as reference
- Added a new formly field which handles links and redirects
- New Predictor for Consumption forecasting based on historical load profiles
- A new predictor model has been developed to forecast upcoming unmanaged consumption values.
- The prediction is based on typical household daily load profiles.
- Load profiles are determined by clustering historical daily consumption time series data.
- The load profiles correspond to the cluster centres.
- The upcoming profile is chosen using historical consumption patterns, such as the day of the week, whether the upcoming day is a working or non-working day, and the previous profile.
- The model evaluates the prediction in real time. So, if during the day the model realizes that the wrong profile was chosen, a better-fitting one is selected for the rest of the day.
- The forecasted quarterly values are determined by the predicted profile.
- EVSE New Architecture
- Add State-Machine to EVSE Single Controller:
- EV_NOT_CONNECTED: EV is not physically connected to the charge point.
- EV_CONNECTED: EV is physically connected but not yet charging.
- CHARGING: Regular charging is ongoing. EV is drawing current according to configured limits and conditions.
- FINISHED_EV_STOP: Charging finished by EV. EV is not drawing power even if it would be allowed to.
- FINISHED_ENERGY_SESSION_LIMIT: Charging is finished by OpenEMS because the configured
EnergySessionLimitwas reached. - prepared for more...
- Add Change-Limit for rising set-points (3 % per second)
- Improve surplus distribution: recursive call makes sure everything is distributed to max power
- Drop
SESSION_LIMIT_REACHEDstate; replaced with State-Machine - Improve JUnit tests and coverage
- KEBA: use Enum for
setSetEnable()(applies also to EVCS) - Phase-Switch is currently not working. Needs to be added to State-Machine
- Successfully tested with 2 x KEBA P30
- Configurable minimum power for vehicle
- Added min and max power in generic vehicle and generic vehicle app
- Add State-Machine to EVSE Single Controller:
- KEBA UDP: disable flaky JUnit tests
- UDP tests sometimes fail with
java.lang.Exception: On TestCase [#1]: expected ReadValue [CHARGING] got [UNDEFINED] for Channel [Status] in Nature [Evcs] on Inputs [[]]
- UDP tests sometimes fail with
- Tibber: switch to QUARTER_HOURLY prices
- Change GraphQL to QUARTER_HOURLY resolution, update parsing of prices and JUnit tests
- See https://developer.tibber.com/docs/changelog for details
- GoodWe:
- use new Registers for GridFeedInLimit and FixedPowerFactor: Registers for FENECON Commerical 50 changed
- allow only possible EmsSetPower limits and correct AcImport/AcExport
- Controller.Ess.RippleControlReceiver: Rundsteuerempfänger
- Controller for Ripple Control Receiver
- Digital Input 2 - Digital Input 4 are used as signal
- DI2 reduces to 0%, DI3 to 30%, DI4 to 60%
- If there are more than one relay active, the "strongest" limitation is used => e.g. 0% and 30% are activated => reducing to 0% power
- Currently only for GoodWe Inverters => Feed-To-Grid Power Limit is set to the lowest of the two options:
- MaxApparentPower * Limitation or the own set limit
- removed MaxGridFeedInLimit of GridOptimizeCharge and BatteryInverter and added it in Meta app => uniform using of limit
- Weather Forecast: keep data in channels
- The current weather and the forecast for the next 24 hours are now being written in channels
- This is more efficient in UI
- Shelly: add
invertconfig property to all ElectricityMeters - App.Heat.HeatingElement: ignoring heat and evcs components in the extern meter list
- KACO Battery Inverter: introduce SunSpec EnumField16
- Sunspec channels are automatically created based on EnumField16 enums.
- These channels are visible as StateChannels in the system.
- Each channel's status (OK, Warning, or Failure) is defined during setup—by default, channels are OK unless specifically configured as warnings.
- Consistant Icons
- changed icons and Buttons to be more consistently identified with functionality
- Fix high and low price description for Octopus Heat TOU Tariff by @sthhs in https://github.com/OpenEMS/openems/pull/3344
- Update timeofusetariff octopus heat Config.java: typo by @sjjh in https://github.com/OpenEMS/openems/pull/3346
- FEMS Backports 2025-10-08 in https://github.com/OpenEMS/openems/pull/3353
- App.Meter.PqPlus available for OWNER
- Weather.OpenMeteo: add random jitter to API calls to reduce simultaneous load
- App.PvInverter.SolarEdge: make Modbus Unit ID configurable
- Phase Rotation for Heating Element & Eastron meter
- outsource enum "Phase Rotation" to make it independent
- changing translations
- implementing "Phase Rotation" in modbus protocoll of the Eastron meter
- added property "Phase Rotation" in the Eastron meter app
- implement KOSTAL PIKO PV inverter via HTTP/HTML parsing by @Sn0w3y in https://github.com/OpenEMS/openems/pull/3297
OpenEMS UI
- FEMS Backports 2025-10-02 in https://github.com/OpenEMS/openems/pull/3339
- Migration to Angular 20
- Apply
ng generate @angular/core:control-flow - VSCode: fix html formatting issues with new control flow syntax: Reference
- Apply
- Settings | Channels: add option to select multiple channels
- EVSE New Architecture
- Extend Evse with navigation to app center update page
- Refactored app center update pages to be usable with new navigation
- fix german/english translation of power
- Fix Helpbutton-component not working due to wrong property name being checked
- Time-of-Use-Tariff Ancillary Costs: Fix possible input errors
- Style fixes
- EVCS Cleanup
- Added class EvcsComponent to clean up historic data generation in all views
- fix Consumption flat widget
- New Navigation: add check for isEnabled on component
- prevent disabled components to be shown for new navigation
- LiveDataService currentData: fix not refreshing bug
- History Storage: add fallback channels for non hybrid ess
- use active power for non hybridEss and subnavigation for phase details only for hybridEss
- Unified icons for "Error" status
- Settings: refactor to lazy loaded module
- decrease size of init app bundle, this PR is focused on migrating Settings to standalone and lazy-loaded.
- fixing changelog component not showing back-arrow when inistialising, improved back button behavior in header component by using Navigation services for dynamic visibility.
- Ensured consistent back navigation across all routes, including when changelog.component is nested or reused.
- Improve keyboard accessibility
- Apply keyboard accessibility according to WCAG (Web Content Accessibility Guidelines)
- GridOptimizedCharge: fix time format for live
- displaying the endTimeDetailedDescription in Netzdienliche Beladung as 24h or 12h format depending on User's browser's language.
- Warning Status: consistent usage of warning icon
- changing display of warning status to have a warning sign / icon. where previously Fault & Warning statuses were displaying
alert-outlinesign / icon .
- changing display of warning status to have a warning sign / icon. where previously Fault & Warning statuses were displaying
- Add Weather Widget
- Added new Weather Widget in Live View below the Energy Monitor
- Displays current weather, 6-hour forecast, and daily forecast for the next 6 days
- Shows temperature, general weather condition, and sun hours
- Weather data is retrieved from the Edge using coordinates stored in Meta configuration
- Forecasts are retrieved in quarter-hourly, hourly, and daily resolution for the next 7 days
- Linear prediction model adapted to handle the new weather data format
- Forecasts are cached on the Edge and the UI fetches only the data it currently needs
- Settings: fix missing buttons
- Added missing import for FlatButtonComponent
- Widget for EnerixControl/Clever-PV
- Ripple Control Receiver (Rundsteuerempfänger)
- Migration to Angular 20
- FEMS Backports 2025-10-08 in https://github.com/OpenEMS/openems/pull/3353
- TimeOfUseTariff: display only two decimals on history chart
- set a fixed amount of decimal places for currency value
- General improvements
- Improve performance
- removes unneccesary evaluating of getter
modalComponentwhich has been evaluated every second and leads to slowing down the monitoring
- removes unneccesary evaluating of getter
- Angular 20 Update: additional visual changes
- See OpenEMS Community: https://community.openems.io/t/fems-backports-broke-many-css-styles/10527/3
- Fix unsubscribe of channels
- problem: too many channels unsubscribed on modal close
- TimeOfUseTariff: display only two decimals on history chart
- Fix: prevent energy flow arrow backgrounds from disappearing by @Jasonlee6789 in https://github.com/OpenEMS/openems/pull/3365
- Enforce UPPER_SNAKE_CASE for translation keys by @Sn0w3y in https://github.com/OpenEMS/openems/pull/3367
Version Upgrades
- Bump org.apache.felix:org.apache.felix.http.jetty12 from 1.1.0 to 1.1.2 in /cnf by @dependabot[bot] in https://github.com/OpenEMS/openems/pull/3332
- Bump io.reactivex.rxjava3:rxjava from 3.1.11 to 3.1.12 in /cnf by @dependabot[bot] in https://github.com/OpenEMS/openems/pull/3333
- Bump the openems-ui group across 1 directory with 11 updates by @dependabot[bot] in https://github.com/OpenEMS/openems/pull/3340
- Bump tar-fs from 3.1.0 to 3.1.1 in /ui by @dependabot[bot] in https://github.com/OpenEMS/openems/pull/3331
- Bump net.java.dev.jna:jna from 5.18.0 to 5.18.1 in /cnf by @dependabot[bot] in https://github.com/OpenEMS/openems/pull/3348
- Bump org.mockito:mockito-core from 5.18.0 to 5.20.0 in /cnf by @dependabot[bot] in https://github.com/OpenEMS/openems/pull/3349
- Bump net.bytebuddy:byte-buddy from 1.17.6 to 1.17.7 in /cnf by @dependabot[bot] in https://github.com/OpenEMS/openems/pull/3351
- Bump org.apache.felix:org.apache.felix.http.jetty12 from 1.1.2 to 1.1.4 in /cnf by @dependabot[bot] in https://github.com/OpenEMS/openems/pull/3362
- Bump com.squareup.okhttp3:okhttp-jvm from 5.1.0 to 5.2.1 in /cnf by @dependabot[bot] in https://github.com/OpenEMS/openems/pull/3358
- Bump net.bytebuddy:byte-buddy from 1.17.7 to 1.17.8 in /cnf by @dependabot[bot] in https://github.com/OpenEMS/openems/pull/3360
- Bump the openems-ui group across 1 directory with 6 updates by @dependabot[bot] in https://github.com/OpenEMS/openems/pull/3363
Full Changelog: https://github.com/OpenEMS/openems/compare/2025.10.0...2025.11.0
Files
OpenEMS/openems-2025.11.0.zip
Files
(80.7 MB)
| Name | Size | Download all |
|---|---|---|
|
md5:fda95da761c92a98c63f5d56c405eaa2
|
80.7 MB | Preview Download |
Additional details
Related works
- Is supplement to
- Software: https://github.com/OpenEMS/openems/tree/2025.11.0 (URL)
Software
- Repository URL
- https://github.com/OpenEMS/openems