[gelöst] Verständigungsfrage Trigger

Begonnen von choetzu, 04 Juni 2018, 19:59:37

Vorheriges Thema - Nächstes Thema

amenomade

#15
Eher sowas in der Art: https://fhem.de/commandref_DE.html#DOIF_Fenster_offen_Meldung

So ein DOIF triggert auf alle "battery" Events, egal das Device, und dann Speichert den Zustand "low" oder "ok" des jeweiligen Device in einem Reading B_<devicename> des DOIFs selbst. Und dieses Reading wird auch in der Bedingung geprüft.

Du hast das umgekehrt gemacht: statt ein Reading des DOIFs pro Device, hast Du ein Reading DOIFreading auf jedem Device gesetzt. Könnte auch gehen, aber Du hast nicht alles unten den Augen zum Testen. Wenn alles auf dem DOIF ist, kannst Du sofort sehen, welche Geräte in welcher Reihenfolge getriggert haben, und in welchem Zweig des DOIFs die gearbeitet haben.

Du warst aber auf dem guten Weg.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

choetzu

#16
herzlichen dank. Ich bin der Sache auf der Spur.. Aber irgendwie komme ich nicht weiter. Alle Storen haben FSB61 im Namen, deshalb kann ich darüber filtern. Das DOIF steht immer auf INITIALIZED, auch wenn ich irgendeine Store hoch oder runtermache. Und checken kann ich ja net, weil kein device getriggert wird, oder?

Gestern noch euphorisch, heute wieder down.. ;)

([?06:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and ["^FSB61$:^up$"])
(setreading $SELF B_$DEVICE close)
(setreading $device test closes)

DOELSEIF
(["^FSB61:position"] < 80
and [?Sommer_Storenzeit_Dummy] eq "on"
and [?10:00-18:30]
and [PoolController:Pool_Aussen_Num] > 23
and [?$SELF:St_$DEVICE] ne "closed")
(setreading $SELF B_$DEVICE closed)
(setreading $device test closes)

DOELSEIF
(["^FSB61$:^up$"]
and [?$SELF:B_$DEVICE] ne "open")
(setreading $SELF B_$DEVICE open)
(setreading $device test open)


attr do always
Raspi3, EnOcean, Zwave, Homematic

amenomade

Warum auch immer, war mein Link hieroben falsch. Ich meinte dieses Beispiel:
Zitat von: CommandRefBatteriewarnung per E-Mail verschicken

define di_battery DOIF ([":battery: low"] and [?$SELF:B_$DEVICE] ne "low")
    ({DebianMail('yourname@gmail.com', 'FHEM - battery warning from device: $DEVICE')}, setreading $SELF B_$DEVICE low)
DOELSEIF ([":battery: ok"] and [?$SELF:B_$DEVICE] ne "ok")
    (setreading $SELF B_$DEVICE ok)
attr di_battery do always

Aber zurück zu deinem Doif:

and ["^FSB61$:^up$"])
Sowas triggert  auf dem Device, das genau FSB61 (nichts vorher da ^, und nichts nachher da $) heisst und wo genauso exakt "up" im Event vorkommt.

Was Du möchstest ist wahrscheinlich entweder alle Device, die im Namen FSB61 haben, dann and ["FSB61:^up$"]) oder die mit FSB61 anfangen, dann and ["^FSB61:^up$"]) oder die mit FSB61 enden, dann and ["FSB61$:^up$"])




Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

choetzu

#18
Zitat von: amenomade am 07 Juni 2018, 22:54:58
Warum auch immer, war mein Link hieroben falsch. Ich meinte dieses Beispiel:
Aber zurück zu deinem Doif:

and ["^FSB61$:^up$"])
Sowas triggert  auf dem Device, das genau FSB61 (nichts vorher da ^, und nichts nachher da $) heisst und wo genauso exakt "up" im Event vorkommt.

Was Du möchstest ist wahrscheinlich entweder alle Device, die im Namen FSB61 haben, dann and ["FSB61:^up$"]) oder die mit FSB61 anfangen, dann and ["^FSB61:^up$"]) oder die mit FSB61 enden, dann and ["FSB61$:^up$"])

Herzlichen Dank. Es muss auf FSB61 enden...

Ich teste es wie folgt:
([?06:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and ["FSB61$:^down$"]
        and [$SELF:ST_$DEVICE] ne "1")
(setreading $SELF ST_$DEVICE 1)

DOELSEIF
([?10:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and [?"FSB61:position"] < 70
and ([PoolController:Pool_Aussen_Num]  > 23
or [Netatmo_Buero:temperature] > 26)
and [?$SELF:ST_$DEVICE] !~ '^(1|2)$')
          (setreading $SELF ST_$DEVICE 2)

DOELSEIF
([00:00])
(setreading $SELF ["^ST_"] 0)


mit do always. die erste Sequenz (down) konnte ich erfolgreich testen. Die zweite Sequenz (> 23) leider noch nicht. Und bei der dritten Sequenz (00:00) kommt eine Fehlermeldung.

setreading TEST_DOIF ST_S.* 0: WARNING: unsupported character in reading ST_S.* (not A-Za-z/\d_\.-)

Ich habe auch ^ und Anführungszeichen, [] etc versucht. geht wie nicht.


[?"^FSB61:position"] < 80
Und bei Sequenz 2, ist das so OK, oder muss ich da mit .* arbeiten? 
Raspi3, EnOcean, Zwave, Homematic

choetzu

hmm, ich komm da nicht weiter...

DOELSEIF
([00:00])
(setreading $SELF {(ST_.*) 0)


da kommt nun die Fehlermeldung
syntax error at (eval 390296) line 1, at EOF
Und das bedeutet nach meiner Recherche "zu wenig Klammern" (EOF). Wo will der denn noch mehr...gggrr
Raspi3, EnOcean, Zwave, Homematic

amenomade

#20
Zitat(setreading $SELF {(ST_.*) 0)

Aber ich glaube nicht, dass Du auf einmal so mehrere Readings setzen kannst. <reading> ist nicht wie <devspec>, der Filter und regex akzeptiert. Evtl musst Du hier bischen Perl schreiben.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

choetzu

Zitat von: amenomade am 09 Juni 2018, 00:40:03
Aber ich glaube nicht, dass Du auf einmal so mehrere Readings setzen kannst. <reading> ist nicht wie <devspec>, der Filter und regex akzeptiert. Evtl musst Du hier bischen Perl schreiben.

danke, den KlammerFehler habe ich auch bemerkt. Geht trotzdem nicht. Ich habe gefühlte 1000 Kombinationen {|][(" etc versucht. Alles geht nicht. Und ich finde auch im Forum etc nichts ähnliches. Ich befürchte Onkel Perl muss helfen.. Den kenn ich aber brutal schlecht.. Wie kann ich dies ändern? Danke.
Raspi3, EnOcean, Zwave, Homematic

Damian

Zitat von: choetzu am 09 Juni 2018, 10:20:26
danke, den KlammerFehler habe ich auch bemerkt. Geht trotzdem nicht. Ich habe gefühlte 1000 Kombinationen {|][(" etc versucht. Alles geht nicht. Und ich finde auch im Forum etc nichts ähnliches. Ich befürchte Onkel Perl muss helfen.. Den kenn ich aber brutal schlecht.. Wie kann ich dies ändern? Danke.

setreading unterstützt offenbar keine regex für Readingnamen, das Setzen der einzelnen Readings  musst du dann explizit mit mehreren setreading-Aufrufen regeln.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

choetzu

Danke.  Dann muss ich einen anderen Weg finden. Vermutlich muss ich die Readings in den entsprechenden Devices schreiben anstelle DoifReadings.. zurück auf Feld 1 ;)
Raspi3, EnOcean, Zwave, Homematic

Per

Zitat von: Damian am 09 Juni 2018, 10:42:25
setreading unterstützt offenbar keine regex für Readingnamen
setreading nicht, aber deletereading (wenn ich mich nicht irre). Und ob 0 oder Nul ;) ist relativ egal und lässt sich abfangen.

amenomade

Also... mit bisschen Perl auch nicht so kompliziert: auf Basis foreach in $defs{$SELF}{READINGS} o.ä. Kann im Moment aber nicht entwickeln/testen.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

DOELSEIF
([00:00])
{ my $readings = $defs{$SELF}->{READINGS};  for my $key (keys %$readings) {fhem("setreading $SELF $key 0") if $key =~ "ST_.*";} }
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

choetzu

wow, super, das funktioniert bestens. Herzlichen Dank. Ich habe es Testweise mal so gemacht.

([?06:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and ["FSB61$:^down$"]
        and [$SELF:ST_$DEVICE] !~'^(1|2)$')
(setreading $SELF ST_$DEVICE 1)

DOELSEIF
([?10:00-20:30]
and [?Sommer_Storenzeit_Dummy] eq "on"
and [?"FSB61:position"] < 70
and ([PoolController:Pool_Aussen_Num]  > 23
or [Netatmo_Buero:temperature] > 26)
and [?$SELF:ST_$DEVICE] !~ '^(1|2)$')
          (setreading $SELF ST_$DEVICE 2)

DOELSEIF
([00:00])
{ my $readings = $defs{$SELF}->{READINGS};  for my $key (keys %$readings) {fhem("setreading $SELF $key 0") if $key =~ "ST_.*";} }


cmd_1 klappt, cmd_3 nun auch. Doch wird cmd_2 mit
and [?"FSB61:position"] < 70
auch klappen? Wenn ja, dann werde ich nebst den Setreadings noch close-/open Befehle ergänzen.

danke nohcmals.. super..
Raspi3, EnOcean, Zwave, Homematic

amenomade

Zitat von: choetzu am 11 Juni 2018, 23:20:34
Doch wird cmd_2 mit
and [?"FSB61:position"] < 70
auch klappen?

Nö, das finde ich komisch. Hast Du jetzt ein Device, das "FSB61" heisst? Dann mit [?FSB61:position] testen.
Aber wenn Du auf Events von mehreren Devices triggern möchtest, wird es nicht sauber mit [PoolController:Pool_Aussen_Num] oder [Netatmo_Buero:temperature] kombiniert.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

choetzu

Zitat von: amenomade am 11 Juni 2018, 23:34:22
Nö, das finde ich komisch. Hast Du jetzt ein Device, das "FSB61" heisst? Dann mit [?FSB61:position] testen.
Aber wenn Du auf Events von mehreren Devices triggern möchtest, wird es nicht sauber mit [PoolController:Pool_Aussen_Num] oder [Netatmo_Buero:temperature] kombiniert.

hmm, hier will ich eigentlich einen Zustand und keinen Event abfragen. Also, wenn [PoolController:Pool_Aussen_Num] oder [Netatmo_Buero:temperature] triggert soll mit and [?"FSB61:position"] < 70 gecheckt werden, bei welchen Rolladen mit FSB61 im Namen die Position < 70 ist. Es triggert also keinen Event sondern einen Zustand/Reading.  Das  [?"FSB61$:position"] < 70 triggert doch einen Event, oder geht das auch beim Zustand?
Raspi3, EnOcean, Zwave, Homematic