Custom Component: ABB/Power-One/FIMER PV Inverters - SunSpec Modbus TCP

Where’s the VSN700 in that high-level schema?

I’ll send it to you privately.

It’s embedded in the REACT. I found a doc in FIMER repository where it seems the embedded interface is compatible with VSN700-05… but I don’t know if it’s something helpful.

I think the webserver interface you see is actually the VSN700, that pulls data from the meters…

So you asked fimer the direct access to local json?

yes, they said it’s technically possible but they don’t want to give this possibility, so they don’t provide info on local access. Luckily someone reverse engineered the local authentication and managed to write a working auth in python, it basically uses a custom digest header. I took that and created a script to get all json data. It could be used to create a component that uses json instead of modbus.

I’m cleaning it up so you can test it on the VSN700, if you are sure you are communicating with the VSN700 and not another interface obviously.

1 Like

Ciao Federico,

here’s the command-line script, you can simply edit the .cfg and change the hostname and you’re done. On the VSN300 the guest account has no pwd (read-only account) and it’s enough to pull the json data from the VSN300. There’s a --help option available.

Let me know how it works with VSN700.

It doesn’t seem to work :frowning:
It’s ok if i put the two files in the same folder, make py executable and edit the cfg, right?
Username/password are the same used in the local website UI. (Admin/*******)

pi@site:~/vsn700 $ python3 vsn300-monitor.py
2021-09-16 14:19:44,266 - main - ERROR - HTTP Error 401: Unauthorized
2021-09-16 14:19:44,266 - root - WARNING - No sys_data received from VSN300 logger. Exiting.
2021-09-16 14:19:44,266 - root - ERROR - Error capturing data. Exiting…
None

Ok, it means the auth system of the VSN300 is very specific. For the VSN700 should be a standard token auth. I don’t know why they didn’t update VSN300 fw to use the same auth method. Too bad, it could’ve been an alternative to modbus.

I’ll try if I can get locally using node red and a token auth. I had a try a couple of months ago using the online AuroraVision portal, since is not too different, there is a possibility to get it directly from the inverter. Once I have the full json it may be possible to write a plug-in on it.

Ciao Alex,
using a basic authentication over a node red http request i get the whole json.
I’m looking for “which value means what”, so it can take a little of time, there is less sun than what i need to get all the data :grin:

Once found it should be relative easy to point at a specific path in json. But i’m really out of the building an HA integration process. If you’re available to support me i think we can provide the community a valid alternative to modbus. Let me know!

Sure, I’ll help you. Please post the entire JSON you received so I can take a look at it.

This is what I receive from the VSN300 with my script, if you look at the names of the variables, they are the same you find in the sunspec xls files. You should be able to find those variables in your JSON, or something similar.

{
  "mfg.part_number": {
    "Label": "",
    "Value": "-3N16-"
  },
  "mfg.serial_number": {
    "Label": "",
    "Value": "111033"
  },
  "mfg.week_year": {
    "Label": "",
    "Value": "1421"
  },
  "logger.sn": {
    "Label": "",
    "Value": "111033-3N16-1421"
  },
  "fw.build_date": {
    "Label": "",
    "Value": "Thu Nov 16 17:04:58 CET 2017"
  },
  "fw.release_number": {
    "Label": "",
    "Value": "1.9.2"
  },
  "fw.build_number": {
    "Label": "",
    "Value": "r1364-5b9c418"
  },
  "fw.revision": {
    "Label": "",
    "Value": "W192"
  },
  "logger.board_model": {
    "Label": "",
    "Value": "WIFI LOGGER CARD"
  },
  "device.0.devName": {
    "Label": "Device Name",
    "Value": "Supervisor"
  },
  "device.0.devType": {
    "Label": "Device type",
    "Value": "Partner"
  },
  "device.0.fwVer": {
    "Label": "Fw Version",
    "Value": "C008"
  },
  "device.1.devName": {
    "Label": "Device Name",
    "Value": "Booster"
  },
  "device.1.devType": {
    "Label": "Device type",
    "Value": "Partner"
  },
  "logger.hostname": {
    "Label": "",
    "Value": "ABB-077909-3G82-3112.local"
  },
  "device.1.fwVer": {
    "Label": "Firmware Version",
    "Value": "A0AC"
  },
  "device.2.devName": {
    "Label": "Device Name",
    "Value": "Inverter"
  },
  "device.2.devType": {
    "Label": "Device type",
    "Value": "Partner"
  },
  "device.2.fwVer": {
    "Label": "Firmware Version",
    "Value": "B185"
  },
  "device.model": {
    "Label": "Model Type",
    "Value": "X"
  },
  "device.invID": {
    "Label": "Inverter ID",
    "Value": "077909-3G82-3112"
  },
  "device.protocol": {
    "Label": "Communication Protocol",
    "Value": "Aurora Legacy"
  },
  "device.modelDesc": {
    "Label": "Model Description",
    "Value": "PVI-10.0-OUTD"
  },
  "device.ACType": {
    "Label": "Inverter ID",
    "Value": "Three"
  },
  "device.startup_time": {
    "Label": "Inverter Time",
    "Value": "1631855252"
  },
  "wlan.fsm_status": {
    "Label": "",
    "Value": "connected"
  },
  "wlan.0.status": {
    "Label": "",
    "Value": "connected"
  },
  "wlan.ap.status": {
    "Label": "",
    "Value": "off"
  },
  "wlan.0.dhcpState": {
    "Label": "",
    "Value": "acquired"
  },
  "wlan.0.ipaddr": {
    "Label": "",
    "Value": "10.1.10.162"
  },
  "wlan.0.netmask": {
    "Label": "",
    "Value": "255.255.254.0"
  },
  "wlan.0.broadcast": {
    "Label": "",
    "Value": ""
  },
  "wlan.0.gateway": {
    "Label": "",
    "Value": "10.1.10.1"
  },
  "wlan.0.dns": {
    "Label": "",
    "Value": "10.1.10.1"
  },
  "m103_1_A": {
    "Title": "IGrid",
    "Value": 1.3471919298171997,
    "Unit": "A"
  },
  "m103_1_AphA": {
    "Title": "IoutR",
    "Value": 1.3899705410003662,
    "Unit": "A"
  },
  "m103_1_AphB": {
    "Title": "IoutS",
    "Value": 1.8106838464736938,
    "Unit": "A"
  },
  "m103_1_AphC": {
    "Title": "IoutT",
    "Value": 1.9507665634155273,
    "Unit": "A"
  },
  "m103_1_DCW": {
    "Title": "Pin",
    "Value": 1.1913018143962972,
    "Unit": "kW"
  },
  "m103_1_Hz": {
    "Title": "FGrid",
    "Value": 49.97401428222656,
    "Unit": "Hz"
  },
  "m103_1_PF": {
    "Title": "Cos phi",
    "Value": 1,
    "Unit": ""
  },
  "m103_1_PhVphA": {
    "Title": "VoutR",
    "Value": 233.1932373046875,
    "Unit": "V"
  },
  "m103_1_PhVphAB": {
    "Title": "VoutRS",
    "Value": 406.265625,
    "Unit": "V"
  },
  "m103_1_PhVphB": {
    "Title": "VoutS",
    "Value": 227.67068481445312,
    "Unit": "V"
  },
  "m103_1_PhVphBC": {
    "Title": "VoutST",
    "Value": 402.53399658203125,
    "Unit": "V"
  },
  "m103_1_PhVphC": {
    "Title": "VoutT",
    "Value": 234.71755981445312,
    "Unit": "V"
  },
  "m103_1_PhVphCA": {
    "Title": "VoutTR",
    "Value": 405.5627746582031,
    "Unit": "V"
  },
  "m103_1_PowerPeakAbs": {
    "Title": "Absolute Pout peak",
    "Value": 7.2254065931883815,
    "Unit": "kW"
  },
  "m103_1_PowerPeakToday": {
    "Title": "Pout Peak of the day ",
    "Value": 5.174124757476477,
    "Unit": "kW"
  },
  "m103_1_TmpCab": {
    "Title": "Ambient stage temperature",
    "Value": 234.79750061035156,
    "Unit": "degC"
  },
  "m103_1_TmpOt": {
    "Title": "Inverter stage temperature",
    "Value": 41.96668243408203,
    "Unit": "degC"
  },
  "m103_1_W": {
    "Title": "Pout",
    "Value": 1.1549104552459255,
    "Unit": "kW"
  },
  "m103_1_WH": {
    "Title": "Lifetime Energy",
    "Value": 75450.06758368574,
    "Unit": "kWh"
  },
  "m160_1_DCA_1": {
    "Title": "Iin1",
    "Value": 1.51153564453125,
    "Unit": "A"
  },
  "m160_1_DCA_2": {
    "Title": "Iin2",
    "Value": 1.39892578125,
    "Unit": "A"
  },
  "m160_1_DCV_1": {
    "Title": "Vin1",
    "Value": 387.0940246582031,
    "Unit": "V"
  },
  "m160_1_DCV_2": {
    "Title": "Vin2",
    "Value": 403.8016052246094,
    "Unit": "V"
  },
  "m160_1_DCW_1": {
    "Title": "Pin1",
    "Value": 0.5961217324158241,
    "Unit": "kW"
  },
  "m160_1_DCW_2": {
    "Title": "Pin2",
    "Value": 0.595180020945314,
    "Unit": "kW"
  },
  "m64061_1_Booster_Tmp": {
    "Title": "Booster stage temperature",
    "Value": 43.6051139831543,
    "Unit": "degC"
  },
  "m64061_1_DayWH": {
    "Title": "Energy today",
    "Value": 8.298000394133851,
    "Unit": "kWh"
  },
  "m64061_1_ILeakDcAc": {
    "Title": "Ileak 1",
    "Value": 0,
    "Unit": "uA"
  },
  "m64061_1_ILeakDcDc": {
    "Title": "Ileak 2",
    "Value": 0,
    "Unit": "uA"
  },
  "m64061_1_Isolation_Ohm1": {
    "Title": "Riso",
    "Value": 1.8906309604644775,
    "Unit": "MOhm"
  },
  "m64061_1_MonthWH": {
    "Title": "Energy current month",
    "Value": 461.4580219180789,
    "Unit": "kWh"
  },
  "m64061_1_VBulk": {
    "Title": "Vbulk",
    "Value": 603.1704711914062,
    "Unit": "V"
  },
  "m64061_1_VBulkMid": {
    "Title": "Vbulk_mid",
    "Value": 301.68359375,
    "Unit": "V"
  },
  "m64061_1_VGnd": {
    "Title": "Vgnd",
    "Value": 4.149086952209473,
    "Unit": "V"
  },
  "m64061_1_WeekWH": {
    "Title": "Energy current week",
    "Value": 141.1270067031728,
    "Unit": "kWh"
  },
  "m64061_1_YearWH": {
    "Title": "Energy current year",
    "Value": 6456.575306670857,
    "Unit": "kWh"
  }
}

Here the resulting json. As you can see there are 4 main sources, but the important ones are the first 2. Most of the values are provided by the meter (first source), the batteries information comes from the inverter (second). I’m trying to understand the differences between most of them. What i understood is that the same interface is used for 3phase inverter too, each main class provides L1, L2, L3, in my case only L1 returns a value different from 0.

After a couple of days of rainy weather, finally I’ve matched all the relevant values of the json response to the correct label in the chart!

I was looking for something like “integration for dummies guide”, since i can write some js…but really don’t know where to start! Any advice?

1 Like

In order to develop my custom component, I started from an existing one, otherwise it would have been impossible for me, not being a developer.

So you should find an existing component that does more or less what you intend to do, then you customize it.

You need some python knowledge though…the code is python.

Dear Specialist,

We are testing Fimer Inverter PVS by Modbus Master Simulator. It can exchange good with almost Modbus registers but there are two following registers types which meet the problem…

  1. Register contain the control function
    Example for the holding register 40233 (WMaxLimPct - Set power output to specified level). Modbus Master Simulator can write any value to this register but don’t receive the feedback value. Suppose if Operator change the setting in inverter’s local interface then Modbus Master Simulator don’t receive the new update value
  2. Event Bitfield 32 (Bit mask)
    Example for the holding register 41110 (Global Events). It is two registers 32 bit with each bit indicate one alarm signal (As bit 22 is Input DC undervoltage). Although Modbus Master Simulator can read this holding register with the status flag is good but the value always be equal to 0 (If right in the night, bit 21 of this holding register must indicate “1” corresponds to “Weak sunlight”)

Anyone can support me? Thank!

You need to contact FIMER support.

Hi Federico,
would you give some help on reaching the same result with NodeRed?
I’m now able to authenticate, but I guess I invoke the wrong API, since all I can receive in the JSON are the historical data for energy production…

Thanks in advance.

Hello,

I’m using your awesome custom component after failing with modbus and sensors. I have ABB uno and most of the sensors generated by the custom components registers right.

I’m not able to get only 3 sensors, the DC voltage it always shows -0.0 V and options sensor it shows hex figures and lastly the total energy shows as 0

The data I need most is available, so I don’t really need these data it is a feedback.

Thank you again
Cheers!

I got it reporting the total generated power correctly, it is reading from the 1st day of installation till today.

How to get for 1 day? I want to get the energy feature in HA reading the correct data

Thank you

that’s the lifetime produced energy counter. what do you mean by “got it reporting”? what did you do to fix it? it’s working fine here.

you don’t need to have it for 1 day, the sensor has the appropriate attributes for the energy integration to know how to manage the fact that it never resets. You just need to convert it from Wh to kWh, for that you can use a template sensor.

image

Read these before using the energy integration, so you understand how these energy sensors work and how the integration uses them: