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! :-*
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
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_VarianteA | | define 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: |
:(
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...).
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! ;)
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!