Autor Thema: neue Features: ereignisgesteuertes Perl - DOIF-Perl  (Gelesen 71553 mal)

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 10148
Antw:neue Features: ereignisgesteuertes Perl - DOIF-Perl
« Antwort #225 am: 04 Oktober 2020, 13:04:25 »
so wird der Aufruf funktionieren:

set_Exec("worktimer",1,"SatDown($delta)")
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Offline obi

  • Jr. Member
  • **
  • Beiträge: 82
Antw:neue Features: ereignisgesteuertes Perl - DOIF-Perl
« Antwort #226 am: 08 Oktober 2020, 15:47:39 »
Hallo,

ich habe das gleiche Problem, dass seit der Änderung der Parameterübergabe der rekursive Aufruf nicht funktioniert.
Habe alle erdenklichen variationen mal durchprobiert.

set_Exec("worktimer",1,"volume($type)"); -> Bareword "Down" not allowed while "strict subs" in use
set_Exec("worktimer",1,'volume("$type")'); -> Global symbol "$type" requires explicit package name (did you forget to declare "my $type"?)
set_Exec("worktimer",1,'volume($type)'); -> Global symbol "$type" requires explicit package name (did you forget to declare "my $type"?)

Wie bekomme ich das Problem gelöst?

VG Sebastian

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 10148
Antw:neue Features: ereignisgesteuertes Perl - DOIF-Perl
« Antwort #227 am: 08 Oktober 2020, 16:00:22 »
Hallo,

ich habe das gleiche Problem, dass seit der Änderung der Parameterübergabe der rekursive Aufruf nicht funktioniert.
Habe alle erdenklichen variationen mal durchprobiert.

set_Exec("worktimer",1,"volume($type)"); -> Bareword "Down" not allowed while "strict subs" in use
set_Exec("worktimer",1,'volume("$type")'); -> Global symbol "$type" requires explicit package name (did you forget to declare "my $type"?)
set_Exec("worktimer",1,'volume($type)'); -> Global symbol "$type" requires explicit package name (did you forget to declare "my $type"?)

Wie bekomme ich das Problem gelöst?

VG Sebastian

Es kommt darauf auf, wie der Aufruf vorher aussah. Wo wird $type definiert?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Offline obi

  • Jr. Member
  • **
  • Beiträge: 82
Antw:neue Features: ereignisgesteuertes Perl - DOIF-Perl
« Antwort #228 am: 08 Oktober 2020, 16:10:57 »
Hi Damian,

danke für die schnelle Antwort.

$type wird innerhalb der Sub als Übergabaparameter definiert, eventuell mache ich ja hier schon einen Fehler.

Hier mal mein kompletten Code der Sub:
sub $SELF_volume
{
my ($type)=@_;
...
set_Exec('$SELF_volume', 1, '$SELF_volume($type)');
  }

Der 1. Aufruf sieht so aus in einem anderen teil des DOIF (Über einen externen Trigger mit IF)
set_Exec('$SELF_volume', 0, '$SELF_volume("Up")');
« Letzte Änderung: 08 Oktober 2020, 16:12:34 von obi »

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 10148
Antw:neue Features: ereignisgesteuertes Perl - DOIF-Perl
« Antwort #229 am: 08 Oktober 2020, 16:37:28 »
Dann frage ich mich, wie du es vor der Umstellung aufgerufen hast.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Offline obi

  • Jr. Member
  • **
  • Beiträge: 82
Antw:neue Features: ereignisgesteuertes Perl - DOIF-Perl
« Antwort #230 am: 08 Oktober 2020, 18:03:06 »
So hatte es vor der Umstellung fehlerfrei funktioniert:

sub $SELF_volume
{
my ($type)=@_;
...
set_Exec('$SELF_volume', 1, '$SELF_volume', $type);
  }

set_Exec('$SELF_volume', 0, '$SELF_volume', 'Up');

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 10148
Antw:neue Features: ereignisgesteuertes Perl - DOIF-Perl
« Antwort #231 am: 08 Oktober 2020, 18:06:26 »
So hatte es vor der Umstellung fehlerfrei funktioniert:

sub $SELF_volume
{
my ($type)=@_;
...
set_Exec('$SELF_volume', 1, '$SELF_volume', $type);
  }

set_Exec('$SELF_volume', 0, '$SELF_volume', 'Up');

dann:

sub $SELF_volume
{
my ($type)=@_;
...
set_Exec('$SELF_volume', 1, "$SELF_volume('$type')");
  }

set_Exec('$SELF_volume', 0, "$SELF_volume('Up')";
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF
Hilfreich Hilfreich x 1 Liste anzeigen

Offline Per

  • Hero Member
  • *****
  • Beiträge: 1782
Antw:neue Features: ereignisgesteuertes Perl - DOIF-Perl
« Antwort #232 am: 14 Januar 2021, 16:24:57 »
Um Lang- und Doppelclick bei meinen EnOcean-Tastern abzufragen, nutzte ich wegen der Timer jeweils ein klassisches DOIF. Ich wollte auf Templates umstellen, hat aber nicht funktioniert. Es gab keine Fehlermeldung, aber auch keine Aktion. Aber egal.
Dann habe ich mal bei Null angefangen und herausgekommen ist ein kleiner Mehrzeiler in Perl-DOIF (mein erster eigener), wahrscheinlich sogar, inkl. Attr., mit weniger Code pro DOIF als vorher. Und natürlich nur eine DOIF statt dutzender.
define EnO_T_DOIF DOIF {\
if (["EnO_T_.*:buttons: released"]) {del_Exec('$DEVICE');;fhem('setreading $DEVICE pressed off');;} ##off\
if (["EnO_T_.*:buttons: pressed"]){\
if ([?$DEVICE:pressed:sec] < 2) {fhem('setreading $DEVICE pressed double');;} ## Double\
else {fhem('setreading $DEVICE pressed on');;set_Exec('$DEVICE',1,'fhem("setreading $DEVICE pressed long")')} ## short,long\
}\
}

Das einzige verbleibende Attribut bei mir ist der Raum.
Timer werden automatisch gesetzt/gelöscht, Events werden nicht erstellt (außer bei dem jeweiligen Tastern. Das benötigte Reading wird automatisch erzeugt. Neue Taster müssen nicht eingepflegt werden, was bei Templates notwendig wäre.

Einzige Voraussetzung ist der passende Namensraum (EnOcean-Taster -> EnO_T_xxx). Könnte man über eine Typ-Anfrage noch absichern, ist bei mir aber nicht notwendig.

PS: trotzdem werde ich nicht pauschal auf Perl-DOIF umsteigen ;)
PPS: wäre es sinnvoll, neben fhem_set auch ein fhem_setreading bereitzustellen?
« Letzte Änderung: 16 Januar 2021, 14:38:05 von Per »

Offline hackepeter

  • Jr. Member
  • **
  • Beiträge: 99
Antw:neue Features: ereignisgesteuertes Perl - DOIF-Perl
« Antwort #233 am: 14 April 2021, 16:51:12 »
Hallo Damin :)

kurze Frage: ich habe ein Doif im PerlModus, welches auf viele Devices reagiert...
Gibt es eine elegante Möglichkeit, mehrfachtriggern zu verhindern, wenn die entsprechenden devices das reading neu setzen, sich dieses aber nicht verändert?

{if (["Event:on"]){
  my $TriggerdeviceNr = substr($device, -4);;
  my $AckType;;
  my $ReceiverNr;;
........

« Letzte Änderung: 15 April 2021, 07:03:51 von hackepeter »

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 10148
Antw:neue Features: ereignisgesteuertes Perl - DOIF-Perl
« Antwort #234 am: 14 April 2021, 17:04:38 »
Hallo Damin :)

kurze Frage: ich habe ein Doif im PerlModus, welches auf viele Devices reagiert...
Gibt es eine elegante Möglichkeit, mehrfachtriggern zu verhindern, wenn die entsprechenden devices das reading neu setzen, sich dieses aber nicht verändert?
    U     "DB_Supplement_SEQ001".SupDB.Message[3]
      U     "DB_Meldungen".HM_FP[3]."1"
      =     "DB_Meldungen".Speicher_Meldungen_SEQ[1]."3"
........

Was ist das für eine Syntax? Das sagt mir nichts.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Offline hackepeter

  • Jr. Member
  • **
  • Beiträge: 99
Antw:neue Features: ereignisgesteuertes Perl - DOIF-Perl
« Antwort #235 am: 15 April 2021, 07:04:25 »
Moin Moin,

sorry, da hatte ich das falsche im Clipboard. Habe es geändert.

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 10148
Antw:neue Features: ereignisgesteuertes Perl - DOIF-Perl
« Antwort #236 am: 15 April 2021, 10:23:53 »
Also, Events eines Devices, die innerhalb eines EventBlocks kommen, triggern ohnehin nur einmal.

Man kann in DOIF-Perl mit Instanzvariablen arbeiten, man kann dort Sachen ablegen, die man beim nächsten Mal abfragen kann, z. B.

if ($_device ne $device) {
  $_device=$device;
  mein Code ...
}


Beim sendenden Device kann man event_on_change_reading-Attribut setzen, damit bleiben Events mit gleichem Inhalt schon mal aus.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Offline PSI69

  • Full Member
  • ***
  • Beiträge: 218
Antw:neue Features: ereignisgesteuertes Perl - DOIF-Perl
« Antwort #237 am: 27 April 2021, 14:48:51 »
Mahlzeit!

Ich bin mir bewußt - das folgende ist kein DOIF Problem, sondern Perl generell und meinem Unverständnis geschuldet...

Ich habe in einem DOIF im Perl Mode folgende Funktion:
  sub $SELF_KalenderEvents {
    my $iCalEvents = "";

    ## Events für Heute besorgen
    $iCalEvents = fhem("get Kalender.iCloud events limit:when=today");

    if(length($iCalEvents) != 0){
      ## Auf *ferien oder Feiertag prüfen
      if(($iCalEvents =~ ".*ferien.*") || ($iCalEvents =~ ".*Feiertag.*") || ($iCalEvents =~ ".*Urlaub.*")){
        $SELF_DebugMessage("setze Dummy 'Jalousien.Ferien' auf 'on'");
        fhem_set"Jalousien.Ferien on";
      }
      else{
        $SELF_DebugMessage("Termine '$iCalEvents' enthalten kein Schlüsselwort");
      }
    }
  }

So lange der 'fhem("get...' - Aufruf Daten zurück liefert, klappt alles super. Werden allerdings keine Kalendereinträge gefunden, erfolgt folgende Fehlermeldung (Warnung):
2021.04.27 09:28:24 1: PERL WARNING: Use of uninitialized value $iCalEvents in numeric ne (!=) at (eval 2599711) line 18.
2021.04.27 09:28:24 3: eval: di_p_Jalousien_Ferien: warning in condition c03

Also, die Prüfung der Variable auf Inhalt mittels 'if(length($iCalEvents) != 0)' bringt mir die Warnung; hm.

Kommentiere ich '$iCalEvents = fhem("get Kalender.iCloud events limit:when=today");' komplett aus, entfällt die Warnung, denn die Variable ist ja mit 'my $iCalEvents = "";' initialisiert. Irgend etwas 'macht' also der 'fhem("get...' - Aufruf bei leeren Daten damit.

Nun zur Frage des Tages: Wie fange ich das 'nicht Zurückgeben' von Kalenderdaten sauber (ohne Warnung im Logfile) ab?
Bin dankbar für jeden Hinweis...

Peter
FHEM 6 auf RPi 4 unter Buster mit inzwischen einem ganzen Zoo von Geräten...

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 10148
Antw:neue Features: ereignisgesteuertes Perl - DOIF-Perl
« Antwort #238 am: 27 April 2021, 16:21:17 »
ganz einfach:

if (defined $iCalEvents and length($iCalEvents) != 0){
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Offline PSI69

  • Full Member
  • ***
  • Beiträge: 218
Antw:neue Features: ereignisgesteuertes Perl - DOIF-Perl
« Antwort #239 am: 28 April 2021, 08:08:04 »
ganz einfach:
... wenn man es weiß :) - ich ja jetzt auch :D.
Danke Peter
FHEM 6 auf RPi 4 unter Buster mit inzwischen einem ganzen Zoo von Geräten...