move more code into InverterBase class

This commit is contained in:
Stefan Allius
2024-10-03 15:08:07 +02:00
parent cfe2c9cb9d
commit 22d59ed659
13 changed files with 892 additions and 559 deletions

View File

@@ -1,35 +1,13 @@
import logging
from asyncio import StreamReader, StreamWriter
if __name__ == "app.src.gen3.inverter_g3":
from app.src.inverter_base import InverterBase
from app.src.async_stream import StreamPtr
from app.src.async_stream import AsyncStreamServer
from app.src.gen3.talent import Talent
else: # pragma: no cover
from inverter_base import InverterBase
from async_stream import StreamPtr
from async_stream import AsyncStreamServer
from gen3.talent import Talent
logger_mqtt = logging.getLogger('mqtt')
class InverterG3(InverterBase):
def __init__(self, reader: StreamReader, writer: StreamWriter, addr):
super().__init__()
self.addr = addr
self.remote = StreamPtr(None)
ifc = AsyncStreamServer(reader, writer,
self.async_publ_mqtt,
self.async_create_remote,
self.remote)
self.local = StreamPtr(
Talent(addr, ifc, True, False), ifc
)
async def async_create_remote(self) -> None:
await InverterBase.async_create_remote(
self, 'tsun', Talent)
def __init__(self, reader: StreamReader, writer: StreamWriter):
super().__init__(reader, writer, 'tsun', Talent)

View File

@@ -1,36 +1,15 @@
import logging
from asyncio import StreamReader, StreamWriter
if __name__ == "app.src.gen3plus.inverter_g3p":
from app.src.inverter_base import InverterBase
from app.src.async_stream import StreamPtr
from app.src.async_stream import AsyncStreamServer
from app.src.gen3plus.solarman_v5 import SolarmanV5
else: # pragma: no cover
from inverter_base import InverterBase
from async_stream import StreamPtr
from async_stream import AsyncStreamServer
from gen3plus.solarman_v5 import SolarmanV5
logger_mqtt = logging.getLogger('mqtt')
class InverterG3P(InverterBase):
def __init__(self, reader: StreamReader, writer: StreamWriter, addr,
def __init__(self, reader: StreamReader, writer: StreamWriter,
client_mode: bool = False):
super().__init__()
self.addr = addr
self.remote = StreamPtr(None)
ifc = AsyncStreamServer(reader, writer,
self.async_publ_mqtt,
self.async_create_remote,
self.remote)
self.local = StreamPtr(
SolarmanV5(addr, ifc, True, client_mode), ifc
)
async def async_create_remote(self) -> None:
await InverterBase.async_create_remote(
self, 'solarman', SolarmanV5)
super().__init__(reader, writer, 'solarman',
SolarmanV5, client_mode)

View File

@@ -3,15 +3,20 @@ import logging
import traceback
import json
from aiomqtt import MqttCodeError
from asyncio import StreamReader, StreamWriter
if __name__ == "app.src.inverter_base":
from app.src.inverter import Inverter
from app.src.async_stream import StreamPtr
from app.src.async_stream import AsyncStreamClient
from app.src.async_stream import AsyncStreamServer
from app.src.config import Config
from app.src.infos import Infos
else: # pragma: no cover
from inverter import Inverter
from async_stream import StreamPtr
from async_stream import AsyncStreamClient
from async_stream import AsyncStreamServer
from config import Config
from infos import Infos
@@ -19,9 +24,23 @@ logger_mqtt = logging.getLogger('mqtt')
class InverterBase(Inverter):
def __init__(self):
def __init__(self, reader: StreamReader, writer: StreamWriter,
config_id: str, prot_class,
client_mode: bool = False):
super().__init__()
self.addr = writer.get_extra_info('peername')
self.config_id = config_id
self.prot_class = prot_class
self.__ha_restarts = -1
self.remote = StreamPtr(None)
ifc = AsyncStreamServer(reader, writer,
self.async_publ_mqtt,
self.async_create_remote,
self.remote)
self.local = StreamPtr(
self.prot_class(self.addr, ifc, True, client_mode), ifc
)
def __enter__(self):
return self
@@ -66,9 +85,10 @@ class InverterBase(Inverter):
return False
return True
async def async_create_remote(self, inv_prot: str, conn_class) -> None:
async def async_create_remote(self) -> None:
'''Establish a client connection to the TSUN cloud'''
tsun = Config.get(inv_prot)
tsun = Config.get(self.config_id)
host = tsun['host']
port = tsun['port']
addr = (host, port)
@@ -83,11 +103,11 @@ class InverterBase(Inverter):
self.remote.ifc = ifc
if hasattr(stream, 'id_str'):
self.remote.stream = conn_class(
self.remote.stream = self.prot_class(
addr, ifc, server_side=False,
client_mode=False, id_str=stream.id_str)
else:
self.remote.stream = conn_class(
self.remote.stream = self.prot_class(
addr, ifc, server_side=False,
client_mode=False)

View File

@@ -25,7 +25,7 @@ class ModbusConn():
'''Establish a client connection to the TSUN cloud'''
connection = asyncio.open_connection(self.host, self.port)
reader, writer = await connection
self.inverter = InverterG3P(reader, writer, self.addr,
self.inverter = InverterG3P(reader, writer,
client_mode=True)
self.inverter.__enter__()
stream = self.inverter.local.stream

View File

@@ -72,8 +72,7 @@ async def webserver(addr, port):
async def handle_client(reader: StreamReader, writer: StreamWriter, inv_class):
'''Handles a new incoming connection and starts an async loop'''
addr = writer.get_extra_info('peername')
with inv_class(reader, writer, addr) as inv:
with inv_class(reader, writer) as inv:
await inv.local.ifc.server_loop()