[ungelöst, aber aufgeschoben]: archetype auf archetype anwenden => reagiert anders

Begonnen von th0masrad, 29 Januar 2024, 12:43:14

Vorheriges Thema - Nächstes Thema

th0masrad

Wenn ich einen ersten archetype auf einen zweiten archetype anwende, funktioniert dies anders, als ich erwarten würde. Es werden nämlich die Attribute des zweiten archetypes in sich selbst (also den zweiten archetype) hineingeschrieben. Und nicht - wie ich erwarte - die Attribute des ersten archetypes in den Zweiten.

Mache ich einen Denkfehler und ist das Verhalten tatsächlich korrekt?



Hier die lange Textversion mit den originalen Beispielen: 8)

Ich arbeite bereits erfolgreich mit archetypen um z. B. meine notifys oder DOIFs mit einem Knopfdruck auf Stand halten zu können. Nun habe ich auch Änderungen an den dazugehörigen archetypen vorgenommen. Dabei dachte ich mir, dass ich mit die Handarbeit an den einzelnen archetypen sparen könnte, wenn ich einen archetype schreibe, der die anderen archetypen auf Stand bringen kann. Das aber funktioniert bei mir nicht.

Hier die "Arbeits-archetypen", die, um im Beispiel zu bleiben, meine notifys und DOIFs aktualisieren können:
1) Der archetype_notify hält meine notifys aktuell:2) Der archetype_DOIF hält meine DOIFs aktuell:
define archetype_notify archetype i:TYPE=notify
attr archetype_notify userattr actual_devStateIcon actual_eventMap actual_icon actual_room actual_stateFormat actual_webCmd actual_webCmdLabel
attr archetype_notify actual_devStateIcon Perl:{mU_notify_devStateIcon($name)}
attr archetype_notify actual_eventMap Perl:{mU_notify_eventMap()}
attr archetype_notify actual_icon TR_notify_Symbol
attr archetype_notify actual_icon_initialUsbCheck i:NAME=initialUsbCheck TR_notify-initialUsbCheck_Symbol
attr archetype_notify actual_room System
attr archetype_notify actual_stateFormat Perl:{mU_notify_stateFormat($name)}
attr archetype_notify actual_webCmd verwenden:anhalten
attr archetype_notify alias Archetype: `notify`
attr archetype_notify attributes devStateIcon eventMap icon room stateFormat webCmd
attr archetype_notify devStateIcon {mU_state_devStateIcon($name, $data{mU_state_archetype})}
attr archetype_notify disable 0
attr archetype_notify eventMap {usr => {'verbreite Attribute' => 'inheritance'}}
attr archetype_notify icon TR_archetype_Symbol
attr archetype_notify room Entwicklung
attr archetype_notify stateFormat {mU_state_stateFormat($name, $data{mU_state_archetype})}
attr archetype_notify webCmd verbreite Attribute
attr archetype_notify webCmdLabel Bitte mit Vorsicht benutzen:; ;
#   DEF        i:TYPE=notify
#   FUUID      65ab957c-f33f-529a-4ed8-9c7f184cac87fae7
#   FVERSION   98_archetype.pm:0.261340/2022-06-07
#   NAME       archetype_notify
#   NOTIFYDEV  global
#   NR         151
#   NTFY_ORDER 50-archetype_notify
#   STATE      verwendungsbereit
#   TYPE       archetype
#   eventCount 1
#   READINGS:
#     2024-01-29 11:04:49   state           active
#
setstate archetype_notify verwendungsbereit
setstate archetype_notify 2024-01-29 11:04:49 state active
define archetype_DOIF archetype i:TYPE=DOIF
attr archetype_DOIF userattr actual_devStateIcon actual_eventMap actual_icon actual_room actual_stateFormat actual_webCmd actual_webCmdLabel
attr archetype_DOIF actual_devStateIcon Perl:{mU_DOIF_devStateIcon($name)}
attr archetype_DOIF actual_eventMap Perl:{mU_DOIF_eventMap()}
attr archetype_DOIF actual_icon TR_DOIF_Symbol
attr archetype_DOIF actual_room System
attr archetype_DOIF actual_stateFormat Perl:{mU_DOIF_stateFormat($name)}
attr archetype_DOIF actual_webCmd verwenden:anhalten:zurücksetzen
attr archetype_DOIF alias Archetype: `DOIF`
attr archetype_DOIF attributes devStateIcon eventMap icon room stateFormat webCmd
attr archetype_DOIF devStateIcon {mU_state_devStateIcon($name, $data{mU_state_archetype})}
attr archetype_DOIF disable 0
attr archetype_DOIF eventMap {usr => {'verbreite Attribute' => 'inheritance'}}
attr archetype_DOIF icon TR_archetype_Symbol
attr archetype_DOIF room Entwicklung
attr archetype_DOIF stateFormat {mU_state_stateFormat($name, $data{mU_state_archetype})}
attr archetype_DOIF webCmd verbreite Attribute
attr archetype_DOIF webCmdLabel Bitte mit Vorsicht benutzen:; ;
#   CFGFN     
#   DEF        i:TYPE=DOIF
#   FUUID      65b76126-f33f-529a-be2e-aee5c2d5b5bb35a2
#   NAME       archetype_DOIF
#   NOTIFYDEV  global
#   NR         155
#   NTFY_ORDER 50-archetype_DOIF
#   STATE      verwendungsbereit
#   TYPE       archetype
#   eventCount 1
#   READINGS:
#     2024-01-29 11:04:44   state           active
#
setstate archetype_DOIF verwendungsbereit
setstate archetype_DOIF 2024-01-29 11:04:44 state active

Nun die archetypen, die die obigen archetypen aktualisieren sollen. Da man die gleiche Funktionalität auf zwei verschiedenen Weisen schreiben kann, habe ich zwei archetypen definiert:
3) archetype, der seine eigenen Attribute weitergeben soll:4) archetype, der die mit actual_ explizit angegebenen Attribute weitergeben soll:
define archetype_archetype1 archetype i:TYPE=archetype
attr archetype_archetype1 alias Archetype: `archetyp1`
attr archetype_archetype1 attributes devStateIcon eventMap icon room stateFormat userattr webCmd webCmdLabel
attr archetype_archetype1 devStateIcon {mU_state_devStateIcon($name, $data{mU_state_archetype})}
attr archetype_archetype1 disable 0
attr archetype_archetype1 eventMap {usr => {'verbreite Attribute' => 'inheritance'}}
attr archetype_archetype1 icon TR_archetype_Symbol
attr archetype_archetype1 room Entwicklung
attr archetype_archetype1 stateFormat {mU_state_stateFormat($name, $data{mU_state_archetype})}
attr archetype_archetype1 webCmd verbreite Attribute
attr archetype_archetype1 webCmdLabel Bitte mit Vorsicht benutzen:; ;
#   CFGFN     
#   DEF        i:TYPE=archetype
#   FUUID      65b7673a-f33f-529a-da22-53dc6061c8e44e31
#   NAME       archetype_archetype1
#   NOTIFYDEV  global
#   NR         156
#   NTFY_ORDER 50-archetype_archetype
#   STATE      verwendungsbereit
#   TYPE       archetype
#   eventCount 1
#   READINGS:
#     2024-01-29 11:04:35   state           active
#
setstate archetype_archetype1 verwendungsbereit
setstate archetype_archetype1 2024-01-29 11:04:35 state active
define archetype_archetype2 archetype i:TYPE=archetype
attr archetype_archetype2 userattr actual_devStateIcon actual_eventMap actual_icon actual_room actual_stateFormat actual_webCmd actual_webCmdLabel
attr archetype_archetype2 actual_devStateIcon Perl:{mU_state_devStateIcon($name, $data{mU_state_archetype})}
attr archetype_archetype2 actual_eventMap Perl:{usr => {'verbreite Attribute' => 'inheritance'}}
attr archetype_archetype2 actual_icon TR_archetype_Symbol
attr archetype_archetype2 actual_room Entwicklung
attr archetype_archetype2 actual_stateFormat Perl:{mU_state_stateFormat($name, $data{mU_state_archetype})}
attr archetype_archetype2 actual_webCmd verbreite Attribute
attr archetype_archetype2 actual_webCmdLabel Bitte mit Vorsicht benutzen:; ;
attr archetype_archetype2 alias Archetype: `archetyp2`
attr archetype_archetype2 attributes userattr actual_devStateIcon actual_eventMap actual_icon actual_room actual_stateFormat actual_webCmd actual_webCmdLabel
attr archetype_archetype2 devStateIcon {mU_state_devStateIcon($name, $data{mU_state_archetype})}
attr archetype_archetype2 disable 0
attr archetype_archetype2 eventMap {usr => {'verbreite Attribute' => 'inheritance'}}
attr archetype_archetype2 icon TR_archetype_Symbol
attr archetype_archetype2 room Entwicklung
attr archetype_archetype2 stateFormat {mU_state_stateFormat($name, $data{mU_state_archetype})}
attr archetype_archetype2 webCmd verbreite Attribute
attr archetype_archetype2 webCmdLabel Bitte mit Vorsicht benutzen:; ;
#   CFGFN     
#   DEF        i:TYPE=archetype
#   FUUID      65b76e66-f33f-529a-813c-508f5191026dc0d6
#   NAME       archetype_archetype2
#   NOTIFYDEV  global
#   NR         157
#   NTFY_ORDER 50-archetype_archetype2
#   STATE      verwendungsbereit
#   TYPE       archetype
#   READINGS:
#     2024-01-29 11:04:31   state           active
#
setstate archetype_archetype2 verwendungsbereit
setstate archetype_archetype2 2024-01-29 11:04:31 state active

Wenn ich nun die archetype-verändernden archetypen ausführen würde, würde folgendes passieren:
`get archetype_archetype(1|2) pending attributes`
5) Ausgabe im FHEMWEB für archetype_archetype1:6) Ausgabe im FHEMWEB für archetype_archetype2;
-attr archetype_DOIF devStateIcon {mU_state_devStateIcon($name, $data{mU_state_archetype})}
+attr archetype_DOIF devStateIcon {mU_DOIF_devStateIcon($name)}
-attr archetype_DOIF eventMap {usr => {'verbreite Attribute' => 'inheritance'}}
+attr archetype_DOIF eventMap {mU_DOIF_eventMap()}
-attr archetype_DOIF icon TR_archetype_Symbol
+attr archetype_DOIF icon TR_DOIF_Symbol
-attr archetype_DOIF room Entwicklung
+attr archetype_DOIF room System
-attr archetype_DOIF stateFormat {mU_state_stateFormat($name, $data{mU_state_archetype})}
+attr archetype_DOIF stateFormat {mU_DOIF_stateFormat($name)}
-attr archetype_DOIF webCmd verbreite Attribute
+attr archetype_DOIF webCmd verwenden:anhalten:zurücksetzen
-attr archetype_notify devStateIcon {mU_state_devStateIcon($name, $data{mU_state_archetype})}
+attr archetype_notify devStateIcon {mU_notify_devStateIcon($name)}
-attr archetype_notify eventMap {usr => {'verbreite Attribute' => 'inheritance'}}
+attr archetype_notify eventMap {mU_notify_eventMap()}
-attr archetype_notify icon TR_archetype_Symbol
+attr archetype_notify icon TR_notify_Symbol
-attr archetype_notify room Entwicklung
+attr archetype_notify room System
-attr archetype_notify stateFormat {mU_state_stateFormat($name, $data{mU_state_archetype})}
+attr archetype_notify stateFormat {mU_notify_stateFormat($name)}
-attr archetype_notify webCmd verbreite Attribute
+attr archetype_notify webCmd verwenden:anhalten
-attr archetype_DOIF actual_devStateIcon Perl:{mU_DOIF_devStateIcon($name)}
+attr archetype_DOIF actual_devStateIcon {mU_state_devStateIcon($name, $data{mU_state_archetype})}
-attr archetype_DOIF actual_eventMap Perl:{mU_DOIF_eventMap()}
+attr archetype_DOIF actual_eventMap {usr => {'verbreite Attribute' => 'inheritance'}}
-attr archetype_DOIF actual_icon TR_DOIF_Symbol
+attr archetype_DOIF actual_icon TR_archetype_Symbol
-attr archetype_DOIF actual_room System
+attr archetype_DOIF actual_room Entwicklung
-attr archetype_DOIF actual_stateFormat Perl:{mU_DOIF_stateFormat($name)}
+attr archetype_DOIF actual_stateFormat {mU_state_stateFormat($name, $data{mU_state_archetype})}
-attr archetype_DOIF actual_webCmd verwenden:anhalten:zurücksetzen
+attr archetype_DOIF actual_webCmd verbreite Attribute
+attr archetype_DOIF actual_webCmdLabel Bitte mit Vorsicht benutzen:
+attr archetype_archetype1 actual_devStateIcon {mU_state_devStateIcon($name, $data{mU_state_archetype})}
+attr archetype_archetype1 actual_eventMap {usr => {'verbreite Attribute' => 'inheritance'}}
+attr archetype_archetype1 actual_icon TR_archetype_Symbol
+attr archetype_archetype1 actual_room Entwicklung
+attr archetype_archetype1 actual_stateFormat {mU_state_stateFormat($name, $data{mU_state_archetype})}
+attr archetype_archetype1 actual_webCmd verbreite Attribute
+attr archetype_archetype1 actual_webCmdLabel Bitte mit Vorsicht benutzen:
-attr archetype_notify actual_devStateIcon Perl:{mU_notify_devStateIcon($name)}
+attr archetype_notify actual_devStateIcon {mU_state_devStateIcon($name, $data{mU_state_archetype})}
-attr archetype_notify actual_eventMap Perl:{mU_notify_eventMap()}
+attr archetype_notify actual_eventMap {usr => {'verbreite Attribute' => 'inheritance'}}
-attr archetype_notify actual_icon TR_notify_Symbol
+attr archetype_notify actual_icon TR_archetype_Symbol
-attr archetype_notify actual_room System
+attr archetype_notify actual_room Entwicklung
-attr archetype_notify actual_stateFormat Perl:{mU_notify_stateFormat($name)}
+attr archetype_notify actual_stateFormat {mU_state_stateFormat($name, $data{mU_state_archetype})}
-attr archetype_notify actual_webCmd verwenden:anhalten
+attr archetype_notify actual_webCmd verbreite Attribute
+attr archetype_notify actual_webCmdLabel Bitte mit Vorsicht benutzen:
Anmerkung: Dass hier der archetype_archetype1 ebenfalls geändert werden soll, ist insofern korrekt, als dass er in die DEF des archetype_archetype2 passt. Ich bin mir aber sicher, dass auch hier nicht die Attribute des archetype_archetype1 auf archetype_archetype2, sondern die eigenen Attribute des archetype_archetype2 auf archetype_archetype2 übertragen werden. Es sind halt nur die gleichen Attribute...

Danke an alle, die bis hier her gelesen haben! :-*
Mit freundlichen Grüßen
Th0mas Rad.

Beta-User

Schwierig, sich da reinzudenken, aber prinzipiell erscheint es mir als Webfehler, wenn man ein archetype auf sich selbst verweisen läßt.

Vielleicht würde in so einem Fall ein FILTER-Argument in der DEF helfen, das den archetype selbst ausnimmt?
defmod archetype_archetype1 archetype i:TYPE=archetype:FILTER=NAME!=archetype_archetype1
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

th0masrad

Zitat von: Beta-User am 30 Januar 2024, 07:49:50Webfehler
Webfehler != WEBfehler!?! :))

Ich habe die DEF entsprechend geändert. Auch habe ich die Namen der verteilenden archetypes geändert. Statt 1 und 2 heißen sie nun _VarianteA bzw. _VarianteB. (Die Ziffern konnten suggerieren, dass es sich um eine Hierarchie (1 ändert 2) handelt. Ich möchte hier "ja nur" die beiden Vererbungsvarianten 'eigene Attribute' gegen 'explizite Attribute' probieren. Nicht dass eine von beiden vielleicht funktioniert und die andere nicht.

define archetype_archetype_VarianteA archetype i:TYPE=archetype:FILTER=NAME!=archetype_archetype_VarianteAdefine archetype_archetype_VarianteB archetype i:TYPE=archetype:FILTER=NAME!=archetype_archetype_VarianteB

Im Ergebnis ändert sich nichts.

Die notify- bzw. DOIF-archetypen werden weiterhin nicht mit den Attributen von archetype_archetype_Variante(A|B) sondern mit ihren jeweils eigenen Attributen (archetype_notify und archetype_DOIF) überschrieben:

Ausgabe von archetype_archetype_VarianteA:Ausgabe von archetype_archetype_VarianteB:
-attr archetype_DOIF devStateIcon {mU_state_devStateIcon($name, $data{mU_state_archetype})}
+attr archetype_DOIF devStateIcon {mU_DOIF_devStateIcon($name)}
-attr archetype_DOIF eventMap {usr => {'verbreite Attribute' => 'inheritance'}}
+attr archetype_DOIF eventMap {mU_DOIF_eventMap()}
-attr archetype_DOIF icon TR_archetype_Symbol
+attr archetype_DOIF icon TR_DOIF_Symbol
-attr archetype_DOIF room Entwicklung
+attr archetype_DOIF room System
-attr archetype_DOIF stateFormat {mU_state_stateFormat($name, $data{mU_state_archetype})}
+attr archetype_DOIF stateFormat {mU_DOIF_stateFormat($name)}
-attr archetype_DOIF webCmd verbreite Attribute
+attr archetype_DOIF webCmd verwenden:anhalten:zurücksetzen
-attr archetype_notify devStateIcon {mU_state_devStateIcon($name, $data{mU_state_archetype})}
+attr archetype_notify devStateIcon {mU_notify_devStateIcon($name)}
-attr archetype_notify eventMap {usr => {'verbreite Attribute' => 'inheritance'}}
+attr archetype_notify eventMap {mU_notify_eventMap()}
-attr archetype_notify icon TR_archetype_Symbol
+attr archetype_notify icon TR_notify_Symbol
-attr archetype_notify room Entwicklung
+attr archetype_notify room System
-attr archetype_notify stateFormat {mU_state_stateFormat($name, $data{mU_state_archetype})}
+attr archetype_notify stateFormat {mU_notify_stateFormat($name)}
-attr archetype_notify webCmd verbreite Attribute
+attr archetype_notify webCmd verwenden:anhalten
-attr archetype_DOIF actual_devStateIcon Perl:{mU_DOIF_devStateIcon($name)}
+attr archetype_DOIF actual_devStateIcon {mU_state_devStateIcon($name, $data{mU_state_archetype})}
-attr archetype_DOIF actual_eventMap Perl:{mU_DOIF_eventMap()}
+attr archetype_DOIF actual_eventMap {usr => {'verbreite Attribute' => 'inheritance'}}
-attr archetype_DOIF actual_icon TR_DOIF_Symbol
+attr archetype_DOIF actual_icon TR_archetype_Symbol
-attr archetype_DOIF actual_room System
+attr archetype_DOIF actual_room Entwicklung
-attr archetype_DOIF actual_stateFormat Perl:{mU_DOIF_stateFormat($name)}
+attr archetype_DOIF actual_stateFormat {mU_state_stateFormat($name, $data{mU_state_archetype})}
-attr archetype_DOIF actual_webCmd verwenden:anhalten:zurücksetzen
+attr archetype_DOIF actual_webCmd verbreite Attribute
+attr archetype_DOIF actual_webCmdLabel Bitte mit Vorsicht benutzen:
-attr archetype_notify actual_devStateIcon Perl:{mU_notify_devStateIcon($name)}
+attr archetype_notify actual_devStateIcon {mU_state_devStateIcon($name, $data{mU_state_archetype})}
-attr archetype_notify actual_eventMap Perl:{mU_notify_eventMap()}
+attr archetype_notify actual_eventMap {usr => {'verbreite Attribute' => 'inheritance'}}
-attr archetype_notify actual_icon TR_notify_Symbol
+attr archetype_notify actual_icon TR_archetype_Symbol
-attr archetype_notify actual_room System
+attr archetype_notify actual_room Entwicklung
-attr archetype_notify actual_stateFormat Perl:{mU_notify_stateFormat($name)}
+attr archetype_notify actual_stateFormat {mU_state_stateFormat($name, $data{mU_state_archetype})}
-attr archetype_notify actual_webCmd verwenden:anhalten
+attr archetype_notify actual_webCmd verbreite Attribute
+attr archetype_notify actual_webCmdLabel Bitte mit Vorsicht benutzen:
:(
Mit freundlichen Grüßen
Th0mas Rad.

Beta-User

Hmm, tut mir leid, im Moment mag ich mich nicht so weit unter das Auto legen, archetype an sich ist ein komplexes Modul, bei dem ich froh bin, das einigermaßen unfallfrei übernommen zu haben.

An sich glaube ich nicht, dass es eine gute Idee ist, ein archetype durch ein anderes archetype bearbeiten zu lassen, v.a. dann, wenn man ggf. die dadurch erzeugten Attribute auch noch automatisch ausrollen wollte. Das riecht irgendwie nach "Schleifengefahr", von daher bin ich eher am überlegen, ob ich ggf. hergehen will, und das komplett unterbinde (aber dazu müßte ich mich in den Code wieder eindenken...).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

th0masrad

Zitat von: Beta-User am 30 Januar 2024, 11:13:25Hmm, tut mir leid
Alles gut! Ich bin schon froh, zu wissen, dass ich nicht aus Unwissenheit / Unverständnis irgendetwas krudes getippt habe...

Zitat von: Beta-User am 30 Januar 2024, 11:13:25dass es eine gute Idee ist, ein archetype durch ein anderes archetype bearbeiten zu lassen
Maschinen, die Maschinen bauen; warum nicht?!? ;D

Ich beende also das Projekt archetypes auf archteypes. Vorerst! ;)
Mit freundlichen Grüßen
Th0mas Rad.

Beta-User

Zitat von: th0masrad am 30 Januar 2024, 12:06:28Maschinen, die Maschinen bauen; warum nicht?!? ;D
Na ja, das setzt halt voraus, dass man gewisse Regeln einhält, v.a. eben die Reihenfolge eindeutig ist, in der was passiert. Aufgrund des Aufbaus von archetype (als notify-type device) müßte man halt entprechend Aufwand reinstecken, damit diese Reihenfolge ggf. eindeutig wird.

Dann geht das ggf. schon. Nur ist halt das Aufwand/Nutzen-Verhältnis zumindest im Moment eher nicht zugunsten einer diesbezüglichen Initiative.

In jedem Fall Danke für die Denksportaufgabe und das Interesse an archetype!
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files