Hauptmenü

neues Modul DOIF

Begonnen von Damian, 21 Mai 2014, 15:53:18

Vorheriges Thema - Nächstes Thema

Brockmann

Zitat von: Damian am 11 August 2014, 12:33:31
Mit der neuen Version (1.61 im ersten Post) sollte es keinen Grund mehr geben auf Perl-if ausweichen zu müssen.  ;)
Funktioniert jetzt mit IF, wie man es erwartet.
Sieht gut aus, Danke!

cwagner

Hallo Damian,

DOIF verfüllt alle Versprechungen und gerade die ABlösung von AT bewährt sich aktuell bei mir besonders: Mein System ist wegen einer anderen Entwicklung instabil, es stürzt also gelegentlich ab: Bei AT bedeutete eine verpasste Zeit auch, dass der entsprechende Befehl ausfiel.

Bei meinen inzwischen 10 DOIFs werden die Bedingungen beim Neustart geprüft und entsprechend alle artig nachgeholt.

Das finde ich sehr fein - wie überhaupt die Vielseitigkeit des Moduls so groß ist, dass ich es vermutlich noch viel öfter einsetzen kann.

Danke!
Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

#347
Zitat von: cwagner am 12 August 2014, 07:23:59
Hallo Damian,

DOIF verfüllt alle Versprechungen und gerade die ABlösung von AT bewährt sich aktuell bei mir besonders: Mein System ist wegen einer anderen Entwicklung instabil, es stürzt also gelegentlich ab: Bei AT bedeutete eine verpasste Zeit auch, dass der entsprechende Befehl ausfiel.

Bei meinen inzwischen 10 DOIFs werden die Bedingungen beim Neustart geprüft und entsprechend alle artig nachgeholt.

Das finde ich sehr fein - wie überhaupt die Vielseitigkeit des Moduls so groß ist, dass ich es vermutlich noch viel öfter einsetzen kann.

Danke!
Christian

Ja, deswegen habe ich bei DOIF bewusst auf relative Zeitangaben verzichtet, denn es gibt oft Probleme nach einem Absturz, denn der relativ errechnete Zeitpunkt ändert sich dann.

In dem Zusammenhang, will ich auf die Frage nach "Schalten alle X-Tage" eingehen. Will man z. B. alle 2 Tage schalten, dann kann man das auch relativ einfach mit der Modulo-Operation % erledigen. Beispiel

([08:00] and $yday % 2 == 0)

so wird nur an geraden Tagen des Jahres geschaltet. Anstelle der 2 kann man beliebige Zahl einsetzen, z. B. alle zwei Wochen:

([08:00] and $yday % 14 == 0)

Diese Vorgehensweise ist nicht relativ und hat den Vorteil, dass auch nach dem Absturz der Zeitpunkt immer gleich ist und nicht, wie bei relativen Zeitangaben z. B. zwei mal am Tag die Blumen gegossen werden  :)

Es ist mir bewusst, dass es nach dem Jahreswechsel Verschiebungen gibt, das dürfte in den meisten Fälle unerheblich sein, da es nur einmal im Jahr passiert. In kritischen Fällen lässt sich auch so etwas durch entsprechende Abfragen umgehen.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Brockmann

Mir ist gestern noch eine Kleinigkeit aufgefallen, die aber wohl mit der Funktionsweise von DOIF zusammenhängt und sich nicht ändern lässt.
[Bad:humidity] = 60
[Datastore:BZ_H_1] = 59

([Bad:humidity])
   (
   setreading Datastore BZ_H_1 [Bad:humidity],
   set Schwellwert [Datastore:BZ_H_1]
   )

setzt Schwellwert nicht auf auf 60, wie man intuitiv erwarten würde, sondern auf 59.
Wenn das DOIF getriggert wird, wird in dem Moment alles in eckigen Klammern interpretiert und intern durch die in diesem Moment geltenden Werte ersetzt. Ändert man diese Werte dann innerhalb des DOIFs, bekommt das DOIF davon nichts mehr mit und rechnet mit den "alten" Werten weiter.
Intern geht das Ganze quasi so an den Interpreter:

(60)
   (
   setreading Datastore BZ_H_1 60,
   set Schwellwert 59
   )


Dieses Verhalten dürfte sich jederzeit umgehen lassen notfalls indem man per ReadingsVal direkt ausliest. Oder in diesem einfachen (konstruierten) Beispiel bei der zweiten Zuweisung halt wieder den Eingangswert nimmt und nicht den Zwischenspeicher. Ist also kein Problem, nur eine kleine Stolperfalle, auf die man stoßen kann.

Also: Wenn man in einem DOIF (oder auch IF) in ein Reading schreibt, sollte man dieses Reading dahinter nicht mehr per [] verwenden, sondern nur per ReadingsVal, richtig?

Damian

#349
Zitat von: Brockmann am 12 August 2014, 08:54:15
Mir ist gestern noch eine Kleinigkeit aufgefallen, die aber wohl mit der Funktionsweise von DOIF zusammenhängt und sich nicht ändern lässt.
[Bad:humidity] = 60
[Datastore:BZ_H_1] = 59

([Bad:humidity])
   (
   setreading Datastore BZ_H_1 [Bad:humidity],
   set Schwellwert [Datastore:BZ_H_1]
   )

setzt Schwellwert nicht auf auf 60, wie man intuitiv erwarten würde, sondern auf 59.
Wenn das DOIF getriggert wird, wird in dem Moment alles in eckigen Klammern interpretiert und intern durch die in diesem Moment geltenden Werte ersetzt. Ändert man diese Werte dann innerhalb des DOIFs, bekommt das DOIF davon nichts mehr mit und rechnet mit den "alten" Werten weiter.
Intern geht das Ganze quasi so an den Interpreter:

(60)
   (
   setreading Datastore BZ_H_1 60,
   set Schwellwert 59
   )


Dieses Verhalten dürfte sich jederzeit umgehen lassen notfalls indem man per ReadingsVal direkt ausliest. Oder in diesem einfachen (konstruierten) Beispiel bei der zweiten Zuweisung halt wieder den Eingangswert nimmt und nicht den Zwischenspeicher. Ist also kein Problem, nur eine kleine Stolperfalle, auf die man stoßen kann.

Also: Wenn man in einem DOIF (oder auch IF) in ein Reading schreibt, sollte man dieses Reading dahinter nicht mehr per [] verwenden, sondern nur per ReadingsVal, richtig?

ja, das ist der Tatsache geschuldet, dass ich den kompletten String zuerst auswerte und dann an die FHEM-Ausführungsfunktion übergebe. Selbst das könnte ich zukünftig regeln, indem ich die einzelnen Befehle bis zum Komma einzeln auswerte und an FHEM übergebe. Solange kannst du dir in solchen Fällen einfach behelfen, indem du den vorherigen Wert nimmst.

setreading Datastore BZ_H_1 [Bad:humidity],
set Schwellwert [Bad:humidity1]

Ich werde es aber noch anpassen, weil es eine wichtige Eigenschaft des intuitiven Programmierens ist.

Bei IF wird es sich aber nicht machen lassen, da ich dort den kompletten Perl-if zusammen bauen.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

satprofi

Hallo.
Ich habe hiermit ein Problem

([Bewohner:state] eq "present" and [08:00-20:59:54]) (set Steckdose2 on)
    DOELSEIF ([Status_Xpeed:state] eq "on" and ($hms ge "19:00" or $hms le "07:59:59")) (set Steckdose2:FILTER=STATE!=on on)  DOELSEIF ([Mediacenter_manuOn:state] eq "on") (set Steckdose2:FILTER=STATE!=on on)
DOELSE (set Steckdose2 off)


Trotz aktiviertem Mediacenter_manuOn, schaltet mir DOIF die Steckdose off.
why?
Das ganze mit IF klappt zwar, aber da wird das Mediacenter_manuOn gar nicht ausgewertet.

gruss
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

tekki

Hallo Damian,

ich möchte mich an dieser Stelle für die super Arbeit und das klasse Modul bedanken. Es erleichtert mir meine Umsetzungen erheblich  :)

In den Posts habe ich von der Errormeldung beim Einsatz von Pushmsg gelesen. Ich setze es auch ein und bekommen mit Version 1.61 auch noch den Error. Die Mitteilung wird aber geschickt.

DEF 
([05:05] or [12:00] or [19:00]) (set Push_msg msg 'Test' 'Das ist ein Test'' '' 0 '')

error set Push_msg msg 'Test' 'Das ist ein Test'' '' 0 '': OK

Ich kann damit leben, wollte es Dir nur zur Info mitteilen.

Grüße
Ralph

Damian

Zitat von: satprofi am 12 August 2014, 18:43:27
Hallo.
Ich habe hiermit ein Problem

([Bewohner:state] eq "present" and [08:00-20:59:54]) (set Steckdose2 on)
    DOELSEIF ([Status_Xpeed:state] eq "on" and ($hms ge "19:00" or $hms le "07:59:59")) (set Steckdose2:FILTER=STATE!=on on)  DOELSEIF ([Mediacenter_manuOn:state] eq "on") (set Steckdose2:FILTER=STATE!=on on)
DOELSE (set Steckdose2 off)


Trotz aktiviertem Mediacenter_manuOn, schaltet mir DOIF die Steckdose off.
why?
Das ganze mit IF klappt zwar, aber da wird das Mediacenter_manuOn gar nicht ausgewertet.

gruss

So wie du es definiert hast, ist es  sogar ziemlich wahrscheinlich. Entscheidend ist folgender Absatz aus der Doku:

Die Angaben werden immer von links nach rechts abgearbeitet. Es wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist. Hinzu kommt, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event auch ein Device beinhalten (Angaben in eckigen Klammern).

Jetzt überlege mal, was ausgeführt wird um z. B. 08:00 Uhr, wenn Bewohner:state nicht present ist und Mediacenter_manuOn:state on.
... dein ELSE-Fall.

Gruß

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: tekki am 12 August 2014, 19:50:04
Hallo Damian,

ich möchte mich an dieser Stelle für die super Arbeit und das klasse Modul bedanken. Es erleichtert mir meine Umsetzungen erheblich  :)

In den Posts habe ich von der Errormeldung beim Einsatz von Pushmsg gelesen. Ich setze es auch ein und bekommen mit Version 1.61 auch noch den Error. Die Mitteilung wird aber geschickt.

DEF 
([05:05] or [12:00] or [19:00]) (set Push_msg msg 'Test' 'Das ist ein Test'' '' 0 '')

error set Push_msg msg 'Test' 'Das ist ein Test'' '' 0 '': OK

Ich kann damit leben, wollte es Dir nur zur Info mitteilen.

Grüße
Ralph

Dazu habe ich bereits schon etwas geschrieben. Das Problem ist, dass set Push_msg einen Returnwert "OK" liefert, statt 0, "" oder undef. Das wird als Fehler interpretiert.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Roaster

Zitat von: Damian am 24 Juni 2014, 21:01:47
Zum Installieren Modul 98_DOIF.pm ins FHEM-Verzeichnis kopieren und in der Kommandozeile reload 98_DOIF.pm eingeben.
Hi,

ich habe so meine lieben Probleme das Modul zu installieren. Lt. Anleitung oben ist das Module ins Verzeichnis /opt/fhem/FHEM kopiert worden. Die Berechtigungen sollten auch korrekt gesetzt sein:
Zitat-rw-r--r-- 1 fhem dialout 32873 Aug 12 21:53 98_DOIF.pm
Aber nach dem reload 98_DOIF.pm in der Kommandozeile kann ich immer noch nicht den neuen DOIF verwenden. FHEM kennt diesen DOIF-Befehl schlichtweg nicht.

Was mache ich denn falsch?

Damian

Zitat von: Roaster am 12 August 2014, 22:22:50
Hi,

ich habe so meine lieben Probleme das Modul zu installieren. Lt. Anleitung oben ist das Module ins Verzeichnis /opt/fhem/FHEM kopiert worden. Die Berechtigungen sollten auch korrekt gesetzt sein:Aber nach dem reload 98_DOIF.pm in der Kommandozeile kann ich immer noch nicht den neuen DOIF verwenden. FHEM kennt diesen DOIF-Befehl schlichtweg nicht.

Was mache ich denn falsch?

Was hast du probiert zu definieren mit dem Modul?

Gruß

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

satprofi

Zitat von: Damian am 12 August 2014, 21:26:57
So wie du es definiert hast, ist es  sogar ziemlich wahrscheinlich. Entscheidend ist folgender Absatz aus der Doku:

Die Angaben werden immer von links nach rechts abgearbeitet. Es wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist. Hinzu kommt, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event auch ein Device beinhalten (Angaben in eckigen Klammern).

Jetzt überlege mal, was ausgeführt wird um z. B. 08:00 Uhr, wenn Bewohner:state nicht present ist und Mediacenter_manuOn:state on.
... dein ELSE-Fall.

Gruß

Damian


alles klar, thx.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Damian

#357
Zitat von: satprofi am 13 August 2014, 06:04:41

alles klar, thx.

Das was du willst, wird so besser funktionieren:

(([Bewohner:state] eq "present" and [08:00-21:00]) or ([Status_Xpeed:state] eq "on" and [19:00-08:00]) or  [Mediacenter_manuOn:state] eq "on") (set Steckdose2 on) DOELSE (set Steckdose2 off)

Wichtig zu wissen ist, dass 08:00-21:00 um 21:00 Uhr nicht mehr wahr ist, ebenso ist 19:00-08:00 um 08:00 nicht mehr wahr. Zeitintervall-Angaben bedeuten "bis ausschließlich".

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Roaster

#358
Zitat von: Damian am 12 August 2014, 22:25:03
Was hast du probiert zu definieren mit dem Modul?

Ich hab's gerade nicht bei der Hand hier in der Arbeit, jedoch bekomme ich gleich beim Speichern der fhem.cfg, dass das Statement DOIF nicht bekannt sei. Ich gehe davon aus, dass dies somit ein globales Problem ist mit meiner Installation als vielmehr ein Problem mit den verwendeten Zeilen innerhalb der fhem.cfg.

Ich werde mal eines der (einfachen) Beispiele vom ersten Posting verwenden um zu prüfen, ob DOIF überhaupt verwendet wird.

Michael

ph1959de

Hast Du mal versucht, das DOIF über das Befehls-Eingabefeld zu definieren? Gleiche Reaktion/Fehlermeldung?
Aktives Mitglied des FHEM e.V. | Moderator im Forenbereich "Wiki"