FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: GU!DO am 03 Mai 2020, 19:20:48

Titel: DOIF mit Wildcards möglich?
Beitrag von: GU!DO am 03 Mai 2020, 19:20:48
Hallo,

ich habe folgendes DOIF um die Position meines Rollo Devices zu ändern wenn der Raffstorelauf nicht über das Rollo Device selbst gestartet wurde:


([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)


Die Ereignis-Namen aller Raffstores unterscheiden sich in der angehängten Zahl. z.B. HCANDeviceRolladen51, HCANDeviceRolladen52, HCANDeviceRolladen63...
Bei den Rollo Devices ist das genau so. z.B. Raffstore51, Raffstore52, Raffstore63...
Die zugehörten Zahlen sind immer gleich. D.h. das Rolladen-Device Raffstore51 gehört zum Ereignis HCANDeviceRolladen51.

Nun würde ich dieses DOIF gerne für alle Raffstores nutzen.

Gibt es eine Möglichkeit hier mit Wildcards zu arbeiten, um für alle Raffstore/Rollo-Device Kombinationen nur ein einziges DOIF erstellen zu müssen?

Viele Grüße & vielen Dank

Guido
Titel: Antw:DOIF mit Wildcards möglich?
Beitrag von: kumue am 03 Mai 2020, 19:49:20
schau mal hier..
https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events (https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events)
Dort sind Beispiele für Regex-Angaben aufgeführt
Titel: Antw:DOIF mit Wildcards möglich?
Beitrag von: GU!DO am 04 Mai 2020, 10:09:57
Hallo,

sie weit bin ich:

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


Was ich jedoch noch nicht hinbekomme ist das Raffstore52 im "set" zu ersetzen.

Könnte mir da bitte jemand auf die Sprünge helfen?

Vielen Dank & viele Grüße

Guido
Titel: Antw:DOIF mit Wildcards möglich?
Beitrag von: Vize am 04 Mai 2020, 15:03:21
Ahoi,

funktioniert
set Raffstore.* closed
?

VG
Andreas
Titel: Antw:DOIF mit Wildcards möglich?
Beitrag von: MadMax-FHEM am 04 Mai 2020, 15:07:12
Zitat von: Vize am 04 Mai 2020, 15:03:21
Ahoi,

funktioniert
set Raffstore.* closed
?

VG
Andreas

Damit werden ja ALLE geschlossen...

Evtl. gibt es bei DOIF $DEVICE oder $NAME wo der Name des triggernden Devices steht...

Gruß, Joachim
Titel: Antw:DOIF mit Wildcards möglich?
Beitrag von: Vize am 04 Mai 2020, 15:15:14
Dann habe ich das hier

ZitatNun würde ich dieses DOIF gerne für alle Raffstores nutzen.

wohl falsch gedeutet...  :-[

VG
Andreas
Titel: Antw:DOIF mit Wildcards möglich?
Beitrag von: MadMax-FHEM am 04 Mai 2020, 15:17:58
Vermutlich nur halb-richtig... ;)

Schon für alle...
...aber nicht für alle "gleichzeitig"...

So wie ich es verstanden habe: möglichst nur 1 DOIF was "alles erschlägt"...
...statt ein DOIF pro Raffstor...

Gruß, Joachim
Titel: Antw:DOIF mit Wildcards möglich?
Beitrag von: GU!DO am 04 Mai 2020, 19:56:38
Hallo,

Danke für die zahlreichen Antworten. MadMax-FHEM liegt richtig. Ich hätte gerne ein DOIF für alle Devices.
Beispiel:
HCANDeviceRolladen51:"DOWN" soll das Rollo Device Raffstore51 auslösen.

Dazu hatte ich ursprünglich:

([HCANDeviceRolladen51:"DOWN"] and [?Raffstore51] ne "drive-down" and [?Raffstore51] ne "drive-up") (set Raffstore51 extern closed) DOELSEIF ...


Das habe ich geändert in:

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



Was mir fehlt ist die Syntax um das in Punkt 2 umgesetzte auch im "set" Befehle zu benutzen: (set "Raffstore".(substr($Event, 18, 2)) extern closed) geht leider nicht.

Habe auch schon "Raffstore".(substr($Event, 18, 2)) in eine Variable geschreiben und diese mit in den Befehl eingefügt. Hat aber ebenfalls nicht geklappt. Das kann eigentlich nur was mit der Syntax zu tun haben.

Viele Grüße & vielen Dank

Guido
Titel: Antw:DOIF mit Wildcards möglich?
Beitrag von: MadMax-FHEM am 04 Mai 2020, 20:37:31
Trotzdem nochmal:

schau doch mal nach, was es bei DOIF gibt.
Es gibt bestimmt sowas wie $DEVICE, $NAME, o.ä.

Dort steht das auslösende Device drin damit sollte dann auch der set-Befehl gehen.

Bzw. 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 ;)

Gruß, Joachim
Titel: Antw:DOIF mit Wildcards möglich?
Beitrag von: GU!DO am 04 Mai 2020, 21:16:33
Ich habe ja eingentlich schon alles was ich brauche, ich habe nur noch keinen Weg gefunden die Strings zu verbinden:

Ergebnis soll sein: (set Raffstore51 extern closed)

Ich habe die 51 durch:
(substr($Event, 18, 2))

Ich weiß nur nicht, wie ich sie innerhalb des "set" Befehls mit "Raffstore" verbinden kann.

Im Bedingungsteil ging das mit
[?Raffstore.(substr($Event, 18, 2))]

so klappt es aber nicht im Anweisungsteil.
Titel: Antw:DOIF mit Wildcards möglich?
Beitrag von: Damian am 04 Mai 2020, 21:22:55
Perlberechnungen in eckigen Klammern der Form [?Raffstore.(substr($Event, 18, 2))] sind nicht sinnvoll möglich.

auf $device kannst du dagegen in der Bedingung substr anwenden, darauf kannst du dann ReadingsVal anwenden.
Titel: Antw:DOIF mit Wildcards möglich?
Beitrag von: amenomade am 04 Mai 2020, 21:24:49
und ich weiss nicht, ob $Event existiert... $EVENT oder $event schon, aber $Event?
Titel: Antw:DOIF mit Wildcards möglich?
Beitrag von: Damian am 04 Mai 2020, 22:15:20

z. B.

(["HCANDeviceRolladen:DOWN"] and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-down"...
Titel: Antw:DOIF mit Wildcards möglich?
Beitrag von: GU!DO am 04 Mai 2020, 22:35:30
Hallo,

ich glaube wir schreiben hier komplett aneinander vorbei.

Diese Bedingung habe ich genau so in meinem FHEM:

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


Wenn ich den Taster für mein Raffstore mit der Nr. 52 drücke, dann bekomme ich folgenden Event in FHEM:

2020-05-04 22:21:05 HCAN HCANDeviceRolladen52 DOWN


Das oben angegebene DOIF (mit $Event in geanu dieser Schreibweise!) reagiert auf den Event und fährt das virtuelle Rollo Device herunter über extern closed.

Mein einziges Problem ist, dass der angegebene Code zwar auf die verschiedenen Raffstores auswertet aber ausschließlich immer nur Raffstore52 ausführt, weil ich nicht weiß wie ich in (set Raffstore52 extern close) die 52 durch die Nummer ersetzten kann, deren Event an FHEM gesendet wurde:

Verhalten mit o.a. Code:
HCAN HCANDeviceRolladen52 DOWN => extern closed für Rollo Device Raffstore52 wird ausgeführt, da 52 hardcoded ist das wäre in dem Fall ja auch ok.
HCAN HCANDeviceRolladen99 DOWN => extern closed für Rollo Device Raffstore52 wird ausgeführt, da 52 hardcoded ist

er soll aber (set Raffstore99 extern closed) ausführen! Denn mein Ziel ist es, dass ich lediglich dieses eine DOIF in FHEM benötige um sämtliche "HCAN HCANDeviceRolladen DOWN" Events mit dem zugehörigen virtuellen Rollo-Device zu verbinden.

Vielen Dank

Guido
Titel: Antw:DOIF mit Wildcards möglich?
Beitrag 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.
Titel: Antw:DOIF mit Wildcards möglich?
Beitrag von: MadMax-FHEM am 04 Mai 2020, 22:46:54
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
Titel: Antw:DOIF mit Wildcards möglich?
Beitrag von: GU!DO am 04 Mai 2020, 22:47:10
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?
Titel: Antw:DOIF mit Wildcards möglich?
Beitrag von: amenomade am 05 Mai 2020, 00:09:54
(["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

Titel: Antw:DOIF mit Wildcards möglich?
Beitrag von: GU!DO am 05 Mai 2020, 20:59:06
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?
Titel: Antw:DOIF mit Wildcards möglich?
Beitrag von: Damian am 05 Mai 2020, 21:40:09
lass die geschweiften Klammern hinter elsif weg
Titel: Antw:DOIF mit Wildcards möglich?
Beitrag von: GU!DO am 05 Mai 2020, 22:26:15
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