From a6480840a229c4c9f1792e8105360cbef57664ee Mon Sep 17 00:00:00 2001
From: bohdan-s
Date: Thu, 22 Dec 2022 20:57:47 +1100
Subject: [PATCH] v0.4.0: HomeAssistant Support!
---
README.md | 52 +++------
SunGather/config-example.yaml | 72 ++++++------
SunGather/exports/mqtt.py | 64 +++++++----
SunGather/exports/webserver.py | 10 +-
SunGather/sungather.py | 163 ++++++++++++++++++---------
SunGather/version.py | 2 +-
img/HomeAssistant-SunGrow_Device.png | Bin 0 -> 362219 bytes
7 files changed, 209 insertions(+), 154 deletions(-)
create mode 100644 img/HomeAssistant-SunGrow_Device.png
diff --git a/README.md b/README.md
index b2071dc..099e28e 100644
--- a/README.md
+++ b/README.md
@@ -37,6 +37,7 @@ On first connection the tool will query your inverter, retrieve the model and re
Register information based on official documentation: Communication Protocol of PV Grid-Connected String Inverters and Communication Protocol of Residential Hybrid Inverters
Has multiple export locations out of the box:
+* Full Home Assistant Support, as HassIO add-on
* Console - Log directly to screen
* MQTT - Load into MQTT, and optionally Home Assistance including Discovery
* PVOutput - Load into PVOutput.org
@@ -53,9 +54,6 @@ I have learned a lot from the following projects, THANK YOU
(back to top)
-## Roadmap / TO DO
-* Full Home Assistant integration, as HACS addon
-
## Built With
@@ -174,6 +172,10 @@ For SG* Models this is calculated from meter_power if -ve value, returned as a p
### Home Assistant setup
+#### The following are manual steps if you are running SunGather separate,
+#### For the easy way see: Hassio Repository
+
+
In the SunGather config.yaml you need to set the smart_meter if you have one
_For Hybrid Models smart_meter doesn't need to get enabled_
@@ -182,46 +184,20 @@ _For Hybrid Models smart_meter doesn't need to get enabled_
smart_meter: True
```
-HA sensors created by the MQTT auto-discovery:
+Enable MQTT, configure the server and HA AutoDiscovery
```
-sensor.inverter_active_power
-sensor.inverter_daily_generation
-sensor.inverter_export_to_grid
-sensor.inverter_import_from_grid
-sensor.inverter_load_power
-sensor.inverter_meter_power
-
+ - name: mqtt
+ enabled: True
+ host: 192.168.1.200
+ homeassistant: True
```
-The Inverter reports Power (W), but HA needs Energy (Wh).
-You can use a "Riemann sum integral" (called integration) to convert it.
-Put the following into your sensors.yaml
-```
-sensor:
- - platform: integration
- source: sensor.inverter_active_power
- name: Solar Production (Sungather)
- - platform: integration
- source: sensor.inverter_export_to_grid
- name: Return to Grid (Sungather)
- - platform: integration
- source: sensor.inverter_import_from_grid
- name: Grid Consumption (Sungather)
-```
+Electricity Grid > Grid Consumption -> Daily Import from Grid
+Electricity Grid > Return to Grid -> Daily Export to Grid
+Solar Panels > Solar Production -> Daily Generation
-The additional sensors then setup in HA are the following with Wh unit of measurement for the Energy platform.
+
-Solar Production (Sungather)
-Return to Grid (Sungather)
-Grid Consumption (Sungather)
-
-Restart Home Assistant for the sensors.yaml to be loaded.
-Make sure SunGather is running, wait 5 minutes for initial data to populate.
-Navigate to the Energy platform (Configuration > Energy). Add these sensors to the following areas:
-
-Electricity Grid > Grid Consumption -> Grid Consumption (Sungather)
-Electricity Grid > Return to Grid -> Return to Grid (Sungather)
-Solar Panels > Solar Production -> Solar Production (Sungather)
(back to top)
diff --git a/SunGather/config-example.yaml b/SunGather/config-example.yaml
index babffdc..95aafe8 100644
--- a/SunGather/config-example.yaml
+++ b/SunGather/config-example.yaml
@@ -5,7 +5,7 @@ inverter:
# retries: 3 # [Optional] Default is 3, how many times to retry if connection fails
# slave: 0x01 # [Optional] Default is 0x01
# scan_interval: 30 # [Optional] Default is 30
- connection: modbus # [Required] options: modbus, sungrow, http
+ connection: modbus # [Required] options: modbus, sungrow, http
# model: "SG7.0RT" # [Optional] This is autodetected on startup, only needed if detection issues or for testing
# See model list here: https://github.com/bohdan-s/SunGather#supported
# serial: xxxxxxxxxx # [Optional] This is autodetected on startup, only needed if detection issues or for testing, used as a unique ID
@@ -24,7 +24,7 @@ inverter:
exports:
# Print Registers to console, good for debugging / troubleshooting
- name: console
- enabled: False # [Optional] Default is False
+ enabled: True # [Optional] Default is False
# Runs a simple Webserver showing Config and last read registers
# Access at http://localhost:8080 or http://[serverip]:8080
@@ -38,7 +38,6 @@ exports:
enabled: False # [Optional] Default is False
# port: 8082 # [Optional] Default is 8080
-
# Output data to InfluxDB
- name: influxdb
enabled: False # [Optional] Default is False
@@ -69,53 +68,60 @@ exports:
enabled: False # [Optional] Default is False
host: 192.168.1.200 # [Required] IP or Hostname of MQTT Server
# port: 1883 # [Optional] Default 1883
- # topic: "inverter/{model}/registers" # [Optional] Default: "inverter/{model}/registers", Variable {model} will be replaced with model number of inverter
+ # topic: "SunGather/{serial_number}" # [Optional] Default: "SunGather/{serial_number}"
# username: # [Optional] Username is MQTT server requires it
# password: # [Optional] Password is MQTT server requires it
- # client_id: # [Optional] Client id for mqtt connection. Defaults to "SunGather", need to be set to different values if you want to run multiple instances of sungather.
- homeassistant: False # [Optional] Default False, Publish discovery and sensors for HomeAssistant
- ha_sensors: # [Optional] / [Required] homeassistant: True, Topics to enable discovery for HA
+ # client_id: # [Optional] Client id for mqtt connection. Defaults to Serial Number.
+ homeassistant: True
+ ha_sensors:
- name: "Daily Generation"
sensor_type: sensor
register: daily_power_yields
- dev_class: energy
+ device_class: energy
state_class: total_increasing
- - name: "Active Power"
+ icon: "mdi:solar-power"
+ - name: "Daily Export to Grid"
sensor_type: sensor
- register: total_active_power
- dev_class: power
- state_class: measurement
- - name: "Load Power"
+ register: daily_export_to_grid
+ device_class: energy
+ state_class: total_increasing
+ icon: "mdi:transmission-tower-export"
+ value_template: "{{ value_json.daily_export_to_grid | round(2) }}"
+ last_reset_value_template: "{{ value_json.last_reset }}"
+ - name: "Daily Import from Grid"
sensor_type: sensor
- register: load_power
- dev_class: power
- state_class: measurement
- - name: "Meter Power"
- sensor_type: sensor
- register: meter_power
- dev_class: power
- state_class: measurement
- - name: "Export to Grid"
- sensor_type: sensor
- register: export_to_grid
- dev_class: power
- state_class: measurement
- - name: "Import from Grid"
- sensor_type: sensor
- register: import_from_grid
- dev_class: power
- state_class: measurement
+ register: daily_import_from_grid
+ device_class: energy
+ state_class: total_increasing
+ icon: "mdi:transmission-tower-import"
+ value_template: "{{ value_json.daily_import_from_grid | round(2) }}"
+ last_reset_value_template: "{{ value_json.last_reset }}"
- name: "Temperature"
sensor_type: sensor
register: internal_temperature
- dev_class: temperature
+ device_class: temperature
state_class: measurement
- name: "Power State"
sensor_type: binary_sensor
register: run_state
- dev_class: running
+ device_class: running
payload_on: "ON"
payload_off: "OFF"
+ - name: "Active Generation"
+ sensor_type: sensor
+ register: total_active_power
+ dev_class: power
+ state_class: measurement
+ - name: "Active Export to Grid"
+ sensor_type: sensor
+ register: export_to_grid
+ dev_class: power
+ state_class: measurement
+ - name: "Active Import from Grid"
+ sensor_type: sensor
+ register: import_from_grid
+ dev_class: power
+ state_class: measurement
# Publish Registers to PVOutput
- name: pvoutput
diff --git a/SunGather/exports/mqtt.py b/SunGather/exports/mqtt.py
index 4838fa8..3050502 100644
--- a/SunGather/exports/mqtt.py
+++ b/SunGather/exports/mqtt.py
@@ -8,15 +8,19 @@ class export_mqtt(object):
self.sensor_topic = None
self.mqtt_queue = []
self.ha_discovery_published = False
+ # Exclude ones linked to register lookups; unit_of_measurement
+ self.ha_variables = ["action_topic", "action_template", "automation_type", "aux_command_topic", "aux_state_template", "aux_state_topic", "available_tones", "availability", "availability_mode", "availability_topic", "availability_template", "away_mode_command_topic", "away_mode_state_template", "away_mode_state_topic", "blue_template", "brightness_command_topic", "brightness_command_template", "brightness_scale", "brightness_state_topic", "brightness_template", "brightness_value_template", "color_temp_command_template", "battery_level_topic", "battery_level_template", "charging_topic", "charging_template", "color_temp_command_topic", "color_temp_state_topic", "color_temp_template", "color_temp_value_template", "color_mode", "color_mode_state_topic", "color_mode_value_template", "cleaning_topic", "cleaning_template", "command_off_template", "command_on_template", "command_topic", "command_template", "code_arm_required", "code_disarm_required", "code_trigger_required", "current_temperature_topic", "current_temperature_template", "device", "device_class", "docked_topic", "docked_template", "encoding", "enabled_by_default", "entity_category", "entity_picture", "error_topic", "error_template", "fan_speed_topic", "fan_speed_template", "fan_speed_list", "flash_time_long", "flash_time_short", "effect_command_topic", "effect_command_template", "effect_list", "effect_state_topic", "effect_template", "effect_value_template", "expire_after", "fan_mode_command_template", "fan_mode_command_topic", "fan_mode_state_template", "fan_mode_state_topic", "force_update", "green_template", "hold_command_template", "hold_command_topic", "hold_state_template", "hold_state_topic", "hs_command_topic", "hs_state_topic", "hs_value_template", "icon", "image_encoding", "initial", "target_humidity_command_topic", "target_humidity_command_template", "target_humidity_state_topic", "target_humidity_state_template", "json_attributes", "json_attributes_topic", "json_attributes_template", "latest_version_topic", "latest_version_template", "last_reset_topic", "last_reset_value_template", "max", "min", "max_mireds", "min_mireds", "max_temp", "min_temp", "max_humidity", "min_humidity", "mode", "mode_command_template", "mode_command_topic", "mode_state_template", "mode_state_topic", "modes", "name", "object_id", "off_delay", "on_command_type", "options", "optimistic", "oscillation_command_topic", "oscillation_command_template", "oscillation_state_topic", "oscillation_value_template", "percentage_command_topic", "percentage_command_template", "percentage_state_topic", "percentage_value_template", "pattern", "payload", "payload_arm_away", "payload_arm_home", "payload_arm_custom_bypass", "payload_arm_night", "payload_arm_vacation", "payload_press", "payload_reset", "payload_available", "payload_clean_spot", "payload_close", "payload_disarm", "payload_home", "payload_install", "payload_lock", "payload_locate", "payload_not_available", "payload_not_home", "payload_off", "payload_on", "payload_open", "payload_oscillation_off", "payload_oscillation_on", "payload_pause", "payload_stop", "payload_start", "payload_start_pause", "payload_return_to_base", "payload_reset_humidity", "payload_reset_mode", "payload_reset_percentage", "payload_reset_preset_mode", "payload_turn_off", "payload_turn_on", "payload_trigger", "payload_unlock", "position_closed", "position_open", "power_command_topic", "power_state_topic", "power_state_template", "preset_mode_command_topic", "preset_mode_command_template", "preset_mode_state_topic", "preset_mode_value_template", "preset_modes", "red_template", "release_summary", "release_url", "retain", "rgb_command_topic", "rgb_command_template", "rgb_state_topic", "rgb_value_template", "rgbw_command_topic", "rgbw_command_template", "rgbw_state_topic", "rgbw_value_template", "rgbww_command_topic", "rgbww_command_template", "rgbww_state_topic", "rgbww_value_template", "send_command_topic", "send_if_off", "set_fan_speed_topic", "set_position_template", "set_position_topic", "position_topic", "position_template", "speed_range_min", "speed_range_max", "source_type", "state_class", "state_closed", "state_closing", "state_off", "state_on", "state_open", "state_opening", "state_stopped", "state_locked", "state_unlocked", "state_topic", "state_template", "state_value_template", "step", "subtype", "supported_color_modes", "support_duration", "support_volume_set", "supported_features", "swing_mode_command_template", "swing_mode_command_topic", "swing_mode_state_template", "swing_mode_state_topic", "temperature_command_template", "temperature_command_topic", "temperature_high_command_template", "temperature_high_command_topic", "temperature_high_state_template", "temperature_high_state_topic", "temperature_low_command_template", "temperature_low_command_topic", "temperature_low_state_template", "temperature_low_state_topic", "temperature_state_template", "temperature_state_topic", "temperature_unit", "tilt_closed_value", "tilt_command_topic", "tilt_command_template", "tilt_invert_state", "tilt_max", "tilt_min", "tilt_opened_value", "tilt_optimistic", "tilt_status_topic", "tilt_status_template", "title", "topic", "unique_id", "value_template", "white_command_topic", "white_scale", "white_value_command_topic", "white_value_scale", "white_value_state_topic", "white_value_template", "xy_command_topic", "xy_state_topic", "xy_value_template"]
# Configure MQTT
def configure(self, config, inverter):
- model = inverter.getInverterModel(True)
+ self.model = inverter.getInverterModel(True)
+ self.serial_number = inverter.getSerialNumber()
+
self.mqtt_config = {
'host': config.get('host', None),
'port': config.get('port', 1883),
- 'client_id': config.get('client_id', f'SunGather-{model}'),
- 'topic': config.get('topic', f"inverter/{model}/registers"),
+ 'client_id': config.get('client_id', f'{self.serial_number}'),
+ 'topic': config.get('topic', f"SunGather/{self.serial_number}"),
'username': config.get('username', None),
'password': config.get('password',None),
'homeassistant': config.get('homeassistant',False)
@@ -80,35 +84,45 @@ class export_mqtt(object):
#elif self.mqtt_queue.__len__() > 10:
# logging.warning(f'MQTT: {self.mqtt_queue.__len__()} messages queued, this may be due to a MQTT server issue')
- logging.debug(f"MQTT: Publishing: {self.mqtt_config['topic']} : {json.dumps(inverter.latest_scrape)}")
- self.mqtt_queue.append(self.mqtt_client.publish(self.mqtt_config['topic'], json.dumps(inverter.latest_scrape).replace('"', '\"'), qos=0).mid)
- logging.info(f"MQTT: Published")
-
if self.mqtt_config['homeassistant'] and not self.ha_discovery_published:
+ # Build Device, this will be the same for every message
+ ha_device = { "name":f"Sungrow {self.model}", "manufacturer":"Sungrow", "model":self.model, "identifiers":self.serial_number, "via_device": "SunGather", "connections":[["address", inverter.getHost() ]]}
+
for ha_sensor in self.ha_sensors:
config_msg = {}
- if ha_sensor.get('name'):
- ha_topic = 'homeassistant/' + ha_sensor.get('sensor_type', 'sensor') + '/inverter/' + self.cleanName(ha_sensor.get('name')) + '/config'
- config_msg['name'] = "Inverter " + ha_sensor.get('name')
- config_msg['unique_id'] = "inverter_" + self.cleanName(ha_sensor.get('name'))
- config_msg['state_topic'] = self.mqtt_config['topic']
- config_msg['value_template'] = "{{ value_json." + ha_sensor.get('register') + " }}"
- if inverter.getRegisterUnit(ha_sensor.get('register')):
- config_msg['unit_of_measurement'] = inverter.getRegisterUnit(ha_sensor.get('register'))
- if ha_sensor.get('dev_class'):
- config_msg['device_class'] = ha_sensor.get('dev_class')
- if ha_sensor.get('state_class'):
- config_msg['state_class'] = ha_sensor.get('state_class')
- if ha_sensor.get('payload_on'):
- config_msg['payload_on'] = ha_sensor.get('payload_on')
- if ha_sensor.get('payload_off'):
- config_msg['payload_off'] = ha_sensor.get('payload_off')
- config_msg['ic'] = "mdi:solar-power"
- config_msg['device'] = { "name":"Solar Inverter", "mf":"Sungrow", "mdl":inverter.getInverterModel(), "connections":[["address", inverter.getHost() ]]}
+ if not (ha_sensor.get('name', False) and ha_sensor.get('sensor_type', False)):
+ logging.error(f"HomeAssistance Discovery requires at minimum; name, sensor_type")
+ break
+ # Set Defaults, these can be overridden below
+ config_msg['state_topic'] = self.mqtt_config['topic']
+ if ha_sensor.get('register', False):
+ config_msg['value_template'] = "{{ value_json." + ha_sensor.get('register') + " }}"
+
+ for ha_variable in self.ha_variables:
+ if ha_sensor.get(ha_variable):
+ config_msg[ha_variable] = ha_sensor[ha_variable]
+
+ # Set unique_id, include Serial so is unique
+ config_msg['unique_id'] = f"sungather_{self.cleanName(config_msg['name'])}_{self.serial_number}"
+
+ # Variables with links to registers
+ if ha_sensor.get('register', False):
+ if inverter.getRegisterUnit(ha_sensor.get('register')):
+ config_msg['unit_of_measurement'] = inverter.getRegisterUnit(ha_sensor.get('register'))
+
+ config_msg['device'] = ha_device
+
+ # ///config
+ ha_topic = f"homeassistant/{ha_sensor.get('sensor_type')}/{self.serial_number}_{self.cleanName(ha_sensor.get('name'))}/config"
logging.debug(f'MQTT: Topic; {ha_topic}, Message: {config_msg}')
self.mqtt_queue.append(self.mqtt_client.publish(ha_topic, json.dumps(config_msg), retain=True, qos=1).mid)
self.ha_discovery_published = True
logging.info("MQTT: Published Home Assistant Discovery messages")
+ payload = json.dumps(inverter.inverter_config | inverter.client_config | inverter.latest_scrape).replace('"', '\"')
+ logging.debug(f"MQTT: Publishing Registers: {self.mqtt_config['topic']} : {payload}")
+ self.mqtt_queue.append(self.mqtt_client.publish(self.mqtt_config['topic'], payload, qos=0).mid)
+ logging.info(f"MQTT: Registers Published")
+
return True
diff --git a/SunGather/exports/webserver.py b/SunGather/exports/webserver.py
index 3200918..f4f7778 100644
--- a/SunGather/exports/webserver.py
+++ b/SunGather/exports/webserver.py
@@ -25,7 +25,10 @@ class export_webserver(object):
return True
def publish(self, inverter):
- body = "Sungather v" + __version__ + "
| Address | | Register | Value |
"
+ body = "SunGather v" + __version__ + "
"
+ body += "Need Help? https://github.com/bohdan-s/SunGather
"
+ body += "NEW HomeAssistant Add-on: https://github.com/bohdan-s/SunGather
"
+ body += "| Address | | Register | Value |
"
metrics = ""
for register, value in inverter.latest_scrape.items():
body += f"| {str(inverter.getRegisterAddress(register))} | {str(register)} | {str(value)} {str(inverter.getRegisterUnit(register))} |
"
@@ -53,7 +56,10 @@ class MyServer(BaseHTTPRequestHandler):
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
- self.wfile.write(bytes("SunGather", "utf-8"))
+ self.wfile.write(bytes("SunGather", "utf-8"))
+ self.wfile.write(bytes("", "utf-8"))
+ self.wfile.write(bytes('', "utf-8"))
+ self.wfile.write(bytes("", "utf-8"))
self.wfile.write(bytes("", "utf-8"))
self.wfile.write(bytes(export_webserver.html_body, "utf-8"))
self.wfile.write(bytes("
", "utf-8"))
diff --git a/SunGather/sungather.py b/SunGather/sungather.py
index f84a3e4..462237e 100644
--- a/SunGather/sungather.py
+++ b/SunGather/sungather.py
@@ -25,19 +25,29 @@ class SungrowInverter():
"RetryOnEmpty": False,
}
self.inverter_config = {
- "slave": config_inverter.get('slave'),
"model": config_inverter.get('model'),
- "serial": config_inverter.get('serial'),
+ "serial_number": config_inverter.get('serial_number'),
"level": config_inverter.get('level'),
+ "scan_interval": config_inverter.get('scan_interval'),
"use_local_time": config_inverter.get('use_local_time'),
"smart_meter": config_inverter.get('smart_meter'),
- "connection": config_inverter.get('connection')
+ "connection": config_inverter.get('connection'),
+ "slave": config_inverter.get('slave'),
+ "start_time": ""
}
self.client = None
self.registers = [[]]
self.registers.pop() # Remove null value from list
- self.registers_custom = [{'name': 'export_to_grid', 'unit': 'W', 'address': 'vr001'}, {'name': 'import_from_grid', 'unit': 'W', 'address': 'vr002'}, {'name': 'run_state', 'address': 'vr003'}, {'name': 'timestamp', 'address': 'vr004'}]
+ self.registers_custom = [ {'name': 'run_state', 'address': 'vr001'},
+ {'name': 'timestamp', 'address': 'vr002'},
+ {'name': 'last_reset', 'address': 'vr003'},
+ {'name': 'export_to_grid', 'unit': 'W', 'address': 'vr004'},
+ {'name': 'import_from_grid', 'unit': 'W', 'address': 'vr005'},
+ {'name': 'daily_export_to_grid', 'unit': 'kWh', 'address': 'vr006'},
+ {'name': 'daily_import_from_grid', 'unit': 'kWh', 'address': 'vr007'}
+ ]
+
self.register_ranges = [[]]
self.register_ranges.pop() # Remove null value from list
@@ -330,12 +340,19 @@ class SungrowInverter():
def scrape(self):
scrape_start = datetime.now()
- # Clear previous inverter values, keep the model and run state
- if self.latest_scrape.get("run_state"): run_state = self.latest_scrape.get("run_state")
- else: run_state = "ON"
+ # Clear previous inverter values, persist some values
+ persist_registers = {
+ "run_state": self.latest_scrape.get("run_state","ON"),
+ "last_reset": self.latest_scrape.get("last_reset",""),
+ "daily_export_to_grid": self.latest_scrape.get("daily_export_to_grid",0),
+ "daily_import_from_grid": self.latest_scrape.get("daily_import_from_grid",0),
+ }
+
self.latest_scrape = {}
self.latest_scrape['device_type_code'] = self.inverter_config['model']
- self.latest_scrape["run_state"] = run_state
+
+ for register, value in persist_registers.items():
+ self.latest_scrape[register] = value
load_registers_count = 0
load_registers_failed = 0
@@ -347,7 +364,7 @@ class SungrowInverter():
load_registers_failed +=1
if load_registers_failed == load_registers_count:
# If every scrape fails, disconnect the client
- logging.warning
+ #logging.warning
self.disconnect()
return False
if load_registers_failed > 0:
@@ -356,52 +373,7 @@ class SungrowInverter():
# Leave connection open, see if helps resolve the connection issues
#self.close()
- # Create a registers for Power imported and exported to/from Grid
- if self.inverter_config['level'] >= 1:
- self.latest_scrape["export_to_grid"] = 0
- self.latest_scrape["import_from_grid"] = 0
-
- if self.validateRegister('meter_power'):
- try:
- power = self.latest_scrape.get('meter_power', self.latest_scrape.get('export_power', 0))
- if power < 0:
- self.latest_scrape["export_to_grid"] = abs(power)
- elif power >= 0:
- self.latest_scrape["import_from_grid"] = power
- except Exception:
- pass
- # in this case we connected to a hybrid inverter and need to use export_power_hybrid
- # export_power_hybrid is negative in case of importing from the grid
- elif self.validateRegister('export_power_hybrid'):
- try:
- power = self.latest_scrape.get('export_power_hybrid', 0)
- if power < 0:
- self.latest_scrape["import_from_grid"] = abs(power)
- elif power >= 0:
- self.latest_scrape["export_to_grid"] = power
- except Exception:
- pass
-
- try: # If inverter is returning no data for load_power, we can calculate it manually
- if not self.latest_scrape["load_power"]:
- self.latest_scrape["load_power"] = int(self.latest_scrape.get('total_active_power')) + int(self.latest_scrape.get('meter_power'))
- except Exception:
- pass
-
- # See if the inverter is running, This is added to inverters so can be read via MQTT etc...
- # It is also used below, as some registers hold the last value on 'stop' so we need to set to 0
- # to help with graphing.
- try:
- if self.latest_scrape.get('start_stop'):
- if self.latest_scrape.get('start_stop', False) == 'Start' and self.latest_scrape.get('work_state_1', False).contains('Run'):
- self.latest_scrape["run_state"] = "ON"
- else:
- self.latest_scrape["run_state"] = "OFF"
- else:
- self.latest_scrape["run_state"] = "OFF"
- except Exception:
- pass
-
+ ## vr002
if self.inverter_config.get('use_local_time',False):
self.latest_scrape["timestamp"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
logging.debug(f'Using Local Computer Time: {self.latest_scrape.get("timestamp")}')
@@ -451,6 +423,85 @@ class SungrowInverter():
except Exception:
pass
+ ### Custom Registers
+ ######################
+
+ ## vr001 - run_state
+ # See if the inverter is running, This is added to inverters so can be read via MQTT etc...
+ # It is also used below, as some registers hold the last value on 'stop' so we need to set to 0
+ # to help with graphing.
+ try:
+ if self.latest_scrape.get('start_stop'):
+ logging.info(f"DEBUG: start_stop:{self.latest_scrape.get('start_stop', 'null')} work_state_1:{self.latest_scrape.get('work_state_1', 'null')}")
+ if self.latest_scrape.get('start_stop', False) == 'Start' and self.latest_scrape.get('work_state_1', False).contains('Run'):
+ self.latest_scrape["run_state"] = "ON"
+ else:
+ self.latest_scrape["run_state"] = "OFF"
+ else:
+ logging.info(f"DEBUG: Couldn't read start_stop so run_state is OFF")
+ self.latest_scrape["run_state"] = "OFF"
+ except Exception:
+ pass
+
+ ## vr003 - last_reset
+ date_format = "%Y-%m-%d %H:%M:%S"
+ if not self.latest_scrape.get('last_reset', False):
+ logging.info('Setting Initial Daily registers; daily_export_to_grid, daily_import_from_grid, last_reset')
+ self.latest_scrape["daily_export_to_grid"] = 0
+ self.latest_scrape["daily_import_from_grid"] = 0
+ self.latest_scrape['last_reset'] = self.latest_scrape["timestamp"]
+ elif datetime.strptime(self.latest_scrape['last_reset'], date_format).date() < datetime.strptime(self.latest_scrape['timestamp'], date_format).date():
+ logging.info('last_reset: ' + self.latest_scrape['last_reset'] + ', timestamp: ' + self.latest_scrape['timestamp'])
+ logging.info('Resetting Daily registers; daily_export_to_grid, daily_import_from_grid, last_reset')
+ self.latest_scrape["daily_export_to_grid"] = 0
+ self.latest_scrape["daily_import_from_grid"] = 0
+ self.latest_scrape['last_reset'] = self.latest_scrape["timestamp"]
+
+ ## vr004 - import_from_grid, vr005 - export_to_grid
+ # Create a registers for Power imported and exported to/from Grid
+ if self.inverter_config['level'] >= 1:
+ self.latest_scrape["export_to_grid"] = 0
+ self.latest_scrape["import_from_grid"] = 0
+
+ if self.validateRegister('meter_power'):
+ try:
+ power = self.latest_scrape.get('meter_power', self.latest_scrape.get('export_power', 0))
+ if power < 0:
+ self.latest_scrape["export_to_grid"] = abs(power)
+ elif power >= 0:
+ self.latest_scrape["import_from_grid"] = power
+ except Exception:
+ pass
+ # in this case we connected to a hybrid inverter and need to use export_power_hybrid
+ # export_power_hybrid is negative in case of importing from the grid
+ elif self.validateRegister('export_power_hybrid'):
+ try:
+ power = self.latest_scrape.get('export_power_hybrid', 0)
+ if power < 0:
+ self.latest_scrape["import_from_grid"] = abs(power)
+ elif power >= 0:
+ self.latest_scrape["export_to_grid"] = power
+ except Exception:
+ pass
+
+ try: # If inverter is returning no data for load_power, we can calculate it manually
+ if not self.latest_scrape["load_power"]:
+ self.latest_scrape["load_power"] = int(self.latest_scrape.get('total_active_power')) + int(self.latest_scrape.get('meter_power'))
+ except Exception:
+ pass
+
+ ## vr004, vr005
+ if not self.latest_scrape.get('daily_export_to_grid', False):
+ self.latest_scrape["daily_export_to_grid"] = 0
+
+ self.latest_scrape["daily_export_to_grid"] += ((self.latest_scrape["export_to_grid"] / 1000) * (self.inverter_config['scan_interval'] / 60 / 60) )
+
+ ## vr005
+ if not self.latest_scrape.get('daily_import_from_grid', False):
+ self.latest_scrape["daily_import_from_grid"] = 0
+
+ self.latest_scrape["daily_import_from_grid"] += ((self.latest_scrape["import_from_grid"] / 1000) * (self.inverter_config['scan_interval'] / 60 / 60) )
+
scrape_end = datetime.now()
logging.info(f'Inverter: Successfully scraped in {(scrape_end - scrape_start).seconds}.{(scrape_end - scrape_start).microseconds} secs')
@@ -502,6 +553,8 @@ def main():
runonce = True
logging.info(f'Starting SunGather {__version__}')
+ logging.info(f'Need Help? https://github.com/bohdan-s/SunGather')
+ logging.info(f'NEW HomeAssistant Add-on: https://github.com/bohdan-s/hassio-repository')
try:
configfile = yaml.safe_load(open(configfilename, encoding="utf-8"))
diff --git a/SunGather/version.py b/SunGather/version.py
index efc7796..222c11c 100644
--- a/SunGather/version.py
+++ b/SunGather/version.py
@@ -1 +1 @@
-__version__ = '0.3.9'
\ No newline at end of file
+__version__ = '0.4.0'
\ No newline at end of file
diff --git a/img/HomeAssistant-SunGrow_Device.png b/img/HomeAssistant-SunGrow_Device.png
new file mode 100644
index 0000000000000000000000000000000000000000..6c4bd3040ba0eef85b8bb4eee12505145fa0473c
GIT binary patch
literal 362219
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