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
			
			
			
				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
			
			
			
				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
			
			
			
				Ahoi,
funktioniert 
set Raffstore.* closed
?
VG
Andreas
			
			
			
				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
			
 
			
			
				Dann habe ich das hier
ZitatNun würde ich dieses DOIF gerne für alle Raffstores nutzen.
wohl falsch gedeutet...  :-[
VG
Andreas
			
				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
			
			
			
				Hallo,
Danke für die zahlreichen Antworten. MadMax-FHEM liegt richtig. Ich hätte gerne ein DOIF für alle Devices.
- Die Events unterscheiden sich lediglich durch die angehängte Nummer. 
- Die zugehörigen Rollo Devices ebenfalls. 
- Die Nummer des events ist die gleiche wie die des "zugehörigen" Rollo Device.
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)
- Er fängt mit ["HCANDeviceRolladen:DOWN"] statt [HCANDeviceRolladen51:"DOWN"] sämtliche HCANDeviceRolladen "DOWN" Events ab.
- Die für die weitere Überprüfung benötigte zugehörige Rolladen Device ermittelt er mit: [?Raffstore.(substr($Event, 18, 2))]. Er "schneidet" so zu sagen die Nummer aus dem Event heraus und hängt diese an den String "Raffstore".  Damit hat er den Namen des zugehörigen Rollo Devices (hier Raffstore51) generiert und kann diesen abfragen.
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
			
				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
			
			
			
				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.
			
			
			
				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.
			
			
			
				und ich weiss nicht, ob $Event existiert... $EVENT oder $event schon, aber $Event?
			
			
			
				
z. B.
(["HCANDeviceRolladen:DOWN"] and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-down"...
			
			
			
				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
			
			
			
				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.
			
			
			
				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
			
 
			
			
				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?
			
			
			
				(["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
			
 
			
			
				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?
			
			
			
				lass die geschweiften Klammern hinter elsif weg
			
			
			
				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