Skip to content

Commit

Permalink
Merge pull request #19 from Pho3niX90/feature/issue_18
Browse files Browse the repository at this point in the history
Feature/issue 18
  • Loading branch information
Pho3niX90 authored Dec 12, 2023
2 parents f9573c4 + ec87c8f commit 57e57c1
Show file tree
Hide file tree
Showing 9 changed files with 443 additions and 37 deletions.
159 changes: 129 additions & 30 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ To install the Solis Modbus Integration, follow these steps:
## Total Sensors
Whilst the solis inverters do provide total sensors for today, yesterday, month and year. I highly suggest to create a utility meter in HA, as a time difference between HA and Solis might have the values reset before midnight, causing issues in charts.

## Manual Installtion
## Manual Installation
1. Copy the "solis_modbus" folder into your "custom_components" folder

## Setup
Expand All @@ -32,7 +32,7 @@ Whilst the solis inverters do provide total sensors for today, yesterday, month
3. Search for "Solis Modbus"
4. Add in the IP of your inverter in the first box, and port in the second.

# sunsynk solar card setup:
# [sunsynk solar card setup](https://github.com/slipx06/sunsynk-power-flow-card):
![img_3.png](img_3.png)
```yaml
type: custom:sunsynk-power-flow-card
Expand Down Expand Up @@ -80,37 +80,136 @@ grid:
max_power: 6000
invert_grid: true
entities:
dc_transformer_temp_90: sensor.solis_inverter_temperature
day_battery_charge_70: sensor.solis_inverter_today_battery_charge_energy
day_battery_discharge_71: sensor.solis_inverter_today_battery_discharge_energy
day_load_energy_84: sensor.solis_inverter_today_energy_consumption
day_grid_import_76: sensor.solis_inverter_today_energy_imported_from_grid
day_grid_export_77: sensor.solis_inverter_today_energy_fed_into_grid
day_pv_energy_108: sensor.solis_inverter_pv_today_energy_generation
inverter_voltage_154: sensor.solis_inverter_a_phase_voltage
load_frequency_192: sensor.solis_inverter_grid_frequency
inverter_current_164: sensor.solis_inverter_a_phase_current
inverter_power_175: sensor.solis_inverter_backup_load_power
grid_power_169: sensor.solis_inverter_ac_grid_port_power
battery_voltage_183: sensor.solis_inverter_battery_voltage
battery_soc_184: sensor.solis_inverter_battery_soc
battery_power_190: sensor.solis_inverter_battery_power
battery_current_191: sensor.solis_inverter_battery_current
essential_power: sensor.solis_inverter_backup_load_power
grid_ct_power_172: sensor.solis_inverter_meter_total_active_power
pv1_voltage_109: sensor.solis_inverter_dc_voltage_1
pv1_current_110: sensor.solis_inverter_dc_current_1
pv1_power_186: sensor.solis_inverter_dc_power_1
pv2_power_187: sensor.solis_inverter_dc_power_2
pv_total: sensor.solis_inverter_total_dc_output
pv2_voltage_111: sensor.solis_inverter_dc_voltage_2
pv2_current_112: sensor.solis_inverter_dc_voltage_2
grid_voltage: sensor.solis_inverter_a_phase_voltage
battery_current_direction: sensor.solis_inverter_battery_current_direction
inverter_status_59: sensor.solis_inverter_current_status
dc_transformer_temp_90: sensor.solis_temperature
day_battery_charge_70: sensor.solis_today_battery_charge_energy
day_battery_discharge_71: sensor.solis_today_battery_discharge_energy
day_load_energy_84: sensor.solis_today_energy_consumption
day_grid_import_76: sensor.solis_today_energy_imported_from_grid
day_grid_export_77: sensor.solis_today_energy_fed_into_grid
day_pv_energy_108: sensor.solis_pv_today_energy_generation
inverter_voltage_154: sensor.solis_a_phase_voltage
load_frequency_192: sensor.solis_grid_frequency
inverter_current_164: sensor.solis_a_phase_current
inverter_power_175: sensor.solis_backup_load_power
grid_power_169: sensor.solis_ac_grid_port_power
battery_voltage_183: sensor.solis_battery_voltage
battery_soc_184: sensor.solis_battery_soc
battery_power_190: sensor.solis_battery_power
battery_current_191: sensor.solis_battery_current
essential_power: sensor.solis_backup_load_power
grid_ct_power_172: sensor.solis_meter_total_active_power
pv1_voltage_109: sensor.solis_dc_voltage_1
pv1_current_110: sensor.solis_dc_current_1
pv1_power_186: sensor.solis_dc_power_1
pv2_power_187: sensor.solis_dc_power_2
pv_total: sensor.solis_total_dc_output
pv2_voltage_111: sensor.solis_dc_voltage_2
pv2_current_112: sensor.solis_dc_voltage_2
grid_voltage: sensor.solis_a_phase_voltage
battery_current_direction: sensor.solis_battery_current_direction
inverter_status_59: sensor.solis_current_status
remaining_solar: sensor.solcast_pv_forecast_forecast_remaining_today
```
## Settings Card Example
![img_4.png](img_4.png)
```yaml
type: vertical-stack
cards:
- type: horizontal-stack
cards:
- type: entities
entities:
- entity: number.solis_time_charging_charge_current
name: Charge Current
state_color: true
- type: horizontal-stack
cards:
- type: entities
entities:
- entity: number.solis_time_charging_discharge_current
name: Discharge Current
state_color: true
- type: entities
entities:
- entity: switch.solis_time_of_use_mode
type: custom:multiple-entity-row
name: Charge Slot 1
toggle: true
state_header: TOU
state_color: true
icon: mdi:timer
entities:
- entity: time.solis_time_charging_charge_start_slot_1
name: Charge From
- entity: time.solis_time_charging_charge_end_slot_1
name: Charge To
- entity: switch.solis_time_of_use_mode
type: custom:multiple-entity-row
name: Discharge Slot 1
toggle: true
state_header: TOU
state_color: true
icon: mdi:timer
entities:
- entity: time.solis_time_charging_discharge_start_slot_1
name: Charge From
- entity: time.solis_time_charging_discharge_end_slot_1
name: Charge To
- entity: switch.solis_time_of_use_mode
type: custom:multiple-entity-row
name: Charge Slot 2
toggle: true
state_header: TOU
state_color: true
icon: mdi:timer
entities:
- entity: time.solis_time_charging_charge_start_slot_2
name: Charge From
- entity: time.solis_time_charging_charge_end_slot_2
name: Charge To
- entity: switch.solis_time_of_use_mode
type: custom:multiple-entity-row
name: Discharge Slot 2
toggle: true
state_header: TOU
state_color: true
icon: mdi:timer
entities:
- entity: time.solis_time_charging_discharge_start_slot_2
name: Charge From
- entity: time.solis_time_charging_discharge_end_slot_2
name: Charge To
- entity: switch.solis_time_of_use_mode
type: custom:multiple-entity-row
name: Charge Slot 3
toggle: true
state_header: TOU
state_color: true
icon: mdi:timer
entities:
- entity: time.solis_time_charging_charge_start_slot_3
name: Charge From
- entity: time.solis_time_charging_charge_end_slot_3
name: Charge To
- entity: switch.solis_time_of_use_mode
type: custom:multiple-entity-row
name: Discharge Slot 3
toggle: true
state_header: TOU
state_color: true
icon: mdi:timer
entities:
- entity: time.solis_time_charging_discharge_start_slot_3
name: Charge From
- entity: time.solis_time_charging_discharge_end_slot_3
name: Charge To
state_color: true
view_layout:
grid-area: a
```
Card inspiration from https://github.com/slipx06/Sunsynk-Home-Assistant-Dash
## Tested
**Inverters Tested**
- Solis S6 Pro 6kW Advanced Hybrid Inverter
Expand Down
2 changes: 1 addition & 1 deletion custom_components/solis_modbus/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

_LOGGER = logging.getLogger(__name__)

PLATFORMS = [Platform.SENSOR, Platform.NUMBER, Platform.SWITCH]
PLATFORMS = [Platform.SENSOR, Platform.NUMBER, Platform.SWITCH, Platform.TIME]

SCHEME_HOLDING_REGISTER = vol.Schema(
{
Expand Down
2 changes: 1 addition & 1 deletion custom_components/solis_modbus/const.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
DOMAIN = "solis_modbus"
CONTROLLER = "modbus_controller"
VERSION = "1.1.0"
VERSION = "1.2.0"
POLL_INTERVAL_SECONDS = 5
MANUFACTURER = "Solis"
MODEL = "S6"
2 changes: 1 addition & 1 deletion custom_components/solis_modbus/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@
"issue_tracker": "https://github.com/Pho3niX90/solis_modbus/issues",
"quality_scale": "silver",
"requirements": ["pymodbus==3.5.4"],
"version": "1.1.0"
"version": "1.2.0"
}
9 changes: 9 additions & 0 deletions custom_components/solis_modbus/modbus_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,15 @@ def write_holding_register(self, register: int, value):
except ModbusIOException as e:
raise ValueError(f"Failed to write Modbus register: {str(e)}")

def write_holding_registers(self, start_register: int, values: list[int]):
try:
result = self.client.write_registers(start_register, values, slave=1)
if result.isError():
raise ValueError(f"Failed to write Modbus holding registers ({start_register}), values = {values}: {result}")
return result
except ModbusIOException as e:
raise ValueError(f"Failed to write Modbus registers: {str(e)}")

def close_connection(self):
self.client.close()

Expand Down
5 changes: 2 additions & 3 deletions custom_components/solis_modbus/number.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@
from homeassistant.components.sensor import SensorDeviceClass
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
UnitOfElectricCurrent, PERCENTAGE, UnitOfPower,
)
UnitOfElectricCurrent, PERCENTAGE, UnitOfPower, )
from homeassistant.core import callback
from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.event import async_track_time_interval
Expand Down Expand Up @@ -69,7 +68,7 @@ async def async_setup_entry(hass, config_entry: ConfigEntry, async_add_devices):
{"type": "SNE", "name": "Solis Force Charge SOC", "register": 43018,
"default": 10, "multiplier": 1,
"min_val": 0, "max_val": 100, "step": 1,
"unit_of_measurement": PERCENTAGE, "enabled": True}
"unit_of_measurement": PERCENTAGE, "enabled": True},
]

for entity_definition in numbers:
Expand Down
Loading

0 comments on commit 57e57c1

Please sign in to comment.