FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: bstaeheli am 21 November 2022, 12:17:55

Titel: [gelöst] Perl DOIF führt gleichnamiges Sub aus einem anderen DOIF aus
Beitrag von: bstaeheli am 21 November 2022, 12:17:55
Liebe FHEM-Gemeinde

Es seien zwei DOIFs gegeben:

define NN.xx.XX.Test.di DOIF test {\
testSub();;\
}\
subs {\
sub testSub {\
Log 1, "$SELF"\
}\
}
attr NN.xx.XX.Test.di room DEV
attr NN.xx.XX.Test.di webCmd test
#   DEF        test {
# testSub();
#}
#subs {
# sub testSub {
# Log 1, "$SELF"
# }
#}
#   FUUID      61cc1787-f33f-c28a-bd9f-6bf5c94667cc0595
#   MODEL      Perl
#   NAME       NN.xx.XX.Test.di
#   NOTIFYDEV  global
#   NR         461
#   NTFY_ORDER 50-NN.xx.XX.Test.di
#   STATE      initialized
#   TYPE       DOIF
#   VERSION    26703 2022-11-14 16:43:41
#   eventCount 19
#   READINGS:
#     2022-11-21 12:04:56   state           initialized
#   Regex:
#     accu:
#     collect:
#   condition:
#     0         
# testSub();
#
#   helper:
#     NOTIFYDEV  global
#     globalinit 1
#     last_timer 0
#     sleeptimer -1
#   perlblock:
#     0          test
#   uiState:
#   uiTable:
#
setstate NN.xx.XX.Test.di initialized
setstate NN.xx.XX.Test.di 2022-11-21 12:04:56 state initialized


und

define NN.xx.XX.Test2.di DOIF test {\
testSub();;\
}\
\
subs {\
sub testSub {\
Log 1, "$SELF"\
}\
\
}\

attr NN.xx.XX.Test2.di room DEV
attr NN.xx.XX.Test2.di webCmd test
#   DEF        test {
# testSub();
#}
#
#subs {
# sub testSub {
# Log 1, "$SELF"
# }
#
#}
#
#   FUUID      637a6969-f33f-c28a-71de-141e277afeff8a8f
#   MODEL      Perl
#   NAME       NN.xx.XX.Test2.di
#   NOTIFYDEV  global
#   NR         38792
#   NTFY_ORDER 50-NN.xx.XX.Test2.di
#   STATE      initialized
#   TYPE       DOIF
#   VERSION    26703 2022-11-14 16:43:41
#   eventCount 3
#   READINGS:
#     2022-11-21 12:10:08   mode            enabled
#     2022-11-21 12:10:08   state           initialized
#   Regex:
#     accu:
#     collect:
#   condition:
#     0         
# testSub();
#
#   helper:
#     NOTIFYDEV  global
#     globalinit 1
#     last_timer 0
#     sleeptimer -1
#   perlblock:
#     0          test
#   uiState:
#   uiTable:
#
setstate NN.xx.XX.Test2.di initialized
setstate NN.xx.XX.Test2.di 2022-11-21 12:10:08 mode enabled
setstate NN.xx.XX.Test2.di 2022-11-21 12:10:08 state initialized



Verhalten:
Wird das zweite DOIF modifiziert und gespeichert, rufen beide DOIF die Sub-Funktion des Zweiten auf. Wird das erste DOIF modifiziert und gespeichert rufen beide die Funktion des ersten auf.

Wir haben mehrere DOIFs mit gleichnamigen Subs und haben in der letzten Zeit komisches Verhalten der DOIFs festgestellt und sind dann per Zufall darauf gekommen.

Ist dieses Verhalten so gewünscht?

Lieben Dank für eure Antworten.
Titel: Antw:Perl DOIF führt gleichnamiges Sub aus einem anderen DOIF aus
Beitrag von: Damian am 21 November 2022, 12:47:41
Der Code aller DOIFs befindet sich im gleichen Package namens DOIF. Eine neue sub-Definition mit gleichem Namen überschreibt die alte, die letzte gewinnt - das sind Perl-Mechanismen.

Du hast die Möglichkeit:

1) eigenes Package pro DOIF zu definieren
2) unterschiedliche Namen der subs zu nehmen

Das kannst du eindeutig mit $SELF realisieren.

sub $SELF_test ...


Aufruf der Methode geht dann mit $SELF_test (...)

oder

{package $SELF;}

Aufruf der Methode geht dann mit $SELF::test ()
Titel: Antw:Perl DOIF führt gleichnamiges Sub aus einem anderen DOIF aus
Beitrag von: Damian am 21 November 2022, 13:03:02
Diese Frage wurde bereits hier behandelt: https://forum.fhem.de/index.php/topic,84969.msg900065.html#msg900065
Titel: Antw:[gelöst] Perl DOIF führt gleichnamiges Sub aus einem anderen DOIF aus
Beitrag von: bstaeheli am 21 November 2022, 14:37:33
Vielen herzlichen Dank Damian!
Titel: Antw Perl DOIF führt gleichnamiges Sub aus einem anderen DOIF aus
Beitrag von: bstaeheli am 22 November 2022, 15:22:27
Zitat
Das kannst du eindeutig mit $SELF realisieren.

sub $SELF_test ...


Aufruf der Methode geht dann mit $SELF_test (...)

oder

{package $SELF;}

Aufruf der Methode geht dann mit $SELF::test ()

Leider funktioniert dein Vorschlag nicht, da wir irgendwann vor vielen Jahren einem Entitäten-Namensschema mit Punkten eingeführt haben.

Hast du noch einen anderen Vorschlag?
Titel: Antw:Antw Perl DOIF führt gleichnamiges Sub aus einem anderen DOIF aus
Beitrag von: Damian am 22 November 2022, 16:28:32
Zitat von: bstaeheli am 22 November 2022, 15:22:27
Leider funktioniert dein Vorschlag nicht, da wir irgendwann vor vielen Jahren einem Entitäten-Namensschema mit Punkten eingeführt haben.

Und wo ist das Problem?

Edit: Du meinst, du hast Punkte in deinen Devicenamen. Dann musst du dir selbst eindeutige Namen in deinen DOIFs überlegen, wenn du das Konzept mit den Punkten im Name behalten willst.