@sihui@thaake
Can you please test the builds of the 4.3.x backport?
Just get a recent version from JFrog, then get the bundle id of org.openhab.binding.fronius in the openHAB console with
I’m still struggling to get thing actions working. I’m using DSL on OH 4.3.5 and still get the auth error.
Using org.openhab.binding.fronius-4.3.7-20250730.105635-40.jar from the link.
Another thing is, I’m using rulesDSL. The binding docs have no example how to exactly call ThingActions from DSL so I’m unsure if what I’m trying is correct.
I’m using var froniusInverterActionsX = getActions(‘fronius’, ‘fronius:powerinverter:FroniusInverterBridge:FroniusInverter’) andfroniusInverterActionsX.resetBatteryControl; for now, that at least seems to trigger HTTP action.
The main problem however is I keep getting the auth error mentioned above, output see below.
Is it because I use the ‘user’ level credentials to access the inverter - do I need admin level access?
2025-07-31 14:34:39.884 [DEBUG] [org.openhab.binding.fronius.internal.api.FroniusConfigAuthUtil ] - Getting authentication parameters
2025-07-31 14:34:39.886 [DEBUG] [org.openhab.binding.fronius.internal.api.FroniusConfigAuthUtil ] - Sending login request to get authentication challenge
2025-07-31 14:34:39.905 [DEBUG] [org.openhab.binding.fronius.internal.api.FroniusConfigAuthUtil ] - HTTP error on attempt #1 http://192.168.188.50/commands/Login?user=user
2025-07-31 14:34:40.406 [DEBUG] [org.openhab.binding.fronius.internal.api.FroniusConfigAuthUtil ] - Sending login request to get authentication challenge
2025-07-31 14:34:40.411 [DEBUG] [org.openhab.binding.fronius.internal.api.FroniusConfigAuthUtil ] - HTTP error on attempt #2 http://192.168.188.50/commands/Login?user=user
2025-07-31 14:34:41.412 [DEBUG] [org.openhab.binding.fronius.internal.api.FroniusConfigAuthUtil ] - Failed connecting to http://192.168.188.50/commands/Login?user=user after 3 attempts.
org.openhab.binding.fronius.internal.api.FroniusCommunicationException: No authentication header found in login response
at org.openhab.binding.fronius.internal.api.FroniusConfigAuthUtil.getAuthParams(FroniusConfigAuthUtil.java:83) ~[?:?]
at org.openhab.binding.fronius.internal.api.FroniusConfigAuthUtil.login(FroniusConfigAuthUtil.java:225) ~[?:?]
at org.openhab.binding.fronius.internal.api.FroniusBatteryControl.setTimeOfUse(FroniusBatteryControl.java:131) ~[?:?]
at org.openhab.binding.fronius.internal.api.FroniusBatteryControl.reset(FroniusBatteryControl.java:157) ~[?:?]
at org.openhab.binding.fronius.internal.action.FroniusSymoInverterActions.lambda$0(FroniusSymoInverterActions.java:168) ~[?:?]
at org.openhab.binding.fronius.internal.action.FroniusSymoInverterActions.executeBatteryControlAction(FroniusSymoInverterActions.java:311) ~[?:?]
at org.openhab.binding.fronius.internal.action.FroniusSymoInverterActions.resetBatteryControl(FroniusSymoInverterActions.java:167) ~[?:?]
at org.openhab.binding.fronius.internal.action.FroniusSymoInverterActions.resetBatteryControl(FroniusSymoInverterActions.java:54) ~[?:?]
at jdk.internal.reflect.GeneratedMethodAccessor601.invoke(Unknown Source) ~[?:?]
at
SymoHybrid, firmware 1.28 I think but it’s not my own device so hard to lookup and change things quickly. Yes I asked the owner to upgrade it to 1.36+
But I hope you agree that we should be aiming for the binding to work with as many Fronius inverters as possible and properly at least communicate with all of them, even those that might not have up to date enough firmware to provide a specific function.
Do the Thing properties show the firmware version?
If you can provide the neccassary paths and HTTP header names and check that the time of use functionality is available through the UI, we might get it running. Open the network tab of the browser’s developer tools to check for the login and time of use setting paths, and click on those requests to get the names of all authentication related headers, as well as there structure (e.g. qop=…, realm=…, nonce=…), no need to share the actual values. Probably PM them instead of posting them here.
No, the inverter thing only has a single Thing property, ThingTypeVersion
Firmware can be found in network requests, it’s 1.1.26-7
In network tab I’ve only seen what I think is the auth request, see below (I see nothing to hide in there, right?). Did not see any request about time of use.
Would I need admin user (= installer level HTTP access) for that? I have user level only so far.
Time of use is available for the user account normally.
Okay, this seems like the actual login, the authorisation header looks similar to what later firmware uses. The must be a request before where the authentication challenge is retrieved from the inverter, but anyway we don’t need to check further and get Auth running if the required time of use setting is not available.
And yes, there is nothing to hide. Digest Auth doesn’t transmit the credentials plaintext and also doesn’t allow replay attacks, thanks to hashing and request counters.
Okay, I got feedback from the installer showing it’s 1.28.1-2 but stating that that is the most current firmware. It says the latest firmware is not available for that hardware version yet.
It’s a SymoHybrid 5.0-3-S (not a Gen24).
But I don’t see any batterymanagement / time of use menu when accessing as “user”.
Pretty much every click to something of interest is hidden behind the admin user (which I don’t have). Do you know if I need that?
Time of use is needed for my approach of controlling the battery behaviour. Probably the installer can check if he can access this setting as admin, but as it’s no Gen24 I don’t know if it has any functionality like this.
I got access to another toy, a Gen24 with firmware 1.36.6-1 this time.
It has a ToU UI item and I have User access so I guess the prerequisites are met.
Installed your latest jar from jfrog (version -57).
So, charging using battery Thing actions works now!
But discharging does not. Whenever I send a negative value, I get a response like below.
Isn’t discharging supposed to work? Does it work for you?
Do I need to change some admin setting in the inverter for that (it does not have any limits active).
2025-08-19 09:06:17.409 [DEBUG] [org.openhab.binding.fronius.internal.api.FroniusConfigAuthUtil ] - Creating digest authentication header
2025-08-19 09:06:17.427 [DEBUG] [org.openhab.binding.fronius.internal.api.FroniusBatteryControl ] - {
"errors" :
[
"INVALID_DATA",
"NODE_NOT_VALID"
],
"permissionFailure" : [],
"unknownNodes" : [],
"validationErrors" :
[
"validator::Power::default_range"
],
"writeFailure" : [],
"writeSuccess" : []
}
2025-08-19 09:06:17.428 [WARN ] [penhab.binding.fronius.internal.action.FroniusSymoInverterActions] - Failed to execute battery control action
org.openhab.binding.fronius.internal.api.FroniusCommunicationException: Failed to write configuration to inverter
at org.openhab.binding.fronius.internal.api.FroniusBatteryControl.setTimeOfUse(FroniusBatteryControl.java:144) ~[?:?]
at org.openhab.binding.fronius.internal.api.FroniusBatteryControl.addForcedBatteryChargingSchedule(FroniusBatteryControl.java:227) ~[?:?]
at org.openhab.binding.fronius.internal.api.FroniusBatteryControl.forceBatteryCharging(FroniusBatteryControl.java:202) ~[?:?]
at org.openhab.binding.fronius.internal.action.FroniusSymoInverterActions.lambda$3(FroniusSymoInverterActions.java:211) ~[?:?]
at org.openhab.binding.fronius.internal.action.FroniusSymoInverterActions.executeBatteryControlAction(FroniusSymoInverterActions.java:311) ~[?:?]
at org.openhab.binding.fronius.internal.action.FroniusSymoInverterActions.forceBatteryCharging(FroniusSymoInverterActions.java:210) ~[?:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:569) ~[?:?]
at org.openhab.core.automation.internal.module.handler.AnnotationActionHandler.execute(AnnotationActionHandler.java:127) ~[?:?]
at org.openhab.core.automation.rest.internal.ThingActionsResource.executeThingAction(ThingActionsResource.java:258) ~[?:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:569) ~[?:?]
The inverter needs positive values only with the appropriate direction, i.e. charge or discharge, set.
Discharging is currently not implemented as an action.
Okay, thanks. Please implement it when you find time to.
Useful to discharge the battery on a summer morning when you need the battery capacity to store the midday peak.
Could you backport your current jar changes into 4.3.7?
According to Fronius it has. I don’t see it when I access the inverter UI with user credentials, but I have a manual showing settings and this is available on that inverter model.
FWIW, I saw this below on thing creation and the thing doesn’t offer your Thing actions.
2025-08-19 12:13:19.989 [DEBUG] [.openhab.binding.fronius.internal.handler.FroniusBaseThingHandler] - Initializing Fronius Smart Meter Service
2025-08-19 12:13:20.012 [DEBUG] [enhab.binding.fronius.internal.handler.FroniusSymoInverterHandler] - Invalid JSON response for version info from Fronius inverter at 192.168.188.50: <?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>404 Not Found</h1>
</body>
</html>
com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 8 path $
at com.google.gson.JsonParser.parseReader(JsonParser.java:76) ~[bundleFile:?]
at com.google.gson.JsonParser.parseString(JsonParser.java:51) ~[bundleFile:?]
at org.openhab.binding.fronius.internal.handler.FroniusSymoInverterHandler.getInverterInfo(FroniusSymoInverterHandler.java:426) [bundleFile:?]
at org.openhab.binding.fronius.internal.handler.FroniusSymoInverterHandler.initialize(FroniusSymoInverterHandler.java:145) [bundleFile:?]
at jdk.internal.reflect.GeneratedMethodAccessor1311.invoke(Unknown Source) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:569) ~[?:?]
at org.openhab.core.internal.common.AbstractInvocationHandler.invokeDirect(AbstractInvocationHandler.java:147) [bundleFile:?]
at org.openhab.core.internal.common.Invocation.call(Invocation.java:52) [bundleFile:?]
at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) [?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [?:?]
at java.lang.Thread.run(Thread.java:840) [?:?]
Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 8 path $
at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1659) ~[bundleFile:?]
at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1465) ~[bundleFile:?]
at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:551) ~[bundleFile:?]
at com.google.gson.stream.JsonReader.peek(JsonReader.java:433) ~[bundleFile:?]
at com.google.gson.JsonParser.parseReader(JsonParser.java:71) ~[bundleFile:?]
... 12 more
2025-08-19 12:13:20.016 [DEBUG] [.openhab.binding.fronius.internal.handler.FroniusBaseThingHandler] - Initializing Fronius Symo Inverter Service