neue Features: ereignisgesteuertes Perl - DOIF-Perl

Begonnen von Damian, 25 Februar 2018, 21:29:16

Vorheriges Thema - Nächstes Thema

eisenhauer1987

Hi,

set_Exec ("timer",10, 'myfunction', 'bla')

wird vermutlich immer die Funktion mit dem Parameter übergeben:

set_Exec ("timer",10, 'myfunction("bla")')


Ist das schon aktiv? Ich nutze DOIF Perl so z.b

set_Exec("Rollo_OPEN_timer",0,'Rollo_OPEN',\@Rollos);

Das würde nicht mehr gehen?

Damian

#211
Zitat von: eisenhauer1987 am 21 September 2020, 15:31:04
Hi,

set_Exec ("timer",10, 'myfunction', 'bla')

wird vermutlich immer die Funktion mit dem Parameter übergeben:

set_Exec ("timer",10, 'myfunction("bla")')


Ist das schon aktiv? Ich nutze DOIF Perl so z.b

set_Exec("Rollo_OPEN_timer",0,'Rollo_OPEN',\@Rollos);

Das würde nicht mehr gehen?
ja, die neue Version ist aktiv, die alte Syntax funktioniert nicht mehr.

so müsste es eigentlich funktionieren:

set_Exec("Rollo_OPEN_timer",0,"Rollo_OPEN(\@Rollos)");

, weil der Zeiger beim Aufruf ausgewertet und übergeben wird.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

eisenhauer1987

Ok Danke,

Probier ich nachher aus, das bedeutet nicht ganz wenig arbeit für mich  ::)

Grüße

eisenhauer1987

Hi,

der Aufruf:
set_Exec("Rollo_OPEN_timer",0,'Rollo_OPEN',\@Rollos);

funktioniert weiterhin.

hingegen:
set_Exec("Rollo_OPEN_timer",0,'Rollo_OPEN','100');
muss jetzt:
set_Exec("Rollo_OPEN_timer",0,'Rollo_OPEN("100")';
heißen.

Auch dies funktioniert nicht mehr:
[code]set_Exec("Rollo_OPEN_timer",0,'Rollo_OPEN','';[/code]

Damian

Zitat von: eisenhauer1987 am 22 September 2020, 10:25:24
Hi,

der Aufruf:
set_Exec("Rollo_OPEN_timer",0,'Rollo_OPEN',\@Rollos);

funktioniert weiterhin.


Dann mehr oder weniger zufällig.

Mit der aktuellen DOIF-Version ist der letzte Parameter eine Bedingung. Jetzt steht dort ein Zeiger, dieser wird vermutlich >0, damit wird der Befehl solange wiederholt, bis man ihn per del_Exec abbricht. Die Übergabe des Parameters findet nicht statt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

eisenhauer1987

Das ist seltsam, hier mal ein größerer Auszug aus meinen code:
my @Rollos = ("EZ.Rollo", "WZ.Rollo", "HWR.Rollo", "GWC.Rollo", "KUE.Rollo.Links", "KUE.Rollo.Rechts", "SZ.Rollo.Links", "SZ.Rollo.Rechts");
set_Exec("Rollo_OPEN_timer",0,'Rollo_OPEN',\@Rollos);


Und das sub:

sub Rollo_OPEN
  {
  my @names = @{$_[0]};
my $Wind = ReadingsVal("Haus.Wind","state","0");
my $allunlock = " ";
if ($Wind eq "on")
{
fhem("setreading $SELF Shading Wind;");
}
if ($Wind eq "off")
{
fhem("setreading $SELF Shading Normal;");
foreach my $n (@names)
{
my $Sperre = ReadingsVal("$n","sperre","0");
my $Shadeposition = ReadingsVal("$n","shadeposition","0");
my $State = ReadingsVal("$n","state","0");
if ($State eq "closed" and $Sperre eq "unlock" and $Shadeposition eq "0")
{
$allunlock=$allunlock."set ".$n." opens; ";
}
if ($State eq "closed" and $Sperre eq "unlock" and $Shadeposition ne "85" and $Shadeposition ne "0")
{
fhem("setreading $SELF Shading On;");
$allunlock=$allunlock."set ".$n." position ".$Shadeposition."; ";
}
if ($State eq "closed" and $Sperre eq "unlock" and $Shadeposition eq "85")
{
fhem("setreading $SELF Shading Heiß;");
$allunlock=$allunlock."set ".$n." position ".$Shadeposition."; ";
}
}
}
if ( $allunlock ne " ")
{
fhem($allunlock)
}
}


Das macht genau das was es soll. Array wird übergeben und ausgewertet.

Damian

Das ist für mich nur erklärbar, wenn bei dir nicht die aktuelle DOIF-Version  aktiv wäre, denn es wird jetzt nur das aufgerufen, was als dritter Parameter übergeben wird, hier also

eval("Rollo_OPEN")

Der vierte Parameter ist jetzt Condition, die per eval auf wahr geprüft wird, also sinngemäß:

if (eval(\@Rollos)) ...

Das kann nicht richtig funktionieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

eisenhauer1987

head 98_DOIF.pm sagt:

22781 2020-09-17

ab welchen release gab es den wechsel?

Damian

Zitat von: eisenhauer1987 am 22 September 2020, 14:00:54
head 98_DOIF.pm sagt:

22781 2020-09-17

ab welchen release gab es den wechsel?

Das sollte die neuste sein. Wenn es aus deiner Sicht funktioniert, dann ist alles gut. Verstehen tue ich das nicht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

eisenhauer1987

Hi ich wollte das ganze jetzt trotzdem glatziehen, aber weder:



set_Exec("Rollo_OPEN_timer",0,'Rollo_OPEN(\@Rollos)');
noch
set_Exec("Rollo_OPEN_timer",0,"Rollo_OPEN(\@Rollos)");



funktioniert.

Nur die alte Variante verhält sich wie vorher:

set_Exec("Rollo_OPEN_timer",0,'Rollo_OPEN',\@Rollos);

Das ist sehr verwirrend und inkosistent.

Damian

Zitat von: eisenhauer1987 am 23 September 2020, 09:52:21
Hi ich wollte das ganze jetzt trotzdem glatziehen, aber weder:



set_Exec("Rollo_OPEN_timer",0,'Rollo_OPEN(\@Rollos)');
noch
set_Exec("Rollo_OPEN_timer",0,"Rollo_OPEN(\@Rollos)");



funktioniert.

Nur die alte Variante verhält sich wie vorher:

set_Exec("Rollo_OPEN_timer",0,'Rollo_OPEN',\@Rollos);

Das ist sehr verwirrend und inkosistent.

ja, ich werde es bei mir nachstellen
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Ich habe deinen Fall nachgestellt.

Ich weiß nicht, wie du es bei dir getestet hast, aber bei mir funktioniert es, wie von mir bereits vermutet, nicht, siehe Fehlermeldung.

ZitatInternals:
   CFGFN     
   DEF        subs {
sub Rollo_OPEN
{
  my @names = @{$_[0]};;
  print("namen: $names[0] $names[2]\n")
}
}

{
my @Rollos = ("EZ.Rollo", "WZ.Rollo", "HWR.Rollo", "GWC.Rollo", "KUE.Rollo.Links", "KUE.Rollo.Rechts", "SZ.Rollo.Links", "SZ.Rollo.Rechts");
set_Exec("timer",0,'Rollo_OPEN',\@Rollos);
}

   FUUID      5f6b80dd-f33f-30f6-ae3d-6674a851dda2fe2a
   MODEL      Perl
   NAME       di_array
   NOTIFYDEV  global
   NR         190463
   NTFY_ORDER 50-di_array
   STATE      initialized
   TYPE       DOIF
   VERSION    22764 2020-09-12 20:06:36
   READINGS:
     2020-09-23 19:09:35   block_01        executed
     2020-09-23 19:09:35   error           eval condition: Undefined subroutine &DOIF::ARRAY called at (eval 891801) line 1.

     2020-09-23 19:09:34   mode            enabled
     2020-09-23 19:09:34   state           initialized
   Regex:
     accu:
   condition:
     0         
my @Rollos = ("EZ.Rollo", "WZ.Rollo", "HWR.Rollo", "GWC.Rollo", "KUE.Rollo.Links", "KUE.Rollo.Rechts", "SZ.Rollo.Links", "SZ.Rollo.Rechts");
set_Exec("timer",0,'Rollo_OPEN',\@Rollos);

Dagegen funktioniert die Syntax "Rollo_OPEN(\@Rollos)" in Perl nicht so, wie ich es mir erhofft hatte.

Ich habe dennoch eine Lösung zu mehr Kompatibilität zur ursprünglichen Version gefunden.

Ich überprüfe jetzt, ob der vierte Parameter eine Referenz darstellt, in diesem Falle wird er als Übergabeparameter der Funktion gewertet und nicht als "condition". "condition" kann man dann als fünften Parameter angeben. So sollten alle wichtigen Fälle abgedeckt sein.

Neue DOIF-Version ist ab morgen per Update verfügbar, dann brauchst du an deinen Definitionen, sofern sie eine Referenz als Übergabeparameter beinhalten nichts zu ändern.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

eisenhauer1987

Morgen!

danke für das nachstellen. Ich sehe einen winzigen unterschied von deiner Probe zu meinen Reallife Szenario.

dein Code um das Array in der Subroutine zu lesen:

my @names = @{$_[0]};;

und mein Code:

my @names = @{$_[0]};

Du hast einmal ";" mehr als ich. Ob das der Grund ist warum das bei dir auf einen Fehler läuft, bei mir aber funktioniert kann ich aber nicht sagen.

Ich übergebe das Array genauso wie du und frage es dann wieder in der Subroutine ab. Daraus bastel ich mir dann in der for schleife (siehe code oben) einen "fhem set" Command der alle Rollos öffnet, welche bestimmte Bedingungen erfüllen.  Das, dass funktioniert sehe ich jeden morgen und Abend, die Rollos öffnen und schließen wie gewünscht, es wird kein Fehler erstellt.


Damian

Zitat von: eisenhauer1987 am 24 September 2020, 07:34:36
Morgen!

danke für das nachstellen. Ich sehe einen winzigen unterschied von deiner Probe zu meinen Reallife Szenario.

dein Code um das Array in der Subroutine zu lesen:

my @names = @{$_[0]};;

und mein Code:

my @names = @{$_[0]};

Du hast einmal ";" mehr als ich. Ob das der Grund ist warum das bei dir auf einen Fehler läuft, bei mir aber funktioniert kann ich aber nicht sagen.

Ich übergebe das Array genauso wie du und frage es dann wieder in der Subroutine ab. Daraus bastel ich mir dann in der for schleife (siehe code oben) einen "fhem set" Command der alle Rollos öffnet, welche bestimmte Bedingungen erfüllen.  Das, dass funktioniert sehe ich jeden morgen und Abend, die Rollos öffnen und schließen wie gewünscht, es wird kein Fehler erstellt.

Dort steht bei mir auch nur ein Semikolon, das Doppeln wird wegen Rawdefintion angezeigt.

Ich kann nur sagen, lt. Programmcode kann es nicht funktionieren, ab heute dann wieder ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Reinschki

Hallo,

das hat vorher funktioniert:
  sub SatDown {     
    my ($delta)=@_;
my $Val = get_Reading("sat") - $delta;
    fhem_set("deCONZ_HUEDevice13 sat $Val");
    if (get_Reading("sat") - $delta > 0) {
set_Exec("worktimer",1,"SatDown",$delta);
set_State("satDown $delta");
} else {
IdleState();
}


nach der Umstellung auf die neue Parameterübergabe von set_Exec funktioniert es nicht mehr:
  sub SatDown {     
    my ($delta)=@_;
my $Val = get_Reading("sat") - $delta;
    fhem_set("HUEGroup1 sat $Val");
    if (get_Reading("sat") - $delta > 0) {
set_Exec("worktimer",1,'SatDown($delta)');
set_Reading("command", $delta);
} else {
IdleState();
}


error
in SatDown($delta): Global symbol "$delta" requires explicit package name (did you forget to declare "my $delta"?) at (eval 19231178) line 1.

Wie kann ich die Parameterübergabe beim rekursiven Aufruf der doif-sub lösen?

Viele Grüße
Reiner