Siehe Stichworte im Betreff: Ich bastel mir gerade ein Dashboard, auf dem ich einige Werte aus dem iobroker auslesen und anzeigen möchte. Mittels SimpleApi habe ich erste Erfolge, bei denen ich mir z.B. die aktuellen und Ziel-Temperaturen von 2 3D-Druckern (octoprint.0 und .1) und von 3 Heizkörper-Thermostaten (fritzdect.0.DECT_xxx) anzeigen lasse.
Nun ist es aber sehr "ruckelig", wenn ich per http-Aufruf alle Werte einzeln abrufe, wenn sie angezeigt werden sollen. (Das Dashboard hat mehrere Seiten, durch die geblättert werden kann.) Also dachte ich mir, ich bastel mir eine Daten-Struktur, die "im Hintergrund" per Timer auf aktuellem Stand gehalten wird. Das Intervall kann dabei recht unterschiedlich sein. Heizkörper sind alle 60 Sekunden eher zu viel, Jog-Positionen des Druckers in 1 Sekunde schon fast zu langsam aktualisiert. Aber ok, das wäre Finetuning später.
Ich hab mir jetzt recht aufwändig Klassen gebastelt, die die Struktur im iobroker abbilden. Also z.B. sowas wie:
Code: Alles auswählen
# octoprint.0
class cls_octoprint():
# -----------------------------------------------------------------------------
# octoprint.0.command
class cls_command():
# -----------------------------------------------------------------------------
# octoprint.0.command.jog
class cls_jog():
x = None
[ ... ]
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
def readall( self ):
getList = [ self.channel + ".x", self.channel + ".y", self.channel + ".z" ]
[ ... ]
self.x = valList[0]
[ ... ]
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
def get( self, node ): # e.g. "x"
self.channel = parent().channel + ".jog" # e.g. "octoprint.0.command.jog"
print( "node: " + self.channel + "." + node ) # e.g. "octoprint.0.command.jog.x"
[ ... ]
if ( node == "x" ):
retval = self.x
[ ... ]
return retval
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
def __init__( self ):
pass
# end cls_jog
# -----------------------------------------------------------------------------
jog = cls_jog()
[ ... ]
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
def readall( self ):
[ ... ]
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
def get( self, node ): # e.g. "jog.x"
[ ... ]
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
def __init__( self ):
pass
# end cls_command
Code: Alles auswählen
class cls_iobroker():
octoprint0 = None
octoprint1 = None
fritzdect0 = None
def __init__():
octoprint0 = cls_octoprint();
octoprint0.setinstance( 0 )
octoprint1 = cls_octoprint();
octoprint1.setinstance( 1 )
fritzdect0 = cls_fritzdect();
Das Hauprogramm erzeugt mittels
Code: Alles auswählen
iob = cls_iobroker
Code: Alles auswählen
bed0tmp = iob.get( "octoprint", 0, "tools.bed.actualTemperature" )
Nun frage ich mich, ob ich so auf dem richtigen Weg bin oder ob das alles eher totaler Murks ist. Tatsache ist: Spätere Anpassungen, wenn sich in der iobroker Struktur der Daten was ändert, sind schon eher aufwändig. Und mich stört auch der Pflegeaufwand der Funktionen, z.B. get(), in den einzelnen Klassen. Die machen prinzipiell ja das gleiche, aber eben auch individuell. Da bin ich auch am Überlegen, ob man das nicht generischer bauen könnte.
Was meint ihr dazu?
Michael