From 80bfd414ec699ad22a8815c997f73f5585e01740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odd=20Str=C3=A5b=C3=B8?= Date: Fri, 7 Apr 2023 23:57:37 +0200 Subject: [PATCH] Implement get_interface --- config-example.yaml | 12 ++++++++++++ srnemqtt/__main__.py | 8 +++----- srnemqtt/config.py | 32 ++++++++++++++++++++------------ srnemqtt/interfaces/feasycom.py | 9 ++++++--- srnemqtt/interfaces/serial.py | 6 +++--- 5 files changed, 44 insertions(+), 23 deletions(-) create mode 100644 config-example.yaml diff --git a/config-example.yaml b/config-example.yaml new file mode 100644 index 0000000..cc72de9 --- /dev/null +++ b/config-example.yaml @@ -0,0 +1,12 @@ +consumers: + stdio.StdoutConsumer: {} +interface: + name: serial.SerialInterface + params: + device: /dev/ttyUSB0 + baudrate: 9600 + timeout: 2 +# name: feasycom.FeasycomInterface +# params: +# mac: DC:0D:30:9C:61:BA +# timeout: 5 diff --git a/srnemqtt/__main__.py b/srnemqtt/__main__.py index 4470d7b..38d8058 100755 --- a/srnemqtt/__main__.py +++ b/srnemqtt/__main__.py @@ -8,15 +8,13 @@ from typing import cast from bluepy.btle import BTLEDisconnectError from serial import SerialException -from .config import get_config, get_consumers -from .constants import MAC -from .lib.feasycom_ble import BTLEUart +from .config import get_config, get_consumers, get_interface from .protocol import parse_battery_state, parse_historical_entry, try_read_parse from .solar_types import DataName from .util import Periodical, log -class CommunicationError(BTLEDisconnectError, SerialException): +class CommunicationError(BTLEDisconnectError, SerialException, IOError): pass @@ -34,7 +32,7 @@ def main(): while True: try: log("Connecting...") - with BTLEUart(MAC, timeout=5) as dev: + with get_interface() as dev: log("Connected.") # write(dev, construct_request(0, 32)) diff --git a/srnemqtt/config.py b/srnemqtt/config.py index 2b680a7..c9c95d4 100644 --- a/srnemqtt/config.py +++ b/srnemqtt/config.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- import importlib import os -from io import RawIOBase from time import sleep from typing import Any, Dict, List, Optional, Type import yaml +from srnemqtt.interfaces import BaseInterface + from .consumers import BaseConsumer @@ -53,21 +54,28 @@ def get_consumers(conf: Optional[Dict[str, Any]] = None) -> List[BaseConsumer]: return consumers -def get_producers(conf: Optional[Dict[str, Any]] = None) -> List[RawIOBase]: - raise NotImplementedError +def _get_interface(name: str) -> Type[BaseInterface]: + mod_name, cls_name = name.rsplit(".", 1) + + mod = importlib.import_module(f".consumers.{mod_name}", package=__package__) + + res = getattr(mod, cls_name) + assert issubclass(res, BaseConsumer) + + return res + + +def get_interface(conf: Optional[Dict[str, Any]] = None) -> BaseInterface: if conf is None: conf = get_config() - consumers = [] - for name, consumer_config in conf["consumers"].items(): - # print(name, consumer_config) - mod = get_consumer(name) - if mod: - # print(mod) - consumers.append(mod(consumer_config)) + name = conf["interface"]["name"] + params = conf["interface"].get("params", {}) - write_config(conf) - return consumers + mod = _get_interface(name) + assert mod + + return mod(**params) if __name__ == "__main__": diff --git a/srnemqtt/interfaces/feasycom.py b/srnemqtt/interfaces/feasycom.py index c3c0859..82a1172 100644 --- a/srnemqtt/interfaces/feasycom.py +++ b/srnemqtt/interfaces/feasycom.py @@ -1,7 +1,10 @@ # -*- coding: utf-8 -*- -# from ..lib.feasycom_ble import BTLEUart -from . import BaseSource +from ..lib.feasycom_ble import BTLEUart +from . import BaseInterface -class FeasycomSource(BaseSource): +class FeasycomInterface(BTLEUart, BaseInterface): pass + + +# BTLEUart(mac=MAC, timeout=5) diff --git a/srnemqtt/interfaces/serial.py b/srnemqtt/interfaces/serial.py index 7322a31..bee3ff6 100644 --- a/srnemqtt/interfaces/serial.py +++ b/srnemqtt/interfaces/serial.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- -# import serial +import serial -from . import BaseSource +from . import BaseInterface -class SerialSource(BaseSource): +class SerialInterface(serial.Serial, BaseInterface): pass