Autor Thema: DOIF Perl Modus mit sub  (Gelesen 312 mal)

Online ch.eick

  • Hero Member
  • *****
  • Beiträge: 2644
DOIF Perl Modus mit sub
« 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
« Letzte Änderung: 10 August 2022, 16:47:17 von ch.eick »
RPI4; Docker; CUNX; Eltako FSB61NP; 230V zentral verschaltet; SamsungTV H-Serie; DLNARenderer; TV.pl;  Sonos; Vallox; Luxtronik; 2x FB7490; Stromzähler mit DvLIR; wunderground; clever-tanken; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 9970
Antw:DOIF Perl Modus mit sub
« Antwort #1 am: 10 August 2022, 16:56:24 »
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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Online ch.eick

  • Hero Member
  • *****
  • Beiträge: 2644
Antw:DOIF Perl Modus mit sub
« Antwort #2 am: 10 August 2022, 17:32:12 »
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.
RPI4; Docker; CUNX; Eltako FSB61NP; 230V zentral verschaltet; SamsungTV H-Serie; DLNARenderer; TV.pl;  Sonos; Vallox; Luxtronik; 2x FB7490; Stromzähler mit DvLIR; wunderground; clever-tanken; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 9970
Antw:DOIF Perl Modus mit sub
« Antwort #3 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);
}

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF
Gefällt mir Gefällt mir x 1 Liste anzeigen

Online ch.eick

  • Hero Member
  • *****
  • Beiträge: 2644
Antw:DOIF Perl Modus mit sub
« Antwort #4 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
RPI4; Docker; CUNX; Eltako FSB61NP; 230V zentral verschaltet; SamsungTV H-Serie; DLNARenderer; TV.pl;  Sonos; Vallox; Luxtronik; 2x FB7490; Stromzähler mit DvLIR; wunderground; clever-tanken; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 9970
Antw:DOIF Perl Modus mit sub
« Antwort #5 am: 11 August 2022, 17:10:42 »
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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF
Gefällt mir Gefällt mir x 1 Liste anzeigen

 

decade-submarginal