Published October 30, 2025 | Version 2025.11.0
Software Open

OpenEMS/openems: 2025.11.0

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."
  • 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
    • 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 EnergySessionLimit was 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_REACHED state; 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
    • 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 [[]]
    • 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 invert config 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
    • 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-outline sign / icon .
    • 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)
  • 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 modalComponent which has been evaluated every second and leads to slowing down the monitoring
    • 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
  • 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

Software