Merkwürdigkeit oder meine Dummheit (Event wird "geschluckt" bei ...)?

Begonnen von M_I_B, 02 August 2016, 21:32:39

Vorheriges Thema - Nächstes Thema

M_I_B

Folgende Situation:

Dummys:
define GC2272B_D0 dummy
attr GC2272B_D0 room GC2272B_TEST
attr GC2272B_D0 devStateIcon 1:on:0 0:off:1
attr GC2272B_D0 setList state:1,0
attr GC2272B_D0 webCmd :
define GC2272B_D1 dummy
attr GC2272B_D1 room GC2272B_TEST
attr GC2272B_D1 devStateIcon 1:on:0 0:off:1
attr GC2272B_D1 setList state:1,0
attr GC2272B_D1 webCmd :
define GC2272B_D2 dummy
attr GC2272B_D2 room GC2272B_TEST
attr GC2272B_D2 devStateIcon 1:on:0 0:off:1
attr GC2272B_D2 setList state:1,0
attr GC2272B_D2 webCmd :
define GC2272B_D3 dummy
attr GC2272B_D3 room GC2272B_TEST
attr GC2272B_D3 devStateIcon 1:on:0 0:off:1
attr GC2272B_D3 setList state:1,0
attr GC2272B_D3 webCmd :


Das ursprüngliche DOIF dazu:
define SendData DOIF ([GC2272B_D0] or [GC2272B_D1] or [GC2272B_D2] or [GC2272B_D3]) \
(set SCC1 raw is00f0ffff[GC2272B_D0][GC2272B_D1][GC2272B_D2][GC2272B_D3]) DOELSE
attr SendData do always

Hier bin ich davon ausgegangen, das jeder Zustandswechsel eines der 4 Dummys einen Event auslöst; weit gefehlt! Wenn man davon ausgeht, das alle Dummys auf "0" stehen, wird nur der Statiwechsel 0>1 erkannt, nicht aber 1>0. Sobald aber ein anderer Dummy auf 1 gesetzt wird, kann man den anderen wieder auf 0 setzen.

Also habe ich mal mit folgenden DOIF's rumprobiert (nur die erste Zeile):
define SendData DOIF ([GC2272B_D0] == 0|1 or [GC2272B_D1] == 0|1 or [GC2272B_D2] == 0|1 or [GC2272B_D3] == 0|1)
Alle 4 Dummys gehen einzeln und in Kombination
define SendData DOIF ([GC2272B_D0 == 0|1] or [GC2272B_D1] == 0|1 or [GC2272B_D2] == 0|1 or [GC2272B_D3])
Alle 4 Dummys gehen einzeln und in Kombination
define SendData DOIF ([GC2272B_D0] == 0|1 or [GC2272B_D1] == 0|1 or [GC2272B_D2] or [GC2272B_D3])
Alle 4 Dummys gehen einzeln und in Kombination
define SendData DOIF ([GC2272B_D0] == 0|1 or [GC2272B_D1] or [GC2272B_D2] or [GC2272B_D3])
Alle 4 Dummys gehen einzeln und in Kombination
define SendData DOIF ([GC2272B_D0] or [GC2272B_D1] or [GC2272B_D2] or [GC2272B_D3])
Ursprung: Einzelner Dummy löst einen Event bei 0>1 aus, aber nicht bei 1>0, nach Setzen eines anderen Dummy 0>1 lässt sich der Erstgenannte wieder auf 1>0 setzen.

Das verstehe ich so gar nicht. Wieso funktionieren alle Dummys, wenn ich nur bei einem Beliebigen ein "== 0|1" setze? Dann sollten doch der Logik nach jene ohne "== 0|1" weiterhin nicht auf einen Zustandswechsel 1>0 reagieren...



KernSani

Ich spekuliere mal, dass 0 und 1 als false bzw. true interpretiert werden.

Deine Ursprüngliche Variante ist:

Ausgangszustand:
0 or 0 or 0 or 0
nach schalten eines Dummies
1 or 0 or 0 or 0 ---> true
zurückschalten des Dummies
0 or 0 or 0 or 0 ---> false

der folgende Ausdruck ist immer wahr, damit ist der gesamte Ausdruck immer wahr und das DOIF wird ausgeführt
0 == 0|1

Vermutlich würde auch ein
([GC2272B_D0] or [GC2272B_D1] or [GC2272B_D2] or [GC2272B_D3]) or 1 das DOIF bei jedem Event triggern...

Reine Spekulation, wie gesagt... (aber lässt sich ja mit der letzten Variante überprüfen)

Grüße,

Oli
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Otto123

Hallo Micha,

ich will Dir nicht zu Nahe treten, aber ich glaube da ist ein Grundkurs Logik fällig.
https://wiki.selfhtml.org/wiki/Perl/Operatoren

vielleicht etwas bildlich:
http://www.elektrotechnik-fachwissen.de/digitaltechnik/logische-verknuepfung.php

Mein Lieblingsausdruck ist  == 0|1 probier mal in der Kommandozeile
{1 == 0|1}
{0 == 0|1}

Wie Oli schon gesagt hat: immer wahr!

Wenn Du einfach bei jeder Änderung Deiner Dummys einen Event auswerten willst, nimm doch ein notify auf "GC2272B.*"

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

M_I_B

@ Otto:
... das "== 0|1" immer wahr ist, ist mir schon klar; so blöd bin ich auch nicht  ::) Sollte das nicht rüber gekommen sein?!?
Zitat... nimm doch ein notify auf "GC2272B.*"
Das hatte ich auch schon ausprobiert, aber dabei bekomme ich den BIN-Code nicht zusammen gebaut

@ Oli:
Konnte Deinen Ausführungen leider nur teilweise folgen  :-\
M.E. wird doch bei DOIF intern erst ein Event ausgewertet und dann erst die ggf. vorhandene Bedingung. Wenn also im Dummy BlaBlub was passiert, egal was, wird DOIF getriggert und erst nach diesem Trigger folgt ein evtl. vorhandener Vergleich. Da hier ein Vergleich in der ursprünglichen Version fehlt, sollte eigentlich jede Aktion bei einem beliebigen der 4 Dummy's einen Event auslösen, der vom DOIF gefangen wird, ganz unabhängig davon, wie im Dummy der Event ausgelöst wurde, also ob nun ein Zustandwechsel von 0 zu 1 oder umgekehrt stattgefunden hat... Oder hab ich jetzt'n Knoten im Hirn?

@ all:

Die Fragen lauten ja:

1.:
Warum löst die Angabe ohne jeglichen Vergleich dahinter nicht wie erwartet bei jedwedem Zustandswechsel einen Event aus, sondern nur bei 0>1 ?

2.:
Warum wird für alle ein korrekter Zustandswechsel als Event erkannt, wenn nur bei einem ein so sinnfreier, immer wahrer Vergleich angestellt wird?


KernSani

nochmal kurz zusammengefasst:
1.) Das DOIF wird bei jedem Zustandswechsel evaluiert
2.) Wenn die DOIF-Bedingung wahr ist, wird CMD_1 ausgeführt
3.) Wenn nur ein einziger Vergleich wahr ist, ist der Gesamtausdruck wahr also kannst du ==0|1 oder 8==8 oder "Oli" eq "Oli" mit rein schreiben - damit wird der Gesamtausdruck wahr und CMD_1 getriggert
4.) Nur in dem Fall, dass dein Gesamtausdruck unwahr ist (also: false OR false OR false...oder eben 0 OR 0 OR 0 ) wird CMD_1 nicht getriggert. Genau das passiert aber, wenn der letzte Dummy 1er Dummy auf 0 gesetzt wird.

Grüße,

Oli
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

M_I_B

... hmmm ...
Da muss ich mal drüber schlafen. Es dämmert mir zwar so langsam, aber richtig hell ist's noch nicht  ::)

Mal anders herum gefragt: Wie kann man denn diese Aufgabe besser lösen?

KernSani

Laut commandref:
Zitat["FS"] triggert auf alle Devices, die "FS" im Namen beinhalten
also sollte

define SendData DOIF (["GC2272B"])
(set SCC1 raw is00f0ffff[GC2272B_D0][GC2272B_D1][GC2272B_D2][GC2272B_D3]) DOELSE


funktionieren
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

M_I_B

... stimmt! Das mit den "FS" ... hatte ich irgendwie aus den Augen verloren ...

Also so wie ich das sehe, muss man verdammt aufpassen und darf nicht aus dem Auge verlieren, das ...

["BlaBlub"] bei der Auswertung nicht identisch ist mit [BlaBlub1] or [BlaBlub2]

Ok, nehme ich erst mal so hin, obwohl ich den real existierenden Unterschied in der Auswertung nicht ganz verstehe; m.E. besagt beides das Gleiche...

Jetzt muss ich nur noch eine Möglichkeit ausgraben, die Fehlermeldung im Log ...

2016.08.03 08:32:06.958 3: set SCC1 raw is00f0ffff0000
2016.08.03 08:32:07.283 3: message "is00f0ffff0000" (14) too short!
2016.08.03 08:32:07.286 3: message "is00f0ffff0000" (14) too short!
2016.08.03 08:32:07.303 3: SCC1: Unknown code is00f0ffff0000, help me!


... irgendwie zu unterdrücken, ohne gleich alles andere auszuschalten. Ich dachte eigentlich, das bei direktem raw solche Plausibilitätsüberprüfungen unterbleiben ...

Otto123

Zitat von: M_I_B am 02 August 2016, 23:12:56
@ Otto:
... das "== 0|1" immer wahr ist, ist mir schon klar; so blöd bin ich auch nicht  ::) Sollte das nicht rüber gekommen sein?!?
Naja sorry aber wenn Dir nicht klar ist, dass bei "oder" die 1 immer durchschlägt (Oli hat es ja erklärt)  :-X
Das Du bist nicht blöd bist ist schon rübergekommen  ;)

Den obigen Ausdruck finde ich schon eine relativ ausschweifende Darstellung von "wahr"  8) oder "or 1"

Ich finde noch das Konstrukt mit DOIF und DOELSE leer am Ende und attr do always irgendwie schräg. Also ich verstehe es einfach nicht.
define SendData DOIF (["GC2272B"]) (set SCC1 raw is00f0ffff[GC2272B_D0][GC2272B_D1][GC2272B_D2][GC2272B_D3])
attr SendData do always
reicht doch oder?
define n_SendData notify GC2272B.* set SCC1 raw is00f0ffff[GC2272B_D0][GC2272B_D1][GC2272B_D2][GC2272B_D3]Sollte aber auch gehen.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

M_I_B

Zitat von: Otto123 am 03 August 2016, 13:27:36Naja sorry aber wenn Dir nicht klar ist, dass bei "oder" die 1 immer durchschlägt ...
Ne, das war mich nicht klar; muss auch nicht klar sein, weil es davon abhängt, wie das DOIF intern solche Logik anfasst, und davon hab ich nun wirklich keine Ahnung ...

Zitat von: Otto123 am 03 August 2016, 13:27:36Den obigen Ausdruck finde ich schon eine relativ ausschweifende Darstellung von "wahr"  8) oder "or 1"
Charaktersache  8) ;D

Zitat von: Otto123 am 03 August 2016, 13:27:36... das Konstrukt mit DOIF und DOELSE leer am Ende ...
... is auch schräg, weil's da real nicht ist; C&P- Fehler...

Wobei ein leeres DOELSE am Ende in gewissen Fällen schon Sinn macht ...

Otto123

Zitat von: M_I_B am 03 August 2016, 13:34:09
Ne, das war mich nicht klar; muss auch nicht klar sein, weil es davon abhängt, wie das DOIF intern solche Logik anfasst, und davon hab ich nun wirklich keine Ahnung ...
Ne ODER ist immer ODER! Also
0 or 0 = 0
0 or 1 = 1
1 or 0 = 1
1 or 1 = 1

Da kommt nicht mal DOIF dran vorbei.  8)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz