[Gelöst] DOIF mehrere Geräte / Devices / Temperaturfühler

Begonnen von ArduPino, 24 November 2016, 13:31:49

Vorheriges Thema - Nächstes Thema

ArduPino

Wie kann ich von mehreren Geräten die Temperatur abfragen und das dann an ein dummy weiterleiten ?


DEF (["^CUL_TX_:humidity"] > 60) (set Feuchtigkeit_hoch on) DOELSE (set Feuchtigkeit_hoch off)


Die Geräte heißen z.B. CUL_TX_113 wobei die Nummer dann immer unterschiedlich ist.
Sobald ich diesen "Platzhalter" ^ verwende, funktioniert es nicht mehr.
Was ist hier falsch ?

KölnSolar

RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

ArduPino

Geht leider auch nicht.
Habe aber nur "manuell" mit

setreading CUL_TX_113 humidity 66

getestet. Weiß nicht ob das ein Unterschied ist, wenn ich das so setze oder der Sensor mir den Wert übermittelt.
Wenn ich das device genau festlege, funktioniert es aber mit dem setreading.
Später noch mal über den Sensor testen.

hschuett

Hallo,
probier es mal ohne die Anführungszeichen
Syntax für Readings:
[<devicename>:<readingname>]

Der Regex Ausdruck .* (-->ein oder mehrere Zeichen am Ende) sollte auf jeden Fall passend sein.

Grüße,
Harald

ArduPino

Dann erhalte ich eine Fehlermeldung sobald ich auf modify klicke

di_Feuchtigkeit DOIF: Wrong timespec CUL_TX.*:humidity: either HH:MM:SS or {perlcode}: CUL_TX.*:humidity

hschuett

Hast Du die eckigen Klammern gesetzt?
Kannst Du die ganze Device-Definition nochmals hier posten?
[Device:Reading] in eckige Klammern gesetzt sollte klappen...

ArduPino

#6
So funktioniert es für ein festes device:

([CUL_TX_113:humidity] > 60) (set Feuchtigkeit_hoch on) DOELSE (set Feuchtigkeit_hoch off)



So erhalte ich die Fehlermeldung:

([CUL_TX_.*:humidity] > 60) (set Feuchtigkeit_hoch on) DOELSE (set Feuchtigkeit_hoch off)



So wird es übernommen, funktioniert aber nicht (ist aber so im Wiki auch enthalten):

(["^CUL_TX_:humidity"] > 60) (set Feuchtigkeit_hoch on) DOELSE (set Feuchtigkeit_hoch off)


Gibts doch nicht...ist doch eine einfache standard Sache  :o
EDIT:
Mache mal ein Update von FHEM.
Das DOIF wurde ja irgendwann angepasst, aber das ist ja schon was länger her.

EDIT:
Nein, daran lag es nicht. Muss vielleicht ein besonderes Attribut gesetzt werden ?
Habe im Wiki etwas von "addStateEvent" gelesen:

"Möchte man eindeutig eine Statusänderung eines Moduls erkennen,..."

Sind die Dinge die man mit DOIF macht nicht immer eindeutig ?


hschuett

#7
Die Regex-Ausdrücke prüfen scheinbar grundsätzlich nicht auf die Readings(werte), sondern ausschließlich auf die generierten Events.
Eine Lösung könnte wie folgt klappen:

Prüfung auf passendes Event und dann variable Prüfung auf Reading(wert) des Event-auslösenden Devices:

define ... DOIF (["^CUL_TX_:humidity"] and [$DEVICE:humidity] > 60)

Der Regex prüft, ob es ein passendes Event eines (beliebigen) CUL_TX Devices gibt, die Variable $DEVICE enthält den Namen des Event-auslösenden CUL_TX Devices. Damit kann dann auf das Reading humidity des auslösenden Gerätes geprüft werden ...

ArduPino

#8
Hab da irgend wie Verständnisprobleme mit Regex, Readings und Events.
Ein Reading ist doch nur der Eintrag (eben in die Readingsliste) wenn ein Event erzeugt wird ?!?

Aber das hier funktioniert ja auch:

DOIF ([LichtWetter:light] < 4  ) (set Steckdose_B on) DOELSE (set Steckdose_B off)


Vom device "LichtWetter" (Twilight) benutze ich den Lichtwert um eine Steckdose zu schalten, und hier wird ja auch ein Readingseintrag überprüft, und das ist ja nicht mal state.

Werde mal dein Beispiel mal versuchen.

EDIT:
Juhu ! Funktioniert !!!!  ;D ;D
Werde mir das mal so notieren, wird man ja sicher öfter mal brauchen.

ABER: Warum steht das denn ganz anders im Wiki ?
War das früher mal so und wurde geändert ?
Oder liegt das Problem ganz wo anders ?
Dein Beispiel müsste ja dann eigentlich da eingetragen werden, gibt ja sicher auch noch andere die so was machen wollen.

hschuett

Soweit ich das verstehe, enthält - aus Sicht des DOIFs - Dein letztes Beispiel keine "unscharfe" Mustersuche (per RegularExpression), sondern - aus Sicht des DOIFs - den konkreten Gerätenamen und den Readingnamen
[<devicename>:<readingname>] bzw. im Beispiel: [LichtWetter:light]
Damit kann das DOIF wohl direkt den Wert des Readings (des einen Geräts) ermitteln.

Ein Regex (Musterssuche) ^CUL_TX.* kann und würde ggf. mehrere (von Namen passende) Geräte & Readingswerte finden/zurückgeben. Vermutlich prüft das DOIF bei Regexausdrücken deshalb nur die (ausgelösten) Events auf vorhandensein. Der Workaround mit der Variablen $DEVICE schränkt (die Rückgabe) dann einen Readingswert eines Geräts ein. Im Zweifel wäre das das jeweilige Gerät, das zuletzt ein passendes Event ausgelöst hat...

ArduPino

In der Hilfe steht noch etwas dazu:

Ereignissteuerung über Auswertung von Events
...
Sollen Events verschiedener Devices ausgewertet werden, so lässt sich folgende Syntax anwenden: ["<device regex>:<event regex>"]


Aber egal.
So wie es ist funktioniert es !

Bedanke mich für die Hilfe !!!