[gelöst] Perl DOIF führt gleichnamiges Sub aus einem anderen DOIF aus

Begonnen von bstaeheli, 21 November 2022, 12:17:55

Vorheriges Thema - Nächstes Thema

bstaeheli

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.

Damian

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 ()
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

bstaeheli


bstaeheli

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?

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF