Fronius Symo Inverter with smartmeter in OH3, using text file config

Hi Everyone. I thought it wise to contribute some knowledge given how much I’ve asked over time.

The following is how I’ve set up my Fronius Symo inverter, with a smartmeter under OH3. I’ve included a .map I created to translate the “error codes” into human readable form for the sitemap. It might help save you some time if you have the same setup. I have manually created my text based configuration files.

I find this setup helps with the binding sticking in the “Initializing” state.

  1. I have installed the Fronius binding:
    Fronius - Bindings | openHAB

  2. I have a group called gOutsideSouthWall to which the Fronius thing belongs. The group is created in an items file which I’ve called “housemodel.items” here’s the relevant outside group:

Summary
Group gOutsideSouthWall     "Outside South Wall"    <terrace>           (gOutdoor)          ["Patio"]
  1. Here’s my fronius.things file:
Summary
Bridge fronius:bridge:mybridge "Fronius Bridge" @ "gOutsideSouthWall" [hostname="your.IPaddress.ofyourFronius.goeshere", refreshInterval=30] {
    Thing powerinverter myinverter [deviceId=1]
    Thing meter mymeter [deviceId=0]
}
  1. Here’s my fonius.items file
Summary
Group  eFroniusSymoInverter                 "Fronius Symo Inverter"                         <solarplant>    (gOutsideSouthWall)         ["Equipment"]
Number:Power            Fronius_AC_Power                "Fronius AC Power"                              <energy>        (eFroniusSymoInverter,gHistory)     [Measurement,Power]     {channel="fronius:powerinverter:mybridge:myinverter:inverterdatachannelpac"}
Number:Energy           Fronius_Day_Energy              "Fronius Total Today Energy"                    <solarplant>    (eFroniusSymoInverter,gHistory)     [Measurement,Energy]    {channel="fronius:powerinverter:mybridge:myinverter:inverterdatachanneldayenergy"}
Number:Energy           Fronius_Total_Energy            "Fronius Total T.D. Energy"                     <solarplant>    (eFroniusSymoInverter,gHistory)     [Measurement,Energy]    {channel="fronius:powerinverter:mybridge:myinverter:inverterdatachanneltotal"}
Number:Energy           Fronius_Year_Energy             "Fronius Year T.D. Energy"                      <solarplant>    (eFroniusSymoInverter,gHistory)     [Measurement,Energy]    {channel="fronius:powerinverter:mybridge:myinverter:inverterdatachannelyear"}
Number:Frequency        Fronius_FAC                     "Fronius AC Current Frequency"                  <energy>        (eFroniusSymoInverter,gHistory)     [Measurement,Frequency] {channel="fronius:powerinverter:mybridge:myinverter:inverterdatachannelfac"}
Number:Energy           Fronius_IAC                     "Fronius AC AMPs"                               <energy>        (eFroniusSymoInverter,gHistory)     [Measurement,Energy]    {channel="fronius:powerinverter:mybridge:myinverter:inverterdatachanneliac"}
Number:Energy           Fronius_IDC                     "Fronius DC AMPs"                               <energy>        (eFroniusSymoInverter,gHistory)     [Measurement,Energy]    {channel="fronius:powerinverter:mybridge:myinverter:inverterdatachannelidc"}
Number:Energy           Fronius_UAC                     "Fronius AC Volts"                              <energy>        (eFroniusSymoInverter,gHistory)     [Measurement,Energy]    {channel="fronius:powerinverter:mybridge:myinverter:inverterdatachanneluac" }
Number:Energy           Fronius_UDC                     "Fronius DC Volts"                              <energy>        (eFroniusSymoInverter,gHistory)     [Measurement,Energy]    {channel="fronius:powerinverter:mybridge:myinverter:inverterdatachanneludc" }
Number                  Fronius_ErrorCode               "Fronius Error Code [MAP(fronius.map):%s]"      <error>         (eFroniusSymoInverter,gHistory)     [Status]                {channel="fronius:powerinverter:mybridge:myinverter:inverterdatadevicestatuserrorcode"}
Number                  Fronius_StatusCode              "Fronius Status Code [MAP(fronius.map):%s]"     <error>         (eFroniusSymoInverter,gHistory)     [Status]                {channel="fronius:powerinverter:mybridge:myinverter:inverterdatadevicestatusstatuscode"}
Number:Power            Fronius_Grid_Power              "Fronius Grid Power"                            <energy>        (eFroniusSymoInverter,gHistory)     [Measurement,Power]     {channel="fronius:powerinverter:mybridge:myinverter:powerflowchannelpgrid"}
Number:Power            Fronius_Load_Power              "Fronius Load Power"                            <energy>        (eFroniusSymoInverter,gHistory)     [Measurement,Power]     {channel="fronius:powerinverter:mybridge:myinverter:powerflowchannelpload"}
Number:Power            Fronius_Battery_Power           "Fronius Battery Power"                         <energy>        (eFroniusSymoInverter,gHistory)     [Measurement,Power]     {channel="fronius:powerinverter:mybridge:myinverter:powerflowchannelpakku"}
Number:Power            Fronius_Solar_Yield             "Fronius Solar Yield"                           <energy>        (eFroniusSymoInverter,gHistory)     [Measurement,Power]     {channel="fronius:powerinverter:mybridge:myinverter:powerflowchannelppv"}

Group eFroniusSmartMeter                    "Fronius Smart Meter"                           <solarplant>    (gOutsideSouthWall)         ["Equipment"]
Number                  Fronius_Meter_Enable            "Fronius Meter Enabled Code"                    <error>         (eFroniusSmartMeter,gHistory)       [Status]                {channel="fronius:meter:mybridge:mymeter:enable"}
Number                  Fronius_Meter_Location          "Fronius Meter Location"                        <error>         (eFroniusSmartMeter,gHistory)       [Status]                {channel="fronius:meter:mybridge:mymeter:location"}
Number:ElectricCurrent  Fronius_Meter_CurrentPhase1     "Fronius AC Current Phase 1"                    <energy>        (eFroniusSmartMeter,gHistory)       [Measurement,Current]   {channel="fronius:meter:mybridge:mymeter:currentacphase1"}
Number:ElectricCurrent  Fronius_Meter_CurrentPhase2     "Fronius AC Current Phase 2"                    <energy>        (eFroniusSmartMeter,gHistory)       [Measurement,Current]   {channel="fronius:meter:mybridge:mymeter:currentacphase2"}
Number:ElectricCurrent  Fronius_Meter_CurrentPhase3     "Fronius AC Current Phase 3"                    <energy>        (eFroniusSmartMeter,gHistory)       [Measurement,Current]   {channel="fronius:meter:mybridge:mymeter:currentacphase3"}
Number:Power            Fronius_Meter_VoltagePhase1     "Fronius AC Voltage Phase 1"                    <energy>        (eFroniusSmartMeter,gHistory)       [Measurement,Voltage]   {channel="fronius:meter:mybridge:mymeter:voltageacphase1"}
Number:Power            Fronius_Meter_VoltagePhase2     "Fronius AC Voltage Phase 2"                    <energy>        (eFroniusSmartMeter,gHistory)       [Measurement,Voltage]   {channel="fronius:meter:mybridge:mymeter:voltageacphase2"}
Number:Power            Fronius_Meter_VoltagePhase3     "Fronius AC Voltage Phase 3"                    <energy>        (eFroniusSmartMeter,gHistory)       [Measurement,Voltage]   {channel="fronius:meter:mybridge:mymeter:voltageacphase3"}
Number:Power            Fronius_Meter_PowerPhase1       "Fronius AC Consumption Phase 1"                <energy>        (eFroniusSmartMeter,gHistory)       [Measurement,Voltage]   {channel="fronius:meter:mybridge:mymeter:powerrealphase1"}
Number:Power            Fronius_Meter_PowerPhase2       "Fronius AC Consumption Phase 2"                <energy>        (eFroniusSmartMeter,gHistory)       [Measurement,Voltage]   {channel="fronius:meter:mybridge:mymeter:powerrealphase2"}
Number:Power            Fronius_Meter_PowerPhase3       "Fronius AC Consumption Phase 3"                <energy>        (eFroniusSmartMeter,gHistory)       [Measurement,Voltage]   {channel="fronius:meter:mybridge:mymeter:powerrealphase3"}
Number:Power            Fronius_Meter_PowerFactorPhase1 "Fronius Power Factor Phase 1"                  <energy>        (eFroniusSmartMeter,gHistory)       [Measurement]           {channel="fronius:meter:mybridge:mymeter:powerfactorphase1"}
Number:Power            Fronius_Meter_PowerFactorPhase2 "Fronius Power Factor Phase 1"                  <energy>        (eFroniusSmartMeter,gHistory)       [Measurement]           {channel="fronius:meter:mybridge:mymeter:powerfactorphase2"}
Number:Power            Fronius_Meter_PowerFactorPhase3 "Fronius Power Factor Phase 1"                  <energy>        (eFroniusSmartMeter,gHistory)       [Measurement]           {channel="fronius:meter:mybridge:mymeter:powerfactorphase3"}
Number:Energy           Fronius_Meter_EnergyConsumed    "Fronius Energy Consumed"                       <energy>        (eFroniusSmartMeter,gHistory)       [Measurement,Energy]    {channel="fronius:meter:mybridge:mymeter:energyrealsumconsumed"}
Number:Energy           Fronius_Meter_EnergyProduced    "Fronius Energy Produced"                       <energy>        (eFroniusSmartMeter,gHistory)       [Measurement,Energy]    {channel="fronius:meter:mybridge:mymeter:energyrealsumproduced"}

Group gFroniusManualThings                  "Fronius Manual Number Things"                  <solarplant>    (gOutsideSouthWall)         ["Equipment"]
Number:Power            Solar_Feed_In                   "Solar Feed In [%.2f W]"                        <energy>        (gFroniusManualThings,gChart,gHistory)  [Measurement,Power]
Number:Power            Grid_Consumption                "Grid Consumption [%.2f W]"                     <energy>        (gFroniusManualThings,gChart,gHistory)  [Measurement,Power]
DateTime                Solar_Feed_LastUpdate           "Solar Feed Last Updated [%1$tA, %1$tH:%1$tM:%1$tS]"   <time>          (gFroniusManualThings,gHistory)         [Measurement,Timestamp]
  1. I use all of this to help run an item which uses energy only when there’s a surplus of energy to be used. Here’s the rule for an example. It calculates the feed-in, the consumption, does a quick calculation and then determines if there’s any surplus (above 250 Watts) to be used. If the surplus is less than 200 Watts (including negative meaning we are consuming energy from the grid) then it stops the item:
Summary
rule "turn on the study tplink power point when there is spare power"
when
    Item SolarSurplussCheck changed from ON to OFF 
then
    val sunset = (Sunset_Time.state as DateTimeType).getZonedDateTime()
    if (now.isBefore(sunset)) {
        SolarSurplussCheck.sendCommand("ON")
    }
end

rule "Solar Surpluss Energy part 1"
when
    Item SolarSurplussCheck changed from OFF to ON
then
    var int feedin1 = (Fronius_Solar_Yield.state as Number).intValue
    var int actual_consumption1 = (Fronius_Meter_PowerPhase1.state as Number).intValue()
    var int actual_consumption2 = (Fronius_Meter_PowerPhase2.state as Number).intValue()
    var int actual_consumption3 = (Fronius_Meter_PowerPhase3.state as Number).intValue()
    if ((Fronius_Meter_PowerPhase1.state as Number) > 0 ) {
        logInfo("Power Surpluss Calculations", "Consumtion rate on phase 1 is positive at {}", Fronius_Meter_PowerPhase1.state as Number)
    } else {
        actual_consumption1 = 0 - (Fronius_Meter_PowerPhase1.state as Number).intValue()
        logInfo("Power Surpluss Calculations", "Feed in rate on phase 1 is {} W", actual_consumption1)
        actual_consumption1 = 0
    }
    if ((Fronius_Meter_PowerPhase2.state as Number) > 0 ) {
        logInfo("Power Surpluss Calculations", "Consumtion rate on phase 2 is positive at {}", Fronius_Meter_PowerPhase2.state as Number)
    } else {
        actual_consumption2 = 0 - (Fronius_Meter_PowerPhase2.state as Number).intValue()
        logInfo("Power Surpluss Calculations", "Feed in rate on phase 2 is {} W", actual_consumption2)
        actual_consumption2 = 0
    }
    if ((Fronius_Meter_PowerPhase3.state as Number) > 0) {
        logInfo("Power Surpluss Calculations", "Consumtion rate on phase 3 is positive at {}", Fronius_Meter_PowerPhase3.state as Number)
    } else {
        actual_consumption3 = 0 - (Fronius_Meter_PowerPhase3.state as Number).intValue()
        logInfo("Power Surpluss Calculations", "Feed in rate on phase 3 is {} W", actual_consumption3)
        actual_consumption3 = 0
    }
    var int actual_consumption = actual_consumption1 + actual_consumption2 + actual_consumption3
    var int feedin = feedin1 - actual_consumption
    if (feedin < 0) {
        feedin = 0
    }
    Solar_Feed_LastUpdate.postUpdate(new DateTimeType()) 
    logInfo("Power Surpluss Calculations", "Total Solar Power feed in rate is: {} W, consumption is {} W, generation is {} W", feedin, actual_consumption, feedin1)
    Solar_Feed_In.setState(new DecimalType(feedin))
    Grid_Consumption.setState(new DecimalType(actual_consumption))
    if (feedin > 250) {
        if (StudyPowerpoint_Power.state == OFF) {
            StudyPowerpoint_Power.sendCommand("ON")
            logInfo("Study_TPLink_powerpoint", "Enough power surpluss to start")
            Solar_Feed_In.postUpdate(feedin)
            Grid_Consumption.postUpdate(actual_consumption)
        } else {
            logInfo("Study_TPLink_powerpoint", "Power is currently on, surpluss continues")
            Solar_Feed_In.postUpdate(feedin)
            Grid_Consumption.postUpdate(actual_consumption)
        }
    }
    if (feedin < 200) {
        if (StudyPowerpoint_Power.state == ON) {
            logInfo("Study_TPLink_powerpoint", "Not enought power surpluss, shutting down")
            StudyPowerpoint_Power.sendCommand("OFF")
            Solar_Feed_In.postUpdate(feedin)
            Grid_Consumption.postUpdate(actual_consumption)
        }
    } 
end
  • To use this rule, I need two manual switches with expire bindings:
Summary
Switch  SolarSurplussCheck      "Solar Surpluss Checker [%s]"                <switch> (gHistory,gManualThings) {state="OFF",expire="5m,state=OFF"}
Switch  InitialiseSolarCheck    "Solar Surpluss Checker Initializer [%s]"    <switch> (gHistory,gManualThings) {state="OFF",expire="1200m,state=OFF"}
  • Which get kicked into motion when the sun rises through a wakeup rule (there are some things in here which aren’t relevant, the correct rule is called “turn on the study tplink power point when there is spare power”:
Summary
rule "Set wake-up during the week" // I wonder if it's possible to interface with something here? Such as a smart alarm clock? Maybe create a set-point for the Thing?
when
    Time cron "0 30 6 ? * * *" // at 06.30
then
    if (Ephemeris.isWeekend == false) {
        SleepTime.sendCommand("OFF")
        EastHallSleepTime.sendCommand("OFF")
        WakeUp.sendCommand("ON")
    }
end

rule "Set wake-up on the weekend"
when
    Time cron "0 0 8 ? * * *" // at 08.00
then
    if (Ephemeris.isWeekend == true) {
        SleepTime.sendCommand("OFF")
	    EastHallSleepTime.sendCommand("OFF")
        WakeUp.sendCommand("ON")
    }
end

rule "Bulb 1 and 2 fade up in brightness on living room lamp"
when 
    Item WakeUp changed from OFF to ON 
then
	if (Ephemeris.isWeekend == false) {
		logInfo("Lounge Room", "Wake up started")
		var Number LT = Colour_Temperature.state as Number
		var LB = (Light_Brightness.state as Number).intValue()
		var Number LTIkea = LT - 15
		if (LTIkea < 0) {
			LTIkea = 0
		}
		Hueambiancecandle1_Brightness.sendCommand(LB)
		Hueambiancecandle1_Color_Temperature.sendCommand(LT)
		Colortemperaturelight5_Color_Temperature.sendCommand(LTIkea)
		Colortemperaturelight5_Brightness.sendCommand(LB)
	}
end

rule "Coffee Machine On"
when 
    Item WakeUp changed from OFF to ON 
then
    logInfo("Kitchen", "Wake up, coffee machine ON")
    CoffeeMe.sendCommand("ON")
end

rule "turn on the study tplink power point when there is spare power"
when
    Item WakeUp changed from OFF to ON 
then
    if (SolarSurplussCheck.state == OFF) {
        SolarSurplussCheck.sendCommand("ON")
    } else {
		SolarSurplussCheck.sendCommand("OFF")
	}
end
  1. I use this code in my Home.sitemap file relating to the Fronius stuff:
Summary
Frame label="Solar Panels (Realtime)" {
        Default item=Fronius_ErrorCode label="Error code"
        Default item=Fronius_StatusCode label="Status code"
        Default item=Fronius_Grid_Power label="Grid power (now)"
        Default item=Fronius_Solar_Yield label="PV Generation (now)"
        Default item=Fronius_Meter_PowerPhase1 label="Phase 1 (now)" icon="energy"
        Default item=Fronius_Meter_PowerPhase2 label="Phase 2 (now)" icon="energy"
        Default item=Fronius_Meter_PowerPhase3 label="Phase 3 (now)" icon="energy"
    }
Frame item=Solar_Feed_LastUpdate label="Solar Panels" {
        Default item=Grid_Consumption label="Grid Power"
        Default item=Solar_Feed_In label="Calculated Feed in (- consumption)" icon="energy"
    }
  • Here’s the corresponding output on the sitemap:
Summary

  1. For your copy and paste edification, to get the error code and status code into human readable form,\ I use the following transformation in a file called “fronius.map”:
Summary

0=Startup
1=Startup
2=Startup
3=Startup
4=Startup
5=Startup
6=Startup
7=Running
8=Standby
9=Bootloading
10=Error
102=AC voltage too high
103=AC voltage too low
105=AC frequency too high
106=AC frequency too low
107=AC grid outside the permissible limits
108=Stand alone operation detected
112=RCMU error
301=Overcurrent (AC)
302=Overcurrent (DC)
303=DC module over temperature
304=AC module over temperature
305=No power being fed in, despite closed relay
306=PV output too low for feeding energy into the grid
307=LOW PV VOLTAGE
308=Intermediate circuit voltage too high
309=DC input voltage MPPT 1 too high
311=Polarity of DC strings reversed
313=DC input voltage MPPT 2 too high
314=Current sensor calibration timeout
315=AC current sensor erro
316=Interrupt Check fail
325=Overtemperature in the connection area
326=Fan 1 error
327=Fan 2 error
401=No communication possible with the power stage set
406=AC module temperature sensor faulty (L1)
407=AC module temperature sensor faulty (L2)
408=DC component measured in the grid too high
412=Fixed voltage mode has been selected instead of MPP voltage
415=Safety cut out via option card or RECERBO has triggered
416=No communication possible between power stage set and control
417=Hardware ID problem
419=Unique ID conflict
420=No communication possible with the Hybrid manager
421=HID range error
425=No communication with the power stage set possible
426=Possible hardware fault
427=Possible hardware fault
428=Possible hardware fault
431=Software problem
436=Functional incompatibility (one or more PC boards in the
437=Power stage set problem
438=Functional incompatibility (one or more PC boards in the
443=Intermediate circuit voltage too low or asymmetric
445=Compatability error (e.g. due to replacement of a PC board)
447=Insulation fault
448=Neutral conductor not connected
450=Guard cannot be found
451=Memory error detected
452=Communication error between the processors
453=Grid voltage and power stage set are incompatible
454=Grid frequency and power stage set are incompatible
456=Anti-islanding function is no longer implemented correctly
457=Grid relay sticking or the neutral conductor ground voltage
458=Error when recording the measuring signal
459=Error when recording the measuring signal for the insulation
460=Reference voltage source for the digital signal processor
461=Fault in the DSP data memory
462=Error with DC feed monitoring routine
463=Reversed AC polarity, AC connector inserted incorrectly
474=RCMU sensor faulty
475=Solar panel ground fault, insulation fault (connection
476=Driver supply voltage too low
480=Functional incompatibility (one or more PC boards in the
481=Functional incompatibility (one or more PC boards in the
482=Setup after the initial start-up was interrupted
483=Voltage UDC fixed on MPP2 string out of limits
485=CAN transmit buffer is full
502=Insulation error on the solar panels
509=No energy fed into the grid in the past 24 hours
515=No communication with filter possible
516=No communication possible with the storage unit
517=Power derating caused by too high a temperature
518=Internal DSP malfunction
519=No communication possible with the storage unit
520=No energy fed into the grid by MPPT1 in the past 24 hours
522=DC low string 1
523=DC low string 2
558=Functional incompatibility (one or more PC boards in the
559=Functional incompatibility (one or more PC boards in the
560=Derating caused by over-frequency
564=Functional incompatibility (one or more PC boards in the
566=Arc detector switched off (e.g. during external arc
567=Grid Voltage Dependent Power Reduction is active
601=CAN bus is full
603=AC module temperature sensor faulty (L3)
604=DC module temperature sensor faulty
607=RCMU error
608=Functional incompatibility (one or more PC boards in the
701=Provides information about the internal processor
702=Provides information about the internal processor
703=Provides information about the internal processor
704=Provides information about the internal processor
705=Provides information about the internal processor
706=Provides information about the internal processor
707=Provides information about the internal processor
708=Provides information about the internal processor
709=Provides information about the internal processor
710=Provides information about the internal processor
711=Provides information about the internal processor
712=Provides information about the internal processor
713=Provides information about the internal processor
714=Provides information about the internal processor
715=Provides information about the internal processor
716=Provides information about the internal processor
721=EEPROM has been re-initialised
722=Provides information about the internal processor
723=Provides information about the internal processor
724=Provides information about the internal processor
725=Provides information about the internal processor
726=Provides information about the internal processor
727=Provides information about the internal processor
728=Provides information about the internal processor
729=Provides information about the internal processor
730=Provides information about the internal processor
731=Initialisation error – USB flash drive is not supported
732=Initialisation erro – Over current on USB stick
733=No USB flash drive connected
734=Update file not recognised or not present
735=Update file does not match the device, update file too old
736=Write or read error occurred
737=File could not be opened
738=Log file cannot be saved (e.g. USB flash drive is write
740=Initialisation error-error in file system on USB flash
741=Error during recording of logging data
743=Error occurred during update process
745=Update file corrupt
746=Error occurred during update process
751=Time lost
752=Real Time Clock module communication error
753=Internal error: Real Time Clock module is in emergency mode
754=Provides information about the processor status
755=Provides information about the processor status
757=Hardware error in the Real Time Clock module
758=Internal error: Real Time Clock module is in emergency mode
760=Internal hardware error
761=Provides information about the internal processor
762=Provides information about the internal processor
763=Provides information about the internal processor
764=Provides information about the internal processor
765=Provides information about the internal processor
766=Emergency power de-rating has been activated
767=Provides information about the internal processor status
768=Different power limitation in the hardware modules
772=Storage unit not available
773=Software update group 0 (invalid country setup)
775=PMC power stage set not available
776=Invalid device type
781=Provides information about the internal processor
782=Provides information about the internal processor
783=Provides information about the internal processor
784=Provides information about the internal processor
785=Provides information about the internal processor
786=Provides information about the internal processor
787=Provides information about the internal processor
788=Provides information about the internal processor
789=Provides information about the internal processor
790=Provides information about the internal processor
791=Provides information about the internal processor
792=Provides information about the internal processor
793=Provides information about the internal processor
794=Provides information about the internal processor
=default
-=undefined
NULL=NULL

Note: Sunset_Time is an Item I use in a lot of rules, manually created from the Astro binding:

DateTime    Sunrise_Time    "Sunrise [%1$tH:%1$tM]"                         <time>  (gChart, gHistory)  {channel="astro:sun:local:nauticDawn#start"}
DateTime    Sunset_Time     "Sunset [%1$tH:%1$tM]"                          <time>  (gChart, gHistory)  {channel="astro:sun:local:astroDusk#end"}
4 Likes

I’ve been looking for a working Fronius text config so thanks a lot for sharing.

You might be aware or not I’m providing an energy management system product based on openHAB but I haven’t had the opportunity to adapt it to a Fronius installation yet.

Care to elaborate on the HW setup, please ?
Which inverter model do you use ? Do you know how specific your items are to it or if they would work with other Fronius models, too ? (Symo gen24 ?)
Just to confirm, is it that you also have a Fronius meter and that that is connected to the inverter via RS485 and it is (indirectly) being queried through the modbus connect to the inverter ?

Can you also share any experiences with a battery setup you might have found along the way ?
May which values to read?

That now got me on the left foot. Hadn’t seen that syntax to date.
A thing to be a member of an (item) group ? Does that work ? Does it make sense after all ?

No problems, all kudos to the community!

The HW setup on the solar plant side is a Fronius Symo 5.0-3-M taking energy from 17x SunPower SPR-E20-327 solar panels. It’s a 3 phase system, hence the three energy phases in the items file - which the binding handles OK.

The smart meter is indeed connected via RS485 and being queried through the modbus connect to the inverter - a lovely little pink cable that looks like cat5 but is wired differently. It’s a 63A-3. Primary power goes to the 3 phase local meter (per regulation) then to the smart meter and power is consumed on each phase prior to feeding in, no battery (ROI is not there yet). This is why the reported energy generation is not the same as actual consumption as you can conceivably have consumption from the grid on any one or more of the three phases while any other phases are feeding in to the grid.

The calculation of total energy used vs. fed into the grid is not the same as the number reported by the PV generation channel in and of itself.

These would work with other items too, Fronius haven’t changed the way in which they communicate data. While I don’t have a gen24, I suspect it’s no different.

On the battery setup, I have none :(. However have been researching extensively. A three phase setup is not ideal for battery storage and consumption, but the smart meter will handle it if you set up the battery to take energy from and feed in to each phase as if they are parralell. It gets complex depending on consumption vs. generation for each phase - but in the same way I have calculated total feed-in to the grid by taking PV generation for each phase and then consumption for each phase, the same can be calculated for battery generation and consumption.

It will take a bit of trial and error on the variables I suspect - but can be obtained through the smart meter. Of course a single phase installation will be much easier.

The Fronius binding has a channel for battery power, but it’s a single channel and I haven’t experimented with that. Oh for a battery to test it out!

Oh, also - apologies, I missed the syntax question, yes absolutely works without a problem. I think of it like inheriting groups in Active Directory, or SharePoint. Inheriting the “permission” to be a part of a group. A collection of items belong to a group which itself is a piece of equipment, that belongs to a group which itself is a location, that can be a subset of a larger location. I could go on in terms of groups belonging to a particular house, within a suburb of a town or a city in a state of a country in the Earth that belong to the Solar System in this Galaxy as part of the Local Group within Laniakeia within the Universe!! (deep breath). This might happen if I’ve had too much whisky. I haven’t yet, so the setup is limited to my immediate area of sight. i.e.:

A fronius Item:

Number:Power            Fronius_Meter_PowerPhase1       "Fronius AC Consumption Phase 1"                <energy>        (eFroniusSmartMeter,gHistory)       [Measurement,Voltage]   {channel="fronius:meter:mybridge:mymeter:powerrealphase1"}

Is in the group “eFroniusSmartMeter”. The group “eFroniusSmartMeter” is defined as the following Thing:

Group eFroniusSmartMeter                    "Fronius Smart Meter"                           <solarplant>    (gOutsideSouthWall)         ["Equipment"]

Which itself is in the gOutsiteWouthWall group. That group is defined as an item in my house model:

Group gOutsideSouthWall     "Outside South Wall"    <terrace>           (gOutdoor)          ["Patio"]

Which itself belongs to the ultimate location, gOutdoor:

Group gOutdoor              "Outdoor"               <garden>                                ["Outdoor"]

Here’s what it looks like in the model:

Summary

Capture

And here’s the extended view part 1:

Summary

and part 2

Summary

Thanks for elaborating.

Few if anybody except electricians cares about phases.
As per regulation all phases must be added (at least in DE and I wouldn’t think it’s different where you are) and most meters (or inverters if queried though those) I know have registers/channels for accumulated grid feed-in and accumulated generation, eventually.
Yes some vendors are braindead from outer space and do not provide accumulated values so you have to add up the phases yourself like you do in your rules but don’t the following items show 3ph-accumulated values on your system?

Number:Power            Fronius_Grid_Power              "Fronius Grid Power"                            <energy>        (eFroniusSymoInverter,gHistory)     [Measurement,Power]     {channel="fronius:powerinverter:mybridge:myinverter:powerflowchannelpgrid"}
Number:Power            Fronius_Load_Power              "Fronius Load Power"                            <energy>        (eFroniusSymoInverter,gHistory)     [Measurement,Power]     {channel="fronius:powerinverter:mybridge:myinverter:powerflowchannelpload"}
Number:Power            Fronius_Battery_Power           "Fronius Battery Power"                         <energy>        (eFroniusSymoInverter,gHistory)     [Measurement,Power]     {channel="fronius:powerinverter:mybridge:myinverter:powerflowchannelpakku"}
Number:Power            Fronius_Solar_Yield             "Fronius Solar Yield"                           <energy>        (eFroniusSymoInverter,gHistory)     [Measurement,Power]     {channel="fronius:powerinverter:mybridge:myinverter:powerflowchannelppv"}

I’m not getting this. I might be misunderstanding the terms you use (“channel in and of itself” ?) but with no battery involved, there’s nowhere else power can flow, and all phases are monitored, so generation = feed-in + consumption no matter if it’s about power (kW) or energy (kWh).
Granted the sums may be some % off due to rounding, different measuring intervals etc and some self consumption losses, but they should match roughly.
Isn’t that (for power) in terms of your items
Fronius_Solar_Yield = Fronius_GridPower + Fronius_Load_Power ?

Yep, twice in fact :slight_smile: (sorry no blaming intended).
Of course all items are part of the universe and should be sorted into a proper taxonomy like the OH model. But my question was on that you made a Thing part of a group (notabene: not an Item).
I wasn’t aware this can even be done, let alone in .things files. In UI I think you cannot (admitted, I didn’t try).

I’m not aware of a function like this.
afaik @ "..." is not a group but a location which can be set per Thing.
BUT: This “location” is the old location in Paper UI which is only used in Paper UI Control…

Although there still is a location parameter in openHAB3 in question of Things, this is not the location within the semantic model.

I found while doing this that yes, they show 3ph accumulated value. When I looked at the difference between what was being consumed on each phase and what was being generated and then fed into the grid on each phase I found that there’s some interesting behaviour.

This fascinated me because it meant that there could be occasions where I was both consuming from the grid and feeding into the grid at the same time.

Substitute the battery for the grid and the same thing can happen.

I wanted to know when that was happening because Australia is starting to talk about a charge to consumers to feed in to the grid at certain times of the day. Bizarre stuff but apparently our grid infrastructure is unable to cope with the fluctuations in generation, so there are times where the power companies don’t want power from households. If I were a cynical person I might suspect foul play at a political level but what would I know.

Fronius_Solar_Yield is the total solar generation of the array. It doesn’t take into account power being consumed in the house, so using that number will not give me an accurate picture of excess energy available.

Fronius_Grid_Power also doesn’t give me a full picture, yes it tells you when you are consuming grid power but not on which phase.

Fronius_Load_Power is weird because it shows a negative number - so I shied away not entirely understanding the behaviour of that channel.

I meant the “Fronius_Solar_Yield” item, reports total PV generation without consumption, logical but I had to experiment a little because I didn’t know if “Solar Yield” meant yield to the grid as opposed to yield from the array.

Yes, it does, sort of. The equation above comes out in a negative number but the absolute value does equal the value in the Solar_Yield item. At this very moment, my Fronius_GridPower item is reporting that I’m consuming a total of 584W, while my Load_Power item is reporting that there’s a -976W load, Solar_Yield is 392W (it’s a cloudy morning here right now). Those values are straight out of the inverter, so either the binding is doing odd things with the Load_Power or the inverter is reporting it like that.

Yes - I did do that, I do that with a lot of my Things, I found that neat trick in the community fora somewhere, I wish I could remember where. I don’t think it’s hacking anything as it all works albeit sometimes the model in the UI does odd things like not show things in the right location (sometimes they are orphaned which I’m still working on) but in the sitemap they fall neatly in to place.

EDIT: found it:

Correct, I have part of my model defined in an items text file which I call “housemodel.items” and I am experimenting with moving the whole model into text:

//HOUSE MODEL

//INDOOR
Group gIndoor               "Indoor"                <house>                                 ["Indoor"]

//OUTDOOR
Group gOutdoor              "Outdoor"               <garden>                                ["Outdoor"]
Group gGarden               "Garden"                <garden>            (gOutdoor)          ["Garden"]
Group gOutsideSouthWall     "Outside South Wall"    <terrace>           (gOutdoor)          ["Patio"]

Understood but don’t misunderstand/overcomplicate. It’s all about the added values. If you feed 3A on one phase and draw 1A on another you feed 2A. Official meters will accumulate.
In Germany there’s some regulation that the difference between phases may not be larger than a specific value 4.6 kW. Yes there is a technical reason behind (if too many people all load their EV on the same phase it adds up and may in fact damage the power generator if the accumulated differences are too large) but other than that phases are not really of interest. Accumulated values are.

You are not, it’s a big foul play over here, too. The aforementioned is a fake argument as by simple coincidence/statistics, households will evenly distribute across phases anyway.
Worse even, households may not feed more than 70% of installed power even on smallest installations.
No valid reason for that whatsoever, and the worst thing and sign it’s political imho actually is that the inverter vendors help the energy companies by implementing a forced cut-off (really: you have to waste that energy) in the admin layer settings - because there it is not accessible by their customers, the inverter owners.
That is ongoing foul play. In times and regardless of and actively promoting the climate crisis.
Ok yes we’re off topic now :frowning:

The point is: the location for a thing has nothing to do with the semantic model. Just forget about it.

Please confirm what I understood by your post:
Fronius_Solar_Yield is DC side generated power (more preceisely, the panels without any eventual battery feed)
Fronius_Grid_Power is consumption from grid, negative values mean grid feed-in Fronius_Load_Power is supposed to be the house consumption but you cannot explain the negative values. Binding docs say + means generator and - means consumer, but it is unclear what component(s) is/are meant by that
Fronius_Battery_Power is (likely as you don’t own one) battery charge/discharge

All of these are 3 phase accumulated values.

Yes

Yes

Yes

Yes
:slight_smile:

1 Like