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
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"]
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
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
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.
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
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.
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 :)
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 ;)
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
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".
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
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
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
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
Sicher? Ich hatte testweise einen Dummy aufgenommen und dessen State gesetzt, was aber nicht reichte.
Muss ich mir nochmal ansehen.
Patrick
Von unterwegs gesendet.
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.
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