From 9f36d01519660b5d0dd9d33521afc80629ff19f7 Mon Sep 17 00:00:00 2001 From: Richard Burford Date: Wed, 13 Sep 2023 08:04:53 +0000 Subject: [PATCH 01/24] sync --- pymyenergi/client.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pymyenergi/client.py b/pymyenergi/client.py index e9aa41c..1af62b3 100644 --- a/pymyenergi/client.py +++ b/pymyenergi/client.py @@ -199,6 +199,7 @@ def power_charging(self): def power_battery(self): """Battery total power""" return self._totals.get(CT_BATTERY, 0) + def find_device_name(self, key, default_value): """Find device or site name""" From 7eb709ed818cb03c05a8c371df1f2214059d754d Mon Sep 17 00:00:00 2001 From: Richard Burford Date: Sat, 16 Sep 2023 06:36:05 +0000 Subject: [PATCH 02/24] lmo and energy --- pymyenergi/base_device.py | 9 +++++++++ pymyenergi/cli.py | 10 ++++++++-- pymyenergi/libbi.py | 14 +++++++++----- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/pymyenergi/base_device.py b/pymyenergi/base_device.py index 32f29c0..30bf1c7 100644 --- a/pymyenergi/base_device.py +++ b/pymyenergi/base_device.py @@ -130,6 +130,10 @@ async def fetch_history_data( "ct4": 0, "ct5": 0, "ct6": 0, + "ive1": 0, + "bdp1": 0, + "bcp1": 0, + "pvp1": 0 } if resolution == MINUTE: url = f"/cgi-jday-{self.prefix}{self._serialno}-{date_from.year}-{date_from.month}-{date_from.day}-{date_from.hour}-0-{how_long}" @@ -158,10 +162,15 @@ async def fetch_history_data( (energy_wh["h1d"] + energy_wh["h2d"] + energy_wh["h3d"]) / 1000, 2 ) + + return_data = { "generated": round(energy_wh["gep"] / 1000, 2), "grid_import": round(energy_wh["imp"] / 1000, 2), "grid_export": round(energy_wh["exp"] / 1000, 2), + "battery_in": round(energy_wh["bcp1"] / 1000, 2), + "battery_out": round(energy_wh["bdp1"] / 1000, 2), + "pv_total": round(energy_wh["pvp1"] / 1000, 2), "device_boosted": device_boosted, "device_green": device_green, "device_total": device_boosted + device_green diff --git a/pymyenergi/cli.py b/pymyenergi/cli.py index a69ebe8..daadc09 100644 --- a/pymyenergi/cli.py +++ b/pymyenergi/cli.py @@ -80,12 +80,18 @@ async def main(args): sys.exit(f"A mode must be specifed, one of {modes}") await device.set_charge_mode(args.arg[0]) print(f"Charging was set to {args.arg[0].capitalize()}") - elif args.action == "mode" and args.command in [EDDI, LIBBI]: + elif args.action == "mode" and args.command == EDDI: if len(args.arg) < 1 or args.arg[0].capitalize() not in EDDI_MODES: modes = ", ".join(EDDI_MODES) sys.exit(f"A mode must be specifed, one of {modes}") await device.set_operating_mode(args.arg[0]) print(f"Operating mode was set to {args.arg[0].capitalize()}") + elif args.action == "mode" and args.command == LIBBI: + if len(args.arg) < 1 or args.arg[0].capitalize() not in LIBBI_MODES: + modes = ", ".join(LIBBI_MODES) + sys.exit(f"A mode must be specifed, one of {modes}") + await device.set_operating_mode(args.arg[0]) + print(f"Operating mode was set to {args.arg[0].capitalize()}") elif args.action == "mingreen" and args.command == ZAPPI: if len(args.arg) < 1: sys.exit("A minimum green level must be provided") @@ -204,7 +210,7 @@ def cli(): LIBBI, help="use libbi --help for available commands" ) subparser_libbi.add_argument("-s", "--serial", dest="serial", default=None) - subparser_libbi.add_argument("action", choices=["show","mode","priority"]) + subparser_libbi.add_argument("action", choices=["show","mode","priority","energy"]) subparser_libbi.add_argument("arg", nargs="*") args = parser.parse_args() diff --git a/pymyenergi/libbi.py b/pymyenergi/libbi.py index af252e5..83de5d3 100644 --- a/pymyenergi/libbi.py +++ b/pymyenergi/libbi.py @@ -32,8 +32,6 @@ def __init__(self, connection: Connection, serialno, data={}) -> None: @property def kind(self): return LIBBI - - @property def status(self): @@ -43,6 +41,11 @@ def status(self): return STATES[n] else: return n + + @property + def localMode(self): + """Get current known status""" + return self._data.get("lmo", 1) @property def prefix(self): @@ -52,7 +55,7 @@ def prefix(self): def ct_keys(self): """Return CT key names that are not none""" keys = {} - for i in range(3): + for i in range(6): ct = getattr(self, f"ct{i+1}") if ct.name_as_key == "ct_none": continue @@ -178,8 +181,10 @@ def show(self, short_format=False): ret = ret + f"Inverter size: {self.inverter_size}kWh\n" ret = ret + f"State of Charge: {self.state_of_charge}%\n" ret = ret + f"Generated: {self.power_generated}W\n" + ret = ret + f"Generated Today: {self.history_data.get()}W\n" ret = ret + f"Grid: {self.power_grid}W\n" ret = ret + f"Status : {self.status}\n" + ret = ret + f"Local Mode : {self.localMode}\n" ret = ret + f"CT 1 {self.ct1.name} {self.ct1.power}W phase {self.ct1.phase}\n" ret = ret + f"CT 2 {self.ct2.name} {self.ct2.power}W phase {self.ct2.phase}\n" ret = ret + f"CT 3 {self.ct3.name} {self.ct3.power}W phase {self.ct3.phase}\n" @@ -188,6 +193,5 @@ def show(self, short_format=False): ret = ret + f"CT 6 {self.ct6.name} {self.ct6.power}W phase {self.ct6.phase}\n" for key in self.ct_keys: ret = ret + f"Energy {key} {self.history_data.get(key, 0)}Wh\n" - - + return ret From 1ee611ce45fc27f272acc6d404a56a0710ac28fc Mon Sep 17 00:00:00 2001 From: Richard Burford Date: Sat, 16 Sep 2023 08:45:54 +0000 Subject: [PATCH 03/24] update libbi suppprt description --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 26d273c..18cc318 100644 --- a/README.md +++ b/README.md @@ -146,9 +146,13 @@ loop.run_until_complete(get_data()) ``` ## libbi support - very early - reads a few values like State of Charge - gets the current status +Very early and basic support of Libbi. +Reads a few values such as State of Charge, DCPV CT +Battery in and out energy +Gets and sets the current status +Change priority of Libbi + + ## Credits From 0e6f4a56cc6e810b57a4d11ec5376d8bf7c32c27 Mon Sep 17 00:00:00 2001 From: Richard Burford Date: Sat, 16 Sep 2023 08:47:36 +0000 Subject: [PATCH 04/24] . --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 18cc318..2d41dfa 100644 --- a/README.md +++ b/README.md @@ -147,9 +147,13 @@ loop.run_until_complete(get_data()) ## libbi support Very early and basic support of Libbi. + Reads a few values such as State of Charge, DCPV CT + Battery in and out energy + Gets and sets the current status + Change priority of Libbi From 829d9b113591bd129cd746548ce2cdc9edf1bd9c Mon Sep 17 00:00:00 2001 From: Richard Burford Date: Sat, 16 Sep 2023 08:49:59 +0000 Subject: [PATCH 05/24] . --- README.md | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 2d41dfa..18bfeea 100644 --- a/README.md +++ b/README.md @@ -145,17 +145,13 @@ loop = asyncio.get_event_loop() loop.run_until_complete(get_data()) ``` -## libbi support +## Libbi support Very early and basic support of Libbi. -Reads a few values such as State of Charge, DCPV CT - -Battery in and out energy - -Gets and sets the current status - -Change priority of Libbi - +- Reads a few values such as State of Charge, DCPV CT +- Battery in and out energy +- Gets and sets the current status +- Change priority of Libbi From b411e0f8ea6d9ff5f95a610752272087684fb2e0 Mon Sep 17 00:00:00 2001 From: Richard Burford Date: Sat, 16 Sep 2023 08:53:36 +0000 Subject: [PATCH 06/24] cli examples --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 18bfeea..d04bf43 100644 --- a/README.md +++ b/README.md @@ -153,6 +153,14 @@ Very early and basic support of Libbi. - Gets and sets the current status - Change priority of Libbi +cli examples: +''' +myenergi libbi show +myenergi libbi mode normal +myenergi libbi mode stop +myenergi libbi priority 1 +''' + ## Credits From 69e6a19e0f3b17c2275eb5eb9472176db11c4a06 Mon Sep 17 00:00:00 2001 From: Richard Burford Date: Sat, 16 Sep 2023 08:54:08 +0000 Subject: [PATCH 07/24] ``` --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d04bf43..144ae94 100644 --- a/README.md +++ b/README.md @@ -154,12 +154,12 @@ Very early and basic support of Libbi. - Change priority of Libbi cli examples: -''' +``` myenergi libbi show myenergi libbi mode normal myenergi libbi mode stop myenergi libbi priority 1 -''' +``` From d1ee1409e4a42242c1aa09b6f4904e0bdb55f7e5 Mon Sep 17 00:00:00 2001 From: trizmark Date: Sun, 17 Sep 2023 10:48:11 +0100 Subject: [PATCH 08/24] Changed operating mode selection --- pymyenergi/libbi.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/pymyenergi/libbi.py b/pymyenergi/libbi.py index 83de5d3..1da59aa 100644 --- a/pymyenergi/libbi.py +++ b/pymyenergi/libbi.py @@ -18,9 +18,11 @@ 6:'Discharging', 7:'Duration Charging', 102:'102', - 104:'104' } + 104:'104', + 234:'Calibration Charge' } LIBBI_MODES = ["Stopped","Normal"] +LIBBI_MODE_NAMES = ["STOP", "BALANCE"] class Libbi(BaseDevice): """Libbi Client for myenergi API.""" @@ -136,8 +138,6 @@ def battery_size(self): def inverter_size(self): """Inverter size in kwh""" return self._data.get("mic", 0) /1000 - - @property def prefix(self): @@ -146,15 +146,12 @@ def prefix(self): async def set_operating_mode(self, mode: str): """Stopped or normal mode""" - print(f"set mode") + print("current mode", self._data["lmo"]) mode_int = LIBBI_MODES.index(mode.capitalize()) await self._connection.get( f"/cgi-libbi-mode-{self.prefix}{self._serialno}-{mode_int}" ) - if mode_int == 0: - self._data["sta"] = 0 - else: - self._data["sta"] = 1 + self._data["lmo"] = LIBBI_MODE_NAMES[mode_int] return True async def set_priority(self, priority): @@ -181,7 +178,7 @@ def show(self, short_format=False): ret = ret + f"Inverter size: {self.inverter_size}kWh\n" ret = ret + f"State of Charge: {self.state_of_charge}%\n" ret = ret + f"Generated: {self.power_generated}W\n" - ret = ret + f"Generated Today: {self.history_data.get()}W\n" + #ret = ret + f"Generated Today: {self.history_data.get()}W\n" ret = ret + f"Grid: {self.power_grid}W\n" ret = ret + f"Status : {self.status}\n" ret = ret + f"Local Mode : {self.localMode}\n" From f292f09e69ab4d10123bec34f233b70097bee335 Mon Sep 17 00:00:00 2001 From: Richard Burford Date: Sun, 17 Sep 2023 10:13:37 +0000 Subject: [PATCH 09/24] removed generated today --- pymyenergi/base_device.py | 2 -- pymyenergi/libbi.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/pymyenergi/base_device.py b/pymyenergi/base_device.py index 30bf1c7..05af8fc 100644 --- a/pymyenergi/base_device.py +++ b/pymyenergi/base_device.py @@ -162,8 +162,6 @@ async def fetch_history_data( (energy_wh["h1d"] + energy_wh["h2d"] + energy_wh["h3d"]) / 1000, 2 ) - - return_data = { "generated": round(energy_wh["gep"] / 1000, 2), "grid_import": round(energy_wh["imp"] / 1000, 2), diff --git a/pymyenergi/libbi.py b/pymyenergi/libbi.py index 83de5d3..3e7b441 100644 --- a/pymyenergi/libbi.py +++ b/pymyenergi/libbi.py @@ -181,7 +181,7 @@ def show(self, short_format=False): ret = ret + f"Inverter size: {self.inverter_size}kWh\n" ret = ret + f"State of Charge: {self.state_of_charge}%\n" ret = ret + f"Generated: {self.power_generated}W\n" - ret = ret + f"Generated Today: {self.history_data.get()}W\n" + ret = ret + f"Grid: {self.power_grid}W\n" ret = ret + f"Status : {self.status}\n" ret = ret + f"Local Mode : {self.localMode}\n" From 58a9d88dc0d88e4a9d9b3343f14291d3ae35d701 Mon Sep 17 00:00:00 2001 From: Richard Burford Date: Sun, 17 Sep 2023 11:47:27 +0000 Subject: [PATCH 10/24] removed today --- pymyenergi/libbi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymyenergi/libbi.py b/pymyenergi/libbi.py index 3e7b441..ab05467 100644 --- a/pymyenergi/libbi.py +++ b/pymyenergi/libbi.py @@ -181,7 +181,7 @@ def show(self, short_format=False): ret = ret + f"Inverter size: {self.inverter_size}kWh\n" ret = ret + f"State of Charge: {self.state_of_charge}%\n" ret = ret + f"Generated: {self.power_generated}W\n" - + ret = ret + f"Generated Today: {self.history_data.get()}Wh\n" ret = ret + f"Grid: {self.power_grid}W\n" ret = ret + f"Status : {self.status}\n" ret = ret + f"Local Mode : {self.localMode}\n" From ebfb04a25e970d8e91e0f53118eb2b5a70aff26d Mon Sep 17 00:00:00 2001 From: Richard Burford Date: Sun, 17 Sep 2023 11:52:59 +0000 Subject: [PATCH 11/24] remove --- pymyenergi/libbi.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pymyenergi/libbi.py b/pymyenergi/libbi.py index ab05467..c40eb99 100644 --- a/pymyenergi/libbi.py +++ b/pymyenergi/libbi.py @@ -181,7 +181,6 @@ def show(self, short_format=False): ret = ret + f"Inverter size: {self.inverter_size}kWh\n" ret = ret + f"State of Charge: {self.state_of_charge}%\n" ret = ret + f"Generated: {self.power_generated}W\n" - ret = ret + f"Generated Today: {self.history_data.get()}Wh\n" ret = ret + f"Grid: {self.power_grid}W\n" ret = ret + f"Status : {self.status}\n" ret = ret + f"Local Mode : {self.localMode}\n" From 8e949628f360f215dec633ff3996b01f87e5c9bd Mon Sep 17 00:00:00 2001 From: Richard Burford Date: Sun, 17 Sep 2023 11:54:35 +0000 Subject: [PATCH 12/24] add cli --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 144ae94..877b175 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,7 @@ myenergi libbi show myenergi libbi mode normal myenergi libbi mode stop myenergi libbi priority 1 +myenergi libbi energy ``` From fed1d5e52384f4a7da84b75cd7895f895973188e Mon Sep 17 00:00:00 2001 From: trizmark Date: Sun, 17 Sep 2023 13:41:44 +0100 Subject: [PATCH 13/24] Remove the generated energy output due to errors --- pymyenergi/libbi.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pymyenergi/libbi.py b/pymyenergi/libbi.py index 1da59aa..7c73d86 100644 --- a/pymyenergi/libbi.py +++ b/pymyenergi/libbi.py @@ -178,7 +178,6 @@ def show(self, short_format=False): ret = ret + f"Inverter size: {self.inverter_size}kWh\n" ret = ret + f"State of Charge: {self.state_of_charge}%\n" ret = ret + f"Generated: {self.power_generated}W\n" - #ret = ret + f"Generated Today: {self.history_data.get()}W\n" ret = ret + f"Grid: {self.power_grid}W\n" ret = ret + f"Status : {self.status}\n" ret = ret + f"Local Mode : {self.localMode}\n" From 4f220523af40f07c6287b27d34a7ad3cba441695 Mon Sep 17 00:00:00 2001 From: Richard Burford Date: Sun, 17 Sep 2023 13:50:08 +0000 Subject: [PATCH 14/24] add battery charge --- README.md | 1 + pymyenergi/base_device.py | 13 ++++++++----- pymyenergi/libbi.py | 16 +++++++++++++--- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 144ae94..877b175 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,7 @@ myenergi libbi show myenergi libbi mode normal myenergi libbi mode stop myenergi libbi priority 1 +myenergi libbi energy ``` diff --git a/pymyenergi/base_device.py b/pymyenergi/base_device.py index 30bf1c7..0113846 100644 --- a/pymyenergi/base_device.py +++ b/pymyenergi/base_device.py @@ -131,6 +131,7 @@ async def fetch_history_data( "ct5": 0, "ct6": 0, "ive1": 0, + "ivi1": 0, "bdp1": 0, "bcp1": 0, "pvp1": 0 @@ -162,19 +163,21 @@ async def fetch_history_data( (energy_wh["h1d"] + energy_wh["h2d"] + energy_wh["h3d"]) / 1000, 2 ) - - return_data = { "generated": round(energy_wh["gep"] / 1000, 2), "grid_import": round(energy_wh["imp"] / 1000, 2), "grid_export": round(energy_wh["exp"] / 1000, 2), - "battery_in": round(energy_wh["bcp1"] / 1000, 2), - "battery_out": round(energy_wh["bdp1"] / 1000, 2), - "pv_total": round(energy_wh["pvp1"] / 1000, 2), + "battery_charge": round(energy_wh["bcp1"] / 1000, 2), + "battery_discharge": round(energy_wh["bdp1"] / 1000, 2), + "inverter_export": round(energy_wh["ive1"] /1000, 2), + "inverter_import": round(energy_wh["ivi1"] /1000, 2), "device_boosted": device_boosted, "device_green": device_green, "device_total": device_boosted + device_green } + if resolution == MINUTE: + return_data["pv_total"] = round(energy_wh["pvp1"] / 1000, 2) + for i in range(6): key = f"ct{i+1}" if hasattr(self, key): diff --git a/pymyenergi/libbi.py b/pymyenergi/libbi.py index 1da59aa..65d1749 100644 --- a/pymyenergi/libbi.py +++ b/pymyenergi/libbi.py @@ -119,6 +119,16 @@ def energy_green(self): """Device green energy from history data""" return self.history_data.get("device_green", 0) + @property + def energy_charge(self): + """Device Battery in from history data""" + return self.history_data.get("battery_charge",0) + + @property + def energy_discharge(self): + """Device Battery out from history data""" + return self.history_data.get("battery_discharge",0) + @property def state_of_charge(self): """State of Charge in %""" @@ -177,8 +187,9 @@ def show(self, short_format=False): ret = ret + f"Battery size: {self.battery_size}kWh\n" ret = ret + f"Inverter size: {self.inverter_size}kWh\n" ret = ret + f"State of Charge: {self.state_of_charge}%\n" - ret = ret + f"Generated: {self.power_generated}W\n" - #ret = ret + f"Generated Today: {self.history_data.get()}W\n" + ret = ret + f"Generating: {self.power_generated}W\n" + ret = ret + f"Battery Charge: {self.energy_charge}wh\n" + ret = ret + f"Grid: {self.power_grid}W\n" ret = ret + f"Status : {self.status}\n" ret = ret + f"Local Mode : {self.localMode}\n" @@ -190,5 +201,4 @@ def show(self, short_format=False): ret = ret + f"CT 6 {self.ct6.name} {self.ct6.power}W phase {self.ct6.phase}\n" for key in self.ct_keys: ret = ret + f"Energy {key} {self.history_data.get(key, 0)}Wh\n" - return ret From e1ed444f05e2eae3435e77c6b62c84919f6e5b3c Mon Sep 17 00:00:00 2001 From: trizmark Date: Sun, 17 Sep 2023 18:59:40 +0100 Subject: [PATCH 15/24] Change from camelCase to snake_case to match rest --- pymyenergi/libbi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymyenergi/libbi.py b/pymyenergi/libbi.py index 7c73d86..13f8093 100644 --- a/pymyenergi/libbi.py +++ b/pymyenergi/libbi.py @@ -45,7 +45,7 @@ def status(self): return n @property - def localMode(self): + def local_mode(self): """Get current known status""" return self._data.get("lmo", 1) From c99f8fe5210d4875041fc782c358149c6c650d68 Mon Sep 17 00:00:00 2001 From: Richard Burford Date: Sun, 17 Sep 2023 18:59:56 +0000 Subject: [PATCH 16/24] add 101 state --- pymyenergi/libbi.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pymyenergi/libbi.py b/pymyenergi/libbi.py index 65d1749..41f6e0c 100644 --- a/pymyenergi/libbi.py +++ b/pymyenergi/libbi.py @@ -17,8 +17,7 @@ 5:'Charging', 6:'Discharging', 7:'Duration Charging', - 102:'102', - 104:'104', + 101:'Idle?', 234:'Calibration Charge' } LIBBI_MODES = ["Stopped","Normal"] @@ -122,7 +121,7 @@ def energy_green(self): @property def energy_charge(self): """Device Battery in from history data""" - return self.history_data.get("battery_charge",0) + return self.history_data.get("battery_charge",0) @property def energy_discharge(self): From 633f1cf0ab3a6d035690e455a72f35ca609f6543 Mon Sep 17 00:00:00 2001 From: Richard Burford Date: Sun, 17 Sep 2023 19:09:26 +0000 Subject: [PATCH 17/24] fix show --- pymyenergi/libbi.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pymyenergi/libbi.py b/pymyenergi/libbi.py index 41f6e0c..fa931e4 100644 --- a/pymyenergi/libbi.py +++ b/pymyenergi/libbi.py @@ -186,9 +186,7 @@ def show(self, short_format=False): ret = ret + f"Battery size: {self.battery_size}kWh\n" ret = ret + f"Inverter size: {self.inverter_size}kWh\n" ret = ret + f"State of Charge: {self.state_of_charge}%\n" - ret = ret + f"Generating: {self.power_generated}W\n" - ret = ret + f"Battery Charge: {self.energy_charge}wh\n" - + ret = ret + f"Generating: {self.power_generated}W\n" ret = ret + f"Grid: {self.power_grid}W\n" ret = ret + f"Status : {self.status}\n" ret = ret + f"Local Mode : {self.localMode}\n" From 98f4508ba3a8d110d375114f36937aefb725aae9 Mon Sep 17 00:00:00 2001 From: Richard Burford Date: Sun, 17 Sep 2023 19:15:43 +0000 Subject: [PATCH 18/24] fix show local mode --- pymyenergi/libbi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymyenergi/libbi.py b/pymyenergi/libbi.py index 2215b81..398bf2b 100644 --- a/pymyenergi/libbi.py +++ b/pymyenergi/libbi.py @@ -189,7 +189,7 @@ def show(self, short_format=False): ret = ret + f"Generating: {self.power_generated}W\n" ret = ret + f"Grid: {self.power_grid}W\n" ret = ret + f"Status : {self.status}\n" - ret = ret + f"Local Mode : {self.localMode}\n" + ret = ret + f"Local Mode : {self.local_mode}\n" ret = ret + f"CT 1 {self.ct1.name} {self.ct1.power}W phase {self.ct1.phase}\n" ret = ret + f"CT 2 {self.ct2.name} {self.ct2.power}W phase {self.ct2.phase}\n" ret = ret + f"CT 3 {self.ct3.name} {self.ct3.power}W phase {self.ct3.phase}\n" From 4a583d4952dc7e0e55896a0298073ee7a0e46c23 Mon Sep 17 00:00:00 2001 From: trizmark Date: Sun, 17 Sep 2023 22:10:55 +0100 Subject: [PATCH 19/24] Expose energy data --- pymyenergi/libbi.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/pymyenergi/libbi.py b/pymyenergi/libbi.py index 398bf2b..8292be4 100644 --- a/pymyenergi/libbi.py +++ b/pymyenergi/libbi.py @@ -118,11 +118,13 @@ def energy_green(self): """Device green energy from history data""" return self.history_data.get("device_green", 0) + """ added battery_charge and battery_discharge for consistent naming - will remove this """ @property def energy_charge(self): """Device Battery in from history data""" return self.history_data.get("battery_charge",0) + """ added battery_charge and battery_discharge for consistent naming - will remove this """ @property def energy_discharge(self): """Device Battery out from history data""" @@ -148,6 +150,31 @@ def inverter_size(self): """Inverter size in kwh""" return self._data.get("mic", 0) /1000 + @property + def grid_import(self): + """Grid import from history data""" + return self.history_data.get("grid_import", 0) + + @property + def grid_export(self): + """Grid export from history data""" + return self.history_data.get("grid_export", 0) + + @property + def battery_charge(self): + """Battery charge from history data""" + return self.history_data.get("battery_charge", 0) + + @property + def battery_discharge(self): + """Battery discharge from history data""" + return self.history_data.get("battery_discharge", 0) + + @property + def generated(self): + """Solar generation from history data""" + return self.history_data.get("generated", 0) + @property def prefix(self): return "L" From 0bb73742cb74c73e8b13be96f6e6c06a56dc0ed4 Mon Sep 17 00:00:00 2001 From: trizmark Date: Mon, 18 Sep 2023 11:28:27 +0100 Subject: [PATCH 20/24] Change energy dis/charge to battery dis/charge --- pymyenergi/libbi.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/pymyenergi/libbi.py b/pymyenergi/libbi.py index 8292be4..7194d79 100644 --- a/pymyenergi/libbi.py +++ b/pymyenergi/libbi.py @@ -118,18 +118,6 @@ def energy_green(self): """Device green energy from history data""" return self.history_data.get("device_green", 0) - """ added battery_charge and battery_discharge for consistent naming - will remove this """ - @property - def energy_charge(self): - """Device Battery in from history data""" - return self.history_data.get("battery_charge",0) - - """ added battery_charge and battery_discharge for consistent naming - will remove this """ - @property - def energy_discharge(self): - """Device Battery out from history data""" - return self.history_data.get("battery_discharge",0) - @property def state_of_charge(self): """State of Charge in %""" From bf0dcd2e57ba9b11f0356195595f90864302d104 Mon Sep 17 00:00:00 2001 From: trizmark Date: Tue, 19 Sep 2023 12:12:38 +0100 Subject: [PATCH 21/24] Re-added 102 status --- pymyenergi/libbi.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pymyenergi/libbi.py b/pymyenergi/libbi.py index 7194d79..5a1969d 100644 --- a/pymyenergi/libbi.py +++ b/pymyenergi/libbi.py @@ -18,6 +18,7 @@ 6:'Discharging', 7:'Duration Charging', 101:'Idle?', + 102:'102', 234:'Calibration Charge' } LIBBI_MODES = ["Stopped","Normal"] From 74853cbe1b5ae36f0296d75f6cb71917d41646ea Mon Sep 17 00:00:00 2001 From: trizmark Date: Thu, 21 Sep 2023 10:03:47 +0100 Subject: [PATCH 22/24] Bump test requirements --- requirements_test.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/requirements_test.txt b/requirements_test.txt index b8c33bd..dc3702a 100644 --- a/requirements_test.txt +++ b/requirements_test.txt @@ -1,7 +1,7 @@ -r requirements_dev.txt -pytest-sugar==0.9.4 -pytest-timeout==1.4.2 +pytest-sugar==0.9.7 +pytest-timeout==2.1.0 pytest-httpx -pytest-xdist==2.2.1 -pytest==6.2.4 +pytest-xdist==3.3.1 +pytest==7.4.2 pytest-asyncio From 33a50c35876761da6e35a12c14ea8a5076d5d489 Mon Sep 17 00:00:00 2001 From: trizmark Date: Thu, 21 Sep 2023 10:05:51 +0100 Subject: [PATCH 23/24] Initial tests and test data for libbi --- tests/conftest.py | 9 ++++++++ tests/fixtures/client.json | 46 ++++++++++++++++++++++++++++++++++++++ tests/fixtures/libbi.json | 41 +++++++++++++++++++++++++++++++++ tests/test_client.py | 10 ++++++++- tests/test_libbi.py | 11 +++++++++ 5 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 tests/fixtures/libbi.json create mode 100644 tests/test_libbi.py diff --git a/tests/conftest.py b/tests/conftest.py index 16329dc..bd4c7d5 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -74,6 +74,15 @@ def harvi_fetch_data_fixture(): yield +@pytest.fixture(name="libbi_fetch_data_fixture") +def libbi_fetch_data_fixture(): + """Mock data from client.fetch_data()""" + with patch( + "pymyenergi.libbi.Libbi.fetch_data", return_value=load_fixture_json("libbi") + ): + yield + + # @pytest.fixture # def eddi_connection_mock(): # with patch("pymyenergi.eddi.Eddi._connection"): diff --git a/tests/fixtures/client.json b/tests/fixtures/client.json index 4627c10..26cf988 100644 --- a/tests/fixtures/client.json +++ b/tests/fixtures/client.json @@ -6,6 +6,7 @@ { "key": "Z17005900", "val": "Test Zappi 2" }, { "key": "H10645200", "val": "Test Harvi 1" }, { "key": "H10644500", "val": "Test Harvi 2" }, + { "key": "L24047164", "val": "Test Libbi 1" }, { "key": "siteName", "val": "Test Site" } ] }, @@ -154,6 +155,51 @@ } ] }, + { + "libbi": [ + { + "sno": 24047164, + "dat": "20-09-2023", + "tim": "14: 53: 03", + "ectp1": -457, + "ectp2": -72, + "ectp3": 0, + "ectt1": "Internal Load", + "ectt2": "Grid", + "ectt3": "None", + "ectp4": 0, + "ectp5": 320, + "ectt4": "None", + "ectt5": "DCPV", + "ectt6": "None", + "dst": 1, + "tz": 0, + "lmo": "BALANCE", + "sta": 6, + "frq": 49.92, + "pri": 1, + "soc": 45, + "isp": "True", + "pha": 1, + "vol": 2350, + "mbc": 20400, + "mic": 5000, + "gen": 320, + "grd": -38, + "div": -457, + "ect1p": 1, + "ect2p": 1, + "ect3p": 1, + "batteryDischargingBoost": "False", + "pvDirectlyConnected": "True", + "g100LockoutState": "NONE", + "cmt": 254, + "fwv": "3702S5.041", + "newAppAvailable": "False", + "newBootloaderAvailable": "False" + } + ] + }, { "asn": "s8.myenergi.net", "fwv": "3401S3077" diff --git a/tests/fixtures/libbi.json b/tests/fixtures/libbi.json new file mode 100644 index 0000000..6b7d9a5 --- /dev/null +++ b/tests/fixtures/libbi.json @@ -0,0 +1,41 @@ +{ + "sno": 24047164, + "dat": "20-09-2023", + "tim": "14: 53: 03", + "ectp1": -457, + "ectp2": -72, + "ectp3": 0, + "ectt1": "Internal Load", + "ectt2": "Grid", + "ectt3": "None", + "ectp4": 0, + "ectp5": 320, + "ectt4": "None", + "ectt5": "DCPV", + "ectt6": "None", + "dst": 1, + "tz": 0, + "lmo": "BALANCE", + "sta": 6, + "frq": 49.92, + "pri": 1, + "soc": 45, + "isp": "True", + "pha": 1, + "vol": 2350, + "mbc": 20400, + "mic": 5000, + "gen": 320, + "grd": -38, + "div": -457, + "ect1p": 1, + "ect2p": 1, + "ect3p": 1, + "batteryDischargingBoost": "False", + "pvDirectlyConnected": "True", + "g100LockoutState": "NONE", + "cmt": 254, + "fwv": "3702S5.041", + "newAppAvailable": "False", + "newBootloaderAvailable": "False" +} \ No newline at end of file diff --git a/tests/test_client.py b/tests/test_client.py index 1a5e0c6..f70adb7 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -3,6 +3,7 @@ from pymyenergi.eddi import Eddi from pymyenergi.harvi import Harvi from pymyenergi.zappi import Zappi +from pymyenergi.libbi import Libbi # All test coroutines will be treated as marked. pytestmark = pytest.mark.asyncio @@ -25,7 +26,7 @@ async def test_init_error(error_on_client_fetch_data): async def test_get_all_devices(client_fetch_data_fixture): client = MyenergiClient(conn) devices = await client.get_devices() - assert len(devices) == 5 + assert len(devices) == 6 async def test_get_eddi_devices(client_fetch_data_fixture): @@ -62,3 +63,10 @@ async def test_1p_harvi_eddi_solar_battery(client_1p_zappi_harvi_solar_battery_f assert client.power_battery == 3000 assert client.power_charging == 2000 assert client.consumption_home == 16000 + + +async def test_get_libbi_devices(client_fetch_data_fixture): + client = MyenergiClient(conn) + devices = await client.get_devices("libbi") + assert len(devices) == 1 + assert isinstance(devices[0], Libbi) \ No newline at end of file diff --git a/tests/test_libbi.py b/tests/test_libbi.py new file mode 100644 index 0000000..16c6591 --- /dev/null +++ b/tests/test_libbi.py @@ -0,0 +1,11 @@ +import pytest +from pymyenergi.libbi import Libbi + +pytestmark = pytest.mark.asyncio + + +async def test_refresh(libbi_fetch_data_fixture): + """Test Libbi data""" + libbi = Libbi({}, 24047164) + await libbi.refresh() + assert libbi.serial_number == 24047164 From e3d2365ff0b354589b59f5b98d6d12000d371129 Mon Sep 17 00:00:00 2001 From: trizmark Date: Thu, 21 Sep 2023 21:22:05 +0100 Subject: [PATCH 24/24] Updated version to release libbi support --- pymyenergi/VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymyenergi/VERSION b/pymyenergi/VERSION index 329ee9f..998726e 100644 --- a/pymyenergi/VERSION +++ b/pymyenergi/VERSION @@ -1 +1 @@ -0.0.28 \ No newline at end of file +0.0.29 \ No newline at end of file