Hallo!
Scheinbar sind meine smarthome.py Kenntnisse ein wenig eingerostet. Zumindest kriege ich eine "komplexere" Logik nicht hin und finde auch in der der Doku nichts erhellendes.
Idee ist es, verschiedene Logiken relativ übersichtlich als Zustandsmaschine zu beschreiben. Hier als Beispiel von einer Raffstore-Steuerung. Basis-Klassen für "StateMachine" und "State", davon abgeleitete Klassen "RaffstoreSteuerung" bzw. "Tag"/"Nacht".
In der normalen Python3-Console funktioniert der Code (bzw. mit geringen Anpassungen da außerhalb der dh.py Umgebung), in sh.py wird nocht der Konstruktor von "RaffstoreSteuerung" aufgerufen, jedoch findet dieser die Klasse "Nacht" nicht. Ich schätze, dass dies an dem Kompilieren der Logik liegt oder ähnlich.
Fehlermeldung:
Jemand eine Idee? (smarthomeNG, aktueller develop)
Grüße
Robert
Scheinbar sind meine smarthome.py Kenntnisse ein wenig eingerostet. Zumindest kriege ich eine "komplexere" Logik nicht hin und finde auch in der der Doku nichts erhellendes.
Idee ist es, verschiedene Logiken relativ übersichtlich als Zustandsmaschine zu beschreiben. Hier als Beispiel von einer Raffstore-Steuerung. Basis-Klassen für "StateMachine" und "State", davon abgeleitete Klassen "RaffstoreSteuerung" bzw. "Tag"/"Nacht".
Code:
#!/usr/bin/env python3 class StateMachine: def __init__(self, initialState): self.currentState = initialState self.currentState.run() def runAll(self, inputs): for i in inputs: newState = self.currentState.next(i) if (newState != self.currentState): logger.info("Transition \"{0} -> {1}\"".format(self.currentState, newState)) self.currentState = newState self.currentState.run() class State: def __init__(self, stateMachine): assert issubclass(type(stateMachine), StateMachine) self.stateMachine = stateMachine def __str__(self): return self.__class__.__name__ def run(self): assert 0, "run not implemented" def next(self, input): assert 0, "next not implemented" class RaffstoreSteuerung(StateMachine): def __init__(self, sh): # Initial state self.nacht = Nacht(self) self.tag = Tag(self) self.sh = sh super().__init__(self.nacht) class Nacht(State): def run(self): pass def next(self, input): return self.stateMachine.tag class Tag(State): def run(self): pass def next(self, input): return self.stateMachine.nacht basepath = "Wohnzimmer.Raffstore.Automatik" baseitem = sh.return_item(basepath) if not hasattr(baseitem, "rs"): baseitem.rs = RaffstoreSteuerung(sh)
Fehlermeldung:
Code:
2016-12-18 18:32:33 ERROR raffstoren_steuerung_wohnzimmer Logic: raffstoren_steuerung_wohnzimmer, File: /usr/local/smarthome/logics/raffstoren_steuerung_wohnzimmer.py, Line: 34, Method: __init__, Exception: name 'Nacht' is not defined Traceback (most recent call last): File "/usr/local/smarthome/lib/scheduler.py", line 355, in _task exec(obj.bytecode) File "/usr/local/smarthome/logics/raffstoren_steuerung_wohnzimmer.py", line 58, in <module> baseitem.rs = RaffstoreSteuerung(sh) File "/usr/local/smarthome/logics/raffstoren_steuerung_wohnzimmer.py", line 34, in __init__ self.nacht = Nacht(self) NameError: name 'Nacht' is not defined
Grüße
Robert
Kommentar