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