Skip to content

Commit

Permalink
added option to ignore system state for charge values
Browse files Browse the repository at this point in the history
  • Loading branch information
marq24 committed Dec 13, 2023
1 parent b713ac2 commit 9f3fc77
Show file tree
Hide file tree
Showing 8 changed files with 40 additions and 19 deletions.
11 changes: 9 additions & 2 deletions custom_components/senec/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
CONF_SYSTYPE_INVERTER,
CONF_SYSTYPE_WEB,
CONF_DEV_MASTER_NUM,
CONF_IGNORE_SYSTEM_STATUS,

MAIN_SENSOR_TYPES,
MAIN_BIN_SENSOR_TYPES,
Expand All @@ -60,6 +61,7 @@
QUERY_WALLBOX_KEY,
QUERY_SPARE_CAPACITY_KEY,
QUERY_PEAK_SHAVING_KEY,
IGNORE_SYSTEM_STATUS_KEY,

SERVICE_SET_PEAKSHAVING,
)
Expand Down Expand Up @@ -204,9 +206,14 @@ def __init__(self, hass: HomeAssistant, config_entry):
else:
self._use_https = False

opt = {
IGNORE_SYSTEM_STATUS_KEY: config_entry.options.get(CONF_IGNORE_SYSTEM_STATUS, False),
QUERY_WALLBOX_KEY: False,
QUERY_BMS_KEY: False,
QUERY_FANDATA_KEY: False
}
# check if any of the wallbox-sensors is enabled... and only THEN
# we will include the 'WALLBOX' in our POST to the lala.cgi
opt = {QUERY_WALLBOX_KEY: False, QUERY_BMS_KEY: False, QUERY_FANDATA_KEY: False}
if hass is not None and config_entry.title is not None:
registry = entity_registry.async_get(hass)
if registry is not None:
Expand Down Expand Up @@ -250,7 +257,7 @@ def __init__(self, hass: HomeAssistant, config_entry):
_LOGGER.info("***** QUERY_FANSPEED-DATA ********")
opt[QUERY_FANDATA_KEY] = True

self.senec = Senec(host=self._host, use_https=self._use_https, websession=async_get_clientsession(hass),
self.senec = Senec(host=self._host, use_https=self._use_https, web_session=async_get_clientsession(hass),
lang=hass.config.language.lower(), options=opt)

self.name = config_entry.title
Expand Down
6 changes: 5 additions & 1 deletion custom_components/senec/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
CONF_SYSTYPE_INVERTER,
CONF_SYSTYPE_WEB,
CONF_DEV_MASTER_NUM,
CONF_IGNORE_SYSTEM_STATUS,
)

_LOGGER = logging.getLogger(__name__)
Expand Down Expand Up @@ -113,7 +114,7 @@ async def _test_connection_senec(self, host, use_https):
self._errors = {}
web_session = self.hass.helpers.aiohttp_client.async_get_clientsession()
try:
senec_client = Senec(host=host, use_https=use_https, websession=web_session)
senec_client = Senec(host=host, use_https=use_https, web_session=web_session)
await senec_client.update_version()
self._use_https = use_https
self._device_type_internal = senec_client.device_type_internal
Expand Down Expand Up @@ -485,6 +486,9 @@ async def async_step_system(self, user_input=None):
vol.Required(
CONF_SCAN_INTERVAL, default=self.options.get(CONF_SCAN_INTERVAL, self.data.get(CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL)),
): int, # pylint: disable=line-too-long
vol.Required(
CONF_IGNORE_SYSTEM_STATUS, default=self.options.get(CONF_IGNORE_SYSTEM_STATUS, self.data.get(CONF_IGNORE_SYSTEM_STATUS, False)),
): bool, # pylint: disable=line-too-long
}
)
return self.async_show_form(
Expand Down
2 changes: 2 additions & 0 deletions custom_components/senec/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
CONF_USE_HTTPS: Final = "use_https"
CONF_SUPPORT_BDC: Final = "has_bdc_support"
CONF_DEV_MASTER_NUM: Final = "master_plant_number"
CONF_IGNORE_SYSTEM_STATUS: Final = "ignore_system_status"

CONF_DEV_TYPE: Final = "dtype"
CONF_DEV_MODEL: Final = "dname"
Expand Down Expand Up @@ -95,6 +96,7 @@
QUERY_WALLBOX_KEY = "query_wallbox_data"
QUERY_SPARE_CAPACITY_KEY = "query_spare_capacity"
QUERY_PEAK_SHAVING_KEY = "query_peak_shaving"
IGNORE_SYSTEM_STATUS_KEY = CONF_IGNORE_SYSTEM_STATUS

# Peak Shaving Options
PEAK_SHAVING_OPTIONS = ["deactivated", "manual", "auto"]
Expand Down
24 changes: 15 additions & 9 deletions custom_components/senec/pysenec_ha/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@

# required to patch the CookieJar of aiohttp - thanks for nothing!
import contextlib
from aiohttp.abc import ClearCookiePredicate
from http.cookies import BaseCookie, SimpleCookie, Morsel
from aiohttp import ClientResponseError, ClientConnectorError
from aiohttp.helpers import is_ip_address
Expand All @@ -26,6 +25,7 @@
QUERY_WALLBOX_KEY,
QUERY_SPARE_CAPACITY_KEY,
QUERY_PEAK_SHAVING_KEY,
IGNORE_SYSTEM_STATUS_KEY,
)

from custom_components.senec.pysenec_ha.util import parse
Expand Down Expand Up @@ -60,15 +60,15 @@
# 14: "CHARGE",
# 43: "CAPACITY TEST: CHARGE",
# 71: "OFFPEAK-CHARGE",
BAT_STATUS_CHARGE = {4, 5, 8, 10, 11, 12, 14, 23, 24, 25, 33, 43, 71}
SYSTEM_STATUS_CHARGE = {4, 5, 8, 10, 11, 12, 14, 23, 24, 25, 33, 43, 71}

# 16: "DISCHARGE",
# 17: "PV + DISCHARGE",
# 18: "GRID + DISCHARGE"
# 21: "OWN CONSUMPTION"
# 44: "CAPACITY TEST: DISCHARGE",
# 97: "SAFETY DISCHARGE",
BAT_STATUS_DISCHARGE = {16, 17, 18, 21, 29, 44, 97}
SYSTEM_STATUS_DISCHARGE = {16, 17, 18, 21, 29, 44, 97}

_LOGGER = logging.getLogger(__name__)

Expand All @@ -95,6 +95,12 @@ def __init__(self, host, use_https, web_session, lang: str = "en", options: dict
else:
self._QUERY_FANDATA = False

if options is not None and IGNORE_SYSTEM_STATUS_KEY in options:
self._IGNORE_SYSTEM_STATUS = options[IGNORE_SYSTEM_STATUS_KEY]
else:
self._IGNORE_SYSTEM_STATUS = False


self.host = host
self.web_session: aiohttp.websession = web_session

Expand Down Expand Up @@ -243,7 +249,7 @@ def battery_charge_power(self) -> float:
"""
value = self._raw[SENEC_SECTION_ENERGY]["GUI_BAT_DATA_POWER"]
if value > 0:
if self.is_battery_state_charging():
if self._IGNORE_SYSTEM_STATUS or self.is_system_state_charging():
return value
return 0

Expand All @@ -254,7 +260,7 @@ def battery_discharge_power(self) -> float:
"""
value = self._raw[SENEC_SECTION_ENERGY]["GUI_BAT_DATA_POWER"]
if value < 0:
if self.is_battery_state_discharging():
if self._IGNORE_SYSTEM_STATUS or self.is_system_state_discharging():
return abs(value)
return 0

Expand Down Expand Up @@ -493,11 +499,11 @@ def is_battery_empty(self) -> bool:
bat_percent_is_zero = self._raw[SENEC_SECTION_ENERGY]["GUI_BAT_DATA_FUEL_CHARGE"] == 0
return bat_state_is_empty or bat_percent_is_zero

def is_battery_state_charging(self) -> bool:
return self._raw[SENEC_SECTION_ENERGY]["STAT_STATE"] in BAT_STATUS_CHARGE
def is_system_state_charging(self) -> bool:
return self._raw[SENEC_SECTION_ENERGY]["STAT_STATE"] in SYSTEM_STATUS_CHARGE

def is_battery_state_discharging(self) -> bool:
return self._raw[SENEC_SECTION_ENERGY]["STAT_STATE"] in BAT_STATUS_DISCHARGE
def is_system_state_discharging(self) -> bool:
return self._raw[SENEC_SECTION_ENERGY]["STAT_STATE"] in SYSTEM_STATUS_DISCHARGE

@property
def bms_cell_temp_a1(self) -> float:
Expand Down
3 changes: 2 additions & 1 deletion custom_components/senec/translations/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@
"data": {
"name": "Anzeige Name",
"host": "IP oder Hostname des SENEC.Home V3 Systems bzw des Inverters",
"scan_interval": "Aktualisierungsintervall in Sekunden"
"scan_interval": "Aktualisierungsintervall in Sekunden",
"ignore_system_status": "Die Werte für die Batterie-LADE/ENTLADE Sensoren sollen den System Status nicht berücksichtigen"
}
},
"websetup": {
Expand Down
3 changes: 2 additions & 1 deletion custom_components/senec/translations/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@
"data": {
"name": "Display name",
"host": "IP or hostname of the SENEC.Home V3 System OR the Inverter",
"scan_interval": "Polling Interval in seconds"
"scan_interval": "Polling Interval in seconds",
"ignore_system_status": "The values for the battery charge/discharge sensors should not take the system status into account"
}
},
"websetup": {
Expand Down
5 changes: 0 additions & 5 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
colorlog==6.8.0
homeassistant>=2023.6.0
pip>=23.2.1
ruff==0.1.7
# https://github.com/home-assistant/core/issues/95192
urllib3>=1.26.5,<2
xmltodict>=0.12.0
packaging>=21.0
5 changes: 5 additions & 0 deletions requirements_dev.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
colorlog==6.8.0
pip>=23.2.1
ruff==0.1.7
# https://github.com/home-assistant/core/issues/95192
urllib3>=1.26.5,<2

0 comments on commit 9f3fc77

Please sign in to comment.