FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: ch.eick am 10 August 2022, 16:36:37

Titel: DOIF Perl Modus mit sub
Beitrag von: ch.eick am 10 August 2022, 16:36:37
Hallo zusammen,

kann es sein, dass die Sub Routinen im DOIF Perl Modus über alle DOIFs geteilt sind?
Mein Verständnis war, dass jedes DOIF einen eigenen Adressraum verwendet.

FVERSION 98_DOIF.pm:0.261820/2022-06-29

EDIT: Aufgefallen ist mir das, weil ich gestern von einem DOIF Device eine Kopie angelegt habe, die ich sofort auf disable 1 gesetzt habe und
      heute machte das original Device mucken. Als ich dann die sub Routinen mit eindeutigen Namen versehen hatte lief es dann wieder richtig.
      Merkwürdig ist dabei auch, dass obwohl die sub generisch ist und mit $SELF auf das eigene DOIF gehen sollte gibt es wohl genau da eventuell
      einen Seiteneffect. Das reading, auf das zugegriffen werden sollte ist in der Kopie noch nicht vorhanden.

VG
   Christian
Titel: Antw:DOIF Perl Modus mit sub
Beitrag von: Damian am 10 August 2022, 16:56:24
Zitat von: ch.eick am 10 August 2022, 16:36:37
Hallo zusammen,

kann es sein, dass die Sub Routinen im DOIF Perl Modus über alle DOIFs geteilt sind?
Mein Verständnis war, dass jedes DOIF einen eigenen Adressraum verwendet.

FVERSION 98_DOIF.pm:0.261820/2022-06-29

EDIT: Aufgefallen ist mir das, weil ich gestern von einem DOIF Device eine Kopie angelegt habe, die ich sofort auf disable 1 gesetzt habe und
      heute machte das original Device mucken. Als ich dann die sub Routinen mit eindeutigen Namen versehen hatte lief es dann wieder richtig.
      Merkwürdig ist dabei auch, dass obwohl die sub generisch ist und mit $SELF auf das eigene DOIF gehen sollte gibt es wohl genau da eventuell
      einen Seiteneffect. Das reading, auf das zugegriffen werden sollte ist in der Kopie noch nicht vorhanden.

VG
   Christian

Das ist richtig. Sie befinden sich alle im Package DOIF. Um Mehrfachdefinitionen zu vermeiden, kannst du entweder mit eigenem Package arbeiten oder die sub eindeutig machen, z. B $SELF_test sub.
Titel: Antw:DOIF Perl Modus mit sub
Beitrag von: ch.eick am 10 August 2022, 17:32:12
Zitat von: Damian am 10 August 2022, 16:56:24
Das ist richtig. Sie befinden sich alle im Package DOIF. Um Mehrfachdefinitionen zu vermeiden, kannst du entweder mit eigenem Package arbeiten oder die sub eindeutig machen, z. B $SELF_test sub.
Kann ich das auch nutzen, in dem ich eine wirklich generische Funktion verwende?
Wie kann ich da auf die readings aus dem aufrufendenden DOIF zugreifen.


sub PV_Modus_Aus() {                                                   ## PV-Modus Ausschalten
    if (AttrVal("$SELF","verbose",0) >=3)
       {Log 3, "Pool_PV sub  : Pool off"};     <== hier kann ich den String natürlich noch generisch machen
    fhem("".ReadingsVal("$SELF","SetCmdOff",0));       <== Aber das hat in meinem Fall wohl nicht geklappt, da es in der Kopie nicht drin war
    set_Reading("Pool_Status","Aus");
  }


Mit dem

fhem("".ReadingsVal("$SELF","SetCmdOff",0));

hole ich das Kommando, dass letztendlich ausgeführt werden soll.
Titel: Antw:DOIF Perl Modus mit sub
Beitrag von: Damian am 10 August 2022, 19:06:58
$SELF wird direkt beim Übersetzen der sub ersetzt und entspricht dann dem jeweiligen DOIF, in dem sub definiert wurde. Ist also fest.

Wenn du mehrere sub PV_Modus_Aus()  in verschiedenen DOIF´s definierst, dann gewinnt immer die zuletzt übersetzte.

Du kannst genauso die sub PV_Modus_Aus()  in myutils auslagern und dann in verschiedenen DOIF´s nutzen.

Wenn du wissen willst wer sie aufruft, dann kannst du das über einen Übergabeparameter realisieren.


{
## Aufruf in einem DOIF-Block
PV_Modus_Aus ($SELF);
}

Titel: Antw:DOIF Perl Modus mit sub
Beitrag von: ch.eick am 11 August 2022, 08:15:52
Hallo Damin,

muss ich bei den Timern dann auch aufpassen, oder wären die separat in jedem DOIF?

VG
   Christian
Titel: Antw:DOIF Perl Modus mit sub
Beitrag von: Damian am 11 August 2022, 17:10:42
Zitat von: ch.eick am 11 August 2022, 08:15:52
Hallo Damin,

muss ich bei den Timern dann auch aufpassen, oder wären die separat in jedem DOIF?

VG
   Christian

Nein, das betrifft nur die subs, weil die von Perl verwaltet werden, pro Package kann es nur eine sub mit dem gleichen Namen geben.