Ausschrift in Logfile aus 99_Utils.pm FBoxparameter

Begonnen von SharcWare, 23 März 2013, 18:31:47

Vorheriges Thema - Nächstes Thema

SharcWare

Hallo,

vor einiger Zeit habe ich in das 99_Utils.pm die Routine der Fritzboxparameter aus dem FHEM-Wiki eingebunden, das funktioniert seit der Hilfe aus dem Forum hervorragend. Nun habe ich mir nach längerer Zeit mal das Logfile angesehen und festgestellt, dass immer, wenn ich den Floorplan aufrufe nachfolgender Text in das Logfile geschrieben wird:

--
date: invalid date '+%d.%m.%y 0:00'
Use of uninitialized value $TelNewMessages in concatenation (.) or string at ./FHEM/99_Utils.pm line 221.
Use of uninitialized value $string in substitution (s///) at ./FHEM/99_Utils.pm line 64.
Use of uninitialized value $string in substitution (s///) at ./FHEM/99_Utils.pm line 65.
Use of uninitialized value in string eq at ./FHEM/99_Utils.pm line 238.
--

Das ändert sich auch nicht nach einem Restart. Die erste Ausschrift kommt von:
    my $Datum = `date -d +"%d.%m.%y 0:00"`;
Da kennt die Routine offensichtlich nicht "date".
Die anderen Ausschriften kommen kommen wahrscheinlich von der Funktion trim, die in Zeile 61-67 definiert wird und ebenfalls beim Aufruf Fehler(Zeile 64, 65) bringt:
   $string =~ s/^\s+//;
   $string =~ s/\s+$//;

Alle diese Funktionen sind original aus dem Wiki und wurden von mir nicht verändert und haben meines Wissens bisher funktioniert. Ich habe eine ganze Weile rumprobiert, komme aber nicht auf den Fehler, ich bin offensichtlich noch zu wenig mit Pearl bekannt um dort selbst auf eine Lösung zu kommen. Kann mir jemand helfen? Als Anhang sende ich das bei mir aktive Pearl-Script.

Danke Jens

rudolfkoenig

Weiss nicht genau, was der Wiki-Autor erreichen wollte, aber -d verlangt als Argument ein Datum und kein Format-String. Jedenfalls auf der FB, auf Ubuntu und OSX:
-d, --date=STRING   display time described by STRING, not `now'


SharcWare

Danke für die schnelle Antwort.
Diese Zeile der Datum-Definition wird nirgends verwendet, wenn ich die auskommentiere ändert sich nichts an der Funktion, die erste Ausschrift ist dann auch verschwunden aber die Ausschriften über "Use of uninitialized value" bleiben.

Gruß Jens

LaLeLu

Dies kann ich bestätigen. Ich habe die Zeile auch auskommentiert.

Die Fehlermeldungen mit
ZitatUse of uninitialized value $TelNewMessages
habe ich aber nicht.

Dies hier ist mein Code: sub ShowFritzBoxValues()
  {
 
    my @FritzAlarmClockTime;
    my @FritzAlarmClockActive;
    my @FritzAlarmClockNumber;
    my @FritzTelName;
    my @FritzAlarmClockWeekdays;
    my @Weekdays;
    my $k;
   
    foreach $k (0..2) {
      my $AStr_Time = "ctlmgr_ctl r telcfg settings/AlarmClock".$k."/Time";
      my $AStr_Active = "ctlmgr_ctl r telcfg settings/AlarmClock".$k."/Active";
      my $AStr_Number = "ctlmgr_ctl r telcfg settings/AlarmClock".$k."/Number";
      my $AStr_Weekdays = "ctlmgr_ctl r telcfg settings/AlarmClock".$k."/Weekdays";
      $FritzAlarmClockTime[$k] = `$AStr_Time`;
      $FritzAlarmClockActive[$k] = `$AStr_Active`;
      $FritzAlarmClockNumber[$k] = `$AStr_Number`;
      $FritzAlarmClockWeekdays[$k] = `$AStr_Weekdays`;
      $FritzAlarmClockActive[$k] =~ s/\s*$//g;
   
      if ($FritzAlarmClockNumber[$k] == "1") {$FritzTelName[$k] = "FritzFon"};
      if ($FritzAlarmClockNumber[$k] == "2") {$FritzTelName[$k] = "Siemens"};
      if ($FritzAlarmClockNumber[$k] == "9") {$FritzTelName[$k] = "alle Telefone"};
      if ($FritzAlarmClockNumber[$k] == "50") {$FritzTelName[$k] = "ISDN Telefone"};
      if ($FritzAlarmClockNumber[$k] == "60") {$FritzTelName[$k] = "FritzFon"};
      if ($FritzAlarmClockNumber[$k] == "61") {$FritzTelName[$k] = "Siemens"};
      if ($FritzAlarmClockNumber[$k] == "62") {$FritzTelName[$k] = "BMC"};
      $Weekdays[$k] = "";
      my $i;
      foreach $i (reverse 0..6) {
        if ($FritzAlarmClockWeekdays[$k] - 2**$i >= 0) {
          if ($i == 6) {$Weekdays[$k] = "SO ".$Weekdays[$k]};
          if ($i == 5) {$Weekdays[$k] = "SA ".$Weekdays[$k]};
          if ($i == 4) {$Weekdays[$k] = "FR ".$Weekdays[$k]};
          if ($i == 3) {$Weekdays[$k] = "DO ".$Weekdays[$k]};
          if ($i == 2) {$Weekdays[$k] = "MI ".$Weekdays[$k]};
          if ($i == 1) {$Weekdays[$k] = "DI ".$Weekdays[$k]};
          if ($i == 0) {$Weekdays[$k] = "MO ".$Weekdays[$k]};
          $FritzAlarmClockWeekdays[$k] = $FritzAlarmClockWeekdays[$k] - 2**$i;
        } ;
      };
    };
   
    my $TelNewMessages;
    my $n;
#      Log 1, "DEBUG ShowFritzBoxValues: Vor myDatum";
#    my $Datum = `date -d +"%d.%m.%y 0:00"`;
#      Log 1, "DEBUG ShowFritzBoxValues: Nach myDatum 1" . $Datum;
    my $one_day = 60*60*24 ;
    my $today = strftime "%d.%m.%y", localtime(time);
    $today = $today." 0:00";
    my $tomorrow = strftime "%d.%m.%y", localtime(time+$one_day);
    $tomorrow = $tomorrow." 0:00";
    my $yesterday = strftime "%d.%m.%y", localtime(time-$one_day);
    $yesterday = $yesterday." 0:00";
    my $today2 = strftime "%d.%m.%y %H:%M", localtime(time);
   
    my $FritzLANActiveDevices = 'Nichts';
   
    foreach $n (0..8) {
      my $JStr_LANDeviceName = "ctlmgr_ctl r landevice settings/landevice".$n."/name";
      my $JStr_LANDeviceName_Erg = `$JStr_LANDeviceName`;
      my $JStr_LANDeviceActive = "ctlmgr_ctl r landevice settings/landevice".$n."/active";
      my $JStr_LANDeviceActive_Erg = `$JStr_LANDeviceActive`;
      my $JStr_LANDeviceOnline = "ctlmgr_ctl r landevice settings/landevice".$n."/online";
      my $JStr_LANDeviceOnline_Erg = `$JStr_LANDeviceOnline`;
      if (trim($JStr_LANDeviceOnline_Erg) eq "1") {
        $FritzLANActiveDevices = $FritzLANActiveDevices.$JStr_LANDeviceName_Erg." (".$n.") ";
        $FritzLANActiveDevices = $FritzLANActiveDevices.$JStr_LANDeviceName_Erg." (".$n.") ";
      }
    };
    if (trim($FritzLANActiveDevices) eq "") { $FritzLANActiveDevices = "0" }
   
    my %FritzValues =
    (
    "FritzCPUTemperature" => int(`ctlmgr_ctl r power status/act_temperature`).'°',
    "FritzDslConnectionStatus" => `ctlmgr_ctl r dslstatistic status/ifacestat0/connection_status`,
    "FritzDslIP-Adress" => `ctlmgr_ctl r dslstatistic status/ifacestat0/ipaddr`,
    "FritzWLANActiveStations" => `ctlmgr_ctl r wlan settings/active_stations`,
    "TelNewMessagesAB" => `ctlmgr_ctl r tam settings/NumNewMessages`,
    #"TelNewMessages" => $TelNewMessages,
    "TelAlarmClock0" => substr($FritzAlarmClockTime[0],0,2).":".substr($FritzAlarmClockTime[0],2,2).' Uhr, aktiv: '. $FritzAlarmClockActive[0] .', Telefon: '.$FritzTelName[0].', Wochentage: '. $Weekdays[0],
    "TelAlarmClock1" => substr($FritzAlarmClockTime[1],0,2).":".substr($FritzAlarmClockTime[1],2,2).' Uhr, aktiv: '. $FritzAlarmClockActive[1] .', Telefon: '.$FritzTelName[1].', Wochentage: '. $Weekdays[1],
    "TelAlarmClock2" => substr($FritzAlarmClockTime[2],0,2).":".substr($FritzAlarmClockTime[2],2,2).' Uhr, aktiv: '. $FritzAlarmClockActive[2] .', Telefon: '.$FritzTelName[2].', Wochentage: '. $Weekdays[2],
    "FritzLANActiveDevices" => $FritzLANActiveDevices,
    "FritzCapi" => `ctlmgr_ctl r capiotcp settings/enabled`
    );
   
    my $tag;
    my $value;
    my $tr_class = "odd";
   
    my $htmlcode = "";
    $htmlcode .= "<table>\n";
    $htmlcode .= "<tr><td><div class=\"devType\">Parameter</div></td></tr>\n";
    $htmlcode .= "<tr><td>\n";
    $htmlcode .= "<table class=\"block wide\" id=\"Parameter\">\n";
   
    foreach $tag (sort keys %FritzValues)
    {
     $htmlcode .= "<tr class=\"$tr_class\"><td>\n<div class=\"col1\">$tag: </div></td>\n<td><div class=\"col2\">$FritzValues{$tag}</div></td></tr>\n";
     if ($tr_class eq "odd") {$tr_class = "even"} else {$tr_class = "odd"};
    }
   
    $htmlcode .= "<tr class=\"$tr_class\"><td><div class=\"col1\">Datum Uhrzeit: </div></td>\n<td><div class=\"col2\">$today2</div></td></tr>\n";
    $htmlcode .= "</table>\n";
    $htmlcode .= "</td></tr>\n";
    $htmlcode .= "</table>\n";
    return $htmlcode;
  }

Vielleicht hilft Dir ein Vergleich mit Deinem Code.
LaLeLu

Fhem Release: 5.6 auf RaspberryPI B (wheezy)
1xFB7390, 1xCUL, 1xHM-CFG-LAN, 4xFHT, 25xFS20 (inkl. PIRA), 18xCUL_HM, 5xCUL_WS, 2xSONOS-Player, calendar, floorplan

SharcWare

Ich habe mir mal Deinen Code genauer angesehen und bemerkt, dass er doch unterschiedlich zu meinem ist (Anhang in meinem ersten Beitrag), die Sache mit dem Datum war ja relativ einfach zu klären, aber die anderen Fehler hast Du ja offensichtlich nicht gehabt. Bei Deiner Version fehlt ein Teil (Zeile 205 bis 223), den ich übrigens in meiner Version auch nicht brauche, deshalb habe ich meine an Deine angepasst und siehe da in erster Näherung hatte ich nur noch eine Ausschrift im Logfile.

"Use of uninitialized value $FritzLANActiveDevices in concatenation (.) or string at ./FHEM/99_Utils.pm line 235."

Nach ein wenig Suchen ist mir aufgefallen, dass die Zeile: "my $FritzLANActiveDevices = 'Nichts';" bei mir mit "my $FritzLANActiveDevices;" definiert ist. Dann steht da zwar später immer vor den ActiveDevices "Nichts" vor aber, das stört mich nicht. Offensichtlich gibt die Funktion "trim" bei völlig lehren Strings im Logfile die Ausschrift wie oben aus. Warum hab ich noch nicht rausgefunden, da werde ich mich mit Pearl nochmal tiefer beschäftigen. Ich habe das Wort 'Nichts' durch 'No:' ersetzt, so dass die spätere Ansicht nicht ganz so verwirrend ist. Meine jetzige 99_Utils.pm hab ich mal im Anhang platziert.

Jens

SharcWare

Nach langem Suchen habe ich eine relativ einfache Lösung gefunden, die auch irgendwie mit in dem Codeschnipsel (FHEM Wiki - FritzBox Parameter in fhem anzeigen)verankert werden kann. Ich weiß noch nicht wie ich das im Wiki veranlassen könnte aber mal sehen.
Das Problem ist offensichtlich, dass die Funktion "trim" keine leeren Strings prüfen kann und deswegen im Log die Ausschriften entstehen. (Definition --> my $TelNewMessages;)
-- z,B.
if (trim($TelNewMessages) eq "") {$TelNewMessages = "0"}
oder
if (trim($FritzLANActiveDevices) eq "") { $FritzLANActiveDevices = "0" }
--
Deshalb definiere ich die Strings default mit einem Leerzeichen. Danach kommen keine Ausschriften und "trim" hat was zu tun.
Nachfolgende Zeilen müssen so ersetzt werden:
--
my $TelNewMessages = ' ';
my $FritzLANActiveDevices = ' ';
--

Ich hoffe das hilft.
Jens
--

PeMue

Hallo zusammen,

inspiriert durch Euren Thread habe ich meine 99_Utils.pm ebenfalls um die Funktion ShowFritzBoxValues() erweitert. Allerdings habe ich gesehen, dass meine FritzBox 7170 keine Temperatur anzeigt (siehe auch http://www.wehavemorefun.de/fritzbox/File:System-Statistik-Bild2.png). Daher habe ich die Zeile
# "FritzCPUTemperature" => int(`ctlmgr_ctl r power status/act_temperature`).'°', einfach auskommentiert.

Gruß PeMue
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

PeMue

Hallo zusammen,

wenn ich mir die Funktion my $TelNewMessages = ' '; anschaue, müsste diese doch die letzten 12 Anrufe aus dem Journal der FritzBox rausholen und darstellen. Ich bekomme auf der FritzBox 7170 per telnet mit ctlmgr_ctl r telcfg settings/Journal1/Number auch Werte zurück, allerdings zeigt das Perl Skript lapidar 0 an.
Hat jemand diese Funktion auf der Fritzbox 7170 schon mal getestet und kann bestätigen, dass diese funktioniert? Die andere Alternative ist, dass ich endlich Perl lerne und verstehe, was da passiert ...

Danke + Gruß

PeMue

my $TelNewMessages = ' ';
my $n;
my $Datum = `date +"%d.%m.%y 0:00"`;
my $Datum = `date -d +"%d.%m.%y 0:00"`;
my $one_day = 60*60*24 ;
my $today = strftime "%d.%m.%y", localtime(time);
$today = $today." 0:00";
my $tomorrow = strftime "%d.%m.%y", localtime(time+$one_day);
$tomorrow = $tomorrow." 0:00";
my $yesterday = strftime "%d.%m.%y", localtime(time-$one_day);
$yesterday = $yesterday." 0:00";

foreach $n (0..11) {
  my $JStr_Duration = "ctlmgr_ctl r telcfg settings/Journal".$n."/Duration";
  my $JStr_Duration_Erg = `$JStr_Duration`;
  my $JStr_Number = "ctlmgr_ctl r telcfg settings/Journal".$n."/Number";
  my $JStr_Number_Erg = `$JStr_Number`;
  my $JStr_Date = "ctlmgr_ctl r telcfg settings/Journal".$n."/Date";
  my $JStr_Date_Erg = `$JStr_Date`;
  my $JStr_Route = "ctlmgr_ctl r telcfg settings/Journal".$n."/Route";
  my $JStr_Route_Erg = `$JStr_Route`;
  my $JStr_Name = "ctlmgr_ctl r telcfg settings/Journal".$n."/Name";
  my $JStr_Name_Erg = `$JStr_Name`;
  if (trim($JStr_Duration_Erg) eq "0:00" && $JStr_Date_Erg ge $today && trim($JStr_Route_Erg) eq "3") {
    $TelNewMessages = $TelNewMessages.$JStr_Date_Erg." ".$JStr_Number_Erg." ";
    if (trim($JStr_Name_Erg) eq "") {$JStr_Name_Erg = "unbekannt"};
    $TelNewMessages = $TelNewMessages."(".trim($JStr_Name_Erg).")"." / ";
  }
};
if (trim($TelNewMessages) eq "") {$TelNewMessages = "0"}
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

PeMue

... gelöst:
Mit der Abfrage
if (trim($JStr_Duration_Erg) eq "0:00" && $JStr_Date_Erg ge $today && trim($JStr_Route_Erg) eq "3")
wird geprüft ob (gleichzeitig)
a. die Dauer des Anrufes 0:00 Stunden war und
c. der Status 3 ist (Anruf in Abwesenheit), das ist der Fall, wenn der Anrufbeantworter nicht angesprungen ist und
b. der Anruf heute kam (im Übrigen hätte ich da noch ein paar Klammern zur Sicherheit spendiert).
Wenn einer also nicht die Geduld aufgebracht hat, bis zum Anrufbeantworter zu warten und der Anruf heute (oder in der Zukunft ;-) kam), dann ist das der Fall.
a. und c. sind gleichwertig, also könnte eine der beiden Abfragen entfallen.

Ich bin das Ganze anders angegangen:
- entweder Anruf mit 0:01 Stunden (wenn der Anrufbeantworter dran ist, aber nichts draufgesprochen wurde) oder
- der Status 3 war (Anruf in Abwesenheit).
Wenn der Anrufbeantworter besprochen wurde, wird dies ja in TelNewMessagesAB angezeigt (halt unschön nur mit der Anzahl, aber das heißt ja nur, dass man das Telefon in die Hand nehmen muss und **600 wählen muss).

Gleichzeitig habe ich viele Dinge über Perl gelernt (und eine Routine zur Konvertierung von Umlauten nach html geschrieben).

Im Anhang mein Code, auch hier die Bitte, falls für würdig befunden diesen gelegentlich ins SVN einzustellen.

Gruß PeMue
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

PeMue

... von wegen bugfrei :-)

Auf der FritzBox 7170 gibt bei

ctlmgr_ctl r telcfg settings/Journal0/Type

der Parameter Type (so meine ich) den Typ des Anrufes an (1 ankommend, 2 in Abwesenheut, 3 raus). Der Parameter Route gibt nichts aus. Daher auch die Abfrage angepasst.

Ich bitte jemand mit einer FritzBox 7270 oder höher den Code mal zu testen und zu berichten.

Danke + Gruß

PeMue
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

PeMue

... update mit uptime und dem für die Fritz Box 7170 wichtigen Werten für RAM und swap (aber ich guttenberge zumindest mit Quellenangabe ;-).

Gruß PeMue
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

PeMue

... auch hier wieder ein update (siehe Anhang, in 99_Utils kopieren).
Mit diesem Code kann RAM bzw. swap bei der Fritz Box 7170 (sollte auch auf anderen Boxen funktionieren) geloggt werden:
# show parameters of FritzBox (added in 99_Utils.pm)
define FritzBoxValues_wl weblink htmlCode {ShowFritzBoxValues()}
attr FritzBoxValues_wl room Status

define FritzBoxRAM dummy
attr FritzBoxRAM room Status
define FritzBoxRAM_log FileLog ./log/fb_ram-%Y-%m.log FritzBoxRAM
attr FritzBoxRAM_log room Status
define FritzBoxRAM_at at +*00:02 { fhem("trigger FritzBoxRAM ".FritzRAMswap("R")) }
attr FritzBoxRAM_at room Status

define FritzBoxswap dummy
attr FritzBoxswap room Status
define FritzBoxswap_log FileLog ./log/fb_swap-%Y-%m.log FritzBoxswap
attr FritzBoxswap_log room Status
define FritzBoxswap_at at +*00:02 { fhem("trigger FritzBoxswap ".FritzRAMswap("S")) }
attr FritzBoxswap_at room Status

Und siehe da:
2013-05-30_18:32:18 FritzBoxRAM R: 93.96 F: 1.83 U: 28.49 T: 30.32
2013-05-30_18:32:18 FritzBoxswap R: 21.21 F: 25.81 U: 6.95 T: 32.76 MB
ohne swap funktioniert es nicht ...

Gruß PeMue
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser