Hi zusammen,
ich arbeite bisher größtenteils mit eigenen Utils, in denen ich verschiedene if Abfragen durchführe, Variablen umforme etc.. Ausgelöst werden die durch notifys oder durch Userreadings.
Nun habe ich mich ein wenig mit DOIF beschäftigt und frage mich, ob DOIF nicht die schönere/bessere Lösung ist. Insbesondere die hinterlegte Statemachine mit cmd_1, cmd_2 etc. gefällt mir. Allein die Umformerei der Variablen stelle ich mir schwerer vor mithilfe von DOIF.
Hat eine der beiden Herangehensweise irgendwelche Vorteile oder Nachteile? Erzeugt der Perl-Code in den Utils evtl. mehr Last?
Gruß
Obi
Zitat von: der_oBi am 26 September 2016, 07:06:08
Hi zusammen,
ich arbeite bisher größtenteils mit eigenen Utils, in denen ich verschiedene if Abfragen durchführe, Variablen umforme etc.. Ausgelöst werden die durch notifys oder durch Userreadings.
Nun habe ich mich ein wenig mit DOIF beschäftigt und frage mich, ob DOIF nicht die schönere/bessere Lösung ist. Insbesondere die hinterlegte Statemachine mit cmd_1, cmd_2 etc. gefällt mir. Allein die Umformerei der Variablen stelle ich mir schwerer vor mithilfe von DOIF.
Hat eine der beiden Herangehensweise irgendwelche Vorteile oder Nachteile? Erzeugt der Perl-Code in den Utils evtl. mehr Last?
Gruß
Obi
Von der Performance wirst du keine nennenswerten Unterschiede feststellen.
Viele Ausdrücke sind kürzer zu formulieren, weil es für typische Ausdrücke, die man in FHEM benötigt, eigene Syntax gibt (Angaben in eckigen Klammern).
Ich habe es in erster Linie deswegen programmiert, weil mir für typische Automatisierungsaufgaben der ständige Wechsel zwischen Perl und FHEM zu umständlich erschien.
DOIF kann insbesondere eine Sache, die du mit at, notify und Perl in einer Definition nicht ohne weiteres schaffst - es kann
gleichzeitig auf Ereignisse
und auf Zeittrigger reagieren.
Allerdings ist auch beim DOIF, insbesondere in den Bedingungen das Verständnis von Perl nützlich.
Welchen Weg du einschlägst, musst du schlussendlich selbst für dich entscheiden.
Gruß
Damian
Was ich vergessen habe zu erwähnen:
Mir gefällt an DOIF auch die Möglichkeit, Befehle zu verzögern.
Wie ich das in Perl umsetze (ohne FHEM zu blocken), ist mir noch nicht ganz klar. Meine einzige Idee wäre, ein einmaliges at zu definieren in dem der Befehl ausgeführt wird. Dieses müsste ich dann aber löschen, wenn innerhalb der Verzögerungszeit die Bedingung nicht mehr wahr ist. Irgendwie umständlich...
Gibt es da eine bessere Lösung in Perl Utils?
Zitat von: der_oBi am 26 September 2016, 14:33:03
Was ich vergessen habe zu erwähnen:
Mir gefällt an DOIF auch die Möglichkeit, Befehle zu verzögern.
Wie ich das in Perl umsetze (ohne FHEM zu blocken), ist mir noch nicht ganz klar. Meine einzige Idee wäre, ein einmaliges at zu definieren in dem der Befehl ausgeführt wird. Dieses müsste ich dann aber löschen, wenn innerhalb der Verzögerungszeit die Bedingung nicht mehr wahr ist. Irgendwie umständlich...
Gibt es da eine bessere Lösung in Perl Utils?
Normalerweise musst du dich selbst um das Löschen kümmern, ob bei at, sleep oder wenn du es selbst in Perl programmieren willst. Genau das habe ich auch programmiert - im DOIF-Modul ;)
Die Verzögerungen im DOIF sind also auch nur FHEM sleep befehle? Perl sleep blockt ja bekanntlich FHEM komplett, oder?
Gesendet von iPhone mit Tapatalk
Zitat von: der_oBi am 26 September 2016, 17:05:43
Die Verzögerungen im DOIF sind also auch nur FHEM sleep befehle? Perl sleep blockt ja bekanntlich FHEM komplett, oder?
Gesendet von iPhone mit Tapatalk
DOIF ist in Perl programmiert und das benutzt Funktionsaufrufe, die in fhem.pl zur Verfügung gestellt werden. Dieselben Aufrufe benutzen natürlich alle FHEM-Module oder FHEM-Befehle wie auch FHEM-Sleep und at. FHEM-Sleep blockiert nicht, wenn man unmittelbar danach mit Semikolon den Befehl angibt.
Aber um einen Befehl um zB 20 min zu verzögern ist doch sauberer mit at statt mit sleep zu lösen, oder?
Gesendet von iPhone mit Tapatalk
Zitat von: der_oBi am 27 September 2016, 06:58:54
Aber um einen Befehl um zB 20 min zu verzögern ist doch sauberer mit at statt mit sleep zu lösen, oder?
Gesendet von iPhone mit Tapatalk
Hinter at und FHEM-sleep steckt der selbe Funktionsaufruf.
Verdammte Axt!
Wieder was gelernt :)
Ich werde mir am WE mal anschauen ob ich meine bisherigen Utils auch mit DOIF umsetzen könnte.
Um meine Variablen umzuformen etc könnte ich ja auch per DOIF eine Perl-Sub aufrufen...
Gesendet von iPhone mit Tapatalk
Ich sehe keinen zwingenden Grund alles umzurüsten.
Ich habe bei mir Notifies für einfache Dinge, welche direkt einfache Befehle triggern.
At wird für einfache reine Zeitsteuerung verwendet.
DOIF für alles was in den anderen Fällen nicht mit einem einzigen notifiy / at funktionieren würde.
Der große Vorteil ist hier, alles an einem Fleck zu haben.
Oder eben Lösungen die wirklich eine Art State Machine sind.
MyUtils wird dennoch stark genutzt bei mir für Hilfsfunktionen, welche ich öfters benötige.
Diese Funktionen rufe ich dann in meinen Notifies / Doifs auf.
Z.B. eine Funktion, welche ein Array der Zuhause anwesenden Bewohner zurückliefert, oder den letzten Bewohner der das Haus verlassen hat.
Eine andere Funktion zum senden von PushMessages auf Handys.
Wieder eine andere liefert alle offenen Fenster etc.
So lassen sich Ereignisse und Reaktionen mit diesen Funktionen z.B. in DOIFs sehr leicht verknüpfen, ohne dass das DOIF durch den ganzen Code dahinter unübersichtlich wird.
Zitat von: Thyraz am 27 September 2016, 09:05:49
Ich sehe keinen zwingenden Grund alles umzurüsten.
Ich habe bei mir Notifies für einfache Dinge, welche direkt einfache Befehle triggern.
At wird für einfache reine Zeitsteuerung verwendet.
Umrüsten würde ich auch nicht (außer ich mache gerade eh größere Änderungen) aber alles was neu ist, mache ich mittlerweile mit DOIF. Die Erfahrung zeigt, dass aus der einfachen Zeitsteuerung schnell was komplexeres wird...
Zitat von: Thyraz am 27 September 2016, 09:05:49
MyUtils wird dennoch stark genutzt bei mir für Hilfsfunktionen, welche ich öfters benötige.
dito