Skip to content

FEMS Backports 2025-10-02#3339

Merged
sfeilmeier merged 88 commits intodevelopfrom
feature/fems-backports
Oct 2, 2025
Merged

FEMS Backports 2025-10-02#3339
sfeilmeier merged 88 commits intodevelopfrom
feature/fems-backports

Conversation

@sfeilmeier
Copy link
Copy Markdown
Contributor

@sfeilmeier sfeilmeier commented Oct 2, 2025

  • Common

    • 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."
  • UI

    • 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)
  • Edge

    • 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
    • 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 [https://github.com/OpenEMS/openems/issues/1]: expected ReadValue [CHARGING] got [UNDEFINED] for Channel [Status] in Nature [Evcs] on Inputs [[]]
    • Tibber: switch to QUARTER_HOURLY prices
    • 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
  • Backend

    • Dummy AppCenter Metadata
    • Remove UiWebsocketValidator
    • MetadataOdoo: handle uncached Edges
      • Solves throwing an Exception when an Edge is missing in EdgeCache

sfeilmeier and others added 30 commits October 1, 2025 22:44
Add option to select multiple channels at once in /channels

Co-authored-by: Sebastian Asen <[email protected]>
Reviewed-by: Sebastian Asen <[email protected]>
Reviewed-by: Sagar Venu <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Lukas Rieger <[email protected]>
Co-committed-by: Lukas Rieger <[email protected]>
Co-authored-by: Sebastian Asen <[email protected]>
Co-authored-by: Michael Grill <[email protected]>
Reviewed-by: Michael Grill <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Andreas Mur <[email protected]>
Co-committed-by: Andreas Mur <[email protected]>
- Extend Evse with navigation to app center update page
- Refactored app center update pages to be usable with new navigation
- Fixed multiple component creation and destruction with conditional content projection

Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Lukas Rieger <[email protected]>
Co-committed-by: Lukas Rieger <[email protected]>
Helpbutton-component not working due to wrong property name being checked

Reviewed-by: Michael Grill <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Lukas Rieger <[email protected]>
Co-committed-by: Lukas Rieger <[email protected]>
- 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.

Co-authored-by: Michael Grill <[email protected]>
Co-authored-by: Stefan Feilmeier <[email protected]>
Reviewed-by: Michael Grill <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Hueseyin Sahutoglu <[email protected]>
Co-committed-by: Hueseyin Sahutoglu <[email protected]>
Reviewed-by: Johann Kaufmann <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Michael Grill <[email protected]>
Co-committed-by: Michael Grill <[email protected]>
Co-authored-by: Sagar Venu <[email protected]>
Co-authored-by: Sebastian Asen <[email protected]>
Reviewed-by: Sebastian Asen <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Michael Grill <[email protected]>
Co-committed-by: Michael Grill <[email protected]>
Reviewed-by: Sebastian Asen <[email protected]>
Reviewed-by: Sagar Venu <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Lukas Rieger <[email protected]>
Co-committed-by: Lukas Rieger <[email protected]>
Reviewed-by: Lukas Rieger <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Sagar Venu <[email protected]>
Co-committed-by: Sagar Venu <[email protected]>
Reviewed-by: Michael Grill <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Sagar Venu <[email protected]>
Co-committed-by: Sagar Venu <[email protected]>
Reviewed-by: Michael Grill <[email protected]>
Co-authored-by: Kai Jeschek <[email protected]>
Co-committed-by: Kai Jeschek <[email protected]>
Before a IndexOutOfBoundsException was thrown, which caused App Center install to fail

```
2025-08-09T19:01:59,431 [ckend0-0] ERROR [.common.jsonapi.JsonApiBuilder] Index 0 out of bounds for length 0
java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
        at jdk.internal.util.Preconditions.outOfBounds(Unknown Source) ~[?:?]
        at jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Unknown Source) ~[?:?]
        at jdk.internal.util.Preconditions.checkIndex(Unknown Source) ~[?:?]
        at java.util.Objects.checkIndex(Unknown Source) ~[?:?]
        at java.util.ArrayList.get(Unknown Source) ~[?:?]
        at com.google.gson.JsonArray.get(JsonArray.java:232) ~[?:?]
        at io.openems.edge.core.host.OperatingSystemDebianSystemd.parseIpJson(OperatingSystemDebianSystemd.java:640) ~[?:?]
        at io.openems.edge.core.host.OperatingSystemDebianSystemd.parseShowJson(OperatingSystemDebianSystemd.java:672) ~[?:?]
        at io.openems.edge.core.host.OperatingSystemDebianSystemd.getSystemIPs(OperatingSystemDebianSystemd.java:614) ~[?:?]
        at io.openems.edge.core.host.HostImpl.getSystemIPs(HostImpl.java:215) ~[?:?]
        at io.openems.edge.app.common.props.CommunicationProps.lambda$excludingIp$6(CommunicationProps.java:80) ~[?:?]
        at io.openems.edge.core.appmanager.AppDef.lambda$setField$6(AppDef.java:698) ~[?:?]
        at io.openems.edge.core.appmanager.AppDef.lambda$getField$18(AppDef.java:922) ~[?:?]
        at io.openems.edge.core.appmanager.AbstractOpenemsAppWithProps.lambda$getAppAssistant$16(AbstractOpenemsAppWithProps.java:210) ~[?:?]
        at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) ~[?:?]
        at java.util.stream.ReferencePipeline$2$1.accept(Unknown Source) ~[?:?]
        at java.util.Spliterators$ArraySpliterator.forEachRemaining(Unknown Source) ~[?:?]
        at java.util.stream.AbstractPipeline.copyInto(Unknown Source) ~[?:?]
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) ~[?:?]
        at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source) ~[?:?]
        at java.util.stream.AbstractPipeline.evaluate(Unknown Source) ~[?:?]
        at java.util.stream.ReferencePipeline.collect(Unknown Source) ~[?:?]
        at io.openems.edge.core.appmanager.AbstractOpenemsAppWithProps.getAppAssistant(AbstractOpenemsAppWithProps.java:214) ~[?:?]
        at io.openems.edge.core.appmanager.AppManagerImpl.handleGetAppAssistantRequest(AppManagerImpl.java:725) ~[?:?]
        at io.openems.edge.core.appmanager.AppManagerImpl.lambda$buildJsonApiRoutes$34(AppManagerImpl.java:823) ~[?:?]
        at io.openems.edge.common.jsonapi.JsonApiBuilder.lambda$handleRequest$4(JsonApiBuilder.java:106) ~[?:?]
        at io.openems.edge.common.jsonapi.JsonApiBuilder.lambda$rpc$7(JsonApiBuilder.java:214) ~[?:?]
        at io.openems.edge.common.jsonapi.JsonApiEndpoint.handle(JsonApiEndpoint.java:63) ~[?:?]
        at io.openems.edge.common.jsonapi.JsonApiBuilder.handle(JsonApiBuilder.java:702) ~[?:?]
        at io.openems.edge.common.jsonapi.JsonApiBuilder.handle(JsonApiBuilder.java:661) ~[?:?]
        at io.openems.edge.controller.api.common.handler.ComponentRequestHandler.lambda$buildJsonApiRoutes$6(ComponentRequestHandler.java:139) ~[?:?]
        at io.openems.edge.common.jsonapi.JsonApiBuilder.lambda$rpc$9(JsonApiBuilder.java:289) ~[?:?]
        at io.openems.edge.common.jsonapi.JsonApiEndpoint.handle(JsonApiEndpoint.java:63) ~[?:?]
        at io.openems.edge.common.jsonapi.JsonApiBuilder.handle(JsonApiBuilder.java:702) ~[?:?]
        at io.openems.edge.common.jsonapi.JsonApiBuilder.handle(JsonApiBuilder.java:661) ~[?:?]
        at io.openems.edge.common.jsonapi.JsonApiBuilder.lambda$delegate$10(JsonApiBuilder.java:325) ~[?:?]
        at io.openems.edge.common.jsonapi.JsonApiEndpoint.handle(JsonApiEndpoint.java:63) ~[?:?]
        at io.openems.edge.common.jsonapi.JsonApiBuilder.handle(JsonApiBuilder.java:702) ~[?:?]
        at io.openems.edge.common.jsonapi.JsonApiBuilder.handle(JsonApiBuilder.java:661) ~[?:?]
        at io.openems.edge.common.jsonapi.SingleJsonApiBinder.handleRequest(SingleJsonApiBinder.java:82) ~[?:?]
        at io.openems.edge.controller.api.backend.BackendOnRequest.apply(BackendOnRequest.java:73) ~[?:?]
        at io.openems.common.websocket.OnMessageHandler.handleJsonrpcRequest(OnMessageHandler.java:83) ~[?:?]
        at io.openems.common.websocket.OnMessageHandler.run(OnMessageHandler.java:61) ~[?:?]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:?]
        at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:?]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) ~[?:?]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[?:?]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[?:?]
        at java.lang.Thread.run(Unknown Source) [?:?]
```

Reviewed-by: Johann Kaufmann <[email protected]>
Reviewed-by: Lukas Rieger <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Sagar Venu <[email protected]>
Co-committed-by: Sagar Venu <[email protected]>
Gradle:
* Allow more than 2 Tests to run in parrallel
* Enable parallel build by default
* Remove `failOnNoDiscoveredTests = false`

Backend.Application:
* Add test for logger configuration

Backend.B2BWebsocket
* Add @ignore, as tests only work under certain conditions anyway

Common.AbstractCycleWorkerTest;
* Sleep up to 100ms: 1s -> 1ms

Edge.OperatingSystemDebianSystemdTest:
* Use `.lines().toList();` syntax for all tests
* Use `getHostAddress()` instead of `getHostName()`, to skip the reverse name lookup: 9s -> 38ms

Reviewed-by: Michael Grill <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Kai Jeschek <[email protected]>
Co-committed-by: Kai Jeschek <[email protected]>
Added a new formly field which handles links and redirects

Co-authored-by: Lukas Rieger <[email protected]>
Reviewed-by: Johann Kaufmann <[email protected]>
Reviewed-by: Lukas Rieger <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Michael Grill <[email protected]>
Co-committed-by: Michael Grill <[email protected]>
Reviewed-by: Michael Grill <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Fabian Brandtner <[email protected]>
Co-committed-by: Fabian Brandtner <[email protected]>
Reduce the log output to make errors clearer.

Co-authored-by: Stefan Feilmeier <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Kai Jeschek <[email protected]>
Co-committed-by: Kai Jeschek <[email protected]>
- Use fixed DateTime reference, instead of `.now()`, for reproducability
- Remove duplicate `ReadWorkerTest`

Reviewed-by: Johann Kaufmann <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Kai Jeschek <[email protected]>
Co-committed-by: Kai Jeschek <[email protected]>
- fixed exception while deactivating multiple nested checkables in `CheckOr`

Reviewed-by: Fabian Brandtner <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Michael Grill <[email protected]>
Co-committed-by: Michael Grill <[email protected]>
- Added Request  that can filter installed apps with the following filter
   - componentId
   - OpenemsAppCategory
   - factoryId

- added response to UpdateAppConfig

Co-authored-by: Johann Kaufmann <[email protected]>
Reviewed-by: Johann Kaufmann <[email protected]>
Reviewed-by: Michael Grill <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Lukas Rieger <[email protected]>
Co-committed-by: Lukas Rieger <[email protected]>
- Added class EvcsComponent to clean up historic data generation in all views

Co-authored-by: Lukas Rieger <[email protected]>
Reviewed-by: Lukas Rieger <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Johann Kaufmann <[email protected]>
Co-committed-by: Johann Kaufmann <[email protected]>
- prevent disabled components to be shown for new navigation

Reviewed-by: Johann Kaufmann <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Lukas Rieger <[email protected]>
Co-committed-by: Lukas Rieger <[email protected]>
Reviewed-by: Leonhard Anderle <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Lukas Rieger <[email protected]>
Co-committed-by: Lukas Rieger <[email protected]>
- use active power for non hybridEss and subnavigation for phase details only for hybridEss

Reviewed-by: Michael Grill <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Lukas Rieger <[email protected]>
Co-committed-by: Lukas Rieger <[email protected]>
Reviewed-by: Michael Grill <[email protected]>
Reviewed-by: Hanna Späth <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Lukas Rieger <[email protected]>
Co-committed-by: Lukas Rieger <[email protected]>
- handling the automatinc prefix appending to absolute links. Now it only appends the DefaultPrefix if the link is relative.
- future TODO: add handeling dotted nested links in help-button setLink() method.

Reviewed-by: Lukas Rieger <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Anas Shetla <[email protected]>
Co-committed-by: Anas Shetla <[email protected]>
- Addition to #2203 due to bad review
- on unselecting edge unsubscribe if there is still a edgeRpcNotification happening

Reviewed-by: Michael Grill <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Lukas Rieger <[email protected]>
Co-committed-by: Lukas Rieger <[email protected]>
Reviewed-by: Hanna Späth <[email protected]>
Reviewed-by: Lukas Rieger <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Anas Shetla <[email protected]>
Co-committed-by: Anas Shetla <[email protected]>
Reviewed-by: Hanna Späth <[email protected]>
Reviewed-by: Lukas Rieger <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Anas Shetla <[email protected]>
Co-committed-by: Anas Shetla <[email protected]>
sfeilmeier and others added 26 commits October 2, 2025 12:25
- Add `StateMachine` to AllowedChannels in Backend
- Increase Persistence Priority for `ActualMode`
- Added min and max power in generic vehicle and generic vehicle app

Co-authored-by: Sebastian Asen <[email protected]>
Reviewed-by: Sebastian Asen <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Johann Kaufmann <[email protected]>
Co-committed-by: Johann Kaufmann <[email protected]>
- The current weather and the forecast for the next 24 hours are now being written in channels
- This is more efficient in UI

Co-authored-by: Sebastian Asen <[email protected]>
Reviewed-by: Sebastian Asen <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Leonhard Anderle <[email protected]>
Co-committed-by: Leonhard Anderle <[email protected]>
…mport/AcExport

GoodWe is not supporting EmsPowerSets above the official Limits in their Data sheets.

Co-authored-by: Michael Grill <[email protected]>
Co-authored-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Sebastian Asen <[email protected]>
Reviewed-by: Michael Grill <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Sebastian Asen <[email protected]>
Co-committed-by: Sebastian Asen <[email protected]>
- consumption shows evcs twice since last update
- Consumption Meters did not filter evcs, BUT evcs list did not work since ElectricityMeter change
- After Evcs list was fixed, evcss where shown twice because consumption meters still did not filter evcs

Co-authored-by: Sebastian Asen <[email protected]>
Reviewed-by: Sebastian Asen <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Johann Kaufmann <[email protected]>
Co-committed-by: Johann Kaufmann <[email protected]>
Co-authored-by: Sebastian Asen <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Sebastian Asen <[email protected]>
Co-committed-by: Sebastian Asen <[email protected]>
- Add `invert` config property to all Shelly ElectricityMeter implementations
- ignoring heat and evcs components in the extern meter list

Co-authored-by: Leon Blenk <[email protected]>
Co-authored-by: Sebastian Asen <[email protected]>
Reviewed-by: Sebastian Asen <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Leon Blenk <[email protected]>
Co-committed-by: Leon Blenk <[email protected]>
- Adds the State-Machine to UI page for better debugging
Co-authored-by: Sebastian Asen <[email protected]>
Reviewed-by: Michael Grill <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Sebastian Asen <[email protected]>
Co-committed-by: Sebastian Asen <[email protected]>
Co-authored-by: Stefan Feilmeier <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Lukas Rieger <[email protected]>
Co-committed-by: Lukas Rieger <[email protected]>
- Rework of the ripple control receiver:
  - Main problem solved: Dynamic rcr was limiting to zero per default if feedInLimit was disabled
  - Added tests & testable methods
  - Renamed some properties/methods

Co-authored-by: Sebastian Asen <[email protected]>
Reviewed-by: Michael Grill <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Sebastian Asen <[email protected]>
Co-committed-by: Sebastian Asen <[email protected]>
- dont validate json for delete or testing
- Dynamic Tariffs compatbile with commercial 50 gen 3

Reviewed-by: Leon Blenk <[email protected]>
Reviewed-by: Victor Nagy <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Michael Grill <[email protected]>
Co-committed-by: Michael Grill <[email protected]>
- rm unnecessary props from ancillary cost: `"formattedDateRange", "key"`

Co-authored-by: Michael Grill <[email protected]>
Reviewed-by: Michael Grill <[email protected]>
Reviewed-by: Victor Nagy <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Lukas Rieger <[email protected]>
Co-committed-by: Lukas Rieger <[email protected]>
- Added UI for RippleControlReceiver
- Grid Flat Widget: Grid states "no Limitation", "Consumption Limitation" (§14a), "Feed In Limiation" (RCR), "Grid Limitation" (if both §14a and RCR are active)
- Grid Modal Widget: complete rework from code generated view to html view
- Grid Modal Widget: added lines for §14a Controller and Grid Feed In Limit
- History:
- added ChartJs boxes for RCR limitation values with cumulated daily active time
- added new page "External Limitation"
- RCR or §14a are only shown if they are at least activated once a day

Co-authored-by: Lukas Rieger <[email protected]>
Co-authored-by: DerMuaaa <102706922+Andreas [email protected]>
Co-authored-by: Michael Grill <[email protected]>
Reviewed-by: Lukas Rieger <[email protected]>
Reviewed-by: Victor Nagy <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Fabian Brandtner <[email protected]>
Co-committed-by: Fabian Brandtner <[email protected]>
Reviewed-by: Sebastian Asen <[email protected]>
Co-authored-by: Lukas Rieger <[email protected]>
Co-committed-by: Lukas Rieger <[email protected]>
- 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.

Co-authored-by: Michael Grill <[email protected]>
Co-authored-by: Stefan Feilmeier <[email protected]>
Reviewed-by: Michael Grill <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Hueseyin Sahutoglu <[email protected]>
Co-committed-by: Hueseyin Sahutoglu <[email protected]>
[Reference](https://www.reddit.com/r/Angular2/comments/1j71x20/how_to_format_angulars_new_controlflow_syntax_in/)

- fix formatter not formatting new control flow syntax correctly, which resulted in

```
@if (form) {
<form [formGroup]="form.formGroup">
</form>
}
```

- fixed version:
```
@if (form) {
  <form [formGroup]="form.formGroup">
  </form>
}
```

Reviewed-by: Andreas Mur <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Lukas Rieger <[email protected]>
Co-committed-by: Lukas Rieger <[email protected]>
- changed icons and Buttons to be more consistently identified with functionality

Co-authored-by: DerMuaaa <102706922+Andreas [email protected]>
Reviewed-by: Lukas Rieger <[email protected]>
Reviewed-by: Hanna Späth <[email protected]>
Reviewed-by: Stefan Feilmeier <[email protected]>
Co-authored-by: Andreas Mur <[email protected]>
Co-committed-by: Andreas Mur <[email protected]>
@codecov
Copy link
Copy Markdown

codecov bot commented Oct 2, 2025

Codecov Report

❌ Patch coverage is 67.81609% with 504 lines in your changes missing coverage. Please review.

Additional details and impacted files
@@              Coverage Diff              @@
##             develop    #3339      +/-   ##
=============================================
+ Coverage      59.46%   59.85%   +0.39%     
+ Complexity       113      112       -1     
=============================================
  Files           2770     2786      +16     
  Lines         119632   120836    +1204     
  Branches        8914     9011      +97     
=============================================
+ Hits           71133    72320    +1187     
+ Misses         45825    45818       -7     
- Partials        2674     2698      +24     
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@sfeilmeier sfeilmeier merged commit 7cef75e into develop Oct 2, 2025
7 checks passed
@sfeilmeier sfeilmeier deleted the feature/fems-backports branch October 2, 2025 13:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant