FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: m8ichael am 13 April 2020, 17:39:02

Titel: DOIF mit Perl-Funktionsabfrage
Beitrag von: m8ichael am 13 April 2020, 17:39:02
Hallo,

ich stehe derzeit etwas auf dem Schlauch: Ich möchte ein DOIF generieren, welches drei Bedingungen abfragt:


Ich habe hierzu das folgende DOIF generiert:


define di.Reinigung DOIF ([08:00-18:00] and [rgr_Bewohner] eq "absent" and {KeineReinigungHeute()} eq "0")  \
(set dmStaubsauger on)


Es hakt hier m. E. an der letzten Bedingung (lasse ich diese weg, funktioniert alles). Was kann ich machen, damit diese korrekt abgefragt wird?

Schon mal vielen Dank!

Viele Grüße

Michael
Titel: Antw:DOIF mit Perl-Funktionsabfrage
Beitrag von: Otto123 am 13 April 2020, 17:47:11
Hallo Michael,

zeig mal ein noch ein list von deinem DOIF. Da gibt es bestimmt ne Fehlermeldung.
Ich denke an der Stelle gehen keine Perlausdrücke. Dann muss Du DOIF im Perlmodus verwenden.

Gruß Otto
Titel: Antw:DOIF mit Perl-Funktionsabfrage
Beitrag von: xenos1984 am 13 April 2020, 17:51:59
Ich tippe darauf (ungetestet):

define di.Reinigung DOIF ([08:00-18:00] and [rgr_Bewohner] eq "absent" and [{KeineReinigungHeute()}] eq "0")  \
(set dmStaubsauger on)


Ansonsten im Perl-Modus:

define di.Reinigung DOIF {if ([08:00-18:00] and [rgr_Bewohner] eq "absent" and KeineReinigungHeute() eq "0")  \
fhem_set dmStaubsauger on}
Titel: Antw:DOIF mit Perl-Funktionsabfrage
Beitrag von: m8ichael am 13 April 2020, 18:23:02
Hallo Otto,

Zitat von: Otto123 am 13 April 2020, 17:47:11
zeig mal ein noch ein list von deinem DOIF. Da gibt es bestimmt ne Fehlermeldung.
Ich denke an der Stelle gehen keine Perlausdrücke. Dann muss Du DOIF im Perlmodus verwenden.

hier mal das List:

DEF        ([08:00-19:00] and [rgr_Bewohner] eq "absent" and {KeineReinigungHeute()} eq "0") 
(set dmStaubsauger on)



   FUUID      5ddebc84-f33f-966a-156c-2af97f38ab9f5fb9
   MODEL      FHEM
   NAME       di.Reinigung
   NOTIFYDEV  global,rgr_Bewohner
   NR         344
   NTFY_ORDER 50-di.Reinigung
   STATE      initialized
   TYPE       DOIF
   VERSION    21224 2020-02-18 18:45:49
   READINGS:
     2020-04-13 18:07:47   cmd             0
     2020-04-13 18:07:47   mode            enabled
     2020-04-13 18:07:47   state           initialized
     2020-04-13 18:07:47   timer_01_c01    14.04.2020 08:00:00
     2020-04-13 18:07:47   timer_02_c01    13.04.2020 19:00:00
   Regex:
     accu:
     cond:
       rgr_Bewohner:
         0:
           &STATE     ^rgr_Bewohner$
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::DOIF_time($hash,0,1,$wday,$hms) and ::InternalDoIf($hash,'rgr_Bewohner','STATE') eq "absent" and {KeineReinigungHeute()} eq "0"
   days:
   do:
     0:
       0          set dmStaubsauger on
     1:
   helper:
     DEVFILTER  ^global$|^rgr_Bewohner$
     NOTIFYDEV  global|rgr_Bewohner
     globalinit 1
     last_timer 2
     sleeptimer -1
   internals:
     all         rgr_Bewohner:STATE
   interval:
     0          -1
     1          0
   intervalfunc:
   localtime:
     0          1586844000
     1          1586797200
   realtime:
     0          08:00:00
     1          19:00:00
   time:
     0          08:00:00
     1          19:00:00
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
     0           0  1
   triggertime:
     1586797200:
       localtime  1586797200
       hash:
     1586844000:
       localtime  1586844000
       hash:
   uiState:
   uiTable:
Attributes:


Ich habe jetzt mal den Perl-Modus ausprobiert, aber so zumindest auch noch keine Lösung erhalten:

define di.Reinigung DOIF {if ([08:00-19:00] and [rgr_Bewohner:"absent"] and [KeineReinigungHeute() eq "0"])  \
{fhem_set "dmStaubsauger on"}\
}\


Auch hier gibt's erst einmal keine Fehlermeldung:

DEF        {if ([08:00-19:00] and [rgr_Bewohner:"absent"] and [KeineReinigungHeute() eq "0"]) 
{fhem_set "dmStaubsauger on"}
}



   FUUID      5ddebc84-f33f-966a-156c-2af97f38ab9f5fb9
   MODEL      Perl
   NAME       di.Reinigung
   NOTIFYDEV  global,rgr_Bewohner
   NR         344
   NTFY_ORDER 50-di.Reinigung
   STATE      cmd_2
   TYPE       DOIF
   VERSION    21224 2020-02-18 18:45:49
   READINGS:
     2020-04-13 18:21:08   Device          rgr_Bewohner
     2020-04-13 18:21:08   block_01        executed
     2020-04-13 18:21:08   e_rgr_Bewohner_events home
     2020-04-13 18:19:36   mode            enabled
     2020-04-13 18:11:08   state           cmd_2
     2020-04-13 18:19:36   timer_01_c01    14.04.2020 08:00:00
     2020-04-13 18:19:36   timer_02_c01    13.04.2020 19:00:00
   Regex:
     accu:
     cond:
       rgr_Bewohner:
         0:
           &STATE     ^rgr_Bewohner$
         1:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          if (::DOIF_time($hash,0,1,$wday,$hms) and ::EventDoIf('rgr_Bewohner',$hash,'absent',1) and [KeineReinigungHeute() eq "0"]) 
{fhem_set "dmStaubsauger on"}

     1         
   days:
   helper:
     DEVFILTER  ^global$|^rgr_Bewohner$
     NOTIFYDEV  global|rgr_Bewohner
     event      home
     globalinit 1
     last_timer 3
     sleeptimer -1
     triggerDev rgr_Bewohner
     triggerEvents:
       home
     triggerEventsState:
       state: home
   internals:
   interval:
     0          -1
     1          0
   intervalfunc:
   localtime:
     0          1586844000
     1          1586797200
   perlblock:
     0         
     1         
   readings:
   realtime:
     0          08:00:00
     1          19:00:00
   time:
     0          08:00:00
     1          19:00:00
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
     0           0  1
   trigger:
     all         rgr_Bewohner
   triggertime:
     1586797200:
       localtime  1586797200
       hash:
     1586844000:
       localtime  1586844000
       hash:
   uiState:
   uiTable:
Attributes:


Viele Grüße

Michael
Titel: Antw:DOIF mit Perl-Funktionsabfrage
Beitrag von: Otto123 am 13 April 2020, 18:40:48
Aber das DOIF triggert ja so auch nicht oder? Da müsstest Du checkall machen.
Der einzige Trigger ist die Zeit und der Zeitpunkt heute ist vorbei. Also wenn ich eine Funktion einbaue {} und checkall mache kommt ein Fehler.

Der Perlmodus wie von xenos1984 vorgeschlagen geht sicher. Ich würde allerdings dann meine Funktion gleich logisch beenden. Wenn diese 0 und 1 liefert brauchst Du nicht noch auf 0 und 1 zu prüfen.
Titel: Antw:DOIF mit Perl-Funktionsabfrage
Beitrag von: m8ichael am 13 April 2020, 18:57:06
Hi,

Zitat von: Otto123 am 13 April 2020, 18:40:48
Der Perlmodus wie von xenos1984 vorgeschlagen geht sicher. Ich würde allerdings dann meine Funktion gleich logisch beenden. Wenn diese 0 und 1 liefert brauchst Du nicht noch auf 0 und 1 zu prüfen.

Das funktioniert leider nicht, dann wird der folgende Fehler geschmissen: condition c01: Undefined subroutine &DOIF::KeineReinigungHeute called, line 1 (wenn ich den Perlmodus verwende).

Ich hatte das DOIF zwischenzeitlich mal testweise bis 19:00 Uhr abgeändert. Es triggert, wenn ich die letzte Bedingung ("KeineReinigungHeute") ersatzlos herausnehme. Der Knackepunkt liegt daher m. E. an der Funktion.
Titel: Antw:DOIF mit Perl-Funktionsabfrage
Beitrag von: MadMax-FHEM am 13 April 2020, 18:59:39
War da nicht was mit "eigenem Namensraum" bei DOIF!?

Wenn du Subs in deiner myUtils rufen willst musst du irgendwie ::Funktionsname machen...

Wobei ich mir mit den :: nicht sicher bin...
...aber auch den Thread wo das so beantwortet wurde nicht mehr finde...

EDIT: https://forum.fhem.de/index.php/topic,89828.msg946655.html#msg946655

EDIT: aber ist wohl eh nicht relevant...

Gruß, Joachim
Titel: Antw:DOIF mit Perl-Funktionsabfrage
Beitrag von: Damian am 13 April 2020, 19:00:32
Im DOIF-FHEM-Modus ist die Bedingung immer Perl, daher ganz einfach:

define di.Reinigung DOIF ([08:00-18:00] and [rgr_Bewohner] eq "absent" and KeineReinigungHeute() eq "0")  \
(set dmStaubsauger on)
Titel: Antw:DOIF mit Perl-Funktionsabfrage
Beitrag von: m8ichael am 13 April 2020, 19:05:42
Zitat von: Damian am 13 April 2020, 19:00:32
Im DOIF-FHEM-Modus ist die Bedingung immer Perl, daher ganz einfach:

define di.Reinigung DOIF ([08:00-18:00] and [rgr_Bewohner] eq "absent" and KeineReinigungHeute() eq "0")  \
(set dmStaubsauger on)


Super! Dankeschön, das hat funktioniert!