Hallo zusammen,
mir ist es in letzter Zeit häufiger im Kopf herumgegangen und deshalb wollte ich das jetzt einfach mal niederschreiben:
Wofür wird der get-Befehl denn heute so verwendet und wofür ist er heutzutage eigentlich auch gedacht?
In der Commandref steht halt nur sowas wie:
Zitat
Ask a value directly from the device, and wait for an answer
Ich interpretiere das so, dass man hier ursprünglich eine direkte Abfrage auf ein angebundenes Hardware Device machte und auf dessen Rückgabe so lange wartete, bis man es dem User dann auch zurückschicken konnte. Sprich: Diese Abfrage sollte wohl bewusst blockierend sein. Ist das noch zeitgemäß und macht das überhaupt noch ein Modul bzw. wird es dann auch sinnvoll benutzt?
Weshalb ich aber eigentlich frage: Oftmals administrative Modulkommandos sind häufig als set-Befehl implementiert und ich kann deren Verwendung über allowed eingrenzen, wenn ich für Nicht-Admins eine eigene FHEMWEB Instanz verwende. Diese eigentlich aber administrativen set-Befehle sind dann trotzdem verfügbar, weshalb ich mir inzwischen bei der Implementierung neuer Befehle sehr genau überlege, ob sie für Admins sind und deshalb als get-Befehl bereitgestellt werden sollen. Beispielsweise habe ich bei der Überarbeitung von ONKYO_AVR den statusRequest-Setter auf get umgestellt und überlege auch, ob ich das bei Gelegenheit bei allen anderen Modulen so mache. Auch wenn dann natürlich der Sprachgebrauch von "set" und "get" nicht mehr ganz stimmig ist, so erscheint es mir trotzdem sinnvoll.
Deshalb wollte ich einfach mal wissen, ob ihr den get-Befehl auch eher als "universell" bzw. negativ ausgedrückt "passt sonst nirgends rein" seht und wenn ja, ob diese Ansicht denn auch so richtig ist?
Gruß
Julian
Manchmal will man was vom Geraet abfragen, und da ist eine direkte Antwort praktischer, als erst die Info zu bestellen, und dann per list/etc nach dem Ergebnis zu suchen.
Da FHEM nicht blockieren darf, sollte man bei get die Funktion asyncOutput verwenden. Dafuer merkt man, wer das get bestellt hat, und man wartet nicht aktiv auf die Antwort, sondern man ruft asyncOutput mit Adressat und Ergebnis auf, wenn die Antwort da ist. Man sollte mit InternalTimer auch eine Timeout definieren. Funktioniert nur fuer die Frontend Module, die ein AsyncOutputFn implementieren, das ist z.Zt. FHEMWEB und telnet.
Ah Danke Rudi, das ist ja schlau 8)
Zugegeben mein Beitrag war nicht besonders auf eine Frage fokussiert, aber diese ist damit definitiv schonmal sehr wertvoll beantwortet. Merci!
Zitat von: rudolfkoenig am 21 August 2016, 19:20:25
Manchmal will man was vom Geraet abfragen, und da ist eine direkte Antwort praktischer, als erst die Info zu bestellen, und dann per list/etc nach dem Ergebnis zu suchen.
Da FHEM nicht blockieren darf, sollte man bei get die Funktion asyncOutput verwenden.
Hi Rudolf, Hi Julian
In my module 00_THZ, both "get and set" block FHEM for 4 to 40ms (the set is always followed by a get to confirm the setted value).
I always paid attention that FHEMWEB and Telnet get a synchronous answer.
Which module can you suggest me to take "inspiration" for AsyncOutputFn?
thanks
immi
ZitatWhich module can you suggest me to take "inspiration" for AsyncOutputFn?
You want to take inspiration for using asyncOutput(), as AsyncOutputFn is meant for modules facing the user (the other side of asyncOutput).
There are not a lot modules using asyncOutput(): ZWave, LIGHTIFY, plex and HMInfo. I only know ZWave, and since it is quite large, it is not ideal as a template. There is even some "politically incorrect" mixing of modules involved: a set command for the ZWDongle module (set addNode on) will report its result via asyncOutput() when the result is parsed in the ZWave module.
ich verwende set für kommandos als device und wenn der datenfluss hauptsächlich von FHEM zum gerät geht.
get wenn der datenfluss in richtung FHEM bzw. zum anwender geht.
zum nicht blockieren hatte rudi ja oben schon geschrieben.
das umfangreichste beispiel dazu ist vermutlich das plex modul. hier kann man sich z.b. per geht durch die komplette mediathek hangeln. per telnet interaktiv und per web auch über anklickbare links in der ausgabe die dann in popups erscheint. alles nicht blockierend.
gruss
andre