Skip to content

Commit

Permalink
Loads more work on the AsyncClient
Browse files Browse the repository at this point in the history
Much more robust handling of edge cases
Tracking outbound requests to match up when their responses come in
Split out the Client into much better segregated subsystems
  • Loading branch information
dewet22 committed May 5, 2022
1 parent d7e8a55 commit 1180ce1
Show file tree
Hide file tree
Showing 19 changed files with 1,987 additions and 1,148 deletions.
63 changes: 42 additions & 21 deletions givenergy_modbus/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,33 @@
import logging

import click
from loguru import logger

from givenergy_modbus.client import GivEnergyClient
from givenergy_modbus.client.asynchronous import Client
from givenergy_modbus.model.battery import Battery
from givenergy_modbus.model.inverter import Inverter # type: ignore
from givenergy_modbus.model.inverter import Inverter
from givenergy_modbus.model.plant import Plant
from givenergy_modbus.util import InterceptHandler


class InterceptHandler(logging.Handler):
"""Install loguru by intercepting logging."""

def emit(self, record):
"""Redirect logging emissions to loguru instead."""
# Get corresponding Loguru level if it exists
try:
level = logger.level(record.levelname).name
except ValueError:
level = record.levelno

# Find caller from where the logged message originated, skipping frames from plumbing/infrastructure
frame, depth = logging.currentframe(), 2
while frame.f_code.co_filename == logging.__file__ or "sentry_sdk/integrations" in frame.f_code.co_filename:
frame = frame.f_back
depth += 1

logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage())


_logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -36,8 +57,8 @@ def main(ctx, host, log_level):
ctx.ensure_object(dict)

# Install our improved logging handler.
logging.basicConfig(handlers=[InterceptHandler()], level=getattr(logging, log_level))
ctx.obj['CLIENT'] = GivEnergyClient(host=host)
# logging.basicConfig(handlers=[InterceptHandler()], level=getattr(logging, log_level))
ctx.obj['CLIENT'] = Client(host=host)


@main.command()
Expand All @@ -47,12 +68,12 @@ def dump_registers(ctx, batteries):
"""Dump out raw register data for use in debugging."""
plant = Plant(number_batteries=batteries)
ctx.obj['CLIENT'].refresh_plant(plant=plant, full_refresh=True)
inverter_json = plant.inverter_rc.to_json()
inverter_json = plant.inverter_rc.json()
inverter = Inverter.from_orm(plant.inverter_rc)

batteries_json = {}
for i in range(batteries):
batteries_json[i] = plant.batteries_rcs[i].to_json()
batteries_json[i] = plant.batteries_rcs[i].json()

click.echo('Inverter registers:')
click.echo(inverter_json)
Expand All @@ -66,56 +87,56 @@ def dump_registers(ctx, batteries):
@main.command()
@click.pass_context
@click.argument('target_soc', type=int)
@is_documented_by(GivEnergyClient.enable_charge_target)
def enable_charge_target(ctx, target_soc): # noqa: D103
ctx.obj['CLIENT'].enable_charge_target(target_soc)
@is_documented_by(Client.set_charge_target)
def set_charge_target(ctx, target_soc): # noqa: D103
ctx.obj['CLIENT'].set_charge_target(target_soc)


@main.command()
@click.pass_context
@is_documented_by(GivEnergyClient.disable_charge_target)
@is_documented_by(Client.disable_charge_target)
def disable_charge_target(ctx): # noqa: D103
ctx.obj['CLIENT'].disable_charge_target()


@main.command()
@click.pass_context
@is_documented_by(GivEnergyClient.enable_charge)
@is_documented_by(Client.enable_charge)
def enable_charge(ctx): # noqa: D103
ctx.obj['CLIENT'].enable_charge()


@main.command()
@click.pass_context
@is_documented_by(GivEnergyClient.disable_charge)
@is_documented_by(Client.disable_charge)
def disable_charge(ctx): # noqa: D103
ctx.obj['CLIENT'].disable_charge()


@main.command()
@click.pass_context
@is_documented_by(GivEnergyClient.enable_discharge)
@is_documented_by(Client.enable_discharge)
def enable_discharge(ctx): # noqa: D103
ctx.obj['CLIENT'].enable_discharge()


@main.command()
@click.pass_context
@is_documented_by(GivEnergyClient.disable_discharge)
@is_documented_by(Client.disable_discharge)
def disable_discharge(ctx): # noqa: D103
ctx.obj['CLIENT'].disable_discharge()


@main.command()
@click.pass_context
@is_documented_by(GivEnergyClient.set_battery_discharge_mode_max_power)
# @is_documented_by(Client.set_battery_discharge_mode_max_power)
def set_battery_discharge_mode_max_power(ctx): # noqa: D103
ctx.obj['CLIENT'].set_battery_discharge_mode_max_power()


@main.command()
@click.pass_context
@is_documented_by(GivEnergyClient.set_battery_discharge_mode_demand)
# @is_documented_by(Client.set_battery_discharge_mode_demand)
def set_battery_discharge_mode_demand(ctx): # noqa: D103
ctx.obj['CLIENT'].set_battery_discharge_mode_demand()

Expand All @@ -124,7 +145,7 @@ def set_battery_discharge_mode_demand(ctx): # noqa: D103
@click.option('-s', '--start', type=click.DateTime(formats=['%H:%m']), required=True)
@click.option('-e', '--end', type=click.DateTime(formats=['%H:%m']), required=True)
@click.pass_context
@is_documented_by(GivEnergyClient.set_charge_slot_1)
@is_documented_by(Client.set_charge_slot_1)
def set_charge_slot_1(ctx, start, end): # noqa: D103
_logger.info(start)
_logger.info(end)
Expand All @@ -135,7 +156,7 @@ def set_charge_slot_1(ctx, start, end): # noqa: D103
@click.option('-s', '--start', type=click.DateTime(formats=['%H:%M', '%H%M']), required=True)
@click.option('-e', '--end', type=click.DateTime(formats=['%H:%M', '%H%M']), required=True)
@click.pass_context
@is_documented_by(GivEnergyClient.set_charge_slot_2)
@is_documented_by(Client.set_charge_slot_2)
def set_charge_slot_2(ctx, start: datetime.datetime, end: datetime.datetime): # noqa: D103
_logger.info(start.time())
_logger.info(end.time())
Expand All @@ -145,15 +166,15 @@ def set_charge_slot_2(ctx, start: datetime.datetime, end: datetime.datetime): #
@main.command()
@click.argument('charge_limit', type=int)
@click.pass_context
@is_documented_by(GivEnergyClient.set_battery_charge_limit)
@is_documented_by(Client.set_battery_charge_limit)
def set_battery_charge_limit(ctx, charge_limit: int): # noqa: D103
ctx.obj['CLIENT'].set_battery_charge_limit(charge_limit)


@main.command()
@click.argument('discharge_limit', type=int)
@click.pass_context
@is_documented_by(GivEnergyClient.set_battery_discharge_limit)
@is_documented_by(Client.set_battery_discharge_limit)
def set_battery_discharge_limit(ctx, discharge_limit: int): # noqa: D103
ctx.obj['CLIENT'].set_battery_discharge_limit(discharge_limit)

Expand Down

0 comments on commit 1180ce1

Please sign in to comment.