structure: clientstate_priority bei unbekannten Zuständen

Begonnen von PatrickR, 30 Juli 2019, 12:13:36

Vorheriges Thema - Nächstes Thema

PatrickR

Mahlzeit!

Ich habe aktuell folgendes Problem. Ich habe eine Reihe von Geräten (DOIFs), die verschiedene Fehlerzustände in FHEM abprüfen. Deren state ist entweder ok oder eine Kurzbeschreibung des Fehlers. Nun habe ich die Geräte in einer structure zusammengefasst, die exakt dann den State ok übernehmen soll wenn alle ihr zugeordneten Geräte ihn haben. Um das zu erreichen, müsste clientstate_priority so definiert werden, dass alle (nicht aufzählbaren) Zustände Priorität vor ok haben.

Wie bewerkstelligt man das am besten?

Patrick
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook

amenomade

Ich sehe keine einfache Möglichkeit mit structure.
Mit https://fhem.de/commandref_DE.html#DOIF_aggregation sollte es aber relativ einfach sein. Z.B. nach diesem Beispiel:
define di_window DOIF
attr di_window state Offene Fenster: [@"^window:open":state:"open","keine"]
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Otto123

Hallo Patrick,

deine Aussage verwirrt mich etwas. Aber die Aufgabe: "die exakt dann den State ok übernehmen soll wenn alle ihr zugeordneten Geräte ihn haben"
da würde ich spontan sagen:
clientstate_behavior  absolute
clientstate_priority spielt keine Rolle

Zitatabsolute
Die Struktur wird erst dann den Status der zugefügten Devices annehmen, wenn alle Devices einen identischen Status vorweisen. Bei unterschiedlichen Devictypen kann dies per Attribut <struct_type>_map pro Device beinflusst werden. Andernfalls hat die Struktur den Status "undefined".

Wenn alle ok dann structure ok - oder?

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

CoolTux

Hallo Otto,

So wie Du es schreibst würde undefined stehen.

@Patrick
Teste mal so.

In den Devices:
Internals:
   FUUID      5d402230-f33f-d1da-1d5c-56d01a5390d14e92
   NAME       dummyDev1
   NR         160
   STATE      fehler im system
   TYPE       dummy
   READINGS:
     2019-07-30 13:11:54   state           fehler im system
Attributes:
   dummyDev_map state:^ok$:ok state:^(\w+\W\w+)+$:error
   room       Test
   userattr   dummyDev dummyDev_map structexclude


Das Structure Device:
Internals:
   ATTR       dummyDev
   CHANGEDCNT 16
   DEF        dummyDev dummyDev1 dummyDev2 dummyDev3
   FUUID      5d402292-f33f-d1da-6fc6-6fc20efcaee45850
   NAME       structureTestDummyDev
   NR         169
   NTFY_ORDER 50-structureTestDummyDev
   STATE      error
   TYPE       structure
   READINGS:
     2019-07-30 13:15:46   LastDevice      dummyDev1
     2019-07-30 13:15:46   LastDevice_Abs  dummyDev1
     2019-07-30 13:15:46   state           error
Attributes:
   clientstate_behavior relative
   clientstate_priority error ok
   room       Test

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

Ach so, Voraussetzung das es geht was ich da gemacht habe ist in der Tat ein Text als state im Device. Du kannst da auch ein anderes Reading für nehmen. Aber der Text muss wenigsten ein wort ein leerzeichen und ein buchstaben haben.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Otto123

Zitat von: CoolTux am 30 Juli 2019, 13:16:39
Hallo Otto,

So wie Du es schreibst würde undefined stehen.

Ja wenn einer nicht ok ist, aber war das nicht die Aufgabe? -> Es soll die structure ok sein wenn alle ok sind.
Es stand doch nicht die Aufgabe, dass etwas bestimmtes in der structure steht wenn ein Gerät nicht ok steht?! 
Beispiel undefined
defmod s structure test a b c
attr s clientstate_behavior absolute
attr s room Test

defmod a dummy
attr a userattr structexclude test test_map
attr a room Test

defmod b dummy
attr b userattr a a_map structexclude
attr b room Test

defmod c dummy
attr c userattr a a_map structexclude
attr c room Test

setstate a dumm
setstate a 2019-07-30 14:26:21 state dumm

setstate b ok
setstate b 2019-07-30 14:24:52 state ok

setstate c ok
setstate c 2019-07-30 14:23:07 state ok

setstate s undefined
setstate s 2019-07-30 14:26:21 LastDevice a
setstate s 2019-07-30 14:26:21 LastDevice_Abs a
setstate s 2019-07-30 14:26:21 state undefined

Beispiel alles ok
setstate a ok
setstate a 2019-07-30 14:30:12 state ok

setstate b ok
setstate b 2019-07-30 14:24:52 state ok

setstate c ok
setstate c 2019-07-30 14:23:07 state ok

setstate s ok
setstate s 2019-07-30 14:30:12 LastDevice a
setstate s 2019-07-30 14:30:12 LastDevice_Abs a
setstate s 2019-07-30 14:30:12 state ok


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

amenomade

Achso... ich hatte es so verstanden, dass der TE irgendwie dann den / einen Fehler im Zustand haben will.
Natürlich ist sonst client_behavior absolute das einfachste.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Otto123

Zitat von: amenomade am 30 Juli 2019, 14:55:00
Achso... ich hatte es so verstanden, dass der TE irgendwie dann den / einen Fehler im Zustand haben will.
Ja kann auch sein, aber ich lese es nicht so :)
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

amenomade

Zitat von: Otto123 am 30 Juli 2019, 15:08:51
Ja kann auch sein, aber ich lese es nicht so :)

Na klar... 2 Kristallkugeln = 2 unterschiedliche Meinungen, das ist wohl bekannt ;)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

PatrickR

Ich möchte lösen. Gemeint war tatsächlich, dass ok reicht. Bei mehreren Nicht-OK-Zuständen würde das ohnehin neben dem Aufwand zu einer Explosion des state führen :)

Danke für die Ideen! Habe jetzt mal testweise die absolute-Variante und die DOIF-Variante gebaut, nun aber das Problem, dass structure scheinbar so lange undefined bleibt wie mindestens eines der Geräte noch kein Event geschickt hat.

Patrick
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook

amenomade

Zitat von: PatrickR am 30 Juli 2019, 20:54:57
Ich möchte lösen. Gemeint war tatsächlich, dass ok reicht. Bei mehreren Nicht-OK-Zuständen würde das ohnehin neben dem Aufwand zu einer Explosion des state führen :)

Danke für die Ideen! Habe jetzt mal testweise die absolute-Variante und die DOIF-Variante gebaut, nun aber das Problem, dass structure scheinbar so lange undefined bleibt wie mindestens eines der Geräte noch kein Event geschickt hat.

Patrick
Nein, mit absolute bleibt die Struktur so lange "undefined" bis ALLE Geräte den gleichen Zustand haben. Dann übernimmt sie diesen Zustand. Steht sogar ganz klar im CommandRef:
Zitatclientstate_behavior
Der Status einer Struktur hängt von den Status der zugefügten Devices ab. Dabei wird das propagieren der Status der Devices in zwei Gruppen klassifiziert und mittels diesem Attribut definiert:

    absolute
    Die Struktur wird erst dann den Status der zugefügten Devices annehmen, wenn alle Devices einen identischen Status vorweisen. Bei unterschiedlichen Devictypen kann dies per Attribut <struct_type>_map pro Device beinflusst werden. Andernfalls hat die Struktur den Status "undefined".
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Otto123

Kann es sein, dass Du meinst, dass nach der Definition der state nicht stimmt, weil noch keine Events verarbeitet wurden?
Dafür gibt es doch
set <structurename> restoreStructState state

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

PatrickR

#12
Guten Morgen!

Zitat von: amenomade am 30 Juli 2019, 20:58:43
Nein, mit absolute bleibt die Struktur so lange "undefined" bis ALLE Geräte den gleichen Zustand haben. Dann übernimmt sie diesen Zustand. Steht sogar ganz klar im CommandRef:
oder mit anderen Worten:
Zitat von: PatrickR am 30 Juli 2019, 20:54:57
[...] dass structure scheinbar so lange undefined bleibt wie mindestens eines der Geräte noch kein Event geschickt hat.


Zitat von: Otto123 am 30 Juli 2019, 21:46:04
Kann es sein, dass Du meinst, dass nach der Definition der state nicht stimmt, weil noch keine Events verarbeitet wurden?
Dafür gibt es doch
set <structurename> restoreStructState state

Gruß Otto

Die Commandref liest sich für mich so als würden die (mit saveStructState) gespeicherten Readings per set an die Member-Geräte gesetzt. Leider habe ich weder Readings gespeichert noch bin ich glücklich mit dem Gedanken, dass die Membergeräte von außen einen Status übergebraten bekommen. Was ich eigentlich brauche, wäre eine Funktion der Structure, die sich initial die Werte der Readings holt und ab diesem Zeitpunkt auf Events wartet. Oder liege ich falsch?

Patrick
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook

Otto123

Zitat von: PatrickR am 31 Juli 2019, 08:20:58
Was ich eigentlich brauche, wäre eine Funktion der Structure, die sich initial die Werte der Readings holt und ab diesem Zeitpunkt auf Events wartet. Oder liege ich falsch?

Patrick
Moin Patrick,

da liegst Du richtig, ich dachte restoreStructState wäre genau das. Aber da habe ich wohl nicht richtig gelesen.

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

Otto123

wobei es irgendwie reicht, wenn einer der structure Mitglieder einen Event sendet. Dann werden alle abgefragt und der state richtig gesetzt. Vorher existiert state gar nicht. 
Daraus könnte man vielleicht eine Funktion bauen?

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