rename class Inverter into Proxy

This commit is contained in:
Stefan Allius
2024-10-04 23:37:05 +02:00
parent 3a94afb48d
commit 00e9a4534d
14 changed files with 300 additions and 232 deletions

View File

@@ -7,12 +7,12 @@ from typing import Self
from itertools import count
if __name__ == "app.src.async_stream":
from app.src.inverter import Inverter
from app.src.proxy import Proxy
from app.src.byte_fifo import ByteFifo
from app.src.async_ifc import AsyncIfc
from app.src.infos import Infos
else: # pragma: no cover
from inverter import Inverter
from proxy import Proxy
from byte_fifo import ByteFifo
from async_ifc import AsyncIfc
from infos import Infos
@@ -240,7 +240,7 @@ class AsyncStream(AsyncIfcImpl):
await self._writer.wait_closed()
def close(self) -> None:
logging.info(f'AsyncStream.close1() l{self.l_addr} | r{self.r_addr}')
logging.debug(f'AsyncStream.close() l{self.l_addr} | r{self.r_addr}')
"""close handler for a no waiting disconnect
hint: must be called before releasing the connection instance
@@ -249,7 +249,6 @@ class AsyncStream(AsyncIfcImpl):
self._reader.feed_eof() # abort awaited read
if self._writer.is_closing():
return
logger.info(f'AsyncStream.close2() l{self.l_addr} | r{self.r_addr}')
self._writer.close()
def healthy(self) -> bool:
@@ -325,15 +324,15 @@ class AsyncStream(AsyncIfcImpl):
class AsyncStreamServer(AsyncStream):
def __init__(self, reader: StreamReader, writer: StreamWriter,
async_publ_mqtt, async_create_remote,
async_publ_mqtt, create_remote,
rstream: "StreamPtr") -> None:
AsyncStream.__init__(self, reader, writer, rstream)
self.async_create_remote = async_create_remote
self.create_remote = create_remote
self.async_publ_mqtt = async_publ_mqtt
def close(self) -> None:
logging.info('AsyncStreamServer.close()')
self.async_create_remote = None
logging.debug('AsyncStreamServer.close()')
self.create_remote = None
self.async_publ_mqtt = None
super().close()
@@ -342,7 +341,7 @@ class AsyncStreamServer(AsyncStream):
logger.info(f'[{self.node_id}:{self.conn_no}] '
f'Accept connection from {self.r_addr}')
Infos.inc_counter('Inverter_Cnt')
await self.publish_outstanding_mqtt()
await self.publish_outstanding_mqtugt()
await self.loop()
Infos.dec_counter('Inverter_Cnt')
await self.publish_outstanding_mqtt()
@@ -360,7 +359,7 @@ class AsyncStreamServer(AsyncStream):
async def _async_forward(self) -> None:
"""forward handler transmits data over the remote connection"""
if not self.remote.stream:
await self.async_create_remote()
await self.create_remote()
if self.remote.stream and \
self.remote.ifc.init_new_client_conn_cb():
await self.remote.ifc._AsyncStream__async_write()
@@ -375,7 +374,7 @@ class AsyncStreamServer(AsyncStream):
'''Publish all outstanding MQTT topics'''
try:
await self.async_publ_mqtt()
await Inverter._async_publ_mqtt_proxy_stat('proxy')
await Proxy._async_publ_mqtt_proxy_stat('proxy')
except Exception:
pass
@@ -387,7 +386,7 @@ class AsyncStreamClient(AsyncStream):
self.close_cb = close_cb
def close(self) -> None:
logging.info('AsyncStreamClient.close()')
logging.debug('AsyncStreamClient.close()')
self.close_cb = None
super().close()

View File

@@ -9,7 +9,7 @@ from asyncio import StreamReader, StreamWriter
if __name__ == "app.src.inverter_base":
from app.src.iter_registry import AbstractIterMeta
from app.src.inverter import Inverter
from app.src.proxy import Proxy
from app.src.async_stream import StreamPtr
from app.src.async_stream import AsyncStreamClient
from app.src.async_stream import AsyncStreamServer
@@ -17,7 +17,7 @@ if __name__ == "app.src.inverter_base":
from app.src.infos import Infos
else: # pragma: no cover
from iter_registry import AbstractIterMeta
from inverter import Inverter
from proxy import Proxy
from async_stream import StreamPtr
from async_stream import AsyncStreamClient
from async_stream import AsyncStreamServer
@@ -28,6 +28,7 @@ logger_mqtt = logging.getLogger('mqtt')
class InverterIfc(metaclass=AbstractIterMeta):
_registry = []
@abstractmethod
def __init__(self, reader: StreamReader, writer: StreamWriter,
@@ -52,17 +53,16 @@ class InverterIfc(metaclass=AbstractIterMeta):
pass # pragma: no cover
@abstractmethod
async def async_create_remote(self) -> None:
async def create_remote(self) -> None:
pass # pragma: no cover
class InverterBase(InverterIfc, Inverter):
_registry = []
class InverterBase(InverterIfc, Proxy):
def __init__(self, reader: StreamReader, writer: StreamWriter,
config_id: str, prot_class,
client_mode: bool = False):
Inverter.__init__(self)
Proxy.__init__(self)
self._registry.append(weakref.ref(self))
self.addr = writer.get_extra_info('peername')
self.config_id = config_id
@@ -71,7 +71,7 @@ class InverterBase(InverterIfc, Inverter):
self.remote = StreamPtr(None)
ifc = AsyncStreamServer(reader, writer,
self.async_publ_mqtt,
self.async_create_remote,
self.create_remote,
self.remote)
self.local = StreamPtr(
@@ -113,7 +113,7 @@ class InverterBase(InverterIfc, Inverter):
await self.local.ifc.disc()
def healthy(self) -> bool:
logging.debug('Inverter healthy()')
logging.debug('InverterBase healthy()')
if self.local.ifc and not self.local.ifc.healthy():
return False
@@ -121,7 +121,7 @@ class InverterBase(InverterIfc, Inverter):
return False
return True
async def async_create_remote(self) -> None:
async def create_remote(self) -> None:
'''Establish a client connection to the TSUN cloud'''
tsun = Config.get(self.config_id)
@@ -179,7 +179,7 @@ class InverterBase(InverterIfc, Inverter):
for key in stream.new_data:
await self.__async_publ_mqtt_packet(stream, key)
for key in Infos.new_stat_data:
await Inverter._async_publ_mqtt_proxy_stat(key)
await Proxy._async_publ_mqtt_proxy_stat(key)
except MqttCodeError as error:
logging.error(f'Mqtt except: {error}')

View File

@@ -13,6 +13,5 @@ class AbstractIterMeta(ABCMeta):
def __iter__(cls):
for ref in cls._registry:
obj = ref()
print(f'obj: {obj}')
if obj is not None:
yield obj

View File

@@ -2,7 +2,7 @@ import asyncio
import logging
import json
if __name__ == "app.src.inverter":
if __name__ == "app.src.proxy":
from app.src.config import Config
from app.src.mqtt import Mqtt
from app.src.infos import Infos
@@ -14,8 +14,8 @@ else: # pragma: no cover
logger_mqtt = logging.getLogger('mqtt')
class Inverter():
'''class Inverter is a baseclass
class Proxy():
'''class Proxy is a baseclass
The class has some class method for managing common resources like a
connection to the MQTT broker or proxy error counter which are common
@@ -34,12 +34,12 @@ class Inverter():
destroyed
methods:
async_create_remote(): Establish a client connection to the TSUN cloud
create_remote(): Establish a client connection to the TSUN cloud
async_publ_mqtt(): Publish data to MQTT broker
'''
@classmethod
def class_init(cls) -> None:
logging.debug('Inverter.class_init')
logging.debug('Proxy.class_init')
# initialize the proxy statistics
Infos.static_init()
cls.db_stat = Infos()
@@ -61,7 +61,7 @@ class Inverter():
# reset at midnight when you restart the proxy just before
# midnight!
inverters = Config.get('inverters')
# logger.debug(f'Inverters: {inverters}')
# logger.debug(f'Proxys: {inverters}')
for inv in inverters.values():
if (type(inv) is dict):
node_id = inv['node_id']
@@ -100,7 +100,7 @@ class Inverter():
@classmethod
def class_close(cls, loop) -> None: # pragma: no cover
logging.debug('Inverter.class_close')
logging.debug('Proxy.class_close')
logging.info('Close MQTT Task')
loop.run_until_complete(cls.mqtt.close())
cls.mqtt = None

View File

@@ -5,7 +5,7 @@ import os
from asyncio import StreamReader, StreamWriter
from aiohttp import web
from logging import config # noqa F401
from inverter import Inverter
from proxy import Proxy
from inverter_base import InverterIfc
from gen3.inverter_g3 import InverterG3
from gen3plus.inverter_g3p import InverterG3P
@@ -87,7 +87,7 @@ async def handle_shutdown(web_task):
#
# first, disc all open TCP connections gracefully
#
async for inverter in InverterIfc:
for inverter in InverterIfc:
await inverter.disc(True)
logging.info('Proxy disconnecting done')
@@ -152,7 +152,7 @@ if __name__ == "__main__":
ConfigErr = Config.class_init()
if ConfigErr is not None:
logging.info(f'ConfigErr: {ConfigErr}')
Inverter.class_init()
Proxy.class_init()
Schedule.start()
ModbusTcp(loop)
@@ -185,7 +185,7 @@ if __name__ == "__main__":
pass
finally:
logging.info("Event loop is stopped")
Inverter.class_close(loop)
Proxy.class_close(loop)
logging.debug('Close event loop')
loop.close()
logging.info(f'Finally, exit Server "{serv_name}"')