FHEM Forum

FHEM => Automatisierung => Thema gestartet von: PatrickR am 30 Juli 2019, 12:13:36

Titel: structure: clientstate_priority bei unbekannten Zuständen
Beitrag von: PatrickR am 30 Juli 2019, 12:13:36
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
Titel: Antw:structure: clientstate_priority bei unbekannten Zuständen
Beitrag von: amenomade am 30 Juli 2019, 12:25:30
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"]
Titel: Antw:structure: clientstate_priority bei unbekannten Zuständen
Beitrag von: Otto123 am 30 Juli 2019, 13:06:11
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
Titel: Antw:structure: clientstate_priority bei unbekannten Zuständen
Beitrag von: CoolTux am 30 Juli 2019, 13:16:39
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

Titel: Antw:structure: clientstate_priority bei unbekannten Zuständen
Beitrag von: CoolTux am 30 Juli 2019, 13:25:07
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.
Titel: Antw:structure: clientstate_priority bei unbekannten Zuständen
Beitrag von: Otto123 am 30 Juli 2019, 14:31:16
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
Titel: Antw:structure: clientstate_priority bei unbekannten Zuständen
Beitrag 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.
Natürlich ist sonst client_behavior absolute das einfachste.
Titel: Antw:structure: clientstate_priority bei unbekannten Zuständen
Beitrag von: Otto123 am 30 Juli 2019, 15:08:51
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 :)
Titel: Antw:structure: clientstate_priority bei unbekannten Zuständen
Beitrag von: amenomade am 30 Juli 2019, 16:20:47
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 ;)
Titel: Antw:structure: clientstate_priority bei unbekannten Zuständen
Beitrag 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
Titel: Antw:structure: clientstate_priority bei unbekannten Zuständen
Beitrag von: amenomade am 30 Juli 2019, 20:58:43
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".
Titel: Antw:structure: clientstate_priority bei unbekannten Zuständen
Beitrag 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
Titel: Antw:structure: clientstate_priority bei unbekannten Zuständen
Beitrag von: PatrickR am 31 Juli 2019, 08:20:58
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
Titel: Antw:structure: clientstate_priority bei unbekannten Zuständen
Beitrag von: Otto123 am 31 Juli 2019, 08:55:46
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
Titel: Antw:structure: clientstate_priority bei unbekannten Zuständen
Beitrag von: Otto123 am 31 Juli 2019, 14:45:43
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
Titel: Antw:structure: clientstate_priority bei unbekannten Zuständen
Beitrag von: PatrickR am 31 Juli 2019, 14:49:43
Sicher? Ich hatte testweise einen Dummy aufgenommen und dessen State gesetzt, was aber nicht reichte.

Muss ich mir nochmal ansehen.

Patrick


Von unterwegs gesendet.
Titel: Antw:structure: clientstate_priority bei unbekannten Zuständen
Beitrag von: Otto123 am 31 Juli 2019, 15:02:10
Ich habe das gerade probiert. In dem Test von gestern einfach die structure gelöscht. mit define neu angelegt. alle dummy standen auf ok und die structure auf ??? Dann set a ok gemacht und schwups stand die structure auf ok.
Titel: Antw:structure: clientstate_priority bei unbekannten Zuständen
Beitrag von: PatrickR am 02 August 2019, 23:32:23
Hi!

Zitat von: Otto123 am 31 Juli 2019, 15:02:10
Ich habe das gerade probiert. In dem Test von gestern einfach die structure gelöscht. mit define neu angelegt. alle dummy standen auf ok und die structure auf ??? Dann set a ok gemacht und schwups stand die structure auf ok.

Mit Dummys bekomme ich es interessanterweise auch hin. Mit meinen DOIFs leider nicht. Könnte natürlich wieder eine DOIF-Besonderheit sein.

/Edit: Das war's tatsächlich. DOIF-Perl hat es geschafft, STATE (das Internal) auf ok zu setzen aber das Reading state auf Initialized. Das ist besonders heimtückisch, da in der Structure bei "Probably associated with" STATE angezeigt wurde, structure aber state auswertet.
/Edit2: Habe nun bei den Perl-DOIFs STRUCT_TYPE_map auf STATE gesetzt.

Patrick