From 2c2822bceab7e3cc3c62e421492a2f4ef9b88275 Mon Sep 17 00:00:00 2001 From: niltrip Date: Thu, 22 Aug 2024 23:28:18 +0200 Subject: [PATCH 1/9] fix issue url --- custom_components/powerocean/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom_components/powerocean/const.py b/custom_components/powerocean/const.py index 708b90b..beffad1 100644 --- a/custom_components/powerocean/const.py +++ b/custom_components/powerocean/const.py @@ -6,7 +6,7 @@ from homeassistant.const import Platform DOMAIN = "powerocean" # Have requested to add logos via https://github.com/home-assistant/brands/pull/4904 NAME = "Ecoflow PowerOcean" VERSION = "2024.01.01" -ISSUE_URL = "https://github.com/evercape/powerocean/issues" +ISSUE_URL = "https://github.com/niltrip/powerocean/issues" ISSUE_URL_ERROR_MESSAGE = " Please log any issues here: " + ISSUE_URL From 3d657ce51241876f0ed92276d9e4fa5484ebecf6 Mon Sep 17 00:00:00 2001 From: niltrip Date: Thu, 22 Aug 2024 23:29:56 +0200 Subject: [PATCH 2/9] feature special icons disable some debug messages --- custom_components/powerocean/ecoflow.py | 25 ++++++++-- custom_components/powerocean/sensor.py | 61 +++++++++++++------------ 2 files changed, 55 insertions(+), 31 deletions(-) diff --git a/custom_components/powerocean/ecoflow.py b/custom_components/powerocean/ecoflow.py index 04d4517..5e54096 100644 --- a/custom_components/powerocean/ecoflow.py +++ b/custom_components/powerocean/ecoflow.py @@ -15,7 +15,7 @@ from .const import _LOGGER, ISSUE_URL_ERROR_MESSAGE # Better storage of PowerOcean endpoint PowerOceanEndPoint = namedtuple( "PowerOceanEndPoint", - "internal_unique_id, serial, name, friendly_name, value, unit, description", + "internal_unique_id, serial, name, friendly_name, value, unit, description, icon", ) @@ -43,7 +43,7 @@ class Ecoflow: "vendor": "Ecoflow", "serial": self.sn, "version": "5.1.15", # TODO: woher bekommt man diese Info? - "build": "13", # TODO: wo finde ich das? + "build": "6", # TODO: wo finde ich das? "name": "PowerOcean", "features": "Photovoltaik", } @@ -120,7 +120,6 @@ class Ecoflow: response = self.get_json_response(request) _LOGGER.debug(f"{response}") - _LOGGER.debug(f"{response['data']}") return self._get_sensors(response) @@ -233,6 +232,9 @@ class Ecoflow: if not isinstance(value, dict): # default uid, unit and descript unique_id = f"{self.sn}_{key}" + special_icon = None + if key == "mpptPwr": + special_icon = "mdi:solar-power" sensors[unique_id] = PowerOceanEndPoint( internal_unique_id=unique_id, @@ -242,6 +244,7 @@ class Ecoflow: value=value, unit=self.__get_unit(key), description=self.__get_description(key), + icon=special_icon, ) return sensors @@ -270,6 +273,7 @@ class Ecoflow: # value=value, # unit=self.__get_unit(key), # description=self.__get_description(key), + # icon=None, # ) # dict.update(sensors, data) # @@ -307,6 +311,7 @@ class Ecoflow: value=value, unit=self.__get_unit(key), description=self.__get_description(key), + icon=None, ) dict.update(sensors, data) @@ -340,6 +345,9 @@ class Ecoflow: # default uid, unit and descript unique_id = f"{self.sn}_{report}_{bat}_{key}" description_tmp = f"{name}" + self.__get_description(key) + special_icon = None + if key == "bpAmp": + special_icon = "mdi:current-dc" data[unique_id] = PowerOceanEndPoint( internal_unique_id=unique_id, serial=self.sn, @@ -348,6 +356,7 @@ class Ecoflow: value=value, unit=self.__get_unit(key), description=description_tmp, + icon=special_icon, ) # compute mean temperature of cells key = "bpTemp" @@ -363,6 +372,7 @@ class Ecoflow: value=value, unit=self.__get_unit(key), description=description_tmp, + icon=None, ) dict.update(sensors, data) @@ -391,6 +401,7 @@ class Ecoflow: value=value, unit=self.__get_unit(key), description=description_tmp, + icon=None, ) # special for phases @@ -408,6 +419,7 @@ class Ecoflow: value=value, unit=self.__get_unit(key), description=self.__get_description(key), + icon=None, ) # special for mpptPv @@ -419,6 +431,11 @@ class Ecoflow: for i, mpptpv in enumerate(mpptpvs): for key, value in d["mpptHeartBeat"][0]["mpptPv"][i].items(): unique_id = f"{self.sn}_{report}_mpptHeartBeat_{mpptpv}_{key}" + special_icon = None + if key.endswith("amp"): + special_icon = "mdi:current-dc" + if key.endswith("pwr"): + special_icon = "mdi:solar-power" data[unique_id] = PowerOceanEndPoint( internal_unique_id=unique_id, @@ -428,6 +445,7 @@ class Ecoflow: value=value, unit=self.__get_unit(key), description=self.__get_description(key), + icon=special_icon, ) # sum power of all strings if key == "pwr": @@ -445,6 +463,7 @@ class Ecoflow: value=mpptPv_sum, unit=self.__get_unit(key), description="Solarertrag aller Strings", + icon="mdi:solar-power", ) dict.update(sensors, data) diff --git a/custom_components/powerocean/sensor.py b/custom_components/powerocean/sensor.py index 3a8957d..8152d8f 100644 --- a/custom_components/powerocean/sensor.py +++ b/custom_components/powerocean/sensor.py @@ -144,11 +144,11 @@ async def async_setup_entry(hass, config_entry, async_add_entities): # entity is enabled if entity and not entity.disabled_by: sensor_data = full_data.get(sensor.unique_id) - _LOGGER.debug(f"{device_id}: Sensor {sensor.name} enabled.") + # _LOGGER.debug(f"{device_id}: Sensor {sensor.name} enabled.") if sensor_data: - _LOGGER.debug( - f"{device_id}: Sensor {sensor.name} has API data to update {sensor_data}" - ) + # _LOGGER.debug( + # f"{device_id}: Sensor {sensor.name} has API data to update {sensor_data}" + # ) # Check if current state value differs from new API value, # or current state has not initialized @@ -156,19 +156,19 @@ async def async_setup_entry(hass, config_entry, async_add_entities): str(sensor._state).strip() != str(sensor_data.value).strip() ): - _LOGGER.debug( - f"{device_id}: Sensor {sensor.name} marked for update: current state = " - f"{sensor._state} with new value = {sensor_data.value}" - ) + # _LOGGER.debug( + # f"{device_id}: Sensor {sensor.name} marked for update: current state = " + # f"{sensor._state} with new value = {sensor_data.value}" + # ) # Now update the sensor with new values # update_status returns 1 for upated, 0 for skipped or error update_status = await sensor.async_update(sensor_data) counter_updated = counter_updated + update_status else: - _LOGGER.debug( - f"{device_id}: Sensor {sensor.name} skipped update! Current value = " - f"{sensor._state}, new value = {sensor_data.value}" - ) + # _LOGGER.debug( + # f"{device_id}: Sensor {sensor.name} skipped update! Current value = " + # f"{sensor._state}, new value = {sensor_data.value}" + # ) counter_unchanged = counter_unchanged + 1 else: _LOGGER.warning( @@ -177,9 +177,9 @@ async def async_setup_entry(hass, config_entry, async_add_entities): ) counter_error = counter_error + 1 else: - _LOGGER.debug( - f"{device_id}: Sensor {sensor.name} is disabled, skipping update" - ) + # _LOGGER.debug( + # f"{device_id}: Sensor {sensor.name} is disabled, skipping update" + # ) counter_disabled = counter_disabled + 1 else: _LOGGER.warning( @@ -231,9 +231,9 @@ class PowerOceanSensor(SensorEntity): self._unique_id = endpoint.internal_unique_id # Set the icon for the sensor based on its unit, ensure the icon_mapper is defined - self._icon = PowerOceanSensor.icon_mapper.get( - endpoint.unit - ) # Default handled in function + # Default handled in function + # self._icon = PowerOceanSensor.icon_mapper.get(endpoint.unit) + self._icon = endpoint.icon # The initial state/value of the sensor self._state = endpoint.value @@ -328,16 +328,21 @@ class PowerOceanSensor(SensorEntity): "manufacturer": "ECOFLOW", } - icon_mapper = defaultdict( - lambda: "mdi:alert-circle", - { - "°C": "mdi:thermometer", - "%": "mdi:flash", - "s": "mdi:timer", - "Wh": "mdi:solar-power-variant-outline", - "h": "mdi:timer-sand", - }, - ) + @property + def icon(self): + """Return the icon of the sensor.""" + return self._icon + + # icon_mapper = defaultdict( + # lambda: "mdi:alert-circle", + # { + # "°C": "mdi:thermometer", + # "%": "mdi:flash", + # "s": "mdi:timer", + # "Wh": "mdi:solar-power-variant-outline", + # "h": "mdi:timer-sand", + # }, + # ) # This is to register the icon settings async def async_added_to_hass(self): From 0812b9bb4dd5a2d72075fee72f54580156ba286e Mon Sep 17 00:00:00 2001 From: niltrip Date: Sun, 25 Aug 2024 12:05:58 +0200 Subject: [PATCH 3/9] cosmetic --- custom_components/powerocean/const.py | 24 +++++++++++----------- custom_components/powerocean/manifest.json | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/custom_components/powerocean/const.py b/custom_components/powerocean/const.py index beffad1..e82e0f2 100644 --- a/custom_components/powerocean/const.py +++ b/custom_components/powerocean/const.py @@ -1,18 +1,18 @@ """Constants for the PowerOcean integration.""" -import logging +#import logging from homeassistant.const import Platform DOMAIN = "powerocean" # Have requested to add logos via https://github.com/home-assistant/brands/pull/4904 NAME = "Ecoflow PowerOcean" -VERSION = "2024.01.01" +#VERSION = "2024.08.25" ISSUE_URL = "https://github.com/niltrip/powerocean/issues" ISSUE_URL_ERROR_MESSAGE = " Please log any issues here: " + ISSUE_URL PLATFORMS: list[Platform] = [Platform.SENSOR] -_LOGGER = logging.getLogger("custom_components.powerocean") +#_LOGGER = logging.getLogger("custom_components.powerocean") ATTR_PRODUCT_DESCRIPTION = "Product Description" ATTR_DESTINATION_NAME = "Destination Name" @@ -26,12 +26,12 @@ ATTR_PRODUCT_BUILD = "Vendor Product Build" ATTR_PRODUCT_FEATURES = "Vendor Product Features" -STARTUP_MESSAGE = f""" ----------------------------------------------------------------------------- -{NAME} -Version: {VERSION} -Domain: {DOMAIN} -If you have any issues with this custom component please open an issue here: -{ISSUE_URL} ----------------------------------------------------------------------------- -""" +# STARTUP_MESSAGE = f""" +# ---------------------------------------------------------------------------- +# {NAME} +# Version: {VERSION} +# Domain: {DOMAIN} +# If you have any issues with this custom component please open an issue here: +# {ISSUE_URL} +# ---------------------------------------------------------------------------- +# """ diff --git a/custom_components/powerocean/manifest.json b/custom_components/powerocean/manifest.json index 351cd1d..3e7df27 100644 --- a/custom_components/powerocean/manifest.json +++ b/custom_components/powerocean/manifest.json @@ -11,5 +11,5 @@ "homekit": {}, "iot_class": "cloud_polling", "requirements": [], - "version": "2024.01.01" + "version": "2024.08.25" } From 0275d26dafb45ed7d8313f7dc2e76e605f41f430 Mon Sep 17 00:00:00 2001 From: niltrip Date: Sun, 25 Aug 2024 12:49:55 +0200 Subject: [PATCH 4/9] fix LOGGER --- custom_components/powerocean/const.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/custom_components/powerocean/const.py b/custom_components/powerocean/const.py index e82e0f2..2a78072 100644 --- a/custom_components/powerocean/const.py +++ b/custom_components/powerocean/const.py @@ -1,18 +1,18 @@ """Constants for the PowerOcean integration.""" -#import logging +import logging from homeassistant.const import Platform DOMAIN = "powerocean" # Have requested to add logos via https://github.com/home-assistant/brands/pull/4904 NAME = "Ecoflow PowerOcean" -#VERSION = "2024.08.25" +VERSION = "2024.08.25" ISSUE_URL = "https://github.com/niltrip/powerocean/issues" ISSUE_URL_ERROR_MESSAGE = " Please log any issues here: " + ISSUE_URL PLATFORMS: list[Platform] = [Platform.SENSOR] -#_LOGGER = logging.getLogger("custom_components.powerocean") +_LOGGER = logging.getLogger("custom_components.powerocean") ATTR_PRODUCT_DESCRIPTION = "Product Description" ATTR_DESTINATION_NAME = "Destination Name" @@ -26,12 +26,12 @@ ATTR_PRODUCT_BUILD = "Vendor Product Build" ATTR_PRODUCT_FEATURES = "Vendor Product Features" -# STARTUP_MESSAGE = f""" -# ---------------------------------------------------------------------------- -# {NAME} -# Version: {VERSION} -# Domain: {DOMAIN} -# If you have any issues with this custom component please open an issue here: -# {ISSUE_URL} -# ---------------------------------------------------------------------------- -# """ +STARTUP_MESSAGE = f""" +---------------------------------------------------------------------------- +{NAME} +Version: {VERSION} +Domain: {DOMAIN} +If you have any issues with this custom component please open an issue here: +{ISSUE_URL} +---------------------------------------------------------------------------- +""" From bdfb6b02ba5cfce0617f24fa86ea08fb1b330b63 Mon Sep 17 00:00:00 2001 From: niltrip Date: Sun, 25 Aug 2024 13:50:40 +0200 Subject: [PATCH 5/9] Change config_flow --- custom_components/powerocean/config_flow.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/custom_components/powerocean/config_flow.py b/custom_components/powerocean/config_flow.py index ed8a539..cd29ec1 100644 --- a/custom_components/powerocean/config_flow.py +++ b/custom_components/powerocean/config_flow.py @@ -142,13 +142,11 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): step_device_options_schema = vol.Schema( { vol.Required("custom_device_name", default=default_device_name): str, - # vol.Required("polling_time", default=60): vol.All( vol.Required("polling_time", default=5): vol.All( - vol.Coerce(int), vol.Clamp(min=60) + vol.Coerce(int), vol.Clamp(min=5) ), vol.Required("group_sensors", default=True): bool, - #vol.Required("disable_sensors", default=False): bool, - vol.Required("disable_sensors", default=True): bool, + vol.Required("disable_sensors", default=False): bool, } ) From 4395fb6f1387eb22c165c92553c2645e22876eb7 Mon Sep 17 00:00:00 2001 From: niltrip Date: Tue, 27 Aug 2024 19:13:07 +0200 Subject: [PATCH 6/9] documentation default 10s --- README.md | 12 +++++++----- custom_components/powerocean/config_flow.py | 2 +- custom_components/powerocean/const.py | 4 ++-- custom_components/powerocean/manifest.json | 2 +- documentation/mpptPv_pwrTotal.PNG | Bin 0 -> 58901 bytes 5 files changed, 11 insertions(+), 9 deletions(-) create mode 100644 documentation/mpptPv_pwrTotal.PNG diff --git a/README.md b/README.md index f7bef86..40b6f14 100644 --- a/README.md +++ b/README.md @@ -34,16 +34,18 @@ Follow the flow. ### Sensors -Sensors are registered to each device as `sensor.{name}_{serial}_{sensor_name}` with an friendly name of `sensor_name`. Additional attributes are presented on each sensor: +Sensors are registered to device as `sensor.{device_name}_{sensor_name}` with an friendly name of `sensor_name`. Additional attributes are presented on each sensor: - Product Description, Destination Name, Source Name: internal names -- Internal Unique ID: `{serial}_{sensor_name}` -- Device Name: as +- Internal Unique ID: `{serial}_{sensor_name}` or `{serial}_{report from response}_{sensor_name}` +- Device Name: `{serial}` - Vendor Product Serial: serial number of the PowerOcean inverter -- Vendor Firmware Version: 5.1.8 -- Vendor Product Build: 13 +- Vendor Firmware Version: 5.1.15 +- Vendor Product Build: 6 ![sensor](documentation/sensor.PNG) +![sensor](documentation/mpptPvPwr_Total.PNG) + ## Troubleshooting Please set your logging for the this custom component to debug during initial setup phase. If everything works well, you are safe to remove the debug logging: diff --git a/custom_components/powerocean/config_flow.py b/custom_components/powerocean/config_flow.py index cd29ec1..c9bf830 100644 --- a/custom_components/powerocean/config_flow.py +++ b/custom_components/powerocean/config_flow.py @@ -142,7 +142,7 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): step_device_options_schema = vol.Schema( { vol.Required("custom_device_name", default=default_device_name): str, - vol.Required("polling_time", default=5): vol.All( + vol.Required("polling_time", default=10): vol.All( vol.Coerce(int), vol.Clamp(min=5) ), vol.Required("group_sensors", default=True): bool, diff --git a/custom_components/powerocean/const.py b/custom_components/powerocean/const.py index 2a78072..5f7c779 100644 --- a/custom_components/powerocean/const.py +++ b/custom_components/powerocean/const.py @@ -3,9 +3,9 @@ import logging from homeassistant.const import Platform -DOMAIN = "powerocean" # Have requested to add logos via https://github.com/home-assistant/brands/pull/4904 +DOMAIN = "powerocean" NAME = "Ecoflow PowerOcean" -VERSION = "2024.08.25" +VERSION = "2024.08.27" ISSUE_URL = "https://github.com/niltrip/powerocean/issues" ISSUE_URL_ERROR_MESSAGE = " Please log any issues here: " + ISSUE_URL diff --git a/custom_components/powerocean/manifest.json b/custom_components/powerocean/manifest.json index 3e7df27..b674693 100644 --- a/custom_components/powerocean/manifest.json +++ b/custom_components/powerocean/manifest.json @@ -11,5 +11,5 @@ "homekit": {}, "iot_class": "cloud_polling", "requirements": [], - "version": "2024.08.25" + "version": "2024.08.27" } diff --git a/documentation/mpptPv_pwrTotal.PNG b/documentation/mpptPv_pwrTotal.PNG new file mode 100644 index 0000000000000000000000000000000000000000..fc36afd24e57083315d41b70b2e8ddcfff6c0254 GIT binary patch literal 58901 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 n5QJ; Date: Tue, 27 Aug 2024 22:25:06 +0200 Subject: [PATCH 7/9] readme --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 40b6f14..128fd85 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Follow the flow. ### Sensors Sensors are registered to device as `sensor.{device_name}_{sensor_name}` with an friendly name of `sensor_name`. Additional attributes are presented on each sensor: - Product Description, Destination Name, Source Name: internal names -- Internal Unique ID: `{serial}_{sensor_name}` or `{serial}_{report from response}_{sensor_name}` +- Internal Unique ID: `{serial}_{sensor_name}` or `{serial}_{report}_{sensor_name}` - Device Name: `{serial}` - Vendor Product Serial: serial number of the PowerOcean inverter - Vendor Firmware Version: 5.1.15 @@ -44,7 +44,9 @@ Sensors are registered to device as `sensor.{device_name}_{sensor_name}` with an ![sensor](documentation/sensor.PNG) -![sensor](documentation/mpptPvPwr_Total.PNG) +##Neuer Sensor (berechnet aus einzelnen Strings) + +![sensor](documentation/mpptPv_pwrTotal.PNG) ## Troubleshooting From 386bc3b448704d6bf28053694268ac310d5726b0 Mon Sep 17 00:00:00 2001 From: niltrip Date: Tue, 27 Aug 2024 22:25:33 +0200 Subject: [PATCH 8/9] 3 new Parameter --- custom_components/powerocean/ecoflow.py | 6 +++++- documentation/parameter_selected.json | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/custom_components/powerocean/ecoflow.py b/custom_components/powerocean/ecoflow.py index 5e54096..70f70e4 100644 --- a/custom_components/powerocean/ecoflow.py +++ b/custom_components/powerocean/ecoflow.py @@ -135,7 +135,7 @@ class Ecoflow: def __get_unit(self, key): """Function get unit from key Name.""" - if key.endswith(("pwr", "Pwr")): + if key.endswith(("pwr", "Pwr", "Power")): unit = "W" elif key.endswith(("amp", "Amp")): unit = "A" @@ -386,6 +386,10 @@ class Ecoflow: sens_select = [ "bpRemainWatth", "emsBpAliveNum", + "emsBpPower", + "pcsActPwr", + "pcsMeterPower", + ] data = {} for key, value in d.items(): diff --git a/documentation/parameter_selected.json b/documentation/parameter_selected.json index 8709676..259a64c 100644 --- a/documentation/parameter_selected.json +++ b/documentation/parameter_selected.json @@ -37,6 +37,7 @@ "SN_BATTERIEPACK2": "{\n \"bpPwr\": -509.56927,\n \"bpSoc\": 83,\n \"bpSoh\": 100,\n \"bpTemp\": [30.0, 31.0, 30.0, 31.0, 31.0, 29.0, 30.0, 30.0, 31.0],\n \"bpCellMaxVol\": 3311.0,\n \"bpCellMinVol\": 3309.0,\n \"bpRunSta\": \"RUNSTA_RUN\",\n \"bpVol\": 52.957,\n \"bpAmp\": -9.622321,\n \"bpBusVol\": 800.7783,\n \"bpErrCode\": 0,\n \"bpCellVol\": [3311.0, 3311.0, 3310.0, 3310.0, 3310.0, 3311.0, 3310.0, 3311.0, 3310.0, 3309.0, 3310.0, 3310.0, 3311.0, 3310.0, 3310.0, 3311.0],\n \"bpDsrc\": 1,\n \"bpSn\": \"SEozMlpESDRaRjhVMDE2Nw==\",\n \"bpCycles\": 129,\n \"bpBalanceState\": 0,\n \"bpHvMosTemp\": 41.0,\n \"bpLvMosTemp\": 40.0,\n \"bpPtcTemp\": 31.0,\n \"bpHtsTemp\": 36.0,\n \"bpBusNegTemp\": 36.0,\n \"bpBusPosTemp\": 37.0,\n \"bpEnvTemp\": 37.0,\n \"bpAccuChgCap\": 10595094,\n \"bpAccuDsgCap\": 10531372,\n \"bpDesignCap\": 100000,\n \"bpFullCap\": 101681,\n \"bpMaxCellTemp\": 31.0,\n \"bpMinCellTemp\": 29.0,\n \"bpMaxMosTemp\": 41.0,\n \"bpMinMosTemp\": 40.0,\n \"bpBmsFault\": 0,\n \"bpEcloundSoc\": 65535,\n \"bpHeartbeatVer\": 33,\n \"bpTimestamp\": 1723754955,\n \"bpRealSoc\": 82.0,\n \"bpRealSoh\": 101.68145,\n \"bpGlobalProtect\": 0,\n \"bpDownLimitSoc\": 14,\n \"bpUpLimitSoc\": 100,\n \"bpActiveCalReqStat\": 0,\n \"bpActiveCalRunStat\": 0,\n \"moduleProductInfo\": 21251,\n \"moduleProgramSta\": 1,\n \"moduleAplSwVer\": 67176201,\n \"moduleLoaderSwVer\": 67174401,\n \"bmsRunSta\": \"PB_BMS_STATE_NORMAL\",\n \"bmsChgDsgSta\": \"PB_STANDBY_STATE\",\n \"dabModSta\": \"PB_MOD_STA_NORMAL\",\n \"bpChgSop\": 50,\n \"bpDsgSop\": 80,\n \"bpRemainWatth\": 4395.431,\n \"bpTargetSoc\": 83.16742,\n \"bpDiffSoc\": 3.0,\n \"bpMaxSoc\": 83.756485,\n \"bpMinSoc\": 80.75656,\n \"bpLimitSoc\": 0.5,\n \"bpCalendarSoh\": 100.0,\n \"bpCycleSoh\": 100.0,\n \"bpAcRechargeFlag\": false,\n \"bpPtcHeatFlag\": false,\n \"bpPtcExitEvent\": \"PB_PTC_OT_STATE\",\n \"bpAccuChgEnergy\": 539787,\n \"bpAccuDsgEnergy\": 521340,\n \"bpPtcTemp2\": 32.0,\n \"bpSysState\": \"NORMAL_STATE\"\n}" }, "JTS1_EMS_HEARTBEAT": { + "pcsBpPower": -512.94556, "pcsCPhase": { "vol": 238.08665, "amp": 1.032396, @@ -78,6 +79,8 @@ "mpptInsResist": 679.71265 } ], + "emsBpPower": -503.5379, + "pcsActPwr": 95.37367, "pcsAPhase": { "vol": 230.28967, "amp": 1.1428562, From 8d22af9344a3692f2bf151a3beb0f17bb7851984 Mon Sep 17 00:00:00 2001 From: niltrip Date: Thu, 29 Aug 2024 13:34:22 +0200 Subject: [PATCH 9/9] response after update firmware 5.1.16.11 new parameter --- .../response_modified_5_1_16_11.json | 539 ++++++++++++++++++ 1 file changed, 539 insertions(+) create mode 100644 documentation/response_modified_5_1_16_11.json diff --git a/documentation/response_modified_5_1_16_11.json b/documentation/response_modified_5_1_16_11.json new file mode 100644 index 0000000..dfe0fce --- /dev/null +++ b/documentation/response_modified_5_1_16_11.json @@ -0,0 +1,539 @@ +{ + "code": "0", + "message": "Success", + "data": { + "sysLoadPwr": 1730.0, + "sysGridPwr": 0.0, + "mpptPwr": 1770.0, + "bpPwr": 40.0, + "bpSoc": 55, + "sysBatChgUpLimit": 0, + "sysBatDsgDownLimit": 0, + "sysGridSta": 0, + "sysOnOffMachineStat": 0, + "online": 1, + "todayElectricityGeneration": "1.79", + "monthElectricityGeneration": "770.80", + "yearElectricityGeneration": "4781.03", + "totalElectricityGeneration": "4883.49", + "systemName": "systemName", + "createTime": "createTime", + "location": "location", + "timezone": "timezone", + "quota": { + "JTS1_ENERGY_STREAM_REPORT": { + "bpSoc": 55, + "mpptPwr": 1770.0, + "updateTime": "2024-08-29 16:14:09", + "bpPwr": 40.0, + "sysLoadPwr": 1730.0, + "sysGridPwr": 0.0 + }, + "JTS1_EMS_CHANGE_REPORT": { + "pcsUnderFreqIncrementEndDelay": 0.0, + "pcsQuQ1": 0.6, + "pcsQuQ2": 0.0, + "pcsQuQ3": 0.0, + "pcsQuQ4": -0.6, + "afciEn": 0, + "ethWanStat": 0, + "pcsDcErrCode": 0, + "evBindList": { + "evSn": [ + ] + }, + "pcsFaultRecoverHighFreqOnGrid": 50.1, + "afciProtectValueCh1": 0.0, + "pcsLowVolRecover": 195.5, + "batRealyStatus": 2, + "mppt1WarningCode": 0, + "afciProtectValueCh2": 20000.0, + "afciFaultCntCh2": 0, + "afciFaultCntCh1": 0, + "pcsOverVolDeratingSwitch": 0, + "pcsOverFreq1": 51.5, + "pcsOverFreq2": 51.5, + "sysHeatStat": 0, + "pcsHighVolRideThroughRecover": 253.0, + "pcsAutoTestFlag": 0, + "pcsSafetyCountryCodeSelection": 4, + "bpLineOffFlag": 0, + "batSoftRelayStatus": 0, + "pcsUnderFreqIncrementEnd": 49.8, + "emsWorkState": 0, + "iot4gErr": 7, + "bpOnlineSum": 2, + "pcsOverFreqDeratingSwitch": 0, + "afciFaultMaxValueCh1": 0.0, + "afciFaultMaxValueCh2": 0.0, + "sysWorkSta": 0, + "pcsOverVolRideThroughStart1": 265.65, + "batRelayCloseFailFlag": 0, + "rateCtrlSwtich": false, + "pcsFastCheck": 0, + "pcsOverVolRideThroughStart2": 287.5, + "pcsLowFreqTime2": 100, + "emsSysSelfCheckStat": 9, + "pcsLowFreqTime1": 100, + "pcsLowVolRideThroughRecover": 195.5, + "pcsReactPwrCompensation": 0.0049, + "wireless4gIccid": "", + "pcsQuLockoutPower": 0.0, + "pcsActivePowerSoftstartSwitch": 1, + "pcsCospP1": 0.1, + "pcsCospP2": 0.5, + "pcsOvpProtectCnt": 0, + "pcsUnderFreqIncrementSlope": 0.4, + "pcsCospP3": 1.0, + "parallelType": 0, + "pcsCospP4": 0.0, + "sysMulPeakTime": 1200, + "emsWordMode": "WORKMODE_SELFUSE", + "pcsOverVolRideThroughProtectTime1": 5500, + "pcsOverFreqDeratingRecoverSlope": 0.09, + "pcsOfpProtectCnt": 0, + "pcsUvp2ProtectCnt": 0, + "pcsOverVolRideThroughProtectTime2": 1000, + "pcsUnderFreqIncrementRecoverSlope": 0.09, + "pcsFaultRecoverHighVolOnGrid": 253.0, + "chgDsgPwr": 0.0, + "pcsRunSta": "RUNSTA_RUN", + "mppt2WarningCode": 0, + "pcsOfpProtectValue": 0.0, + "pcsQuV1": 213.90001, + "wifiStaStat": 0, + "pcsAutoTestState": 0, + "pcsOverVolDeratingEnd": 257.6, + "pcsFaultRecoverLowFreqOnGrid": 47.53, + "emsFeedRatio": 100, + "pcsLowVolRideThroughProtectTime1": 5200, + "pcsFreqLocalCommand": 1, + "pcsLowVolRideThroughProtectTime3": 1000, + "pcsLowVolRideThroughProtectTime2": 3000, + "pcsOverFreqDeratingStart": 50.2, + "pcs10minOverVolTime": 100, + "sysGridSta": 0, + "pcsUnderFreqIncrementStart": 49.8, + "sysRateCtrlTime": 60, + "pcsAvgOvpProtectCnt": 0, + "pcsUvp2ProtectValue": 0.0, + "pcsLowVolTime2": 300, + "pcsLowVolTime3": 240, + "pcsFaultRecoverLowVolOnGrid": 195.5, + "mppt2FaultCode": 0, + "pcsLowVolTime1": 3000, + "pcsSendEnd": 0, + "sysBatBackupRatio": 0, + "emsFeedPwr": 10000, + "afciSelfTestCmdState": 0, + "pcsOvpProtectValue": 0.0, + "sysMulPeakSwitch": true, + "emsSgRunStat": 0, + "pcsOverFreqDeratingEnd": 50.2, + "pcs10minOverVolSwitch": 0, + "pcsUnderFreqIncrementFrozeSwitch": 0, + "pcsAcWarningCode": 0, + "sysTypeCfg": 0, + "pcsPowerDeratingFlag": 9, + "pcsQuV2": 223.1, + "pcsQuV3": 236.9, + "pcsQuV4": 246.1, + "emsFeedMode": 3, + "pcsAcErrCode": 0, + "pcsOngridReconnectFlag": 0, + "pcsUvp1ProtectCnt": 0, + "pcsOverVolDeratingDaleyTime": 0.0, + "sysCalStat": 0, + "emsSgReadyEn": false, + "pcsOverFreqTime2": 100, + "pcsOverFreqTime1": 100, + "pcsOverVolDeratingTimeConst": 10.0, + "pcsPowerDeratingSet": 200, + "userRole": 0, + "pcsAvgOvpProtectValue": 0.0, + "pcsFunctionEnable": 0, + "pcsOverVolTime1": 100, + "pcsOverVolTime2": 100, + "pcsOverVolTime3": 0, + "pcsActivePowerNormalRampUpRate": 60.0, + "pcsUfpProtectValue": 0.0, + "pcsLowVolRideThroughStart1": 184.0, + "pcsAntiBackFlowSwitch": 1, + "pcsLowVolRideThroughStart3": 57.5, + "pcsLowVol1": 184.0, + "pcsLowVolRideThroughStart2": 103.5, + "pcsLowVol2": 103.5, + "pcsLowVol3": 57.5, + "pcsOverFreqDeratingEndDelay": 0.0, + "pcsOverVolDeratingEndPower": 0.0, + "sysOnOffMachineStat": 0, + "afciFaultClearState": 0, + "parallelTypeCur": 0, + "mppt1FaultCode": 0, + "pcsOverVolRecover": 253.0, + "emsCtrlLedType": 1, + "pcsActivePowerDeratingPercent": 1.0, + "sysBatChgUpLimit": 100, + "pcsOverVol3": 0.0, + "pcsOverVol2": 287.5, + "pcsOverVol1": 287.5, + "pcs10minOverVol": 253.0, + "pcsAutoTestPercent": 0, + "iot4gSta": 2, + "afciFaultValueCh2": 0.0, + "afciFaultValueCh1": 0.0, + "emsSgReady": { + "emsSgParam": [ + ] + }, + "pcsOverFreqDeratingStartDelay": 0.0, + "sysBatDsgDownLimit": 10, + "pcsLowFreqRecover": 47.53, + "parallelTypeSet": 0, + "pcsActivePowerSoftStartRate": 0.1, + "pcsOverFreqDeratingCutoffPower": 0.0, + "pcsActivePowerSoftstartTime": 1143373824, + "pcsQuMinimumCosphi": 0.4, + "pcsHighFreqOnGrid": 50.1, + "pcsQuTimeConst": 10.0, + "pcsReactPwrModeSelect": 0, + "iot4gOn": 1, + "bpTotalChgEnergy": 1214338, + "pcsLowFreqOnGrid": 47.53, + "pcsRunFsmState": 58861634, + "afciFaultFlagCh1": 0, + "pcsOverFreqDeratingFrozeSwitch": 0, + "afciFaultFlagCh2": 0, + "updateTime": "2024-08-29 16:37:32", + "pcsHighVolOnGrid": 253.0, + "pcsOverVolDeratingStart": 253.0, + "pcsUfpProtectCnt": 0, + "pcsOverFreqRecover": 50.1, + "pcsUnderFreqIncrementRecoverSlopeSwitch": 1, + "chgDsgMode": 0, + "sysMeterCfg": 0, + "pcsCospPf2": -1.0, + "pcsOverFreqDeratingRecoverSlopeSwitch": 0, + "pcsCospPf1": -1.0, + "pcsCospPf4": 0.0, + "pcsCospPf3": -0.9, + "afciIsExist": 0, + "pcsActivePowerGradient": 0.0033, + "afciSellfTestResult": 0, + "pcsHvrtLvrtSwitch": 1, + "pcsQuLockinPower": 0.0, + "pcsActivePowerDeratingSwitch": 0, + "bpChgDsgSta": 1, + "pcsFreqRecoverTime": 1000, + "emsKeepSoc": 0, + "pcsFaultRecoverOnGridWaitTime": 60000, + "pcsPfValue": 1.0, + "bpReverseFlag": 0, + "afciEnSet": 0, + "pcsVolRecoverTime": 1000, + "pcsOnGridWaitTime": 60000, + "bpSoc": 60, + "pcsReconnectGridDetectSwitch": 1, + "pcsLowFreq1": 47.5, + "pcsLowFreq2": 47.5, + "bpRestartFlag": 1, + "pcsUvp1ProtectValue": 0.0, + "emsCtrlLedBright": 10, + "pcsOverVolDeratingStartingPower": 1.0, + "pcsOverFreqDeratingSlope": 0.4, + "pcsUnderFreqIncrementSwitch": 0, + "virtualHardEdition": 1, + "parallelAllowState": false, + "pcsReactPwrPercent": 0.0, + "afciSwitchFreqCh2": 20000, + "iot4gPdp": -1, + "pcsRelaySelfCheckSta": 9, + "afciSwitchFreqCh1": 0, + "pcsOverFreqDeratingPowerBased": 2.0, + "emsStopAll": 0, + "pcsUnderFreqIncrementStartDelay": 0.0, + "pcsFreqExternalSignal": 0, + "pcsRelayStateShow": 609324111, + "bpTotalDsgEnergy": 1147539, + "pcsLowVolOnGrid": 195.5, + "afciEnableCmdState": 0, + "pcsIslandDetectSwitch": 1, + "emsBackupEvent": 0 + }, + "JTS1_HP_TIMER_TASK_REPORT": { + }, + "JTS1_BP_STA_REPORT": { + "SN_BATTERIEPACK1": "{\n \"bpPwr\": 1561.5443,\n \"bpSoc\": 61,\n \"bpSoh\": 100,\n \"bpTemp\": [29.0, 31.0, 29.0, 29.0, 31.0, 28.0, 28.0, 29.0, 30.0],\n \"bpCellMaxVol\": 3381.0,\n \"bpCellMinVol\": 3374.0,\n \"bpRunSta\": \"RUNSTA_RUN\",\n \"bpVol\": 54.021,\n \"bpAmp\": 28.906246,\n \"bpBusVol\": 807.8273,\n \"bpErrCode\": 0,\n \"bpCellVol\": [3376.0, 3378.0, 3377.0, 3379.0, 3378.0, 3379.0, 3377.0, 3378.0, 3381.0, 3379.0, 3377.0, 3379.0, 3379.0, 3380.0, 3375.0, 3374.0],\n \"bpDsrc\": 2,\n \"bpSn\": \"SEozMlpESDRaRjhVMDEyNg==\",\n \"bpCycles\": 132,\n \"bpBalanceState\": 0,\n \"bpHvMosTemp\": 38.0,\n \"bpLvMosTemp\": 37.0,\n \"bpPtcTemp\": 30.0,\n \"bpHtsTemp\": 34.0,\n \"bpBusNegTemp\": 36.0,\n \"bpBusPosTemp\": 36.0,\n \"bpEnvTemp\": 35.0,\n \"bpAccuChgCap\": 11190702,\n \"bpAccuDsgCap\": 11171727,\n \"bpDesignCap\": 100000,\n \"bpFullCap\": 101937,\n \"bpMaxCellTemp\": 31.0,\n \"bpMinCellTemp\": 28.0,\n \"bpMaxMosTemp\": 38.0,\n \"bpMinMosTemp\": 37.0,\n \"bpBmsFault\": 0,\n \"bpEcloundSoc\": 65535,\n \"bpHeartbeatVer\": 33,\n \"bpTimestamp\": 1724920557,\n \"bpRealSoc\": 61.0,\n \"bpRealSoh\": 101.93712,\n \"bpGlobalProtect\": 0,\n \"bpDownLimitSoc\": 14,\n \"bpUpLimitSoc\": 100,\n \"bpActiveCalReqStat\": 0,\n \"bpActiveCalRunStat\": 0,\n \"moduleProductInfo\": 21251,\n \"moduleProgramSta\": 1,\n \"moduleAplSwVer\": 67176454,\n \"moduleLoaderSwVer\": 67174401,\n \"bmsRunSta\": \"PB_BMS_STATE_NORMAL\",\n \"bmsChgDsgSta\": \"PB_DSG_STATE\",\n \"dabModSta\": \"PB_MOD_STA_NORMAL\",\n \"bpChgSop\": 50,\n \"bpDsgSop\": 80,\n \"bpRemainWatth\": 3123.2,\n \"bpTargetSoc\": 61.346497,\n \"bpDiffSoc\": 2.333374,\n \"bpMaxSoc\": 62.444008,\n \"bpMinSoc\": 60.108322,\n \"bpLimitSoc\": 0.5,\n \"bpCalendarSoh\": 100.0,\n \"bpCycleSoh\": 100.0,\n \"bpAcRechargeFlag\": false,\n \"bpPtcHeatFlag\": false,\n \"bpPtcExitEvent\": \"PB_PTC_OT_STATE\",\n \"bpAccuChgEnergy\": 574233,\n \"bpAccuDsgEnergy\": 555830,\n \"bpPtcTemp2\": 31.0,\n \"bpSysState\": \"NORMAL_STATE\"\n}", + "": "{\n \"bpTemp\": [],\n \"bpCellVol\": []\n}", + "updateTime": "2024-08-29 16:36:02", + "SN_BATTERIEPACK2": "{\n \"bpPwr\": -0.26787513,\n \"bpSoc\": 61,\n \"bpSoh\": 100,\n \"bpTemp\": [29.0, 31.0, 29.0, 30.0, 31.0, 29.0, 30.0, 30.0, 31.0],\n \"bpCellMaxVol\": 3338.0,\n \"bpCellMinVol\": 3326.0,\n \"bpRunSta\": \"RUNSTA_RUN\",\n \"bpVol\": 53.277,\n \"bpAmp\": -0.0050279694,\n \"bpBusVol\": 808.02185,\n \"bpErrCode\": 0,\n \"bpCellVol\": [3328.0, 3330.0, 3329.0, 3335.0, 3329.0, 3331.0, 3331.0, 3328.0, 3338.0, 3326.0, 3333.0, 3328.0, 3334.0, 3333.0, 3330.0, 3335.0],\n \"bpDsrc\": 1,\n \"bpSn\": \"SEozMlpESDRaRjhVMDE2Nw==\",\n \"bpCycles\": 138,\n \"bpBalanceState\": 0,\n \"bpHvMosTemp\": 39.0,\n \"bpLvMosTemp\": 37.0,\n \"bpPtcTemp\": 31.0,\n \"bpHtsTemp\": 36.0,\n \"bpBusNegTemp\": 35.0,\n \"bpBusPosTemp\": 36.0,\n \"bpEnvTemp\": 35.0,\n \"bpAccuChgCap\": 11294418,\n \"bpAccuDsgCap\": 11253368,\n \"bpDesignCap\": 100000,\n \"bpFullCap\": 101681,\n \"bpMaxCellTemp\": 31.0,\n \"bpMinCellTemp\": 29.0,\n \"bpMaxMosTemp\": 39.0,\n \"bpMinMosTemp\": 37.0,\n \"bpBmsFault\": 0,\n \"bpEcloundSoc\": 65535,\n \"bpHeartbeatVer\": 33,\n \"bpTimestamp\": 1724920556,\n \"bpRealSoc\": 61.0,\n \"bpRealSoh\": 101.68145,\n \"bpGlobalProtect\": 0,\n \"bpDownLimitSoc\": 14,\n \"bpUpLimitSoc\": 100,\n \"bpActiveCalReqStat\": 0,\n \"bpActiveCalRunStat\": 0,\n \"moduleProductInfo\": 21251,\n \"moduleProgramSta\": 1,\n \"moduleAplSwVer\": 67176454,\n \"moduleLoaderSwVer\": 67174401,\n \"bmsRunSta\": \"PB_BMS_STATE_NORMAL\",\n \"bmsChgDsgSta\": \"PB_STANDBY_STATE\",\n \"dabModSta\": \"PB_MOD_STA_NORMAL\",\n \"bpChgSop\": 50,\n \"bpDsgSop\": 80,\n \"bpRemainWatth\": 3123.2,\n \"bpTargetSoc\": 61.015976,\n \"bpDiffSoc\": 3.0,\n \"bpMaxSoc\": 62.38619,\n \"bpMinSoc\": 59.380417,\n \"bpLimitSoc\": 0.5,\n \"bpCalendarSoh\": 100.0,\n \"bpCycleSoh\": 100.0,\n \"bpAcRechargeFlag\": false,\n \"bpPtcHeatFlag\": false,\n \"bpPtcExitEvent\": \"PB_PTC_OT_STATE\",\n \"bpAccuChgEnergy\": 577577,\n \"bpAccuDsgEnergy\": 559331,\n \"bpPtcTemp2\": 31.0,\n \"bpSysState\": \"NORMAL_STATE\"\n}" + }, + "JTS1_LOGY_DEV_REPORT": { + "HPReport": { + "devSn": "", + "online": 0, + "errorCode": "" + }, + "updateTime": "2024-08-29 16:27:34" + }, + "JTS1_EMS_PARAM_CHANGE_REPORT": { + "smartCtrl": false, + "breakerCapacityMax": 400, + "energyEfficientEnable": true, + "breakerEnableState": true, + "bpBurst": false, + "updateTime": "2024-08-29 16:27:34", + "lowerPowerStat": false, + "sysZone": 8, + "sysTimeTab": 19662120 + }, + "JTS1_HP_UI_REPORT": { + }, + "JTS1_PARALLEL_ENERGY_STREAM_REPORT": { + }, + "JTS1_EMS_ALL_TIMER_TASK_REPORT": { + "timeTaskCfg": [ + ], + "updateTime": "2024-08-29 13:21:07" + }, + "JTS1_HEATING_ROD_TIMER_TASK_REPORT": { + }, + "JTS1_LOGY_DEV_ENERGY_STREAM_REPORT": { + }, + "JTS1_APP_REQUEST_BP_EU_LAW_DATA_REPORT": { + }, + "JTS1_EMS_PV_INV_ENERGY_STREAM_REPORT": { + "pvInvPwr": 0.0, + "updateTime": "2024-08-29 16:14:09" + }, + "JTS1_EMS_PARALLEL_DEVICE_LIST": { + }, + "JT303_EDEV_PRIORITY_LIST_REPORT": { + }, + "JTS1_ERROR_CHANGE_REPORT": { + "updateTime": "2024-08-29 16:27:36", + "emsErrCode": { + "errCode": [ + ], + "moduleSn": "codierte sn" + }, + "pcsErrCode": { + "errCode": [ + ], + "moduleSn": "codierte sn" + }, + "bpErrCode": [ + { + "errCode": [ + ], + "moduleSn": "codierte sn" + }, + { + "errCode": [ + ], + "moduleSn": "codierte sn" + } + ] + }, + "JTS1_EV_CHARGING_ENERGY_STREAM_REPORT": { + }, + "JTS1_ERROR_CODE_MASK_REPORT": { + "errorCode": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "updateTime": "2024-08-29 13:21:07" + }, + "JTS1_EMS_HEARTBEAT": { + "emsPcsStartupState": 1, + "pcsBpPower": 1232.3423, + "pcsPfcCurRef": 0.0, + "pcsCPhase": { + "vol": 239.47925, + "amp": 1.0047227, + "actPwr": -149.27367, + "reactPwr": 188.70789, + "apparentPwr": 240.61024 + }, + "pcsActivePowerRef": 713.7766, + "pcsReactivePowerRef": 0.0, + "bpRemainWatth": 6666.0, + "emsMpptModStat": 0, + "pcsAverageVoltage": 0.0, + "emsBpAliveNum": 2, + "pcsDci": 0.0035001037, + "emsBpDsg": -6601.1196, + "emsSelfUsedCnt": 14701148, + "pcsActivePowerLimitUp": 713.7766, + "pcsBPhase": { + "vol": 241.53192, + "amp": 0.6367133, + "actPwr": -123.93383, + "reactPwr": 91.0534, + "apparentPwr": 153.78659 + }, + "pcsDcv": 0.0, + "pcsVbusRef": 770.0, + "emsStartFsmState": 1078644260, + "emsBusVolt": 806.4418, + "emsBpChg": 5000.848, + "emsAcMakeupTriggleSoc": 12, + "bpDsgTime": 600000, + "pcsLeakAmp": -6.364746, + "emsLpStateFlag": 0, + "emsMpptStartupState": 1, + "pcsActivePowerLimitDn": -10000.0, + "pcsBusVolt": 806.153, + "pcsGridSafetyStateRecord": 9490524, + "pcsCommInterfaceState": 17120, + "emsLpState": 0, + "pcsMeterPower": -5.2220154, + "emsStopCmd": 34, + "emsPcsSelfcheckState": 1, + "emsAcMakeupExitSoc": 14, + "emsBusVoltErrSlidFilter": 0.85184544, + "emsPvInvPwr": 0.0, + "emsMpptHbState": 17, + "emsBpChgRequest": 0, + "pcsLoadInfo": [ + { + "vol": 235.78484, + "amp": 0.0, + "freq": 50.019608, + "pwr": 0.0 + }, + { + "vol": 241.53192, + "amp": 0.0, + "freq": 50.019608, + "pwr": 0.0 + }, + { + "vol": 239.47925, + "amp": 0.0, + "freq": 50.019608, + "pwr": 0.0 + } + ], + "mpptHeartBeat": [ + { + "mpptPv": [ + { + "vol": 345.86108, + "amp": 5.05552, + "lightSta": true, + "pwr": 1748.5077 + }, + { + "vol": 254.73224, + "amp": 1.5166792, + "lightSta": true, + "pwr": 386.34708 + } + ], + "mpptTempVal": [ + 41.100002, + 42.3, + 42.0 + ], + "mpptInsResist": 611.47766 + } + ], + "emsBusVoltRipple": 1.2493286, + "emsLpType": 0, + "pcsBpPowerChgLimit": 5000.848, + "pcsAcFreq": 50.01, + "emsSocCalibRequest": 0, + "emsBpStartupState": 1, + "emsSysCfg": 7, + "emsAcMakeupMinSoc": 0, + "emsLpMpptCnt": 0, + "emsBpSelfcheckState": 1, + "emsBpPower": 1234.7299, + "emsActiveOffGridCmd": 0, + "pcsActPwr": 109.46263, + "emsLpBpCnt": 0, + "emsNtcTempMax": 42.3, + "emsAcMakeupCnt": 0, + "emsSocCalibState": 0, + "pcsRelayStateShow": 609324111, + "updateTime": "2024-08-29 16:40:24", + "emsMpptRunState": 1, + "pcsVgridThd": 8.080436E-05, + "pcsInterruptOccupancyRate": 90.0, + "pcsAPhase": { + "vol": 235.78484, + "amp": 1.8547661, + "actPwr": 382.67014, + "reactPwr": 211.70108, + "apparentPwr": 437.3257 + }, + "emsMpptSelfcheckState": 1, + "pcsPfcCurReal": 0.0, + "pcsGridSafetyFuncRecord": 100687970, + "pcsGridInvErrorRms": 10.824885, + "meterHeartBeat": [ + { + "meterAddr": 106, + "meterType": 11, + "meterData": [ + 0.0, + 0.0, + 0.0, + 5.4385986 + ] + } + ] + }, + "JT303_EDEV_PRIORITY_SET_ACK": { + }, + "JTS1_HEATING_ROD_ENERGY_STREAM_REPORT": { + }, + "JTS1_EVCHARGING_REPORT": { + }, + "JTS1_HEATING_ROD_PARAM_REPORT": { + }, + "JTS1_ECOLOGY_DEV_BIND_LIST_REPORT": { + "devItem": [ + ], + "updateTime": "2024-08-29 16:27:34" + }, + "JTS1_MPPT_STA_REPORT": { + }, + "JTS1_EV_CHARGING_TIMER_TASK_REPORT": { + } + } + }, + "eagleEyeTraceId": "lange id", + "tid": "" +} \ No newline at end of file