#!/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