FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: kroemmel am 17 Mai 2017, 13:04:27

Titel: Hilfe bei Stacktrace Analyse / 99_MyUtils
Beitrag von: kroemmel am 17 Mai 2017, 13:04:27
Hallo zusammen,

seit meinem letzten Update am 15.05. wirft mir eine Funktion zur Steuerung meiner Jalousien einen Fehler und ich komme mit der Analyse nicht weiter. Seit Ende 2016 tat das Konstrukt fehlerfrei seinen Dienst.

Edit Zur Sicherheit habe ich eben noch ein frisches Update angestoßen - gleiches Verhalten.

Szenario: Das Haus hat auf verschiedenen Seiten Jalousien, welche je nach Sonnenstand (Azimuth) oder Uhrzeit geschaltet werden. Natürlich auch Manuell. Die Funktion welche nun einen Fehler wirf (lcAcitivity) schaltet Dummys für eine Hausseite, auf die wiederrum die einzelnen Aktoren für die Jalousien lauschen. Der Fehler wird für alle Hausseiten und Jalousien geworfen, exemplarisch unten für das Kinderzimmer.

Ich hab im Forum gestöbert, wie ich den Fehler einkreisen kann und hab den Stacktrace aktiviert. Allerdings werde ich da nicht ganz schlau draus und bräuchte Hilfe bei der Interpretation - Wo muss ich schauen? Bzw. an welcher Stelle stehe ich auf dem Schlauch?

Ausgelöste Aktion (diesesmal manuell, gleiches Ergebnis bei AT):
2017.05.17 12:35:40 0: Rolladen EG_ki_Jalousie1 auf pct 60 eingestellt.
Das "pct 60" ist die Meldung an den Rolladen Aktor, die wird auch ausgeführt, wenn Manuell getriggert. Für den globalen Sonnenstand wird das Schlüsselwort "Sonne" verwendet, welches jeder Dummy für die Rolläden akzeptiert. Sonderfall Kinderzimmer: Da wird (noch) in Prozent gearbeitet, allerdings wird dieses Sonderfall auch über die Funktion abgefangen.

Stacktrace
Code (Stacktrace) Auswählen
2017.05.17 12:35:40 1: PERL WARNING: Use of uninitialized value $cmd in pattern match (m//) at fhem.pl line 998.
2017.05.17 12:35:40 3: eval: my $SELF='n_ki_Rolladen';my $EVENT='Sonne';my $EVTPART0='Sonne';my $NAME='d_ki_Rolladen';my $TYPE='dummy';{
lcActivity("Kind","$EVENT");
}
2017.05.17 12:35:40 1: stacktrace:
2017.05.17 12:35:40 1:     main::__ANON__                      called by fhem.pl (998)
2017.05.17 12:35:40 1:     main::AnalyzeCommandChain           called by fhem.pl (3438)
2017.05.17 12:35:40 1:     main::fhem                          called by ./FHEM/99_MyUtils.pm (120)
2017.05.17 12:35:40 1:     main::lcActivity                    called by (eval 6106) (2)
2017.05.17 12:35:40 1:     (eval)                              called by fhem.pl (1070)
2017.05.17 12:35:40 1:     main::AnalyzePerlCommand            called by fhem.pl (1093)
2017.05.17 12:35:40 1:     main::AnalyzeCommand                called by fhem.pl (1018)
2017.05.17 12:35:40 1:     main::AnalyzeCommandChain           called by ./FHEM/91_notify.pm (102)
2017.05.17 12:35:40 1:     main::notify_Exec                   called by fhem.pl (3398)
2017.05.17 12:35:40 1:     main::CallFn                        called by fhem.pl (3319)
2017.05.17 12:35:40 1:     main::DoTrigger                     called by fhem.pl (4287)
2017.05.17 12:35:40 1:     main::readingsEndUpdate             called by fhem.pl (4469)
2017.05.17 12:35:40 1:     main::readingsSingleUpdate          called by ./FHEM/98_dummy.pm (63)
2017.05.17 12:35:40 1:     main::dummy_Set                     called by fhem.pl (3393)
2017.05.17 12:35:40 1:     main::CallFn                        called by fhem.pl (1725)
2017.05.17 12:35:40 1:     main::DoSet                         called by fhem.pl (1758)
2017.05.17 12:35:40 1:     main::CommandSet                    called by fhem.pl (1154)
2017.05.17 12:35:40 1:     main::AnalyzeCommand                called by ./FHEM/01_FHEMWEB.pm (2468)
2017.05.17 12:35:40 1:     main::FW_fC                         called by ./FHEM/01_FHEMWEB.pm (855)
2017.05.17 12:35:40 1:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (544)
2017.05.17 12:35:40 1:     main::FW_Read                       called by fhem.pl (3398)
2017.05.17 12:35:40 1:     main::CallFn                        called by fhem.pl (685)


Funktion lcActivity in 99_MyUtils.pm
Code (lcAcitivity) Auswählen
######################################################
# Globaler Sun-Downer für die Rolläden
# Aufruf per "{lcActivity(Hausseite, Modus)}"
# Akzeptiert:    Hausseite = Nord, West, Sued, Ost, Alle, Kind
#                      Modus = Oben, Unten, Sonne, Stop
# Erstellt: 08.09.2016
# Update: -
# Status: Done & Working
######################################################
sub lcActivity($$)
{
my $hs = shift; #Hausseite
my $md = shift; #Modus für den Rolladen
my $modus = "stop";
my $eg_ki_modus = "stop";
my $delay = 1;

if($md eq "Oben"){
$modus = "on";
$eg_ki_modus = "off";
}elsif($md eq "Unten"){
$modus = "off";
$eg_ki_modus = "on";
}elsif ($md eq "Sonne"){
$modus = $md;
$eg_ki_modus = "pct 60";
}else{
$modus = "stop";
$eg_ki_modus = "stop";
}

if($hs eq "Ost") {
foreach my $ref (@ost_og_LCs)
{
my $atName = "a_" . $ref;
my $dly = atDelayCalc($delay, 1);
{ fhem ("define $atName at $dly set $ref $modus ") };
{ fhem (Log 0, "At fuer Rolladen $ref auf $modus eingestellt in $dly Delay.")};
$delay++;
}
}elsif($hs eq "Sued") {
foreach my $ref (@sued_og_LCs)
{
my $atName = "a_" . $ref;
my $dly = atDelayCalc($delay, 1);
{ fhem ("define $atName at $dly set $ref $modus ") };
{ fhem (Log 0, "At fuer Rolladen $ref auf $modus eingestellt in $dly Delay.")};
$delay++;
}
}elsif($hs eq "Kind") {
foreach my $ref (@ost_eg_LCs)
{
{ fhem ("set $ref $eg_ki_modus") };
{ fhem (Log 0, "Rolladen $ref auf $eg_ki_modus eingestellt.")};
}
}elsif($hs eq "Nord") {
# noch nicht verkabelt
{ fhem (Log 0, "Jalousien noch nicht verkabelt.")};
}elsif($hs eq "West") {
# noch nicht verkabelt
{ fhem (Log 0, "Jalousien noch nicht verkabelt.")};
}elsif($hs eq "Alle") {
# noch nicht nötig
{ fhem (Log 0, "Alle baue ich irgendwann. Geduld.")};
}
}


List d_ki_Rolladen
Code (d_ki_Rolladen) Auswählen
Internals:
   NAME       d_ki_Rolladen
   NR         277
   STATE      Sonne
   TYPE       dummy
   Readings:
     2017-05-17 12:53:26   state           Sonne
Attributes:
   DbLogExclude .*
   alias      EG Kinderzimmer Jalousie
   devStateIcon Stop:fts_shutter_manual Unten:fts_shutter_100 Oben:fts_shutter_10 Sonne:weather_sun Winter:weather_frost
   group      grp_JalousieWetter
   icon       fts_sunblind
   room       01-Kinderzimmer,04-JalousieAutomatik
   setList    Unten Oben Sonne Stop
   webCmd     Unten:Oben:Sonne:Stop


List n_ki_Rolladen
Code (n_ki_Rolladen) Auswählen
Internals:
   DEF        d_ki_Rolladen.* {
lcActivity("Kind","$EVENT");
}
   NAME       n_ki_Rolladen
   NOTIFYDEV  d_ki_Rolladen.*
   NR         280
   NTFY_ORDER 50-n_ki_Rolladen
   REGEXP     d_ki_Rolladen.*
   STATE      2017-05-17 12:53:26
   TYPE       notify
   Readings:
     2017-05-17 12:41:45   state           active
Attributes:
   icon       light_exclamation
   room       01-Kinderzimmer,04-JalousieAutomatik




Innerhalb von lcAcitivity aufgerufene Funktion
Berechnet das AT für den verzögerten Aufruf der weiteren Jalousieaktoren (Reduktion Anlaufstrom).
########################################################
# Delay berechner für ATs.
# Akzeptiert: $Aktueller Delay in Sekunden
# $Zusätzliches Delay in Sekunden
########################################################
sub atDelayCalc($$)
{
my $src = shift;
my $pls = shift;
my $nuDelay = "";

my $sec = $src + $pls; #gesamt Delay in Sekunden

my $m = int $sec / 60; # Gesamtminuten
my $s = $sec - ($m * 60); # Gesamtsekunden
my $h = int $m / 60; # Gesamtstunden
$m = $m - ($h * 60); # Update Minuten bei Stundenüberschlag

if($h<10){
$nuDelay = "+0" . $h;
}elsif($h > 9){
$nuDelay = "+"  . $h;
}

if($m<10){
$nuDelay = $nuDelay . ":0" . $m;
}elsif($m > 9){
$nuDelay = $nuDelay . ":"  . $m;
}

if($s<10){
$nuDelay = $nuDelay . ":0" . $s;
}elsif($s > 9){
$nuDelay = $nuDelay . ":"  . $s;
}

return $nuDelay;
}


Vielen Dank schon Mal für die Mühe, mein Kauderwelsch durchzuschauen und jede Anregung.

Grüße,
Florian
Titel: Antw:Hilfe bei Stacktrace Analyse / 99_MyUtils
Beitrag von: DeeSPe am 17 Mai 2017, 13:20:23
Ich sehe sehr viel { und } die unnötig sind.
Wenn man schon in Perl ist mit {} muss man das nicht noch einmal drumherum setzen.

Zitat von: kroemmel am 17 Mai 2017, 13:04:27
Code (lcAcitivity) Auswählen

if($hs eq "Ost") {
foreach my $ref (@ost_og_LCs)
{
my $atName = "a_" . $ref;
my $dly = atDelayCalc($delay, 1);
{ fhem ("define $atName at $dly set $ref $modus ") };
{ fhem (Log 0, "At fuer Rolladen $ref auf $modus eingestellt in $dly Delay.")};
$delay++;
}
}elsif($hs eq "Sued") {
foreach my $ref (@sued_og_LCs)
{
my $atName = "a_" . $ref;
my $dly = atDelayCalc($delay, 1);
{ fhem ("define $atName at $dly set $ref $modus ") };
{ fhem (Log 0, "At fuer Rolladen $ref auf $modus eingestellt in $dly Delay.")};
$delay++;
}
}elsif($hs eq "Kind") {
foreach my $ref (@ost_eg_LCs)
{
{ fhem ("set $ref $eg_ki_modus") };
{ fhem (Log 0, "Rolladen $ref auf $eg_ki_modus eingestellt.")};
}
}elsif($hs eq "Nord") {
# noch nicht verkabelt
{ fhem (Log 0, "Jalousien noch nicht verkabelt.")};
}elsif($hs eq "West") {
# noch nicht verkabelt
{ fhem (Log 0, "Jalousien noch nicht verkabelt.")};
}elsif($hs eq "Alle") {
# noch nicht nötig
{ fhem (Log 0, "Alle baue ich irgendwann. Geduld.")};
}
}


Überall wo "{ fhem ("") }" steht sind die geschweiften Klammern drumherum unnötig.

Log ist eine Perl Funktion von FHEM und nicht mit "fhem" auszuführen:
Code (lcAcitivity) Auswählen

if($hs eq "Ost") {
foreach my $ref (@ost_og_LCs)
{
my $atName = "a_" . $ref;
my $dly = atDelayCalc($delay, 1);
fhem "define $atName at $dly set $ref $modus";
Log 0, "At fuer Rolladen $ref auf $modus eingestellt in $dly Delay.";
$delay++;
}


Wenn Du den Rest auch so entsprechend anpasst, dürfte es keine Fehler mehr geben.

Gruß
Dan
Titel: Antw:Hilfe bei Stacktrace Analyse / 99_MyUtils
Beitrag von: kroemmel am 17 Mai 2017, 18:22:15
Hi,

Vielen Dank für deine Hilfe!

Ich ändere die Methode heute Abend noch ab und versuche es erneut.

Das mit den Parenthesen in FHEM verwirrt mich nach wie vor  :-[

Grüße
Florian
Titel: Antw:Hilfe bei Stacktrace Analyse / 99_MyUtils
Beitrag von: kroemmel am 18 Mai 2017, 13:06:30
Hallo!

In Summe war es der inkorrekte Aufruf der Log Funktion. Die hat den Fehler geschmissen. Vielen Dank für deine Hilfe! Da werde ich jetzt wohl durch einigen Code durch müssen..... :o

Was mich quasi wieder zu der Ausgangsfrage bringt: Wie lese ich den Stacktrace? Dann hätte ich das ggf. selbst beheben können und würde hier keinen mit solchen Lapalien aufhalten :)

Grüße,
Florian
Titel: Antw:Hilfe bei Stacktrace Analyse / 99_MyUtils
Beitrag von: DeeSPe am 18 Mai 2017, 15:44:44
Wie man stacktrace genau liest kann ich Dir auch nicht sagen.
Aber diese Zeile:
2017.05.17 12:35:40 1:     main::fhem                          called by ./FHEM/99_MyUtils.pm (120)
hat den Fehler wohl schon recht genau eingekreist.

Gruß
Dan