[gelöst] DOIF Wildcard für Device

Begonnen von MikeRoxx, 04 März 2017, 11:41:04

Vorheriges Thema - Nächstes Thema

MikeRoxx

Hallo zusammen,

ich bin gerade am verzweifeln. Ich habe mehrere Fensterkontakte die ich über ein DOIF abfrage.
Das funktioniert auch soweit. Ich suche aber die passende Syntax für eine Wildcard im Devicename. Das Wort "Fensterkontakt" kommt im jeden Devicename vor.
Etwas wie .*_Fensterkontakt.* leider Funktioniert das hier nicht richtig oder ich sehe den Wald vor Bäumen nicht. Kann mich bitte jemand in die richtige Richtung stubsen.

Vielen Dank,

Gruß
Mike


([wz_Fensterkontakt_Esszimmer:contact] eq "open (to vccu)") (set HomeBot message Fenster im {(AttrVal("$DEVICE","alias","$DEVICE"))} ist offen)
DOELSEIF
([wz_Fensterkontakt_Esszimmer:contact] eq "closed (to vccu)") (set HomeBot message Fenster im {(AttrVal("$DEVICE","alias","$DEVICE"))} ist zu)

DOELSEIF
([wz_Fensterkontakt_1:contact] eq "open (to vccu)") (set HomeBot message Fenster im Wohnzimmer ist offen)
DOELSEIF
([wz_Fensterkontakt_1:contact] eq "closed (to vccu)") (set HomeBot message Fenster im Wohnzimmer ist zu)

DOELSEIF
([bd_Fensterkontakt:contact] eq "open (to vccu)")(set HomeBot message Fenster im Bad ist offen)
DOELSEIF
([bd_Fensterkontakt:contact] eq "closed (to vccu)")(set HomeBot message Fenster im Bad ist zu)



Proxmox mit FHEM und Debmatic auf Deb. Buster
HM / HmIP / FS20

Damian

Zitat von: MikeRoxx am 04 März 2017, 11:41:04
Hallo zusammen,

ich bin gerade am verzweifeln. Ich habe mehrere Fensterkontakte die ich über ein DOIF abfrage.
Das funktioniert auch soweit. Ich suche aber die passende Syntax für eine Wildcard im Devicename. Das Wort "Fensterkontakt" kommt im jeden Devicename vor.
Etwas wie .*_Fensterkontakt.* leider Funktioniert das hier nicht richtig oder ich sehe den Wald vor Bäumen nicht. Kann mich bitte jemand in die richtige Richtung stubsen.

Vielen Dank,

Gruß
Mike


([wz_Fensterkontakt_Esszimmer:contact] eq "open (to vccu)") (set HomeBot message Fenster im {(AttrVal("$DEVICE","alias","$DEVICE"))} ist offen)
DOELSEIF
([wz_Fensterkontakt_Esszimmer:contact] eq "closed (to vccu)") (set HomeBot message Fenster im {(AttrVal("$DEVICE","alias","$DEVICE"))} ist zu)

DOELSEIF
([wz_Fensterkontakt_1:contact] eq "open (to vccu)") (set HomeBot message Fenster im Wohnzimmer ist offen)
DOELSEIF
([wz_Fensterkontakt_1:contact] eq "closed (to vccu)") (set HomeBot message Fenster im Wohnzimmer ist zu)

DOELSEIF
([bd_Fensterkontakt:contact] eq "open (to vccu)")(set HomeBot message Fenster im Bad ist offen)
DOELSEIF
([bd_Fensterkontakt:contact] eq "closed (to vccu)")(set HomeBot message Fenster im Bad ist zu)


Wildcards im Devicenamen geht nur bei Ereignisabfragen und nicht bei Readingabfragen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

ArduPino

Was ist denn der unterschied zu dem hier:

define di_test_schaltung DOIF (["^1HM_T:on"]) (set 1TEST_E4 on)

Das habe ich gerade hier gefunden. Ich selber benutze auch was ähnliches, aber da sind noch Variablen wie $DEVICE dabei, weil das bei mir auch nicht ging.
Hier werden doch auch alle Geräte die mit "1HM_T" anfangen berücksichtigt.

Ich hab immer meine Probleme mir dem Ereignis und Readings...ist das nicht das gleiche? Die Ereignisse werden doch in die Readings geschrieben?


Gesendet von meinem Wileyfox Swift mit Tapatalk


Damian

[wz_Fensterkontakt_Esszimmer:contact] das ist eine Readingabfrage - sie liefert den Inhalt eines Readings

["wz_Fensterkontakt_Esszimmer:contact"] ist ein Ereignistrigger - der kann nur wahr oder nicht wahr sein und nur den kannst du generalisieren in der Form:

["wz_Fensterkontakt_:contact"]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

ArduPino

(["^CUL_TX_:humidity"] and [$DEVICE:humidity] > 69) (set Feuchtigkeit_hoch on) DOELSE (set Feuchtigkeit_hoch off)

Und das hier? Das habe ich mal hier aus dem Forum bekommen. Das sind doch Readings, wenn ich verschiedene Werte habe und wie hier vergleiche?

Gesendet von meinem Wileyfox Swift mit Tapatalk

MikeRoxx

Danke Damian und    ArduPino,

jetzt funktioniert es mit 2 Zeilen:

(["Fensterkontakt:open"]) (set HomeBot message {(AttrVal("$DEVICE","alias","$DEVICE"))} ist offen)
DOELSEIF
(["Fensterkontakt:close"]) (set HomeBot message {(AttrVal("$DEVICE","alias","$DEVICE"))} ist zu)


Hier auch noch einmal die Erklärung, die habe ich wohl übersehen:
https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung

Zitat["FS"] triggert auf alle Devices, die "FS" im Namen beinhalten
["^FS"] triggert auf alle Devices, die mit "FS" im Namen anfangen
["FS:temp"] triggert auf alle Devices, die "FS" im Namen und "temp" im Event beinhalten
([":^temp"]) triggert auf beliebige Devices, die im Event mit "temp" beginnen
(["^FS$:^temp$"] triggert auf Devices, die genau "FS" heißen und im Event genau "temp" vorkommt
[""] triggert auf alles
Proxmox mit FHEM und Debmatic auf Deb. Buster
HM / HmIP / FS20

Damian

Zitat von: ArduPino am 04 März 2017, 12:32:11
(["^CUL_TX_:humidity"] and [$DEVICE:humidity] > 69) (set Feuchtigkeit_hoch on) DOELSE (set Feuchtigkeit_hoch off)

Und das hier? Das habe ich mal hier aus dem Forum bekommen. Das sind doch Readings, wenn ich verschiedene Werte habe und wie hier vergleiche?

Gesendet von meinem Wileyfox Swift mit Tapatalk

[$DEVICE:humidity] das ist ein Reading ohne regex

(["^CUL_TX_:humidity"]  das ist kein Reading mit regex
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Klinki

Hi,

Ich bin auch etwas ratlos. Ich will für eine Gruppe von Devices eine Meldung auslösen, wenn ein Reading ein bestimmtes Alter überschritten hat. Da ich mit ReadingsAge und einem Wildcard-Device nicht weitergekommen bin, habe ich über ReadingsWatcher eine Überwachung eingerichtet welche den Wert des Readings "_letzteMeldung" den String "???" setzt.
Nun will ich mit Doif dieses Reading abfragen und eine Meldung generieren falls es den Wert "???" hat.


Hier der Versuch mit ReadingsAge für ein einzelnes Device:
( ReadingsAge("TTN_Wassermelder_1","_letzteMeldung",2) > 3) (set Signalbot send Alarm)
- funktioniert

( ReadingsAge("","_letzteMeldung",2) > 3) (set Signalbot send Alarm)
- funktioniert nicht

( ReadingsAge("^TTN","_letzteMeldung",2) > 3) (set Signalbot send Alarm)
- funktioniert nicht

Und der Versuch mit readingsWatcher:
([ "^TTN:_letzteMeldung"] eq "???") (set Signalbot send Alarm)
- funktioniert nicht

([ ":_letzteMeldung"] eq "???") (set Signalbot send Alarm)
- funktioniert nicht

Problem ist, glaube ich, dass mit der Wildcard-Nutzung nur auf Events reagiert wird und nicht auf den Wert eines Readings.
Was ich aber gerne hätte ist das Alter eines Readings mit einer Wildcard im Devicenamen.

Gruß
klinki

Damian

Zitat von: Klinki am 17 September 2021, 11:48:11
Problem ist, glaube ich, dass mit der Wildcard-Nutzung nur auf Events reagiert wird und nicht auf den Wert eines Readings.
Was ich aber gerne hätte ist das Alter eines Readings mit einer Wildcard im Devicenamen

Dann willst du ja nicht das Alter eines Readings, sondern vieler. Denn Wildcard würden ja mehrere selektieren. Das geht natürlich bei ReadingsAge nicht.

Was du probieren kannst:

DOIF (["^TTN:_letzteMeldung"] and ReadingsAge($device,"_letzteMeldung",2) > 3) (set Signalbot send Alarm)


Oder evtl. über Aggregation lösen: https://fhem.de/commandref_DE.html#DOIF_aggregation
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Klinki

Danke Für Deine Tipps.

Über die Doif-Aggregation habe ich es leider auch nicht hinbekommen.

Ich arbeite jetzt mit dem Reading, welches von ReadingsWatcher nach Timeout auf "???" gesetzt wird. Alle fraglichen Devices habe ich in einer Struktur (structure) zusammengefasst. Diese fasst besagtes Reading "_letzteMeldung" zusammen und hat enweder den Wert "undefined", oder, wenn eines der Devices "???" im Reading hat, den Wert "???".

Den Status der Struktur per Doif auszuwerten und nen Alarm abzusetzen ist ja dann kein Problem.
Ob mein Ansatz nun tatsächlich sinnvoller ist als einfach ein DoIf auf jeden Wassermelder einzustellen - keine Ahnung...