Hauptmenü

DOIF mit Wildcards möglich?

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

Vorheriges Thema - Nächstes Thema

GU!DO

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

kumue


GU!DO

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

Vize

Ahoi,

funktioniert
set Raffstore.* closed
?

VG
Andreas

MadMax-FHEM

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

Vize

Dann habe ich das hier

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

wohl falsch gedeutet...  :-[

VG
Andreas

MadMax-FHEM

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
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

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

MadMax-FHEM

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
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

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.

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

amenomade

und ich weiss nicht, ob $Event existiert... $EVENT oder $event schon, aber $Event?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Damian


z. B.

(["HCANDeviceRolladen:DOWN"] and ReadingsVal ("Raffstore".substr($device, 18, 2),"state","") ne "drive-down"...
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

GU!DO

#13
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

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF