From 7f02d2fbab4ff1f8c0f73be53f8edc0934f96547 Mon Sep 17 00:00:00 2001 From: Michael Kotten Date: Wed, 8 Jun 2022 08:04:47 +0200 Subject: [PATCH] #53 - adds support for bit masks --- SunGather/registers-sungrow.yaml | 50 +++++++++++++++++++++++++++++--- SunGather/sungather.py | 6 +++- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/SunGather/registers-sungrow.yaml b/SunGather/registers-sungrow.yaml index 2738fd3..af49d11 100644 --- a/SunGather/registers-sungrow.yaml +++ b/SunGather/registers-sungrow.yaml @@ -1108,12 +1108,54 @@ registers: - response: 0x4000 value: "EMS Run" models: ["SH5K-20","SH3K6","SH4K6","SH5K-V13","SH5K-30","SH3K6-30","SH4K6-30","SH5.0RS","SH3.6RS","SH4.6RS","SH6.0RS","SH10RT","SH8.0RT","SH6.0RT","SH5.0RT"] - - name: "running_state" + - name: "running_state" level: 2 address: 13001 datatype: "U16" - models: ["SH5K-20","SH3K6","SH4K6","SH5K-V13","SH5K-30","SH3K6-30","SH4K6-30","SH5.0RS","SH3.6RS","SH4.6RS","SH6.0RS","SH10RT","SH8.0RT","SH6.0RT","SH5.0RT"] - - name: "daily_pv_generation" + models: ["SH5K-20","SH3K6","SH4K6","SH5K-V13","SH5K-30","SH3K6-30","SH4K6-30","SH5.0RS","SH3.6RS","SH4.6RS","SH6.0RS","SH10RT","SH8.0RT","SH6.0RT","SH5.0RT"] + - name: "power_generated_from_pv" + level: 2 + address: 13001 + datatype: "U16" + mask: 1 + models: ["SH5K-20","SH3K6","SH4K6","SH5K-V13","SH5K-30","SH3K6-30","SH4K6-30","SH5.0RS","SH3.6RS","SH4.6RS","SH6.0RS","SH10RT","SH8.0RT","SH6.0RT","SH5.0RT"] + - name: "battery_charging" + level: 2 + address: 13001 + datatype: "U16" + mask: 2 + models: ["SH5K-20","SH3K6","SH4K6","SH5K-V13","SH5K-30","SH3K6-30","SH4K6-30","SH5.0RS","SH3.6RS","SH4.6RS","SH6.0RS","SH10RT","SH8.0RT","SH6.0RT","SH5.0RT"] + - name: "battery_discharging" + level: 2 + address: 13001 + datatype: "U16" + mask: 4 + models: ["SH5K-20","SH3K6","SH4K6","SH5K-V13","SH5K-30","SH3K6-30","SH4K6-30","SH5.0RS","SH3.6RS","SH4.6RS","SH6.0RS","SH10RT","SH8.0RT","SH6.0RT","SH5.0RT"] + - name: "load_active" + level: 2 + address: 13001 + datatype: "U16" + mask: 8 + models: ["SH5K-20","SH3K6","SH4K6","SH5K-V13","SH5K-30","SH3K6-30","SH4K6-30","SH5.0RS","SH3.6RS","SH4.6RS","SH6.0RS","SH10RT","SH8.0RT","SH6.0RT","SH5.0RT"] + - name: "feed_into_grid" + level: 2 + address: 13001 + datatype: "U16" + mask: 16 + models: ["SH5K-20","SH3K6","SH4K6","SH5K-V13","SH5K-30","SH3K6-30","SH4K6-30","SH5.0RS","SH3.6RS","SH4.6RS","SH6.0RS","SH10RT","SH8.0RT","SH6.0RT","SH5.0RT"] + - name: "import_from_grid" + level: 2 + address: 13001 + datatype: "U16" + mask: 32 + models: ["SH5K-20","SH3K6","SH4K6","SH5K-V13","SH5K-30","SH3K6-30","SH4K6-30","SH5.0RS","SH3.6RS","SH4.6RS","SH6.0RS","SH10RT","SH8.0RT","SH6.0RT","SH5.0RT"] + - name: "power_generated_from_load" + level: 2 + address: 13001 + datatype: "U16" + mask: 128 + models: ["SH5K-20","SH3K6","SH4K6","SH5K-V13","SH5K-30","SH3K6-30","SH4K6-30","SH5.0RS","SH3.6RS","SH4.6RS","SH6.0RS","SH10RT","SH8.0RT","SH6.0RT","SH5.0RT"] + - name: "daily_pv_generation" level: 2 address: 13002 datatype: "U16" @@ -1153,7 +1195,7 @@ registers: datatype: "S32" unit: "W" models: ["SH5K-20","SH3K6","SH4K6","SH5K-V13","SH5K-30","SH3K6-30","SH4K6-30","SH5.0RS","SH3.6RS","SH4.6RS","SH6.0RS","SH10RT","SH8.0RT","SH6.0RT","SH5.0RT"] - - name: "daily_battery_charge_from_pv" + - name: "daily_battery_charge_from_pv" level: 1 address: 13012 datatype: "U16" diff --git a/SunGather/sungather.py b/SunGather/sungather.py index 6f7b91f..5bd94b8 100644 --- a/SunGather/sungather.py +++ b/SunGather/sungather.py @@ -208,6 +208,9 @@ class SungrowInverter(): if register.get('datatype') == "U16": if register_value == 0xFFFF: register_value = 0 + if register.get('mask'): + # Filter the value through the mask. + register_value = 1 if register_value & register.get('mask') != 0 else 0 elif register.get('datatype') == "S16": if register_value == 0xFFFF or register_value == 0x7FFF: register_value = 0 @@ -234,12 +237,13 @@ class SungrowInverter(): if value['response'] == rr.registers[num]: register_value = value['value'] + + if register.get('accuracy'): register_value = round(register_value * register.get('accuracy'),2) # Set the final register value with adjustments above included self.latest_scrape[register_name] = register_value - break return True def validateRegister(self, check_register):