Hauptmenü

neues Modul DOIF

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

Vorheriges Thema - Nächstes Thema

satprofi

hallo.
es liegt nicht an DOIF, sondern an fhem selbst. denn werte die keine zustandsänderung nach reboot des systems haben, werden mit -???- gelistet.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Damian

Zitat von: satprofi am 20 Juli 2014, 19:33:57
hallo.
es liegt nicht an DOIF, sondern an fhem selbst. denn werte die keine zustandsänderung nach reboot des systems haben, werden mit -???- gelistet.

Wenn du vor dem Reboot save config machst, dann sollte der Reading erhalten bleiben.

Gruß

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

TecCheck

Hallo zusammen,
hallo Damian,

ich habe jetzt die neueste Version DOIF (1.5)  installiert und es läuft,
soweit ich das feststellen kann, bisher alles bestens.

habe bisher 3 DOIF's laufen, von denen zwei  5 notify's ersetzen und eins direkt als DOIF umgesetzt wurde.

Dein Modul wird ja immer universeller.
Du solltest auf jeden Fall nach dem einchecken (das kommt, da bin ich sicher) neben einem Eintrag in die CommandRef eine WikiSeite mit allen Beispielen hier aus dem Post in Betracht ziehen. Du hast sicher viel Arbeit in dieses Modul investiert und es wäre zu schade, wenn es aus Unkenntniss kaum genutzt würde.

So, jetzt mein (Luxus)Problem:
Ich möchte bei jeder Statusänderung (egal welche Änderung) einer meiner Tür/Fenstersensoren
einen Einschaltbefehl an ein Display senden.
Ist es mit DOIF möglich, dies zu erreichen, ohne jeden Sensor einzeln aufzuzählen wie:
DOIF ([tf_Sens1] eq "on"  or [tf_Sens2] eq "on"  or   [tf_Sens3] eq "on" or . . . . .) (set display on_for_timer 20)

z.B. in dem man auf eine Statusänderung in einer Gruppe triggert wie zb.:

DOIF ([TF_SensorenGruppe] eq "on"  or  [TF_SensorenGruppe] eq "off") (set display on_for_timer 20)

oder kannst du eine solche funktion einbauen?
Ist das 'gemeinsame triggern' überhaupt in fhem möglich??

Sorry,  :-[  wollte (als NichtProgrammierer hab ich keine Ahnung wieviel Arbeit das ist) nicht unverschämt sein, könnte aber nützlich sein.

Jedenfalls DANKE für dein Modul

Schöne Grüße
Wolfgang
Intel NUC mit Ubuntu als FHEM-Server,
CUL  868, RFXTRX 433, Jeelink-PCA,ZWDongle, HMLan
Aktivlautsprecher über LineIn und Display per HDMI am NUC,
diverse FS20 und Intertechno - Komponenten, Oregon Temp-Hum-Sensoren, HomeMatic, PCA301, KS300,Sonos, ZWave, Alexa,Echo's

Damian

#258
Zitat von: TecCheck am 20 Juli 2014, 22:21:54
Hallo zusammen,
Du solltest auf jeden Fall nach dem einchecken (das kommt, da bin ich sicher) neben einem Eintrag in die CommandRef eine WikiSeite mit allen Beispielen hier aus dem Post in Betracht ziehen. Du hast sicher viel Arbeit in dieses Modul investiert und es wäre zu schade, wenn es aus Unkenntniss kaum genutzt würde.

Da brauchst du dir keine Sorgen zu machen. Die Doku aus dem ersten Post kommt komplett mit allen Beispielen in die Commandref. So habe ich auch beim THRESHOLD verfahren. Wiki mag ganz nett sein, ich finde aber ausführliche Beispiele gehören in die Doku, wo man auch zuerst nachschaut.

Ich bin mir jetzt schon sicher, dass DOIF das THRESHOLD Modul, was nicht ganz unbekannt ist, um ein Vielfaches in der Nutzung übertrumpfen wird, da es viel universeller ist.



Zitat
So, jetzt mein (Luxus)Problem:
Ich möchte bei jeder Statusänderung (egal welche Änderung) einer meiner Tür/Fenstersensoren
einen Einschaltbefehl an ein Display senden.
Ist es mit DOIF möglich, dies zu erreichen, ohne jeden Sensor einzeln aufzuzählen wie:
DOIF ([tf_Sens1] eq "on"  or [tf_Sens2] eq "on"  or   [tf_Sens3] eq "on" or . . . . .) (set display on_for_timer 20)

z.B. in dem man auf eine Statusänderung in einer Gruppe triggert wie zb.:

DOIF ([TF_SensorenGruppe] eq "on"  or  [TF_SensorenGruppe] eq "off") (set display on_for_timer 20)

oder kannst du eine solche funktion einbauen?
Ist das 'gemeinsame triggern' überhaupt in fhem möglich??


Dafür brauche ich nichts zu programmieren. Du fasst deine Sensoren über "structure" zu einer Gruppe zusammen und bestimmst, was passieren soll (z. B. alle off -> gruppe off) und benutzt dann deine structure bei DOIF als Gruppe.

Gruß

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

TecCheck

Dankeschön, werde das morgen mal ausprobieren.

Das nenne ich mal Support!
Da kann sich manche Hotline ein paar Scheiben von abschneiden.

Schönen Abend noch!

Wolfgang
Intel NUC mit Ubuntu als FHEM-Server,
CUL  868, RFXTRX 433, Jeelink-PCA,ZWDongle, HMLan
Aktivlautsprecher über LineIn und Display per HDMI am NUC,
diverse FS20 und Intertechno - Komponenten, Oregon Temp-Hum-Sensoren, HomeMatic, PCA301, KS300,Sonos, ZWave, Alexa,Echo's

Damian

Zitat von: TecCheck am 20 Juli 2014, 22:53:22
Das nenne ich mal Support!
Da kann sich manche Hotline ein paar Scheiben von abschneiden.

Na denn, und das mache ich nebenbei in meinem Urlaub  :)

Gruß

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

Hoeness

Hi,

Sorry für meinen späten Kommentar zu euren Antworten.

Ersteinmal möchte ich danke für eure Bemühungen sagen.

Da mein letzter Post ein paar Seiten her ist hier nochmal mein Problem:

Zitat von: Hoeness am 12 Juli 2014, 22:27:16
Hi,

ich bins mal wieder ;-)

Ich möchte mit DOIF ein dummy toggeln (aus/an):

Der Trigger hierzu kommt von einem Taster über GPIO: hier die Config:

######## Input 4 -Beregnung
define In4_Beregnung RPI_GPIO 10
attr In4_Beregnung active_low no
attr In4_Beregnung debounce_in_ms 50
attr In4_Beregnung devStateIcon aus:rain-icon_off an:rain-icon_on
attr In4_Beregnung direction input
attr In4_Beregnung eventMap on:an off:aus
attr In4_Beregnung group 1_Input
attr In4_Beregnung interrupt rising
attr In4_Beregnung pud_resistor down
attr In4_Beregnung room Bewässerung_DOIF
attr In4_Beregnung webCmd an:aus


Der dummy ist wie folgt konfiguriert:

######## Beleuchtung Terasse
define man_Bewaesserung dummy
attr man_Bewaesserung group 2_Output
attr man_Bewaesserung room Bewässerung_DOIF
attr man_Bewaesserung webCmd an:aus
attr man_Bewaesserung devStateIcon aus:Lampe_off an:Lampe_on
attr man_Bewaesserung eventMap on:aus off:an


Mein DOIF sieht wie folgt aus:

define n_In4_Beregnung DOIF ([In4_Beregnung] eq "an" and [man_Bewaesserung] eq "aus") (set man_Bewaesserung an) DOELSEIF ([In4_Beregnung] eq "an" and [man_Bewaesserung] eq "an") (set man_Bewaesserung aus)

Irgendwie stehe ich hier auf dem Schlauch.

Hat sich noch nicht viel geändert. Ich habe heute wieder ein paar Stunden experimentiert. Bin aber nicht weitergekommen.
Im Event Monitor kann ich sehen, dass das dummy man_Bewaesserung aus und danach sofort wieder eingeschaltet wird. Warum ist mir schleierhaft.

2014-07-20 23:38:21 DOIF n_In4_Beregnung cmd_1
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_cmd: 1
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_cmd_event: man_Bewaesserung
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_error: no error
2014-07-20 23:38:21 dummy man_Bewaesserung aus
2014-07-20 23:38:21 dummy man_Bewaesserung an
2014-07-20 23:38:21 DOIF n_In4_Beregnung cmd_2
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_cmd: 2
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_cmd_event: In4_Beregnung
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_error: no error
2014-07-20 23:38:21 RPI_GPIO In4_Beregnung Pinlevel: high
2014-07-20 23:38:21 RPI_GPIO In4_Beregnung an
2014-07-20 23:38:22 RPI_GPIO In4_Beregnung Pinlevel: low
2014-07-20 23:38:22 RPI_GPIO In4_Beregnung aus
2014-07-20 23:38:22 RPI_GPIO In4_Beregnung Langpress: off


Vielleicht kann mir jemand helfen.

Damian

#262
Zitat von: Hoeness am 21 Juli 2014, 00:11:36
Hi,

Sorry für meinen späten Kommentar zu euren Antworten.

Ersteinmal möchte ich danke für eure Bemühungen sagen.

Da mein letzter Post ein paar Seiten her ist hier nochmal mein Problem:

Hat sich noch nicht viel geändert. Ich habe heute wieder ein paar Stunden experimentiert. Bin aber nicht weitergekommen.
Im Event Monitor kann ich sehen, dass das dummy man_Bewaesserung aus und danach sofort wieder eingeschaltet wird. Warum ist mir schleierhaft.

2014-07-20 23:38:21 DOIF n_In4_Beregnung cmd_1
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_cmd: 1
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_cmd_event: man_Bewaesserung
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_error: no error
2014-07-20 23:38:21 dummy man_Bewaesserung aus
2014-07-20 23:38:21 dummy man_Bewaesserung an
2014-07-20 23:38:21 DOIF n_In4_Beregnung cmd_2
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_cmd: 2
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_cmd_event: In4_Beregnung
2014-07-20 23:38:21 DOIF n_In4_Beregnung last_error: no error
2014-07-20 23:38:21 RPI_GPIO In4_Beregnung Pinlevel: high
2014-07-20 23:38:21 RPI_GPIO In4_Beregnung an
2014-07-20 23:38:22 RPI_GPIO In4_Beregnung Pinlevel: low
2014-07-20 23:38:22 RPI_GPIO In4_Beregnung aus
2014-07-20 23:38:22 RPI_GPIO In4_Beregnung Langpress: off


Vielleicht kann mir jemand helfen.

Ich kann das hier z. Zt. aus dem Urlaub nicht nachstellen. Vielleicht hat es doch etwas damit zu tun, dass durch das Setzen des Dummys das Event durch fhem nicht unterbunden wird und erneut ein Event bei n_In4 auslöst.

Du kannst mal probieren

attr n_In4 wait 1:1

zu setzen. Damit wird ein Verzögerungstimer von 1 Sekunde gesetzt, damit könnte das Problem umgangen werden.

Gruß

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

Damian

#263
Zitat von: Damian am 21 Juli 2014, 08:16:37
Ich kann das hier z. Zt. aus dem Urlaub nicht nachstellen. Vielleicht hat es doch etwas damit zu tun, dass durch das Setzen des Dummys das Event durch fhem nicht unterbunden wird und erneut ein Event bei n_In4 auslöst.

Du kannst mal probieren

attr n_In4 wait 1:1

zu setzen. Damit wird ein Verzögerungstimer von 1 Sekunde gesetzt, damit könnte das Problem umgangen werden.

Gruß

Damian

Ich befürchte es wird das Problem nicht beheben, allerdings sollte das die Lösung sein:

define n_In4_Beregnung DOIF ([In4_Beregnung] eq "an")
(IF ([man_Bewaesserung] eq "aus") (set man_Bewaesserung an) ELSE (set man_Bewaesserung aus))

attr n_In4 do always


So löst das Setzen von "man_Bewasseung" kein Event bei n_In4 mehr aus.

Und ich dachte IF bräuchte man gar nicht mehr  :)

Gruß

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

Brockmann

Zitat von: Damian am 21 Juli 2014, 08:53:32
Und ich dachte IF bräuchte man gar nicht mehr  :)
Tja, ganz ohne wird es wohl auch in Zukunft nicht gehen.  ;)

Vielleicht noch zur Erklärung für Hoeness, was eigentlich das Problem ist:
Du hast hier eine perfekte Endlosschleife programmiert, die nur dadurch verhindert wird, dass In4_Beregnung irgendwann wieder auf "aus" geht. Das passiert aber nicht sofort, sondern erst, wenn dieser Schritt in der FHEM-Queue dran ist. Das kannst Du im Event-Monitor gut sehen: In4_Beregnung geht erst um :22 wieder auf "aus", da ist das DOIF aber um :21 schon zweimal abgearbeitet.
Denn durch das Verändern von man_Bewaesserung im DOIF rufst Du das DOIF sofort wieder auf, weil eine Änderung an man_Bewaesserung es ja triggert. Da man_Bewaesserung jetzt aber an ist, wird es diesmal gleich wieder ausgeschaltet.
Vermutlich greift FHEM danach selbst ein, weil die Veränderung an man_Bewaesserung durch das DOIF selbst vorgenommen wurde und triggert das DOIF nicht noch ein drittes Mal - eben um eine Endlosschleife zu verhindern. Vielleicht ist die Queue inzwischen aber auch so weit, dass das In4_Beregnung wieder auf "aus" gesetzt wurde. Das kann man (bzw. ich) nicht so genau sagen.

Du möchtest hier ja im Grunde genommen ein Toggle für Dummy verwenden, was FHEM von Hause aus nicht unterstützt. Damian hat dieses Toggle jetzt in seinen Vorschlag eingebaut. Eine etwas universellere Lösung wäre ein cmdalias, der sozusagen ein Toggle für alle Deine Dummy nachrüstet. Das kannst Du das an mehreren Stellen nutzen, etwa so:
define CMD_dtoggle cmdalias dtoggle .* AS IF (Value("$EVTPART0") eq "an")(set $EVTPART0 aus) ELSE (set $EVTPART0 an)
Dann würde Dein DOIF einfach so aussehen:
define n_In4_Beregnung DOIF ([In4_Beregnung] eq "an") (dtoggle man_Bewaesserung)
Das attr n_In4 do always wäre überflüssig, wenn IN4_Beregung ein Taster ist, da das dann ohnehin immer wieder auf "aus" zurückfällt (wie ich annehme). Aber schaden sollte es auch nicht.

Hoeness

Danke für die schnellen Antworten und eure Lösungen.

Ich werde beides heute Abend ausprobieren und mich dann wieder melden.

@Brockmann:

deinen Code
define CMD_dtoggle cmdalias dtoggle .* AS IF (Value("$EVTPART0") eq "an")(set $EVTPART0 aus) ELSE (set $EVTPART0 an)

füge ich irgendwo (weit oben) in meine fhem.cfg ein.
Richtig ?


Brockmann

Zitat von: Hoeness am 21 Juli 2014, 10:57:33
define CMD_dtoggle cmdalias dtoggle .* AS IF (Value("$EVTPART0") eq "an")(set $EVTPART0 aus) ELSE (set $EVTPART0 an)
füge ich irgendwo (weit oben) in meine fhem.cfg ein.
Einfach in die Kommandozeile in der Weboberfläche einfügen. Der allgemeine Konsens hier im Forum ist: Möglichst nichts direkt in der fhem.cfg erstellen/bearbeiten.
Wenn Du Dich daran hältst, ergibt sich auch die Reihenfolge von alleine, da Du einen cmdalias erst in einem define verwenden kannst, wenn Du ihn zuvor definiert hast.
Er wird also automatisch an der "richtigen" Stelle der fhem.cfg stehen.

Hoeness

Hallo,

hat super geklappt.
da ich das toggeln von dummys eventuell noch öfter benötige habe ich die Lösung von Brockmann umgesetzt.

Danke ihr seid TOP.





Simon74

Schönes Modul, das verstehe sogar ich  :)

Meine erste DOIF Funktion:
define Cafe_Abends_Aus DOIF ([20:59-21:00] and [t5.ku.sd1_Pwr:power] < 2) (set t5.ku.sd1_Sw off)

Ich hätte nun aber gerne im Logfile stehen das <DOIF "Cafe_Abends_Aus"> ausgelöst wurde, wie am einfachsten ?

Brockmann

Zitat von: Simon74 am 23 Juli 2014, 23:39:19
define Cafe_Abends_Aus DOIF ([20:59-21:00] and [t5.ku.sd1_Pwr:power] < 2) (set t5.ku.sd1_Sw off)
Ich hätte nun aber gerne im Logfile stehen das <DOIF "Cafe_Abends_Aus"> ausgelöst wurde, wie am einfachsten ?
Da das ganze ja nur einmal pro Tag ausgeführt werden soll, kannst Du das Intervall weglassen und einfach [21:00] schreiben.
Dann wird das DOIF halt um Punkt 21:00 Uhr einmal ausgeführt.

Logeinträge kannst Du auf jeden Fall jederzeit mit {Log 1, "<DOIF Cafe_Abends_Aus>"} einfügen lassen.
Ob DOIF solche Einträge automatisch anlegen sollte, weiß ich nicht. Andere Befehle wie at oder notify tun das ja auch nicht.
Wenn das DOIF einen Status setzt o. ä., dann hinterlässt das im Log ja in der Regel ohnehin Spuren. Und wenn Du einen Eintrag im Log hast, dass die Kaffeemaschine um 21:00 Uhr ausgeschaltet wurde, dann wird es wohl das DOIF gewesen sein, oder?