94 lines
3.0 KiB
Python
94 lines
3.0 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Base Module Interface
|
|
Definiert die einheitliche Schnittstelle für alle Gerätemodule
|
|
"""
|
|
|
|
from abc import ABC, abstractmethod
|
|
from typing import List, Dict, Tuple
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class BaseModule(ABC):
|
|
"""
|
|
Abstrakte Basisklasse für alle Gerätemodule
|
|
|
|
Jedes Modul muss nur discover() implementieren und gibt
|
|
eine Liste von (actors, sensors) zurück.
|
|
Die Datenbank-Logik bleibt im Hauptscript.
|
|
"""
|
|
|
|
def __init__(self, config):
|
|
"""
|
|
Initialisiert das Modul
|
|
|
|
Args:
|
|
config: Config-Objekt mit allen Einstellungen
|
|
"""
|
|
self.config = config
|
|
self.module_name = self.__class__.__name__.replace('Module', '')
|
|
|
|
@abstractmethod
|
|
def discover(self) -> Tuple[List[Dict], List[Dict]]:
|
|
"""
|
|
Führt Device Discovery durch
|
|
|
|
Returns:
|
|
Tuple (actors, sensors) mit Listen von Dicts:
|
|
|
|
Actor Dict Format:
|
|
{
|
|
'type': str, # z.B. 'RollerShutter'
|
|
'name': str, # z.B. 'Wohnzimmer Rollo'
|
|
'url': str, # Eindeutige ID/URL
|
|
'commands': [ # Liste von Commands
|
|
{
|
|
'command': str,
|
|
'parameters': [
|
|
{
|
|
'name': str,
|
|
'type': str,
|
|
'min': float (optional),
|
|
'max': float (optional),
|
|
'values': list (optional)
|
|
}
|
|
]
|
|
}
|
|
],
|
|
'states': [ # Liste von States
|
|
{
|
|
'name': str,
|
|
'type': int/str,
|
|
'current_value': any,
|
|
'unit': str (optional)
|
|
}
|
|
]
|
|
}
|
|
|
|
Sensor Dict Format:
|
|
{
|
|
'type': str, # z.B. 'TemperatureSensor'
|
|
'name': str, # z.B. 'Außentemperatur'
|
|
'url': str, # Eindeutige ID/URL
|
|
'states': [ # Liste von States
|
|
{
|
|
'name': str,
|
|
'type': int/str,
|
|
'current_value': any,
|
|
'unit': str (optional)
|
|
}
|
|
]
|
|
}
|
|
"""
|
|
pass
|
|
|
|
def is_enabled(self) -> bool:
|
|
"""Prüft ob Modul aktiviert ist"""
|
|
return True # Override in Subklassen falls nötig
|
|
|
|
def get_name(self) -> str:
|
|
"""Gibt Modulname zurück"""
|
|
return self.module_name
|