Hauptmenü

neues Modul DOIF

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

Vorheriges Thema - Nächstes Thema

igami

Zitat von: Damian am 03 November 2014, 09:39:53
Gut dass wir auf das Thema kommen. In meiner Todo-Liste habe ich bereits "kein Trigger" für Readings vor längerer Zeit aufgenommen. Meine erste Idee war auch das Ausrufungszeichen gewesen. Allerdings würde das bei Programmierern "das Gegenteil von" bedeuten und das ist es nicht.
Daher habe ich nach anderen Zeichen gesucht, das sind meine letzten Aufzeichnungen:

-Readings ohne Trigger [NoTrigger:...] oder [#...] oder ['...] oder [^...]

So etwas würde man dann auf Zeiten übertragen.

Gruß

Damian

Das könnte ich nun wirklich gut gebrauchen. Bist du schon weiter gekommen? Es würde sich vielleicht auch ein [?...] anbieten, oder ist das schon anderweitig verplant wie in readingsGroup für Attribute?
Ansonsten noch als Vorschlag [*...], aber mit [noTrigger:...] kommt man bestimmt auch klar.
Werde mir solange mit ReadingsVal behelfen.

Grüße
Igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Damian

#721
Zitat von: igami am 21 November 2014, 13:18:13
Das könnte ich nun wirklich gut gebrauchen. Bist du schon weiter gekommen? Es würde sich vielleicht auch ein [?...] anbieten, oder ist das schon anderweitig verplant wie in readingsGroup für Attribute?
Ansonsten noch als Vorschlag [*...], aber mit [noTrigger:...] kommt man bestimmt auch klar.
Werde mir solange mit ReadingsVal behelfen.

Grüße
Igami

Bin z. Zt. beruflich etwas eingespannt, um zu programmieren. Werde versuchen die Sachen in den Ferien zu programmieren. Vorschläge sind natürlich willkommen. Ein Fragezeichen ist auch keine schlechte Idee.
Solange kann man sich, wie du schon sagst, mit ReadingsVal oder Value behelfen.

Gruß

Damian

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

locodriver

Ich hätte auch noch eine Anregung ;):

Das Attribut "do" in "doalways" ändern und wie bei "disable" mit 0 und 1 aus- bzw. einschalten. Ich denke, dann kann man bei Bedarf das Attribut ein- oder ausschalten und muss es nicht "deleten" wenn es mal nicht (mehr) gebraucht wird.
Die DOIF-Nutzer müssten natürlich das Attribut händisch ändern, aber das wäre ja nur einmalig.

Uwe
fhem 6.0 auf Rpi3 Bookworm
HM-LAN-CFG (FW 0.965), HM-MOD-UART, 2x HM-TC-IT-WM-W-EU, 4x HM-Sec-RHS und 3x HM-CC-RT-DN, 6x HM-LC-Bl1-FM mit je 1x Somfy-Motor,
2x HM-LC-SW2-FM für Licht und Lüfter, 2x HM-PB-6-WM55, Alexa, Jeelinkcross, CUL, CUNO2, IR-Blaster

Damian

Zitat von: locodriver am 21 November 2014, 17:26:15
Ich hätte auch noch eine Anregung ;):

Das Attribut "do" in "doalways" ändern und wie bei "disable" mit 0 und 1 aus- bzw. einschalten. Ich denke, dann kann man bei Bedarf das Attribut ein- oder ausschalten und muss es nicht "deleten" wenn es mal nicht (mehr) gebraucht wird.
Die DOIF-Nutzer müssten natürlich das Attribut händisch ändern, aber das wäre ja nur einmalig.

Uwe

Warum sollte sich die Definition von do always plötzlich ändern. Ich habe es bei mir noch nie gebraucht. Entweder ist diese Einstellung erforderlich oder nicht. Das do attribut bekommt übrigens bei der nächsten Version weitere Einstellungsmöglichkeiten.

Gruß

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

igami

Zitat von: locodriver am 21 November 2014, 17:26:15
Das Attribut "do" in "doalways" ändern und wie bei "disable" mit 0 und 1 aus- bzw. einschalten. Ich denke, dann kann man bei Bedarf das Attribut ein- oder ausschalten und muss es nicht "deleten" wenn es mal nicht (mehr) gebraucht wird.
Die DOIF-Nutzer müssten natürlich das Attribut händisch ändern, aber das wäre ja nur einmalig.
Dann doch bitte lieber wie bei wait für jedes cmd separat
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

locodriver

@Damian: momentan habe zumindest ich keine Anwendung bei mir, aber wenn du schon weiter planst, dann lasse ich mich überraschen.
fhem 6.0 auf Rpi3 Bookworm
HM-LAN-CFG (FW 0.965), HM-MOD-UART, 2x HM-TC-IT-WM-W-EU, 4x HM-Sec-RHS und 3x HM-CC-RT-DN, 6x HM-LC-Bl1-FM mit je 1x Somfy-Motor,
2x HM-LC-SW2-FM für Licht und Lüfter, 2x HM-PB-6-WM55, Alexa, Jeelinkcross, CUL, CUNO2, IR-Blaster

Damian

#726
Zitat von: locodriver am 21 November 2014, 18:28:07
@Damian: momentan habe zumindest ich keine Anwendung bei mir, aber wenn du schon weiter planst, dann lasse ich mich überraschen.

Auch wenn ich z. Zt. was anders zu tun habe, hier schon mal meine todo-liste als Vorgeschmack für die nächste Version:

- Readings und Zeitangaben ohne Trigger [?...]
- relative Zeitangaben: [+HH:SS]
- nur einmal ein Timer für die gleiche Zeit (Intern)
- Mehrere Bedingungen, die zum gleichen Kommando, damit zum gleichen Zustand, führen, können angegeben werden (es wird nur die jeweilige Bedingung, zu der ein Ereignis eintritt, überprüft)

define di_test DOIF (<Bedingung1>)|(<Bedingung2)|(<Bedingung3>) (<Kommando1>)

- Mehrere Kommandos, die zu einer Bedingung gehören (interessant mit neuem wait):

define di_test DOIF (<Bedingung>)(<Kommando1>)(<Kommando2>)

- neue Attribute:

eventpause, waitnext, repeatsame, waitsame, do resetwait

Attribut eventpause

eventpause 300 Zwangspause, das nächste Event erst nach 300 Sekunden annehmen

Attribut waitnext

waitnext 300:400:200 Wartezeit für das gleiche Kommando nach dem ersten Schalten (nur in Verbindung mit do always sinnvoll)

Attribut repeatsame

repeatsame 4:5:3  Maximale Wiederholungsanzahl für die Wiederholung des gleichen Kommando (sinnvoll ohne do always)

Attribut waitsame

waitsame 2:1:3 Wartet maximal X-Sekunden auf das Eintreten des gleichen Kommandos.

Beispiele:

on-for-timer

define di_motion DOIF ([motion])
  (set light on)
  (set light off)

attr di_motion wait 0:500
attr di_motion do always|resetwait

nur ein Zustand cmd1
set light on wird nicht nochmal ausgeführt, solange timer läuft (intern cmd1_wait)

Alternative:

define di_motion DOIF ([motion])
         (set light on)
wait 500 (set light off)
attr di_motion do always|resetwait


set light on wird nicht nochmal ausgeführt, solange timer läuft (intern cmd1_wait)


Pushmeldung beim Ausbleiben eines Events:
define di_push DOIF ([Device])
  (set pushmeldung "kein Event")

attr di_push wait 600
attr di_push do always|resetwait


Waschmaschine fertig maximal 3-Mal im Abstand von mind. 10 Minuten
define di_fertig DOIF ([Watt]<2)
(set pushmeldung "Waschmaschine fertig)

attr di_fertig repeatsame 3
attr di_fertig evenpause 600


Rollladen hoch, wenn innerhalb einer Zeitspanne von 2 Sekunden ein Taster betätigt wird
define di_fensterhoch DOIF ([Fenster])(set Rollladen hoch)
attr di_fensterhoch waitsame 2
attr di_fenseterhoch do always


Gruß

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

locodriver

Du übertriffst dich wieder selbst...
fhem 6.0 auf Rpi3 Bookworm
HM-LAN-CFG (FW 0.965), HM-MOD-UART, 2x HM-TC-IT-WM-W-EU, 4x HM-Sec-RHS und 3x HM-CC-RT-DN, 6x HM-LC-Bl1-FM mit je 1x Somfy-Motor,
2x HM-LC-SW2-FM für Licht und Lüfter, 2x HM-PB-6-WM55, Alexa, Jeelinkcross, CUL, CUNO2, IR-Blaster

Sany

Hallo DOIF-Fans,

kann ich mit DOIF auf Readings triggern, die bei verschiedenen Modulen den gleichen Namen haben? Etwas ausfühlicher:

ausgehend vom Wiki Batteriestatus http://www.fhemwiki.de/wiki/Batterie%C3%BCberwachung wollte ich das per DOIF lösen. Problem beim notify: der meldende Sensor meldet ja immer wieder (z.B. ein FHT alle ca 15min), also gibts jede Menge Meldungen, bis die Batterie gewechselt ist. Per DOIF wäre das schön zu lösen. Ich bin oft nicht da, wo die Sender sind, ausserdem ist die Baatterie ja nie völlig leer, d.h. die Sender laufen ja noch eine Weile weiter, der Batteriewechsel muss nicht sofort sein, es reicht 1 Meldung.

das notify sieht so aus (DEF-Part):
.*:[Bb]attery.* { if ($EVENT !~ m/ok/) {fhem("set pushmessage message ".$NAME.": ".$EVENT." um ".TimeNow());Log 3, "$NAME : Batteriewarnung $EVENT"}}
und funktioniert.

per DOIF habe ich folgendes probiert:
([.*:battery.*] eq "low")({fhem("set pushmessage message ".$NAME.": ".$EVENT." um ".TimeNow())." <doif>"},{Log 3, "$NAME : Batteriewarnung $EVENT"})

das DOIF bleibt aber auf initialized, es wird also nie getriggert (ja, ein FHT meldet gerade batters low, deshalb kann ich es schön testen).

Abgesehen vom DO-Part, der so wohl nicht funktioniert ($EVENT und $NAME gibts bei DOIF so wohl nicht??) wollte ich gerne wissen, ob der IF-Part so überhaupt möglich ist, oder ob nur ein "namentlich" bekanntes Modul triggern kann?

ein list sieht so aus (wobei ich da noch nicht alles verstenden habe....)
Internals:
   CFGFN
   DEF        ([.*:battery.*] eq "low")({fhem("set pushmessage message ".$NAME.": ".$EVENT." um ".TimeNow())." <doif>"},{Log 3, "$NAME : Batteriewarnung $EVENT"})
   NAME       BattChecker
   NR         7219
   NTFY_ORDER 50-BattChecker
   STATE      initialized
   TYPE       DOIF
   Readings:
     2014-11-22 17:28:26   state           initialized
   Condition:
     0          ReadingValDoIf('.*','battery.*','') eq "low"
   Devices:
     0           .*
     all         .*
   Do:
     0          {fhem("set pushmessage message ".$NAME.": ".$EVENT." um ".TimeNow())." <doif>"},{Log 3, "$NAME : Batteriewarnung $EVENT"}
   Helper:
     last_timer 0
     sleeptimer -1
   Readings:
     0           .*:battery.*
     all         .*:battery.*
   State:
   Timerfunc:
Attributes:
   room       System


'eq "low"' ist nur testhalber, vorher stand 'ne "ok"'  (ohne ' )

Vielen Dank für jegliche Hilfe :)
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Damian

Zitatkann ich mit DOIF auf Readings triggern, die bei verschiedenen Modulen den gleichen Namen haben?

nein, wird es auch nicht können, denn die Auswertung der Bedingung wird in Perl durchgeführt und da kann man den Bezeichner, wie in jeder anderen Programmiersprache auch, nicht einfach als regulären Ausdruck angeben, wie z. B.

if (a* > 50) ...

Gruß

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

Sany

Alles klar. Vielen Dank für die schnelle Antwort.

Gelöst habe ich es nun mit event-on-change/update (wird im verlinkten Wiki auch ganz kurz erwähnt)
Das war mal wieder der Klassiker mit Wald und Bäumen.....
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

moonsorrox

@Damian
vllt hast du ja trotz deiner knappen Zeit mal ein Moment und schaust mal auf meinen Code im DOIF Modul, ich habe nach einigen Versuchen es nicht hin bekommen.

Ich habe das Problem das die 2.Lampe in der Nacht also gestern ausschaltet und sofort wieder einschaltet, ich dachte erst es liegt an der Definition Wochenende weil er ja von Freitag auf Samstag wechselt und habe dieses deshalb mit den Tagesbezeichnungen ([01:15|56]) gemacht aber er hat auch gestern Nacht wieder eingeschaltet.
Evtl. kannst du mal drauf schauen und siehst den Fehler sofort..?

Dämmerung steht oben drin weil ich noch einen Punkt über ein Dummy verwenden möchte der dann Zufall heißt und hier möchte ich dann in das DOIF einen RandomTimer rein bringen, aber das nur zur Information das kommt dann später, wenn ich es gebacken bekomme.

Hier mal der Code zum DOIF aus dem DEF
( [Zeitsteuerung] eq "Dämmerung" and ([{sunset("CIVIL",1200,"17:00","22:20")}-{sunset("CIVIL",9000,"19:00","22:20")}|12345] or [{sunset("CIVIL",800,"17:00","22:20")}- {sunset("CIVIL",9000,"19:00","22:20")}|06]))
    (set WegLampe_Sw_01 on)

DOELSEIF ([Zeitsteuerung] eq "Dämmerung" and ([00:15|01234] or [01:15|56]))
    (set WegLampe_Sw_02 off)
DOELSE
    (set WegLampe_Sw_01 off,set WegLampe_Sw_02 on)
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Puschel74

Hallo,

Zitatvllt hast du ja trotz deiner knappen Zeit mal ein Moment und schaust mal auf meinen Code im DOIF Modul, ich habe nach einigen Versuchen es nicht hin bekommen.
Ich sag jetzt mal nix dazu  :P

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Inputsammler

Zitat von: Damian am 20 November 2014, 21:27:38
Im Reading ist W als Einheit daher filtern nach Zahlen einsetzen, siehe commandref von DOIF

also

([FBDECT_17:power:d]<25) (set CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_01 off, set CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_02 off)
Danke Danke das habe ich wirklich vollkommen überlesen .....
und ich habe mir deswegen den kopf zerbrochen danke


Zitat
([22:00-00:00|5]) ((set CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_01, CUL_HM_HM_LC_SW4_BA_PCB_529FF4_Sw_02 on))
Warum das so ist steht ebenfalls in der Commandref von DOIF.
Da habe ich ein kleines Problem damit, den das funktioniert leider nicht so.

So funktioniert es ohne Probleme:
([13:49-15:00|7]) (set CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_01 on, set CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_02 on)

Aber mit der Verkürzung nicht
([13:56-15:00|7]) ((set CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_01, CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_02 on))

im log steht
2014.11.23 13:56:00 2: PM_NAS_OFF_TEST: set CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_01, CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_02 on: Unknown argument CUL_HM_HM_LC_SW4_BA_PCB_529FE4_Sw_02, choose one of clear:readings,trigger,register,rssi,msgEvents,all getConfig getRegRaw inhibit:on,off off on on-for-timer on-till peerBulk peerIODev press regBulk regSet sign:on,off statusRequest toggle


Zitat
Das Modul ist eingecheckt (steht im ersten Post) und ist immer aktuell per FHEM-Update.
Ja mich hat es gewundert das es nicht mit deinen Namen (Damian) angezeigt wird bei dem FHEM Befehl "Version" deswegen ist es mir nicht aufgefallen

danke nochmals für das gute Umfangreiche Modul.
Dadurch habe ich jetzt fast alle at und notify ersetzt..
Gruß Gerd


Rpi's und Bpi's und Hw von Dirk und locutus
CCU2,F20,Ks300,1-Wire,Homematic usw ...
vitodens 300 & IstrkrM372 auslesen über USB und FHEM
RUHE IN FRIEDEN AHA1805 RIP Mallorca +29.08.16
I miss you and your Family H.H.L.L.

Damian

Zitat von: moonsorrox am 23 November 2014, 12:39:32

Hier mal der Code zum DOIF aus dem DEF
( [Zeitsteuerung] eq "Dämmerung" and ([{sunset("CIVIL",1200,"17:00","22:20")}-{sunset("CIVIL",9000,"19:00","22:20")}|12345] or [{sunset("CIVIL",800,"17:00","22:20")}- {sunset("CIVIL",9000,"19:00","22:20")}|06]))
    (set WegLampe_Sw_01 on)

DOELSEIF ([Zeitsteuerung] eq "Dämmerung" and ([00:15|01234] or [01:15|56]))
    (set WegLampe_Sw_02 off)
DOELSE
    (set WegLampe_Sw_01 off,set WegLampe_Sw_02 on)


Der DOELSE-Fall ist hier wahrscheinlich das Problem: Um 00:15 ist der zweite Fall wahr, deswegen wird die Lampe ausgeschaltet. Beim nächsten senden von Zeitsteuerung ist der zweite Fall nicht mehr Wahr und dann schlägt der letzte Fall zu.

Als Empfehlung: Versuche den DOELSE-Fall durch einen DOELSEIF-Fall zu ersetzen.

Gruß

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