[Gelöst] Undefined subroutine &DOIF

Begonnen von Marcel_R, 13 April 2019, 09:02:11

Vorheriges Thema - Nächstes Thema

Marcel_R

Grüezi,

Ich habe 17 HM-Sec-RHS. Bisher habe ich diese mit Watchdogs überwacht - habe jedoch nie herausgefunden, wieso diese in 5 - 8 % der Fälle prellen (d.h., dass andere Watchdogs fälschlicherweise mitausgelöst werden).

Bin dann darauf gestossen, dass Watchdogs durch DOIF's ersetzt werden können. Wenn schon, denn schon möchte ich jetzt ein generisches DOIF für alle 17 Fenster.

Folgende Lösung ist i.O:
(["^FK:open"]) ({DebianMail('fhem@123.com',"FHEM:
" . (substr("$DEVICE", 4, 6)) . "-Fenster offen","Das Fenster " . substr("$DEVICE", 4, 6) . " ist seit mehr als 7 Minuten offen <a href=\"http://w.x.y.z:8083/fhem/floorplan/" . lc(substr("$DEVICE", 2, 2)) . "\">floorplan/" .  lc(substr("$DEVICE", 2, 2)) . "</a></html>\"",'')})


Soweit ich heraus gefunden habe, werden mit diesem Konstrukt alle Fenster überwacht, jedoch kann zu einem Zeitpunkt nur 1 Fenster eine Aktion auslösen. Ist dies richtig?

Ich habe dann in der DOIT-Referenz unter
ZitatVerzögerte Fenster-offen-Meldung mit Wiederholung für mehrere Fenster
gefundenen Code adaptiert.
subs {
  sub logwin {
my ($FK)=@_;
Log 3,"Fenster offen, bitte schließen: " . substr($FK, 4, 6) ;
  }
}
{ if (["^FK:open"]) {set_Exec ("$DEVICE",10,'logwin',"$DEVICE")}}
{ if (["^FK:closed"]) {del_Exec ("$DEVICE")}}


Nun möchte ich nicht einen Log-Eintrag, sondern, dass Mails verschickt werden.

Der angepasste Code:
subs {
  sub logwin {
my ($FK)=@_;
{DebianMail('fhem@123.com','FHEM:Fenster offen','Das Fenster ist seit mehr als 7 Minuten offen')};
  }
}
{ if (["^FK:open"]) {set_Exec ("$DEVICE",10,'logwin',"$DEVICE")}}
{ if (["^FK:closed"]) {del_Exec ("$DEVICE")}}


ergibt
ZitatFK_doif error in logwin: Undefined subroutine &DOIF::DebianMail called at (eval 10861) line 4
.

Da mir eh das Wasser weit über dem Kopf (in Sachen Verständis) steht, bitte ich jemand, mich in die richtige Richtung zu dirigieren...

Danke im Voraus!
Marcel

FHEM / Fritz!Box 7490 / CULv3 / Raspi / COC / MAX! / HomeMatic /

Damian

Im Perlmodus gilt:

Zitat aus der Commandref:

ZitatDer Namensraum im Perl-Modus ist gekapselt. Selbstdefinierte Funktionen im DOIF-Device können nicht bereits existierende Perlfunktionen in FHEM (Namensraum main) überschreiben. Funktionen aus dem Namensraum main müssen mit vorangestellem Doppelpunkt angegeben werden: ::<perlfunction>

Das gilt insb. auch für DebianMail ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Marcel_R

Vielen Dank Damian,

Es tut mir leid, dass ich mir den Punkt der Commandref nicht zu Gemüte geführt habe - aber ich weiss meist mit bestem Willen nicht, wonach ich überhaupt suchen müsste.... (wenn ich in Fhem unterwegs bin fühle ich mich als 66 jähriger Rookie mit Stock und Hut < 2 mm!!).

Dank Dir klappt das - aber da man nie zufrieden ist...
hast Du (oder jemand anderes) einen Tip, wie folgender Code so angepasst werden kann, dass der substr($FK, 4, 6) auf Grund von einem if else angepasst werden kann:
subs {
  sub logwin {
my ($FK)=@_;
(::DebianMail("fhem\@123.com","FHEM:" . substr($FK, 4, 6). "Fenster offen","Das Fenster ". substr($FK, 4, 6) . " ist seit mehr als 7 Minuten offen <a href=\"http://w.x.y.z:8083/fhem/floorplan/" . lc(substr($FK, 2, 2)),""));
  }
}
{ if (["^FK:open"]) {set_Exec ("$DEVICE",420,"logwin","$DEVICE")}}
{ if (["^FK:closed"]) {del_Exec ("$DEVICE")}}


im Sinne von {if (substr($FK, 10, 1) eq "y") substr($FK, 4, 6) ;; substr($FK, 4, 7)}

Wenn so verwendet, ergibt dies ein
ZitatFK_doif DOIF: syntax error at (eval 14083) line 4, near "{if"
syntax error at (eval 14083) line 4, near "} ."
Global symbol "$FK" requires explicit package name (did you forget to declare "my $FK"?) at (eval 14083) line 4.
: error in defs block

Ich habe nach dem Gegenft von :: gesucht und komme auf our ($FK)=@_; (statt my ($FK)=@_;).

Bin ich da arg auf dem Holzweg (und was muss ich bei globalen Variablen  bedenken) ?

Danke!
Marcel
FHEM / Fritz!Box 7490 / CULv3 / Raspi / COC / MAX! / HomeMatic /

Damian

Zitat von: Marcel_R am 13 April 2019, 12:41:24
Vielen Dank Damian,

Es tut mir leid, dass ich mir den Punkt der Commandref nicht zu Gemüte geführt habe - aber ich weiss meist mit bestem Willen nicht, wonach ich überhaupt suchen müsste.... (wenn ich in Fhem unterwegs bin fühle ich mich als 66 jähriger Rookie mit Stock und Hut < 2 mm!!).

Dank Dir klappt das - aber da man nie zufrieden ist...
hast Du (oder jemand anderes) einen Tip, wie folgender Code so angepasst werden kann, dass der substr($FK, 4, 6) auf Grund von einem if else angepasst werden kann:
subs {
  sub logwin {
my ($FK)=@_;
(::DebianMail("fhem\@123.com","FHEM:" . substr($FK, 4, 6). "Fenster offen","Das Fenster ". substr($FK, 4, 6) . " ist seit mehr als 7 Minuten offen <a href=\"http://w.x.y.z:8083/fhem/floorplan/" . lc(substr($FK, 2, 2)),""));
  }
}
{ if (["^FK:open"]) {set_Exec ("$DEVICE",420,"logwin","$DEVICE")}}
{ if (["^FK:closed"]) {del_Exec ("$DEVICE")}}


im Sinne von {if (substr($FK, 10, 1) eq "y") substr($FK, 4, 6) ;; substr($FK, 4, 7)}

Wenn so verwendet, ergibt dies ein
Ich habe nach dem Gegenft von :: gesucht und komme auf our ($FK)=@_; (statt my ($FK)=@_;).

Bin ich da arg auf dem Holzweg (und was muss ich bei globalen Variablen  bedenken) ?

Danke!
Marcel

Wenn du im Perl-Modus etwas definierst, dann musst du dir wenigsten die Perl-Grundlagen zu Gemüte führen. z. B. zu if:

if (<Bedingung>)
{
   <Perlbefehle>
} else {
  <Perlbefehle>
}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Marcel_R

Hi Damian,
Vielen Dank, dass Du Dich mir und meinen Problemen annimmst.

Eigentlich wollte ich innerhalb von DebianMail mittels if else wirken - das habe ich nicht geschafft.

Nun habe ich es so gelöst:
subs {
  sub logwin {   
my ($FK)=@_;
if (substr($FK, 10, 1) ne "y")
{
(::DebianMail("fhem\@123.com","FHEM:" .  substr($FK, 4, 7) . "Fenster offen","Das Fenster " . substr($FK, 4, 7) . " ist seit mehr als 7 Minuten offen <a href=\"http://w.x.y.z:8083/fhem/floorplan/" . lc(substr($FK, 2, 2)),""))
} else {
(::DebianMail("fhem\@123.com","FHEM:" .  substr($FK, 4, 6) . "Fenster offen","Das Fenster ". substr($FK, 4, 6) . " ist seit mehr als 7 Minuten offen <a href=\"http://w.x.y.z:8083/fhem/floorplan/" . lc(substr($FK, 2, 2)),""))
}
}
}
{ if (["^FK:open"]) {set_Exec ("$device",10,"logwin","$device")}}
{ if (["^FK:closed"]) {del_Exec ("$device")}}


Es werden keine Fehler mehr angezeigt, block_1 und block_2 werden ausgeführt -> leider ohne sichtbare Leistung, d.h. es werden keine Mails versandt (und obwohl verbose 5, wird nichts geloggt).

Ist mir noch zu helfen?
Marcel
FHEM / Fritz!Box 7490 / CULv3 / Raspi / COC / MAX! / HomeMatic /

Damian

Zitat von: Marcel_R am 14 April 2019, 01:55:45
Hi Damian,
Vielen Dank, dass Du Dich mir und meinen Problemen annimmst.

Eigentlich wollte ich innerhalb von DebianMail mittels if else wirken - das habe ich nicht geschafft.

Nun habe ich es so gelöst:
subs {
  sub logwin {   
my ($FK)=@_;
if (substr($FK, 10, 1) ne "y")
{
(::DebianMail("fhem\@123.com","FHEM:" .  substr($FK, 4, 7) . "Fenster offen","Das Fenster " . substr($FK, 4, 7) . " ist seit mehr als 7 Minuten offen <a href=\"http://w.x.y.z:8083/fhem/floorplan/" . lc(substr($FK, 2, 2)),""))
} else {
(::DebianMail("fhem\@123.com","FHEM:" .  substr($FK, 4, 6) . "Fenster offen","Das Fenster ". substr($FK, 4, 6) . " ist seit mehr als 7 Minuten offen <a href=\"http://w.x.y.z:8083/fhem/floorplan/" . lc(substr($FK, 2, 2)),""))
}
}
}
{ if (["^FK:open"]) {set_Exec ("$device",10,"logwin","$device")}}
{ if (["^FK:closed"]) {del_Exec ("$device")}}


Es werden keine Fehler mehr angezeigt, block_1 und block_2 werden ausgeführt -> leider ohne sichtbare Leistung, d.h. es werden keine Mails versandt (und obwohl verbose 5, wird nichts geloggt).

Ist mir noch zu helfen?
Marcel

Du solltest um die einzelnen Perlfunktionen (hier ::Debianmail...) keine runden Klammern setzen. Wenn es vorher funktioniert hat, dann muss es jetzt auch funktionieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Marcel_R

Hi Damian,
Vielen Dank. Ich bin immer wieder erstaunt, dass es tausende Arten gibt, etwas falsch zu machen (und leider meist nur eine richtige).

Nun ist alles in Butter.

Gruss
Marcel
FHEM / Fritz!Box 7490 / CULv3 / Raspi / COC / MAX! / HomeMatic /

andies

Zitat von: Damian am 13 April 2019, 10:12:40
Zitat aus der Commandref: ...

Das gilt insb. auch für DebianMail ;)
Ich habe festgestellt, dass das auch bei meiner selbst gestrickten Funktion ,,hydrAbgleichSetzen" gilt - ohne :: bekam ich die gleiche Fehlermeldung. Ich dachte zuerst beim Lesen dieses Threads, dass das nur auf bereits vorhandene Funktionennamen zutrifft.

Jedenfalls ist men Problem gelöst, seit ich die Doppelpunkte verwende. Vielleicht hilfreich für andere, das auszuprobieren.
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann