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
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
######################################################
# 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
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
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
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
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:
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
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
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
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