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.
-
I have installed the Fronius binding:
Fronius - Bindings | openHAB -
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"]
- 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]
}
- 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]
- 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
- 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:
- 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"}