[Gelöst] Mehrere DOIFS zu einem vereinen?

Begonnen von Kuehnhackel, 03 Januar 2021, 15:08:14

Vorheriges Thema - Nächstes Thema

Kuehnhackel

Auch daran kann es nicht liegen:

Hexadezimal -> D3D5DE
entspricht
Dezimal -> 13882846


amenomade

#16
Wenn Du
[MQTT2_DVES_BF00E2:"^Data:.D3D5DE"] schreibst, reagieren die entspr. Bedingungen bei jedem Event von MQTT2_DVES_BF00E2 und testen dann ob das Event tatsächlich ^Data:.D3D5DE matcht.

Hier bei jedem Event von MQTT2_DVES_BF00E2  werden (nur) Bedingungen 1 und 3 getestet, und wenn das Event nicht matcht, geht er dann auf DOELSE. Deswegen kann man hier nicht mit DOELSE arbeiten.

Hätte dein Device ein bestimmtes Reading motion / nomotion könnte man es
([MQTT2_DVES_BF00E2:reading] eq "motion") schreiben, und da würden die Bedingungen 1 und 3 nur triggern, wenn dieses Reading sich ändert.
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

#17
Ein kleiner aber wichtiger Tipp:

bei [MQTT2_DVES_BF00E2:"^Data:.D3D5DE"] wird ein konkretes Device angegeben, wenn dieses Device etwas anderes sendet, so wird die Bedingung getestet, da sie aber nicht wahr ist, wird DOELSE ausgeführt,

bei ["^MQTT2_DVES_BF00E2$:^Data:.D3D5DE"] gehört das Device zum Event, wenn das Device etwas anderes sendet, wird die Bedingung erst gar nicht getestet, damit wird kein DOELSE ausgeführt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

amenomade

Danke Damian. Dann ist die Lösung einfach. Ich war schon auf der Suche nach einem passenden DOELSEIF um das DOELSE zu ersetzen, z.B.:
DOELSEIF (([Lux_Dachboden:"BH1750_Illuminance"] or [MQTT2_DVES_BF00E2:"^Data"]) \
         and [?21:31-16:29] and [$SELF:cmd] ne "3.1" and [?H801_Kueche] ne "off") \
   (set H801_Kueche off)


Hier hätte ich Illuminance und MQTT2 Events als reine Trigger benutzt (je nachdem welches das erste ist, das sich meldet), und dann den Rest getestet.

aber es reicht denn in der 1. und in der 3. Bedingung, die Events in deiner 2. Form zu schreiben

   DEF        (["^MQTT2_DVES_BF00E2$:^Data:.D3D5DE"] and [?16:30-21:30] and [?Lux_Dachboden:BH1750_Illuminance]< 1100 )
   (set H801_Kueche pct 100)
   (set H801_Kueche pct 50)
DOELSEIF  ([16:30-21:30] and [Lux_Dachboden:BH1750_Illuminance]< 50 and [$SELF:cmd] ne "1.1")
   (set H801_Kueche pct 50)
DOELSEIF (["^MQTT2_DVES_BF00E2$:^Data:.D3D5DE"] and [?21:31-16:29] and [?Lux_Dachboden:BH1750_Illuminance]< 1100)
   (set H801_Kueche pct 50)
   (set H801_Kueche off)
DOELSE (set H801_Kueche off)

Hier wird er auf DOELSE schalten, sobald Illuminance sich meldet und die 2. Bedingung nicht wahr ist.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Kuehnhackel

Zitat von: Damian am 04 Januar 2021, 13:34:37

bei ["^MQTT2_DVES_BF00E2$:^Data:.D3D5DE"] gehört das Device zum Event, wenn das Device etwas anderes sendet, wird die Bedingung erst gar nicht getestet, damit wird kein DOELSE ausgeführt.

Danke, das war der Schlüssel.

Danke an alle die mitgeholfen haben.

Mache den Thread dann mal auf gelöst  ;D

Liebe Grüße aus dem Osten Hamburgs

Ralf

Kuehnhackel

#20
Hallo, ich muss das gelöst noch einmal aufheben ;), weil ich habe noch einen entscheidenen "Kinken" drin.

21:31-9:29 alle 3 Bedingungen erfüllen

defmod LUX_LED_Kueche DOIF (["^MQTT2_DVES_BF00E2$:^Data:.D3D5DE"] and [?16:30-21:30] and [?Lux_Dachboden:BH1750_Illuminance]< 1100 ) \
   (set H801_Kueche pct 100) \
   (set H801_Kueche pct 50) \
DOELSEIF  ([16:30-21:30] and [Lux_Dachboden:BH1750_Illuminance]< 50 and [$SELF:cmd] ne "1.1") \
   (set H801_Kueche pct 50) \
DOELSEIF (["^MQTT2_DVES_BF00E2$:^Data:.D3D5DE"] and [?21:31-9:29] and [?Lux_Dachboden:BH1750_Illuminance]< 50) \
   (set H801_Kueche pct 50) \
   (set H801_Kueche off) \
DOELSE (set H801_Kueche off)
attr LUX_LED_Kueche do resetwait
attr LUX_LED_Kueche room Küche
attr LUX_LED_Kueche wait 0,300:0:0,300:0


Weil es fehlt, dass das Licht in der Zeit von 9.30-16:29 angeht, wenn die Schwelle unter 1100 Lux fällt, aber ohne Bewegungsmelder
defmod LUX_LED_Kueche DOIF (["^MQTT2_DVES_BF00E2$:^Data:.D3D5DE"] and [?16:30-21:30] and [?Lux_Dachboden:BH1750_Illuminance]< 1100 ) \
   (set H801_Kueche pct 100) \
   (set H801_Kueche pct 50) \
DOELSEIF  ([16:30-21:30] and [Lux_Dachboden:BH1750_Illuminance]< 50 and [$SELF:cmd] ne "1.1") \
   (set H801_Kueche pct 50) \
DOELSEIF (["^MQTT2_DVES_BF00E2$:^Data:.D3D5DE"] and [?21:31-9:29] and [?Lux_Dachboden:BH1750_Illuminance]< 50) \
   (set H801_Kueche pct 50) \
   (set H801_Kueche off) \
DOELSEIF ([?9:30-16:29] and [?Lux_Dachboden:BH1750_Illuminance]< 1100) \
   (set H801_Kueche pct 50) \
DOELSE (set H801_Kueche off)
attr LUX_LED_Kueche do resetwait
attr LUX_LED_Kueche room Küche
attr LUX_LED_Kueche wait 0,300:0:0,300:0:0


Oder müsste da noch der cmd rein?
defmod LUX_LED_Kueche DOIF (["^MQTT2_DVES_BF00E2$:^Data:.D3D5DE"] and [?16:30-21:30] and [?Lux_Dachboden:BH1750_Illuminance]< 1100 ) \
   (set H801_Kueche pct 100) \
   (set H801_Kueche pct 50) \
DOELSEIF  ([16:30-21:30] and [Lux_Dachboden:BH1750_Illuminance]< 50 and [$SELF:cmd] ne "1.1") \
   (set H801_Kueche pct 50) \
DOELSEIF (["^MQTT2_DVES_BF00E2$:^Data:.D3D5DE"] and [?21:31-9:29] and [?Lux_Dachboden:BH1750_Illuminance]< 50) \
   (set H801_Kueche pct 50) \
   (set H801_Kueche off) \
DOELSEIF ([?9:30-16:29] and [?Lux_Dachboden:BH1750_Illuminance]< 1100)  and [$SELF:cmd] ne "1.1") \
   (set H801_Kueche pct 50) \
DOELSE (set H801_Kueche off)
attr LUX_LED_Kueche do resetwait
attr LUX_LED_Kueche room Küche
attr LUX_LED_Kueche wait 0,300:0:0,300:0:0


Hängt hat mit der Anwesenheit zusammen  ;D

amenomade

Ich dachte Du willst nur am Tag beleuchten, wenn eine Bewegung kommt, aber nicht permanent. Und das macht

DOELSEIF (["^MQTT2_DVES_BF00E2$:^Data:.D3D5DE"] and [?21:31-16:29] and [?Lux_Dachboden:BH1750_Illuminance]< 1100)
   (set H801_Kueche pct 50)
   (set H801_Kueche off)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Kuehnhackel

Habe das gerade so der Regerung vorgeführt, aber die war not amused  8)

amenomade

Also:

(["^MQTT2_DVES_BF00E2$:^Data:.D3D5DE"] and [?16:30-21:30] and [?Lux_Dachboden:BH1750_Illuminance]< 1100 )
Bewegung abends wenn dunkel

([16:30-21:30] and [Lux_Dachboden:BH1750_Illuminance]< 50 and [$SELF:cmd] ne "1.1")
Dunkel abends und wir sind nicht während wait nach Bewegung

(["^MQTT2_DVES_BF00E2$:^Data:.D3D5DE"] and [?21:31-9:29] and [?Lux_Dachboden:BH1750_Illuminance]< 50)
Bewegung nachts wenn dunkel

[21:31-9:29] and [Lux_Dachboden:BH1750_Illuminance]< 50
Dunkel nachts

Die Bedingungen mit ? triggern nicht


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

#24
Wenn Du nur strikt das willst ,(bis auf die Uhrzeiten und Lux Grenzen):
Zitat1. In der Zeit von 16:30-21:30, wenn es dunkel ist = Lux < 200 soll er auf 50 pct angehen. Zusätzlich soll er, wenn Bewegung erkannt wird auf 100% gehen. Die 100% sollen für 5 min an bleiben und dann zurückfallen auf 50%
2. In der Zeit von 21:31-16:29, wenn es dunkel ist = Lux < 1100 soll er auf 50 pct angehen

DEF        (["^MQTT2_DVES_BF00E2$:^Data:.D3D5DE"] and [?16:30-21:30] and [?Lux_Dachboden:BH1750_Illuminance]< 1100 ) #Bewegung abends wenn dunkel
   (set H801_Kueche pct 100)
   (set H801_Kueche pct 50)
DOELSEIF  ([16:30-21:30] and [Lux_Dachboden:BH1750_Illuminance]< 50 and [$SELF:cmd] ne "1.1") #Abends wenn dunkel und keine Bewegung vorher
   (set H801_Kueche pct 50)
DOELSEIF ([21:31-9:29] and [Lux_Dachboden:BH1750_Illuminance]< 50) #Nachts wenn dunkel
   (set H801_Kueche pct 50)
DOELSE (set H801_Kueche off)


Das Missverständnis kam, da Du jetzt wieder die Uhrzeiten geändert hast. Früher war es 21:31-16:29 und ich hätte nie gedacht, dass du permanent auch am Tag beleuchten willst.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Kuehnhackel

Die Zeiten hatte verändert, wahrscheinlich als du geantwortet hast.

Ich habe dieses DOIF jetzt mal initialisiert.
defmod LUX_Kueche DOIF (["^MQTT2_DVES_BF00E2$:^Data:.D3D5DE"] and [?16:30-21:30] and [?Lux_Dachboden:BH1750_Illuminance]< 1100 ) \ #1100 Lux decken auch Frühjahr und Herbst ab#
   (set H801_Kueche pct 100) \
   (set H801_Kueche pct 50) \
DOELSEIF  ([16:30-21:30] and [Lux_Dachboden:BH1750_Illuminance]< 50 and [$SELF:cmd] ne "1.1") \ #generell an egal ob jemand zuhause oder nicht#
   (set H801_Kueche pct 50) \
DOELSEIF (["^MQTT2_DVES_BF00E2$:^Data:.D3D5DE"] and [?21:31-16:29] and [?Lux_Dachboden:BH1750_Illuminance]< 1100) \ #wenn jemand tagsüber in der Küche ist, in der Nacht runtergeht oder spät heimkommt, die 1100 Lux sind bedeckter Himmel#
   (set H801_Kueche pct 50) \
   (set H801_Kueche off) \
DOELSE (set H801_Kueche off)
attr LUX_Kueche do resetwait
attr LUX_Kueche room Küche
attr LUX_Kueche wait 0,300:0:0,300:0:0

Wobei ich das Schwachsinn finde was die GöGa da will  :( - Also alles wieder auf den Ursprung und gut ist. Alles andere ist doppelt gemoppelt  8)

Danke für Hilfe und Denkanstöße

Liebe Grüße

Ralf



amenomade

Bitte auch die Anmerkung von Beta-User im anderen Thread berücksichtigen: ich weiss nicht wie "MQTT2_DVES_BF00E2:Data" babbelt, aber mit "event-on-change-reading .*" wird eine erneute Bewegung das DOIF nicht triggern, falls inzwischen kein anderes "Data" Event angekommen ist.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Kuehnhackel

Zitat von: Damian am 04 Januar 2021, 13:34:37
Ein kleiner aber wichtiger Tipp:

bei [MQTT2_DVES_BF00E2:"^Data:.D3D5DE"] wird ein konkretes Device angegeben, wenn dieses Device etwas anderes sendet, so wird die Bedingung getestet, da sie aber nicht wahr ist, wird DOELSE ausgeführt,

bei ["^MQTT2_DVES_BF00E2$:^Data:.D3D5DE"] gehört das Device zum Event, wenn das Device etwas anderes sendet, wird die Bedingung erst gar nicht getestet, damit wird kein DOELSE ausgeführt.

Aber das hattest du auch gelesen?

amenomade

#28
Ja, aber das ändert nicht an den Fakt: kein Event = keine Triggerung

EDIT: da im "json_raw" aber immer der Timestamp enthalten ist, wird sich das json_raw Reading jedes mal ändern, und dann kriegst Du wahrscheinlich jedes Mal doch ein Event. Ist wahrscheinlich schon OK.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Kuehnhackel

Ich gebe dann an der Stelle auf, weil es nicht funktioniert, wie ich es mir vorstelle. Werde mir andere Lösungen

Ganz seltsam was nun passiert ist. Bewegung wurde erkannt und schaltet auf 100% hoch. Nach dem wait 300 sek später schaltet es sich ab.

Dann nach weiteren 300 sek geht der Stripe auf 50% an.

Ich bin verwirrt.

Ich werde mir wohl was anderes einfallen lassen müssen.