diff --git a/README.md b/README.md index ced3bf1..bcdcf72 100644 --- a/README.md +++ b/README.md @@ -150,7 +150,7 @@ Once the component is running, it will add the following entities to Home Assist # Status Entities -Apart from the inverter-parameters, it will also add status entities to view the status of the solarman component. +Apart from the inverter-parameters, it will also add status entities to view the status of the solarman component (in the **Diagnostic** category). ![Component-status](./component_status.png) # Energy Dashboard diff --git a/custom_components/solarman/const.py b/custom_components/solarman/const.py index 7b28cfc..e1ff1a8 100644 --- a/custom_components/solarman/const.py +++ b/custom_components/solarman/const.py @@ -1,4 +1,5 @@ from datetime import timedelta +import os DOMAIN = 'solarman' @@ -6,7 +7,8 @@ DEFAULT_INVERTER_MB_SLAVEID = 1 DEFAULT_LOOKUP_FILE = 'deye_hybrid.yaml' -LOOKUP_FILES = (os.listdir(os.path.dirname(__file__) + '/inverter_definitions')) +LOOKUP_FILES = (sorted([f for f in os.listdir(os.path.dirname(__file__) + '/inverter_definitions') if f.endswith('.yaml')])) + MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=15) diff --git a/custom_components/solarman/inverter_definitions/deye_sg04lp3.yaml b/custom_components/solarman/inverter_definitions/deye_sg04lp3.yaml index 3a61eef..0560107 100644 --- a/custom_components/solarman/inverter_definitions/deye_sg04lp3.yaml +++ b/custom_components/solarman/inverter_definitions/deye_sg04lp3.yaml @@ -5,518 +5,705 @@ requests: - start: 0x0003 end: 0x0059 mb_functioncode: 0x03 - - start: 0x0202 + - start: 0x0063 + end: 0x006D + mb_functioncode: 0x03 + - start: 0x0085 + end: 0x0085 + mb_functioncode: 0x03 + - start: 0x0202 end: 0x022E - mb_functioncode: 0x03 - - start: 0x024A + mb_functioncode: 0x03 + - start: 0x0218 + end: 0x021A + mb_functioncode: 0x03 + - start: 0x024A end: 0x024F - mb_functioncode: 0x03 + mb_functioncode: 0x03 - start: 0x0256 end: 0x027C - mb_functioncode: 0x03 - - start: 0x0284 + mb_functioncode: 0x03 + - start: 0x0284 end: 0x028D - mb_functioncode: 0x03 - - start: 0x02A0 + mb_functioncode: 0x03 + - start: 0x0295 + end: 0x029F + mb_functioncode: 0x03 + - start: 0x02A0 end: 0x02A7 mb_functioncode: 0x03 - + parameters: - - group: solar - items: - - name: "PV1 Power" - class: "power" - state_class: "measurement" - uom: "W" - scale: 1 - rule: 1 - registers: [0x02A0] - icon: 'mdi:solar-power' - - - name: "PV2 Power" - class: "power" - state_class: "measurement" - uom: "W" - scale: 1 - rule: 1 - registers: [0x02A1] - icon: 'mdi:solar-power' - - - name: "PV1 Voltage" - class: "voltage" - state_class: "measurement" - uom: "V" - scale: 0.1 - rule: 1 - registers: [0x02A4] - icon: 'mdi:solar-power' - - - name: "PV2 Voltage" - class: "voltage" - state_class: "measurement" - uom: "V" - scale: 0.1 - rule: 1 - registers: [0x02A6] - icon: 'mdi:solar-power' - - - name: "PV1 Current" - class: "current" - state_class: "measurement" - uom: "A" - scale: 0.1 - rule: 1 - registers: [0x02A5] - icon: 'mdi:solar-power' - - - name: "PV2 Current" - class: "current" - state_class: "measurement" - uom: "A" - scale: 0.1 - rule: 1 - registers: [0x02A7] - icon: 'mdi:solar-power' - - - name: "Daily Production" - class: "energy" - state_class: "total_increasing" - uom: "kWh" - scale: 0.1 - rule: 1 - registers: [0x0211] - icon: 'mdi:solar-power' - validation: - max: 100 - invalidate_all: - - - name: "Total Production" - class: "energy" - state_class: "total_increasing" - uom: "kWh" - scale: 0.1 - rule: 3 - registers: [0x0216,0x0217] - icon: 'mdi:solar-power' - - - group: Battery - items: - - - name: "Daily Battery Charge" - class: "energy" - state_class: "total_increasing" - uom: "kWh" - scale: 0.1 - rule: 1 - registers: [0x0202] - icon: 'mdi:battery-plus' - - name: "Daily Battery Discharge" - class: "energy" - state_class: "total_increasing" - uom: "kWh" - scale: 0.1 - rule: 1 - registers: [0x0203] - icon: 'mdi:battery-plus' - - - name: "Total Battery Charge" - class: "energy" - state_class: "total_increasing" - uom: "kWh" - scale: 0.1 - rule: 3 - registers: [0x0204,0x0205] - icon: 'mdi:battery-plus' - - - name: "Total Battery Discharge" - class: "energy" - state_class: "total_increasing" - uom: "kWh" - scale: 0.1 - rule: 3 - registers: [0x0206,0x0207] - icon: 'mdi:battery-minus' - - - name: "Battery Power" - class: "power" - state_class: "measurement" - uom: "W" - scale: 1 - rule: 2 - registers: [0x024E] - icon: 'mdi:battery' - - - name: "Battery Voltage" - class: "voltage" - state_class: "measurement" - uom: "V" - scale: 0.01 - rule: 1 - registers: [0x024B] - icon: 'mdi:battery' - - - name: "Battery SOC" - class: "battery" - state_class: "measurement" - uom: "%" - scale: 1 - rule: 1 - registers: [0x024C] - icon: 'mdi:battery' - validation: - min: 0 - max: 101 - - - name: "Battery Current" - class: "current" - state_class: "measurement" - uom: "A" - scale: 0.01 - rule: 2 - registers: [0x024F] - icon: 'mdi:battery' - - - name: "Battery Temperature" - class: "temperature" - state_class: "measurement" - uom: "°C" - scale: 0.1 - rule: 1 - offset: 1000 - registers: [0x024A] - icon: 'mdi:battery' - validation: - min: 1 - max: 99 - - - group: Grid - items: - - name: "Total Grid Power" - class: "measurement" - state_class: "measurement" - uom: "W" - scale: 1 - rule: 2 - registers: [0x0271] - icon: 'mdi:transmission-tower' - - - name: "Grid Voltage L1" - class: "voltage" - state_class: "measurement" - uom: "V" - scale: 0.1 - rule: 1 - registers: [0x0256] - icon: 'mdi:transmission-tower' - - - name: "Grid Voltage L2" - class: "voltage" - state_class: "measurement" - uom: "V" - scale: 0.1 - rule: 1 - registers: [0x0257] - icon: 'mdi:transmission-tower' - - - name: "Grid Voltage L3" - class: "voltage" - state_class: "measurement" - uom: "V" - scale: 0.1 - rule: 1 - registers: [0x0258] - icon: 'mdi:transmission-tower' - - - name: "Internal CT L1 Power" - class: "power" - state_class: "measurement" - uom: "W" - scale: 1 - rule: 2 - registers: [0x025C] - icon: 'mdi:transmission-tower' - - - name: "Internal CT L2 Power" - class: "power" - state_class: "measurement" - uom: "W" - scale: 1 - rule: 2 - registers: [0x025D] - icon: 'mdi:transmission-tower' - - - name: "Internal CT L3 Power" - class: "power" - state_class: "measurement" - uom: "W" - scale: 1 - rule: 2 - registers: [0x025E] - icon: 'mdi:transmission-tower' - - - name: "External CT L1 Power" - class: "power" - state_class: "measurement" - uom: "W" - scale: 1 - rule: 2 - registers: [0x0268] - icon: 'mdi:transmission-tower' - - - name: "External CT L2 Power" - class: "power" - state_class: "measurement" - uom: "W" - scale: 1 - rule: 2 - registers: [0x0269] - icon: 'mdi:transmission-tower' - - - name: "External CT L3 Power" - class: "power" - state_class: "measurement" - uom: "W" - scale: 1 - rule: 2 - registers: [0x026A] - icon: 'mdi:transmission-tower' - - - name: "Daily Energy Bought" - class: "energy" - state_class: "total_increasing" - uom: "kWh" - scale: 0.1 - rule: 1 - registers: [0x0208] - icon: 'mdi:transmission-tower-export' - - - name: "Total Energy Bought" - class: "energy" - state_class: "total_increasing" - uom: "kWh" - scale: 0.1 - rule: 1 - registers: [0x020A,0x020B] - icon: 'mdi:transmission-tower-export' - - - name: "Daily Energy Sold" - class: "energy" - state_class: "total_increasing" - uom: "kWh" - scale: 0.1 - rule: 1 - registers: [0x0209] - icon: 'mdi:transmission-tower-import' - - - name: "Total Energy Sold" - class: "energy" - state_class: "total_increasing" - uom: "kWh" - scale: 0.1 - rule: 3 - registers: [0x020C,0x020D] - icon: 'mdi:transmission-tower-import' - - - name: "Total Grid Production" - class: "energy" - state_class: "total_increasing" - uom: "kWh" - scale: 0.1 - rule: 4 - registers: [0x020C,0x020D] - icon: 'mdi:transmission-tower' - - - group: Upload - items: - - name: "Total Load Power" - class: "power" - state_class: "measurement" - uom: "W" - scale: 1 - rule: 1 - registers: [0x028D] - icon: 'mdi:lightning-bolt-outline' - - - name: "Load L1 Power" - class: "power" - state_class: "measurement" - uom: "W" - scale: 1 - rule: 1 - registers: [0x028A] - icon: 'mdi:lightning-bolt-outline' - - - name: "Load L2 Power" - class: "power" - state_class: "measurement" - uom: "W" - scale: 1 - rule: 1 - registers: [0x028B] - icon: 'mdi:lightning-bolt-outline' - - - name: "Load L3 Power" - class: "power" - state_class: "measurement" - uom: "W" - scale: 1 - rule: 1 - registers: [0x028C] - icon: 'mdi:lightning-bolt-outline' - - - name: "Load Voltage L1" - class: "voltage" - state_class: "measurement" - uom: "V" - scale: 0.1 - rule: 1 - registers: [0x0284] - icon: 'mdi:lightning-bolt-outline' - - - name: "Load Voltage L2" - class: "voltage" - state_class: "measurement" - uom: "V" - scale: 0.1 - rule: 1 - registers: [0x0285] - icon: 'mdi:lightning-bolt-outline' - - - name: "Load Voltage L3" - class: "voltage" - state_class: "measurement" - uom: "V" - scale: 0.1 - rule: 1 - registers: [0x0286] - icon: 'mdi:lightning-bolt-outline' - - - name: "Daily Load Consumption" - class: "energy" - state_class: "total_increasing" - uom: "kWh" - scale: 0.1 - rule: 1 - registers: [0x020E] - icon: 'mdi:lightning-bolt-outline' - - - name: "Total Load Consumption" - class: "energy" - state_class: "total_increasing" - uom: "kWh" - scale: 0.1 - rule: 3 - registers: [0x020F,0x0210] - icon: 'mdi:lightning-bolt-outline' - - - group: Inverter - items: - - name: "Current L1" - class: "current" - state_class: "measurement" - uom: "A" - scale: 0.01 - rule: 2 - registers: [0x0276] - icon: 'mdi:home-lightning-bolt' - - - name: "Current L2" - class: "current" - state_class: "measurement" - uom: "A" - scale: 0.01 - rule: 2 - registers: [0x0277] - icon: 'mdi:home-lightning-bolt' - - - name: "Current L3" - class: "current" - uom: "A" - scale: 0.01 - rule: 2 - registers: [0x0278] - icon: 'mdi:home-lightning-bolt' - - - name: "Inverter L1 Power" - class: "power" - state_class: "measurement" - uom: "W" - scale: 1 - rule: 2 - registers: [0x0279] - icon: 'mdi:home-lightning-bolt' - - - name: "Inverter L2 Power" - class: "power" - state_class: "measurement" - uom: "W" - scale: 1 - rule: 2 - registers: [0x027A] - icon: 'mdi:home-lightning-bolt' - - - name: "Inverter L3 Power" - class: "power" - state_class: "measurement" - uom: "W" - scale: 1 - rule: 2 - registers: [0x027B] - icon: 'mdi:home-lightning-bolt' - - - name: "DC Temperature" - class: "temperature" - state_class: "measurement" - uom: "°C" - scale: 0.1 - rule: 2 - offset: 1000 - registers: [0x021C] - icon: 'mdi:thermometer' - - - name: "AC Temperature" - class: "temperature" - state_class: "measurement" - uom: "°C" - scale: 0.1 - rule: 2 - offset: 1000 - registers: [0x021D] - icon: 'mdi:thermometer' - - - name: "Inverter ID" - class: "" - state_class: "" - uom: "" - scale: 1 - rule: 5 - registers: [0x0003,0x0004,0x0005,0x0006,0x0007] - isstr: true - - - name: "Communication Board Version No." - class: "" - state_class: "" - uom: "" - scale: 1 - rule: 1 - registers: [0x0011] - isstr: true - - - name: "Control Board Version No." - class: "" - state_class: "" - uom: "" - scale: 1 - rule: 1 - registers: [0x000D] - isstr: true - - - group: Alert - items: - - name: "Alert" - class: "" - state_class: "" - uom: "" - scale: 1 - rule: 6 - registers: [0x0229,0x022A,0x22B,0x022C,0x022D,0x022E] + - group: solar + items: + - name: "PV1 Power" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 1 + registers: [0x02A0] + icon: "mdi:solar-power" + + - name: "PV2 Power" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 1 + registers: [0x02A1] + icon: "mdi:solar-power" + + - name: "PV1 Voltage" + class: "voltage" + state_class: "measurement" + uom: "V" + scale: 0.1 + rule: 1 + registers: [0x02A4] + icon: "mdi:solar-power" + + - name: "PV2 Voltage" + class: "voltage" + state_class: "measurement" + uom: "V" + scale: 0.1 + rule: 1 + registers: [0x02A6] + icon: "mdi:solar-power" + + - name: "PV1 Current" + class: "current" + state_class: "measurement" + uom: "A" + scale: 0.1 + rule: 1 + registers: [0x02A5] + icon: "mdi:solar-power" + + - name: "PV2 Current" + class: "current" + state_class: "measurement" + uom: "A" + scale: 0.1 + rule: 1 + registers: [0x02A7] + icon: "mdi:solar-power" + + - name: "Daily Production" + class: "energy" + state_class: "total_increasing" + uom: "kWh" + scale: 0.1 + rule: 1 + registers: [0x0211] + icon: "mdi:solar-power" + validation: + max: 100 + invalidate_all: + + - name: "Total Production" + class: "energy" + state_class: "total_increasing" + uom: "kWh" + scale: 0.1 + rule: 3 + registers: [0x0216, 0x0217] + icon: "mdi:solar-power" + + - group: Battery + items: + - name: "Battery Equalization V" + class: "voltage" + state_class: "measurement" + uom: "V" + scale: 0.01 + rule: 1 + registers: [0x0063] + icon: "mdi:battery" + + - name: "Battery Absorption V" + class: "voltage" + state_class: "measurement" + uom: "V" + scale: 0.01 + rule: 1 + registers: [0x0064] + icon: "mdi:battery" + + - name: "Battery Float V" + class: "voltage" + state_class: "measurement" + uom: "V" + scale: 0.01 + rule: 1 + registers: [0x0065] + icon: "mdi:battery" + + - name: "Battery Capacity" + class: "battery" + state_class: "measurement" + uom: "Ah" + scale: 1 + rule: 1 + registers: [0x0066] + icon: "mdi:battery" + + - name: "Battery Empty V" + class: "voltage" + state_class: "measurement" + uom: "V" + scale: 0.01 + rule: 1 + registers: [0x0066] + icon: "mdi:battery" + + - name: "Battery Max A Charge" + class: "current" + state_class: "measurement" + uom: "A" + scale: 1 + rule: 1 + registers: [0x006C] + icon: "mdi:battery" + + - name: "Battery Max A Discharge" + class: "current" + state_class: "measurement" + uom: "A" + scale: 1 + rule: 1 + registers: [0x006D] + icon: "mdi:battery" + + - name: "Daily Battery Charge" + class: "energy" + state_class: "total_increasing" + uom: "kWh" + scale: 0.1 + rule: 1 + registers: [0x0202] + icon: "mdi:battery-plus" + + - name: "Daily Battery Discharge" + class: "energy" + state_class: "total_increasing" + uom: "kWh" + scale: 0.1 + rule: 1 + registers: [0x0203] + icon: "mdi:battery-plus" + + - name: "Total Battery Charge" + class: "energy" + state_class: "total_increasing" + uom: "kWh" + scale: 0.1 + rule: 3 + registers: [0x0204, 0x0205] + icon: "mdi:battery-plus" + + - name: "Total Battery Discharge" + class: "energy" + state_class: "total_increasing" + uom: "kWh" + scale: 0.1 + rule: 3 + registers: [0x0206, 0x0207] + icon: "mdi:battery-minus" + + - name: "Battery Power" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 2 + registers: [0x024E] + icon: "mdi:battery" + + - name: "Battery Voltage" + class: "voltage" + state_class: "measurement" + uom: "V" + scale: 0.01 + rule: 1 + registers: [0x024B] + icon: "mdi:battery" + + - name: "Battery SOC" + class: "battery" + state_class: "measurement" + uom: "%" + scale: 1 + rule: 1 + registers: [0x024C] + icon: "mdi:battery" + validation: + min: 0 + max: 101 + + - name: "Battery Current" + class: "current" + state_class: "measurement" + uom: "A" + scale: 0.01 + rule: 2 + registers: [0x024F] + icon: "mdi:battery" + + - name: "Battery Temperature" + class: "temperature" + state_class: "measurement" + uom: "°C" + scale: 0.1 + rule: 1 + offset: 1000 + registers: [0x024A] + icon: "mdi:battery" + validation: + min: 1 + max: 99 + + - group: Grid + items: + - name: "Total Grid Power" + class: "measurement" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 2 + registers: [0x0271] + icon: "mdi:transmission-tower" + + - name: "Grid Voltage L1" + class: "voltage" + state_class: "measurement" + uom: "V" + scale: 0.1 + rule: 1 + registers: [0x0256] + icon: "mdi:transmission-tower" + + - name: "Grid Voltage L2" + class: "voltage" + state_class: "measurement" + uom: "V" + scale: 0.1 + rule: 1 + registers: [0x0257] + icon: "mdi:transmission-tower" + + - name: "Grid Voltage L3" + class: "voltage" + state_class: "measurement" + uom: "V" + scale: 0.1 + rule: 1 + registers: [0x0258] + icon: "mdi:transmission-tower" + + - name: "Internal CT L1 Power" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 2 + registers: [0x025C] + icon: "mdi:transmission-tower" + + - name: "Internal CT L2 Power" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 2 + registers: [0x025D] + icon: "mdi:transmission-tower" + + - name: "Internal CT L3 Power" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 2 + registers: [0x025E] + icon: "mdi:transmission-tower" + + - name: "External CT L1 Power" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 2 + registers: [0x0268] + icon: "mdi:transmission-tower" + + - name: "External CT L2 Power" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 2 + registers: [0x0269] + icon: "mdi:transmission-tower" + + - name: "External CT L3 Power" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 2 + registers: [0x026A] + icon: "mdi:transmission-tower" + + - name: "Daily Energy Bought" + class: "energy" + state_class: "total_increasing" + uom: "kWh" + scale: 0.1 + rule: 1 + registers: [0x0208] + icon: "mdi:transmission-tower-export" + + - name: "Total Energy Bought" + class: "energy" + state_class: "total_increasing" + uom: "kWh" + scale: 0.1 + rule: 1 + registers: [0x020A, 0x020B] + icon: "mdi:transmission-tower-export" + + - name: "Daily Energy Sold" + class: "energy" + state_class: "total_increasing" + uom: "kWh" + scale: 0.1 + rule: 1 + registers: [0x0209] + icon: "mdi:transmission-tower-import" + + - name: "Total Energy Sold" + class: "energy" + state_class: "total_increasing" + uom: "kWh" + scale: 0.1 + rule: 3 + registers: [0x020C, 0x020D] + icon: "mdi:transmission-tower-import" + + - name: "Total Grid Production" + class: "energy" + state_class: "total_increasing" + uom: "kWh" + scale: 0.1 + rule: 4 + registers: [0x020C, 0x020D] + icon: "mdi:transmission-tower" + + - group: Upload + items: + - name: "Total Load Power" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 1 + registers: [0x028D] + icon: "mdi:lightning-bolt-outline" + + - name: "Load L1 Power" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 1 + registers: [0x028A] + icon: "mdi:lightning-bolt-outline" + + - name: "Load L2 Power" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 1 + registers: [0x028B] + icon: "mdi:lightning-bolt-outline" + + - name: "Load L3 Power" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 1 + registers: [0x028C] + icon: "mdi:lightning-bolt-outline" + + - name: "Load Voltage L1" + class: "voltage" + state_class: "measurement" + uom: "V" + scale: 0.1 + rule: 1 + registers: [0x0284] + icon: "mdi:lightning-bolt-outline" + + - name: "Load Voltage L2" + class: "voltage" + state_class: "measurement" + uom: "V" + scale: 0.1 + rule: 1 + registers: [0x0285] + icon: "mdi:lightning-bolt-outline" + + - name: "Load Voltage L3" + class: "voltage" + state_class: "measurement" + uom: "V" + scale: 0.1 + rule: 1 + registers: [0x0286] + icon: "mdi:lightning-bolt-outline" + + - name: "Daily Load Consumption" + class: "energy" + state_class: "total_increasing" + uom: "kWh" + scale: 0.1 + rule: 1 + registers: [0x020E] + icon: "mdi:lightning-bolt-outline" + + - name: "Total Load Consumption" + class: "energy" + state_class: "total_increasing" + uom: "kWh" + scale: 0.1 + rule: 3 + registers: [0x020F, 0x0210] + icon: "mdi:lightning-bolt-outline" + + - group: Inverter + items: + - name: "Current L1" + class: "current" + state_class: "measurement" + uom: "A" + scale: 0.01 + rule: 2 + registers: [0x0276] + icon: "mdi:home-lightning-bolt" + + - name: "Current L2" + class: "current" + state_class: "measurement" + uom: "A" + scale: 0.01 + rule: 2 + registers: [0x0277] + icon: "mdi:home-lightning-bolt" + + - name: "Current L3" + class: "current" + uom: "A" + scale: 0.01 + rule: 2 + registers: [0x0278] + icon: "mdi:home-lightning-bolt" + + - name: "Inverter L1 Power" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 2 + registers: [0x0279] + icon: "mdi:home-lightning-bolt" + + - name: "Inverter L2 Power" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 2 + registers: [0x027A] + icon: "mdi:home-lightning-bolt" + + - name: "Inverter L3 Power" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 2 + registers: [0x027B] + icon: "mdi:home-lightning-bolt" + + - name: "DC Temperature" + class: "temperature" + state_class: "measurement" + uom: "°C" + scale: 0.1 + rule: 2 + offset: 1000 + registers: [0x021C] + icon: "mdi:thermometer" + + - name: "AC Temperature" + class: "temperature" + state_class: "measurement" + uom: "°C" + scale: 0.1 + rule: 2 + offset: 1000 + registers: [0x021D] + icon: "mdi:thermometer" + + - name: "Inverter ID" + class: "" + state_class: "" + uom: "" + scale: 1 + rule: 5 + registers: [0x0003, 0x0004, 0x0005, 0x0006, 0x0007] + isstr: true + + - name: "Communication Board Version No." + class: "" + state_class: "" + uom: "" + scale: 1 + rule: 1 + registers: [0x0011] + isstr: true + + - name: "Control Board Version No." + class: "" + state_class: "" + uom: "" + scale: 1 + rule: 1 + registers: [0x000D] + isstr: true + + - group: SmartLoad + items: + - name: "SmartLoad Enable Status" + class: "" + state_class: "" + uom: "" + scale: 1 + rule: 1 + registers: [0x0085] + isstr: true + lookup: + - key: 0 + value: "GEN Use" + - key: 1 + value: "SMART Load output" + - key: 2 + value: "Microinverter" + icon: "mdi:lightning-bolt-outline" + + - name: "Phase voltage of Gen port A" + class: "voltage" + state_class: "measurement" + uom: "V" + scale: 0.1 + rule: 1 + registers: [0x0295] + icon: "mdi:home-lightning-bolt" + + - name: "Phase voltage of Gen port B" + class: "voltage" + state_class: "measurement" + uom: "V" + scale: 0.1 + rule: 1 + registers: [0x0296] + icon: "mdi:home-lightning-bolt" + + - name: "Phase voltage of Gen port C" + class: "voltage" + state_class: "measurement" + uom: "V" + scale: 0.1 + rule: 1 + registers: [0x0297] + icon: "mdi:home-lightning-bolt" + + - name: "Phase power of Gen port A" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 1 + registers: [0x0298, 0x029C] + icon: "mdi:home-lightning-bolt" + validation: + min: 0 + max: 12000 + + - name: "Phase power of Gen port B" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 1 + registers: [0x0299, 0x029D] + icon: "mdi:home-lightning-bolt" + validation: + min: 0 + max: 12000 + + - name: "Phase power of Gen port C" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 1 + registers: [0x029A, 0x029E] + icon: "mdi:home-lightning-bolt" + validation: + min: 0 + max: 12000 + + - name: "Total Power of Gen port" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 1 + registers: [0x029B, 0x029F] + icon: "mdi:home-l1ghtning-bolt" + validation: + min: 0 + max: 12000 + + - name: "Generator daily power generation" + class: "energy" + state_class: "total_increasing" + uom: "kWh" + scale: 0.1 + rule: 3 + registers: [0x0218] + icon: "mdi:transmission-tower-import" + + - name: "Generator total power generation" + class: "energy" + state_class: "total_increasing" + uom: "kWh" + scale: 0.1 + rule: 3 + registers: [0x0219, 0x021A] + icon: "mdi:transmission-tower-import" + + - group: Alert + items: + - name: "Alert" + class: "" + state_class: "" + uom: "" + scale: 1 + rule: 6 + registers: [0x0229, 0x022A, 0x22B, 0x022C, 0x022D, 0x022E] diff --git a/custom_components/solarman/inverter_definitions/hyd-zss-hp-3k-6k.yaml b/custom_components/solarman/inverter_definitions/hyd-zss-hp-3k-6k.yaml index ddf3f19..f230bc0 100644 --- a/custom_components/solarman/inverter_definitions/hyd-zss-hp-3k-6k.yaml +++ b/custom_components/solarman/inverter_definitions/hyd-zss-hp-3k-6k.yaml @@ -2,24 +2,33 @@ # with LSW-3 WiFi logger with SN 27xxxxxxxx and FW LSW3_15_270A_1.53: requests: - - start: 0x0400 - end: 0x042B + - start: 0x0404 + end: 0x0410 mb_functioncode: 0x03 - - start: 0x0482 - end: 0x04A4 + - start: 0x0418 + end: 0x041A + mb_functioncode: 0x03 + - start: 0x042b + end: 0x042b mb_functioncode: 0x03 - - start: 0x0582 + - start: 0x0484 + end: 0x048d + mb_functioncode: 0x03 + - start: 0x04AF + end: 0x04AF + mb_functioncode: 0x03 + - start: 0x0504 + end: 0x0504 + mb_functioncode: 0x03 + - start: 0x0584 end: 0x0589 mb_functioncode: 0x03 - start: 0x0604 end: 0x060A mb_functioncode: 0x03 - - start: 0x0682 + - start: 0x0683 end: 0x069B mb_functioncode: 0x03 - - start: 0x0504 - end: 0x0504 - mb_functioncode: 0x03 parameters: - group: Solar @@ -174,8 +183,8 @@ parameters: - name: "Battery Power" class: "power" state_class: "measurement" - uom: "KW" - scale: 0.01 + uom: "W" + scale: 10 rule: 2 registers: [0x0606] icon: 'mdi:battery-charging-high' @@ -200,6 +209,24 @@ parameters: - group: Grid items: + - name: "Grid Power" + class: "power" + state_class: "measurement" + uom: "W" + scale: 10 + rule: 2 + registers: [0x0488] + icon: 'mdi:transmission-tower' + + - name: 'Grid Voltage' + class: 'voltage' + state_class: 'measurement' + uom: 'V' + scale: 0.1 + rule: 1 + registers: [0x048d] + icon: 'mdi:transmission-tower' + - name: 'Grid Frequency' class: 'frequency' state_class: 'measurement' @@ -207,7 +234,7 @@ parameters: scale: 0.01 rule: 1 registers: [0x0484] - icon: 'mdi:home-lightning-bolt' + icon: 'mdi:transmission-tower' - name: 'Active Power Output Total' class: 'power' @@ -217,7 +244,16 @@ parameters: rule: 2 registers: [0x0485] icon: 'mdi:home-lightning-bolt' - + + - name: 'Home Consumption' + class: 'power' + state_class: 'measurement' + uom: 'W' + scale: 10 + rule: 2 + registers: [0x04AF] + icon: 'mdi:home-lightning-bolt' + - name: 'Active Power Load Total' class: 'power' state_class: 'measurement' @@ -312,7 +348,7 @@ parameters: - name: 'Insulation Resistance' class: '' state_class: 'measurement' - uom: 'Ω' + uom: 'kΩ' scale: 1 rule: 1 registers: [0x042B] diff --git a/custom_components/solarman/inverter_definitions/sofar_g3hyd.yaml b/custom_components/solarman/inverter_definitions/sofar_g3hyd.yaml index ba30139..da23940 100644 --- a/custom_components/solarman/inverter_definitions/sofar_g3hyd.yaml +++ b/custom_components/solarman/inverter_definitions/sofar_g3hyd.yaml @@ -1,26 +1,35 @@ # Sofar G3 also HYD 5-20KTL-3PH -# This works also for rebranded ZCS Azzurro 3-Phase inverters such as the 3PH HYD6000 ZSS +# This works also for rebranded ZCS Azzurro 3-Phase inverters such as the 3PH HYD6000 ZSS, or single phase such as 1PH HY6000 ZSS HP # Note that this won't work if your ZCS inverter is connected via Connext, you have to be using a Wi-Fi or Ethernet Kit such as ZSM-WIFI-USB. requests: - - start: 0x0404 - end: 0x0420 + - start: 0x0404 # inverter and faults + end: 0x042B mb_functioncode: 0x03 - - start: 0x0484 + - start: 0x0445 # serial number, hw, sw and firmare versions + end: 0x0465 + mb_functioncode: 0x03 + - start: 0x0484 # on-grid end: 0x04AF mb_functioncode: 0x03 -# off - grid info -# - start: 0x0504 -# end: 0x051F -# mb_functioncode: 0x03 - - start: 0x0584 + - start: 0x0504 # off-grid + end: 0x051F + mb_functioncode: 0x03 + - start: 0x0584 # dc end: 0x0589 mb_functioncode: 0x03 - - start: 0x0604 - end: 0x060A # end of first battery after this continue battery pack 2,3,4 + - start: 0x0604 # battery 1 + end: 0x060A # end of first battery, last battery (8th) ends in 0x063A mb_functioncode: 0x03 - - start: 0x0684 + - start: 0x0684 # generation end: 0x069B mb_functioncode: 0x03 + - start: 0x104D # battery dod and eod + end: 0x104E + mb_functioncode: 0x03 + - start: 0x1052 # battery eps buffer + end: 0x1052 + mb_functioncode: 0x03 + parameters: - group: Inverter @@ -128,6 +137,77 @@ parameters: rule: 2 registers: [ 0x0422 ] icon: 'mdi:thermometer' + - name: "Generation Time Today" + class: "duration" + state_class: "measurement" + uom: "min" + scale: 1 + rule: 1 + registers: [ 0x0426 ] + icon: 'mdi:clock' + - name: "Insulation resistance" + class: "" + state_class: "measurement" + uom: "kΩ" + scale: 1 + rule: 1 + registers: [ 0x042B ] + icon: 'mdi:omega' + - name: "Serial Number" + class: "" + uom: "" + scale: 1 + rule: 5 + isstr: true + registers: [ 0x0445,0x0446,0x0447,0x0448,0x0449,0x044A,0x044B,0x044C ] # serial number 17th to 20th digits are in 0x0470 and 0x0471 + icon: 'mdi:barcode' + - name: "Hardware Version" + class: "" + uom: "" + scale: 1 + rule: 5 + isstr: true + registers: [ 0x044D,0x044E ] + icon: 'mdi:alpha-v' + - name: "Software Version Master" + class: "" + uom: "" + scale: 1 + rule: 5 + isstr: true + registers: [ 0x0453,0x0454,0x0455,0x0456 ] + icon: 'mdi:alpha-v' + - name: "Software Version Slave" + class: "" + uom: "" + scale: 1 + rule: 5 + isstr: true + registers: [ 0x0457,0x0458,0x0459,0x045A ] + icon: 'mdi:alpha-v' + - name: "Safety Version" + class: "" + uom: "" + scale: 1 + rule: 7 + registers: [ 0x045B,0x045C ] + icon: 'mdi:alpha-v' + - name: "Safety Firmware Version" + class: "" + uom: "" + scale: 1 + rule: 5 + isstr: true + registers: [ 0x0460,0x0461,0x0462,0x0463 ] + icon: 'mdi:alpha-v' + - name: "Safety Hardware Version" + class: "" + uom: "" + scale: 1 + rule: 5 + isstr: true + registers: [ 0x0464,0x0465 ] + icon: 'mdi:alpha-v' - group: InverterDC items: @@ -238,62 +318,30 @@ parameters: rule: 1 registers: [ 0x060A ] icon: 'mdi:battery' - - name: "Battery 2 Voltage" - class: "voltage" - state_class: "measurement" - uom: "V" - scale: 0.1 - rule: 1 - registers: [ 0x060B ] - icon: 'mdi:battery' - - name: "Battery 2 Current" - class: "current" - state_class: "measurement" - uom: "A" - scale: 0.01 - rule: 2 - registers: [ 0x060C ] - icon: 'mdi:current-dc' - - name: "Battery 2 Power" - class: "power" - state_class: "measurement" - uom: "W" - scale: 10 - rule: 2 - registers: [ 0x060D ] - icon: 'mdi:battery-charging' - - name: "Battery 2 Temperature" - class: "temperature" - state_class: "measurement" - uom: "°C" - scale: 1 - rule: 2 - registers: [ 0x060E ] - icon: 'mdi:battery' - - name: "Battery 2 SOC" - class: "battery" + - name: "Battery DOD" + class: "" state_class: "measurement" uom: "%" scale: 1 rule: 1 - registers: [ 0x060F ] + registers: [ 0x104D ] icon: 'mdi:battery' - - name: "Battery 2 SOH" - class: "battery" + - name: "Battery EOD" + class: "" state_class: "measurement" uom: "%" scale: 1 rule: 1 - registers: [ 0x0610 ] + registers: [ 0x104E ] icon: 'mdi:battery' - - name: "Battery 2 Number of Cycles" + - name: "Battery EPS Buffer" class: "" state_class: "measurement" - uom: "cycle" + uom: "%" scale: 1 rule: 1 - registers: [ 0x0611 ] - icon: 'mdi:battery' + registers: [ 0x1052 ] + icon: 'mdi:battery-low' - group: GridAC items: @@ -894,6 +942,10 @@ parameters: value: "ID03 Grid Over Frequency Protection" - key: 8 value: "ID04 Grid Under Frequency Protection" + - key: 10 + value: "LOOKUP" # off-grid + - key: 14 + value: "ID03 Grid Over Frequency Protection" # also ID14 Grid voltage unbalance - key: 16 value: "ID05 Leakage current fault" - key: 32 diff --git a/custom_components/solarman/inverter_definitions/solis_3p-4g.yaml b/custom_components/solarman/inverter_definitions/solis_3p-4g.yaml index 7d95b35..788daf0 100644 --- a/custom_components/solarman/inverter_definitions/solis_3p-4g.yaml +++ b/custom_components/solarman/inverter_definitions/solis_3p-4g.yaml @@ -7,9 +7,6 @@ requests: - start: 2999 end: 3044 mb_functioncode: 0x04 - - start: 4999 - end: 4999 - mb_functioncode: 0x04 parameters: @@ -39,15 +36,6 @@ parameters: - key: 6 value: "Rule21Volt–watt" - - name: "Grid status" - class: "" - state_class: "" - uom: "" - scale: 1 - rule: 1 - registers: [4999] - icon: 'mdi:home-lightning-bolt' - - name: "Inverter Temperature" class: "temperature" state_class: "measurement" diff --git a/custom_components/solarman/inverter_definitions/solis_hybrid.yaml b/custom_components/solarman/inverter_definitions/solis_hybrid.yaml index de8699b..a485776 100644 --- a/custom_components/solarman/inverter_definitions/solis_hybrid.yaml +++ b/custom_components/solarman/inverter_definitions/solis_hybrid.yaml @@ -13,7 +13,7 @@ requests: - start: 33206 end: 33282 mb_functioncode: 0x04 - - start: 43140 + - start: 43000 end: 43150 mb_functioncode: 0x03 @@ -844,6 +844,24 @@ parameters: registers: [33144] icon: 'mdi:battery-arrow-down' + - name: "Backup Mode SOC" + class: "battery" + state_class: "measurement" + uom: "%" + scale: 1 + rule: 1 + registers: [43024] + icon: 'mdi:battery' + + - name: "Overdischarge SOC" + class: "battery" + state_class: "measurement" + uom: "%" + scale: 1 + rule: 1 + registers: [43011] + icon: 'mdi:battery' + - group: TimedCharge items: - name: "Timed Charge Current" diff --git a/custom_components/solarman/parser.py b/custom_components/solarman/parser.py index 8162290..f444b82 100644 --- a/custom_components/solarman/parser.py +++ b/custom_components/solarman/parser.py @@ -55,7 +55,7 @@ def do_validate(self, title, value, rule): def try_parse_signed (self, rawData, definition, start, length): title = definition['name'] - scale = definition['scale'] + scale = definition['scale'] if 'scale' in definition else 1 value = 0 found = True shift = 0 @@ -95,7 +95,7 @@ def try_parse_signed (self, rawData, definition, start, length): def try_parse_unsigned (self, rawData, definition, start, length): title = definition['name'] - scale = definition['scale'] + scale = definition['scale'] if 'scale' in definition else 1 value = 0 found = True shift = 0 diff --git a/custom_components/solarman/sensor.py b/custom_components/solarman/sensor.py index f96a069..10e931d 100644 --- a/custom_components/solarman/sensor.py +++ b/custom_components/solarman/sensor.py @@ -12,7 +12,7 @@ import voluptuous as vol from homeassistant.core import HomeAssistant from homeassistant.config_entries import ConfigEntry -from homeassistant.const import CONF_NAME +from homeassistant.const import CONF_NAME, EntityCategory from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity_platform import AddEntitiesCallback @@ -63,8 +63,8 @@ def _do_setup_platform(hass: HomeAssistant, config, async_add_entities : AddEnti except BaseException as ex: _LOGGER.error(f'Config error {ex} {sensor}') raise - hass_sensors.append(SolarmanStatus(inverter_name, inverter, "status_lastUpdate", inverter_sn)) - hass_sensors.append(SolarmanStatus(inverter_name, inverter, "status_connection", inverter_sn)) + hass_sensors.append(SolarmanStatusDiag(inverter_name, inverter, "status_lastUpdate", inverter_sn)) + hass_sensors.append(SolarmanStatusDiag(inverter_name, inverter, "status_connection", inverter_sn)) _LOGGER.debug(f'sensor.py:_do_setup_platform: async_add_entities') _LOGGER.debug(hass_sensors) @@ -160,6 +160,14 @@ def state(self): def update(self): self.p_state = getattr(self.inverter, self._field_name, None) +############################################################################################################# +# This is the the same of SolarmanStatus, but it has EntityCategory setup to Diagnostic. +############################################################################################################# + +class SolarmanStatusDiag(SolarmanStatus): + def __init__(self, inverter_name, inverter, field_name, sn): + super().__init__(inverter_name, inverter, field_name, sn) + self._attr_entity_category = EntityCategory.DIAGNOSTIC ############################################################################################################# # Entity displaying a text field read from the inverter diff --git a/custom_components/solarman/solarman.py b/custom_components/solarman/solarman.py index 8f74b77..f74ece9 100644 --- a/custom_components/solarman/solarman.py +++ b/custom_components/solarman/solarman.py @@ -74,7 +74,8 @@ def get_statistics(self): start = request['start'] end = request['end'] mb_fc = request['mb_functioncode'] - log.debug(f"Querying [{start} - {end}]...") + range_string = f"{start}-{end} (0x{start:04X}-0x{end:04X})" + log.debug(f"Querying [{range_string}]...") attempts_left = QUERY_RETRY_ATTEMPTS while attempts_left > 0: @@ -85,15 +86,15 @@ def get_statistics(self): result = 1 except Exception as e: result = 0 - log.warning(f"Querying [{start} - {end}] failed with exception [{type(e).__name__}: {e}]") + log.warning(f"Querying [{range_string}] failed with exception [{type(e).__name__}: {e}]") self.disconnect_from_server() if result == 0: - log.warning(f"Querying [{start} - {end}] failed, [{attempts_left}] retry attempts left") + log.warning(f"Querying [{range_string}] failed, [{attempts_left}] retry attempts left") else: - log.debug(f"Querying [{start} - {end}] succeeded") + log.debug(f"Querying [{range_string}] succeeded") break if result == 0: - log.warning(f"Querying registers [{start} - {end}] failed, aborting.") + log.warning(f"Querying registers [{range_string}] failed, aborting.") break if result == 1: diff --git a/customization.md b/customization.md index 8805025..a503b30 100644 --- a/customization.md +++ b/customization.md @@ -1,127 +1,127 @@ -# Customizing - -The heart of this component is the parameter-definition file, such as *deye_hybrid.yaml*. By changing the file, the behaviour is totally changed. - -NOTE: -In order to leave your customized file intact during upgrades, copy the most relevant yaml file to a file called `custom_parameters.yaml`, and set the "lookup_file" option in configuration.yaml to point to it (or just select the file in the configuration flow UI). - -~~~ YAML -sensor: - - platform: ... - name: ... - inverter_host: ... - inverter_port: ... - inverter_serial: ... - scan_interval: ... - lookup_file: custom_parameters.yaml -~~~ - -It has two sections: - -## 1. Requests -This section defines the requests that should be issued to the logger each time the component does a parameter update. The list below was created for a DEYE 5kW inverter, and could be customized for other models that are not 100% compatible with this inverter. - -~~~ YAML -requests: - - start: 0x0003 - end: 0x000E - mb_functioncode: 0x03 - - start: 0x003B - end: 0x0070 - mb_functioncode: 0x03 - - start: 0x0096 - end: 0x00C3 - mb_functioncode: 0x03 - - start: 0x00f4 - end: 0x00f8 - mb_functioncode: 0x03 -~~~ - -This block specifies that the component should issue three requests to the logger, the first one requesting parameters 0x0003 up to 0x000E, then a second request for parmeters 0x003B up to 0x0070, and the last for parameters 0x000f4 up to 0x00f8. All of the requests will be sent using Modbus Function Code 0x03. - -The **maximum number** of registers that can be queried using the protocol **for each request is 125** (see [here](https://github.com/jmccrohan/pysolarmanv5/issues/51#issuecomment-1902238661)), but some loggers may get errors like `CRC validation failed` if the length is too much; in that case, reduce the length (`end-start`) by doing multiple requests. - -If you get `V5FrameError: V5 frame contains invalid sequence number` errors in the log, it might be caused by concurrency (i.e. more than one client connected to the same logger stick). - -## 2. Parameters -This section defines the individual parameter definitions: each parameter creates one sensor in Home Assistant. For example: - -~~~ YAML -parameters: - - group: solar - items: - - name: "PV1 Power" - class: "power" - state_class: "measurement" - uom: "W" - scale: 1 - rule: 1 - registers: [0x00BA] - icon: 'mdi:solar-power' -~~~ - -The register must be included in the requests of the previous point, otherwise the sensor will have an `Unknown` value in Home Assistant. - -Pay attention to the registers order when more than one are required; it could be descending when 2 registers are joint together or not, depending on the inverter. - -### Group -The group just groups parameters that belong together. The induvidual parameter-items has to be placed in a group. The *items* parameters contains the parameter definitions that belong in the group. - -### Parameter-item - - -|Field||Description| -|-|-|-| -|name||The *name* field of the home-assistant entity #| -|class||The *class* field of the home-assistant entity #| -|state_class||The *state_class* field of the home-assistant entity ##| -|uom||The *unit_of_measurement* field of the home-assistant entity #| -|icon||The *icon* field of the home-assistant entity #| -|| **The fields below define how the value from the logger is parsed** | -|scale||Scaling factor for the value read from the logger (default: 1)| +# Customizing + +The heart of this component is the parameter-definition file, such as *deye_hybrid.yaml*. By changing the file, the behaviour is totally changed. + +NOTE: +In order to leave your customized file intact during upgrades, copy the most relevant yaml file to a file called `custom_parameters.yaml`, and set the "lookup_file" option in configuration.yaml to point to it (or just select the file in the configuration flow UI). + +~~~ YAML +sensor: + - platform: ... + name: ... + inverter_host: ... + inverter_port: ... + inverter_serial: ... + scan_interval: ... + lookup_file: custom_parameters.yaml +~~~ + +It has two sections: + +## 1. Requests +This section defines the requests that should be issued to the logger each time the component does a parameter update. The list below was created for a DEYE 5kW inverter, and could be customized for other models that are not 100% compatible with this inverter. + +~~~ YAML +requests: + - start: 0x0003 + end: 0x000E + mb_functioncode: 0x03 + - start: 0x003B + end: 0x0070 + mb_functioncode: 0x03 + - start: 0x0096 + end: 0x00C3 + mb_functioncode: 0x03 + - start: 0x00f4 + end: 0x00f8 + mb_functioncode: 0x03 +~~~ + +This block specifies that the component should issue three requests to the logger, the first one requesting parameters 0x0003 up to 0x000E, then a second request for parmeters 0x003B up to 0x0070, and the last for parameters 0x000f4 up to 0x00f8. All of the requests will be sent using Modbus Function Code 0x03. + +The **maximum number** of registers that can be queried using the protocol **for each request is 125** (see [here](https://github.com/jmccrohan/pysolarmanv5/issues/51#issuecomment-1902238661)), but some loggers may get errors like `CRC validation failed` if the length is too much; in that case, reduce the length (`end-start`) by doing multiple requests. + +If you get `V5FrameError: V5 frame contains invalid sequence number` errors in the log, it might be caused by concurrency (i.e. more than one client connected to the same logger stick). + +## 2. Parameters +This section defines the individual parameter definitions: each parameter creates one sensor in Home Assistant. For example: + +~~~ YAML +parameters: + - group: solar + items: + - name: "PV1 Power" + class: "power" + state_class: "measurement" + uom: "W" + scale: 1 + rule: 1 + registers: [0x00BA] + icon: 'mdi:solar-power' +~~~ + +The register must be included in the requests of the previous point, otherwise the sensor will have an `Unknown` value in Home Assistant. + +Pay attention to the registers order when more than one are required; it could be descending when 2 registers are joint together or not, depending on the inverter. + +### Group +The group just groups parameters that belong together. The induvidual parameter-items has to be placed in a group. The *items* parameters contains the parameter definitions that belong in the group. + +### Parameter-item + + +|Field||Description| +|-|-|-| +|name||The *name* field of the home-assistant entity #| +|class||The *class* field of the home-assistant entity #| +|state_class||The *state_class* field of the home-assistant entity ##| +|uom||The *unit_of_measurement* field of the home-assistant entity #| +|icon||The *icon* field of the home-assistant entity #| +|| **The fields below define how the value from the logger is parsed** | +|scale||Scaling factor for the value read from the logger (default: 1)| |scale_division||If specified, divides the result of the scaling by this number (e.g. if the value of the register is in minutes and you want the home-assistant entity in hours, use `scale_division: 60` and `uom: "h"`) -|rule||Method to interpret the data from the logger (see the table below)| -|mask||A mask to filter only used bit fields; this is especialy useful for flag fields| -|registers||Array of register fields that comprises the value; if the value is placed in a number of registers, this array will contain more than one item (note: order is important)| -|lookup||Defines a key-value pair for values where an integer maps to a string field| -||**The following is optional and could be used, if the inverter delivers sometimes non-usable data (e.g. Total Production == 0.0)**| -|validation| || -||min|Spefifies the minimum value to accept| -||max|Specifies the maximum value to accept| -||invalidate_all| Optional: invalidate the complete dataset if specified; if not specified, it will only invalidate the specific parameter| - -Example yaml file for the mentioned above: - -~~~ YAML - - name: "Total Production" - class: "energy" - state_class: "total_increasing" - uom: "kWh" - scale: 0.1 - rule: 3 - registers: [0x003F,0x0040] - icon: 'mdi:solar-power' - validation: - min: 0.1 - invalidate_all: -~~~ - -\# (see) https://developers.home-assistant.io/docs/core/entity/ - -\## see https://developers.home-assistant.io/docs/core/entity/sensor/#entities-representing-a-total-amount - -### Rule -The `rule` field specifies how to interpret the binary data contained in the register(s). - -| Rule # | Description | Example | -|--------|-----------------------|------------------------------------------------------------------------------------------------------------------------| -| 1 | Unsigned 16-bit value | | -| 2 | Signed 16 bit value | | -| 3 | Unsigned 32 bit value | | -| 4 | Signed 32 bit value | | -| 5 | ASCII value | | -| 6 | Bit field | | -| 7 | Version | | -| 8 | Date Time | | -| 9 | Time | Time value as string| - +|rule||Method to interpret the data from the logger (see the table below)| +|mask||A mask to filter only used bit fields; this is especialy useful for flag fields| +|registers||Array of register fields that comprises the value; if the value is placed in a number of registers, this array will contain more than one item (note: order is important)| +|lookup||Defines a key-value pair for values where an integer maps to a string field| +||**The following is optional and could be used, if the inverter delivers sometimes non-usable data (e.g. Total Production == 0.0)**| +|validation| || +||min|Spefifies the minimum value to accept| +||max|Specifies the maximum value to accept| +||invalidate_all| Optional: invalidate the complete dataset if specified; if not specified, it will only invalidate the specific parameter| + +Example yaml file for the mentioned above: + +~~~ YAML + - name: "Total Production" + class: "energy" + state_class: "total_increasing" + uom: "kWh" + scale: 0.1 + rule: 3 + registers: [0x003F,0x0040] + icon: 'mdi:solar-power' + validation: + min: 0.1 + invalidate_all: +~~~ + +\# (see) https://developers.home-assistant.io/docs/core/entity/ + +\## see https://developers.home-assistant.io/docs/core/entity/sensor/#entities-representing-a-total-amount + +### Rule +The `rule` field specifies how to interpret the binary data contained in the register(s). + +| Rule # | Description | Example | +|--------|-----------------------|------------------------------------------------------------------------------------------------------------------------| +| 1 | Unsigned 16-bit value | | +| 2 | Signed 16 bit value | | +| 3 | Unsigned 32 bit value | | +| 4 | Signed 32 bit value | | +| 5 | ASCII value | | +| 6 | Bit field | | +| 7 | Version | | +| 8 | Date Time | | +| 9 | Time | Time value as string| +