Hauptmenü

DOIF mit Wildcards möglich?

Begonnen von GU!DO, 03 Mai 2020, 19:20:48

Vorheriges Thema - Nächstes Thema

MadMax-FHEM

Zitat von: Damian am 04 Mai 2020, 22:40:08
Dann schaue mal mit list, was DOIF aus deiner Bedingung gemacht hat ;)

Wenn du die 52 in den Ausführungsteil übertragen möchtest, dann solltest du es mit DOIF-Perl machen.

Hatte ich ja auch schon vorgeschlagen... ;)

https://forum.fhem.de/index.php/topic,110853.msg1050440.html#msg1050440

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

GU!DO

Also:

define doif_RaffstoreXX DOIF
(["HCANDeviceRolladen:DOWN"] and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-down" and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-up") (set Raffstore52 extern closed)


Funktioniert ebenfalls. Wenn das so besser ist, lasse ich das natürlich so. Bleibt das Problem das noch hardgecodete Raffstore52 loszuwerden....

Hier ist das aktuelle list des DOIF mit o.a. geänderten Code:

Internals:
   CFGFN     
   DEF        (["HCANDeviceRolladen:DOWN"] and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-down" and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-up") (set Raffstore52 extern closed)
   DOIFDEV    ^global$|HCANDeviceRolladen
   FUUID      5eb07e30-f33f-8741-a810-41efc2a23d665790
   MODEL      FHEM
   NAME       doif_RaffstoreXX
   NR         2372
   NTFY_ORDER 50-doif_RaffstoreXX
   STATE      cmd_1
   TYPE       DOIF
   VERSION    21224 2020-02-18 18:45:49
   READINGS:
     2020-05-04 22:42:55   Device          HCANDeviceRolladen51
     2020-05-04 22:42:54   cmd             1
     2020-05-04 22:42:54   cmd_event       HCANDeviceRolladen51
     2020-05-04 22:42:54   cmd_nr          1
     2020-05-04 22:42:24   mode            enabled
     2020-05-04 22:42:54   state           cmd_1
   Regex:
     accu:
     cond:
       :
         0:
           "HCANDeviceRolladen:DOWN" HCANDeviceRolladen:DOWN
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::EventDoIf('HCANDeviceRolladen',$hash,'DOWN',0) and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-down" and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-up"
   do:
     0:
       0          set Raffstore52 extern closed
     1:
   helper:
     DEVFILTER  ^global$|HCANDeviceRolladen
     NOTIFYDEV  global|.*HCANDeviceRolladen.*
     event      DOWN
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   HCANDeviceRolladen51
     timerevent DOWN
     triggerDev HCANDeviceRolladen51
     timerevents:
       DOWN
     timereventsState:
       DOWN
     triggerEvents:
       DOWN
     triggerEventsState:
       DOWN
   internals:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:


Könntest Du mir bitte ein Syntax Beispiel schreiben?

amenomade

#17
(["HCANDeviceRolladen:DOWN"] and [?Raffstore.(substr($Event, 18, 2))] ne "drive-down" and [?Raffstore.(substr($Event, 18, 2))] ne "drive-up") (set Raffstore52 extern closed)

Ergibt
::EventDoIf('HCANDeviceRolladen',$hash,'DOWN',0) and ::DOIF_time_once($hash,0,$wday) ne "drive-down" and ::DOIF_time_once($hash,1,$wday) ne "drive-up"
Also... bestimmt nicht was gewünscht ist: 2 Time-Trigger, die mit "drive-down" verglichen werden? Wahrscheinlich ist die Bedingung immer wahr, und deswegen die Illusion, dass es funktioniert...



define doif_RaffstoreXX DOIF
(["HCANDeviceRolladen:DOWN"] and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-down" and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-up") (set Raffstore52 extern closed)

Ergibt
::EventDoIf('HCANDeviceRolladen',$hash,'DOWN',0) and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-down" and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-up"

Sicher besser.



ZitatBleibt das Problem das noch hardgecodete Raffstore52 loszuwerden....
Die Lösung wurde dir schon 2x gegeben:
ZitatWenn du die 52 in den Ausführungsteil übertragen möchtest, dann solltest du es mit DOIF-Perl machen.
und
ZitatBzw. wirst du vermutlich für dein "Zusammenbau-Konzept" nach DOIF-Perl "schalten" müssen...
...in "native" DOIF (nur zwischen runde Klammern) wird nicht funktionieren wie du ja schon weißt

Also... wechsel mal zu DOIF-Perl:
DOIF {if (<Bedingung mit Trigger>) {fhem"<FHEM-Befehle>"} }
Und in dem Befehl kannst Du substr($device,..,..) benutzen

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

GU!DO

Sorry, dass ich so renitent war. Aber irgend wie sehe ich den Wald vor lauter Bäumen nicht mehr. Daher muß ich nochmals nerven. Ich gelobe aber Besserung...  :-[

Ich habe es jetzt so umgesetzt:

define doif_RaffstoreXX DOIF {if
(["HCANDeviceRolladen:DOWN"] and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-down" and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-up") {fhem"set Raffstore".substr($device, 18, 2)." extern closed"}
}


und soweit läuft es auch. Nun hatte ich bei meiner ursprünglichen Variante (mit den festen Devicenamen) weitere Zustände, die ich mitteles DOELSEIF abgefragt habe. Das sah insgesamt dann so aus:


define doif_Raffstore51 DOIF
([HCANDeviceRolladen51:"DOWN"] and [?Raffstore51] ne "drive-down" and [?Raffstore51] ne "drive-up") (set Raffstore51 extern closed) DOELSEIF
([HCANDeviceRolladen51:"DOWN"] and [?Raffstore51] =~ "drive") (set Raffstore51 extern stop) DOELSEIF 
([HCANDeviceRolladen51:"UP"] and [?Raffstore51] ne "drive-down" and [?Raffstore51] ne "drive-up") (set Raffstore51 extern open) DOELSEIF
([HCANDeviceRolladen51:"UP"] and [?Raffstore51] =~ "drive") (set Raffstore51 extern stop)


Ich habe nun versucht den ersten Teil, der "alten" Version, wie folgt umzusetzen:

define doif_RaffstoreXX DOIF {if
(["HCANDeviceRolladen:DOWN"] and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-down" and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-up") {fhem"set Raffstore".substr($device, 18, 2)." extern closed"}
} elsif {
(["HCANDeviceRolladen:DOWN"] and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") =~ "drive") {fhem"set Raffstore".substr($device, 18, 2)." extern stop"}
}


Er reagiert jedoch nicht wenn die Bedingung hinter dem elsif zutrifft. Könntet Ihr mich bitte nochmal in die richtige Richtung schubsen?

Damian

lass die geschweiften Klammern hinter elsif weg
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

GU!DO

Hallo Damian,

ich habe das nun so gebaut:

define doif_RaffstoreXX DOIF {if
(["HCANDeviceRolladen:DOWN"] and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-down" and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-up") {fhem"set Raffstore".substr($device, 18, 2)." extern closed"}
elsif
(["HCANDeviceRolladen:DOWN"] and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") =~ "drive") {fhem"set Raffstore".substr($device, 18, 2)." extern stop"}
elsif
(["HCANDeviceRolladen:UP"] and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-down" and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-up") {fhem"set Raffstore".substr($device, 18, 2)." extern open"}
elsif
(["HCANDeviceRolladen:UP"] and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") =~ "drive") {fhem"set Raffstore".substr($device, 18, 2)." extern stop"}
}


Das läuft leider nur bedingt.

Ich habe 2 Taster für meine Raffstores. UP & DOWN
Wenn ein Raffstore fährt, und ich betätige einen der beiden Taster (egal welchen!) hält der Raffstore an.

Das DOIF produziert jedoch folgendes:
Wenn ich z.B. in Richtung Down fahre und drücke UP, fährt das DOIF mein Rollo-Device Richtung UP, obwohl das physische Device anhält. Das passiert sehr oft, aber nicht immer.

Ursprünglich hatte ich mal diesen Code:

define doif_Raffstore51 DOIF
([HCANDeviceRolladen51:"DOWN"] and [?Raffstore51] !~ "drive") (set Raffstore51 extern closed) DOELSEIF
([HCANDeviceRolladen51:"DOWN"] and [?Raffstore51] =~ "drive") (set Raffstore51 extern stop) DOELSEIF
([HCANDeviceRolladen51:"UP"] and [?Raffstore51] !~ "drive") (set Raffstore51 extern open) DOELSEIF
([HCANDeviceRolladen51:"UP"] and [?Raffstore51] =~ "drive") (set Raffstore51 extern stop)

damit hatte ich das gleiche Problem.

Den Code habe ich dann durch diesen ersetzt:

define doif_Raffstore51 DOIF
([HCANDeviceRolladen51:"DOWN"] and [?Raffstore51] ne "drive-down" and [?Raffstore51] ne "drive-up") (set Raffstore51 extern closed) DOELSEIF
([HCANDeviceRolladen51:"DOWN"] and [?Raffstore51] =~ "drive") (set Raffstore51 extern stop) DOELSEIF
([HCANDeviceRolladen51:"UP"] and [?Raffstore51] ne "drive-down" and [?Raffstore51] ne "drive-up") (set Raffstore51 extern open) DOELSEIF
([HCANDeviceRolladen51:"UP"] and [?Raffstore51] =~ "drive") (set Raffstore51 extern stop)

Damit ist das Phenomen nicht mehr aufgetreten.

Ich habe da schon nicht verstanden, warum sich

([?Raffstore51] ne "drive-down" and [?Raffstore51] ne "drive-up")

und

[?Raffstore51] !~ "drive"

unterscheiden, obwohl es keinen anderen "drive"-Zustand als "drive-down" und "drive-up" gibt?!?

Wäre nett wenn Du dir nochmal die Zeit nehmen würdest.

Vielen Dank

Guido