Seit Update: FritzBox Presence Erkennung meldet Fehler

Begonnen von Christian72D, 20 September 2018, 08:54:00

Vorheriges Thema - Nächstes Thema

Christian72D

Seit dem letzten Update habe ich massig Einträge wie diesen im Log:

2018.09.20 08:48:19 1: ERROR evaluating {checkAllFritzMACpresent("90:A5:AD:xx:xx:xx")}: Undefined subroutine &main::checkAllFritzMACpresent called at (eval 170286) line 1.

2018.09.20 08:48:19 2: PRESENCE (Chris_FB) - error while processing check: unexpected function output (expected 0 or 1): Undefined subroutine &main::checkAllFritzMACpresent called at (eval 170286) line 1.


Genutzt wird dafür diese Funktion, die so im Wiki zu finden ist und seit über einem Jahr bei mir läuft:

sub checkAllFritzMACpresent($) {
  # Benötigt: nur die zu suchende MAC ($MAC),
  # Es werden alle Instanzen vom Type FRITZBOX abgefragt
  #
  # Rückgabe: 1 = Gerät gefunden
  #           0 = Gerät nicht gefunden
  my ($MAC) = @_;
  # Wird in keiner Instanz die MAC Adresse gefunden bleibt der Status 0
  my $Status = 0;
  $MAC =~ tr/:/_/;
  $MAC = "mac_".uc($MAC);
  my @FBS = devspec2array("TYPE=FRITZBOX");
    foreach( @FBS ) {
my $StatusFritz = ReadingsVal($_, $MAC, "weg");
if ($StatusFritz eq "weg") {
} elsif ($StatusFritz eq "inactive") {
} else {
  # Reading existiert, Rückgabewert ist nicht "inactive", also ist das Gerät am Netzwerk angemeldet.
  $Status = 1;
}
    }
  return $Status
}


CoolTux

Wie heißt die pm in der die Funktion drin steht? Und zeige bitte einmal den Inhalt der gesamten pm
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Christian72D

Meinst du das?

Internals:
   DEF        function {checkAllFritzMACpresent("90:A5:AD:xx:xx:xx")} 60 60
   INTERVAL_NORMAL 60
   INTERVAL_PRESENT 60
   MODE       function
   NAME       Chris_FB
   NOTIFYDEV  global
   NR         275
   NTFY_ORDER 50-Chris_FB
   STATE      error
   TYPE       PRESENCE
   Helper:
     DBLOG:
       state:
         logdb:
           TIME       1537440034.57077
           VALUE      error
   READINGS:
     2018-09-19 09:21:57   model           function
     2018-09-15 09:57:17   presence        present
     2018-09-20 12:40:34   state           error
   helper:
     ABSENT_COUNT 0
     PRESENT_COUNT 0
     call       {checkAllFritzMACpresent("90:A5:AD:xx:xx:xx")}
Attributes:
   room       Residents

CoolTux

Nein. Ich meine die Datei in der Du die Funktion reingeschrieben hast.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Christian72D

Ah, sorry.

Das ist die 99_myUtils.pm

Und hier der gesamte Inhalt:


package main;

use strict;
use warnings;
use POSIX;

sub myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.

use Net::SNMP;

sub snmpCheck($$$)
{
my ($host, $community, $oid)= @_;

my ($snmp, $error) = Net::SNMP->session(
-hostname => $host,
-community => $community,
-port => 161,
-version => 2
);

if(!defined($snmp)) {
return "Can't connect to host $host.";
}

my $response = $snmp->get_request($oid);

$snmp->close;

return $response->{$oid};
}


sub Untoggle($) {
  my ($obj) = @_;

  if( Value($obj) eq "toggle" ){
    if( OldValue($obj) eq "off" ) {
      fhem( "setstate $obj on" );
    }
    else {
      fhem( "setstate $obj off" );
    }
  }
  else {
    fhem( "setstate $obj ".Value($obj) );
  }
}

sub Anwesenheit($) {
  my ($obj) = @_;

  if( Value($obj) eq "home" ){
      fhem( "setstate $obj on" );
    }
    else {
      fhem( "setstate $obj off" );
    }
}


sub Brand() {
      fhem( "setstate W.Rolladen on" );
      fhem( "setstate K.Rolladen on" );
  fhem( "setstate Licht on" );
  fhem( "setstate Aussenlicht on" );
  fhem( "setstate Aussenstrom off" );
      fhem( "sleep 30;; setstate Strom off" );  
}


sub statusFensterOffen() {
my @monitored=devspec2array("(*Fenster.*):FILTER=STATE!=closed");
my $cnt_devs=@monitored;
my $i = 0;
my $msgtext = "";
foreach(@monitored) {
$msgtext .= AttrVal($_,"alias",$_);
if ($i < $cnt_devs - 2) {
  $msgtext .= ", ";
}
if ($i == $cnt_devs - 2) {
  $msgtext .= " und ";
}
$i++;
}

return $msgtext if ($cnt_devs > 0);
}

##########################################################
# SecondsToTime
# converts seconds to time
# https://forum.fhem.de/index.php?topic=66126
##########################################################

sub myUtils_SecondsToTime($) {
my ($sec) = @_;
my $s = $sec % 60;
$sec = ($sec - $s) / 60;
my $m = $sec % 60;
$sec = ($sec - $m) / 60;
my $h = $sec % 24;
$sec = ($sec - $h) / 24;
my $d = $sec;
my $ret = sprintf("%02d Tage, %02d Stunden",$d,$h);
return $ret;
}

##########################################################
# SecondsToHours
# converts seconds to time
# attr BH.Heizung stateFormat {myUtils_SecondsToTime(ReadingsVal($name,'pulseTimeOverall',0))}
##########################################################

sub myUtils_SecondsToHours($) {
my ($sec) = @_;
my $h = $sec / 3600;
my $ret = sprintf("%d Stunden",$h);
return $ret;
}

sub Kalenderstart ($)
{
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids = split(/;/,$Ereignisteil1);
foreach my $uid (@uids) {
my $Kalendertext = fhem("get Kalender_Christian summary uid=$uid 1");
if ($Kalendertext =~ /Urlaub/) {
fhem("set Urlaub_dummy ja");
}
if ($Kalendertext =~ /Frei/) {
fhem("set Frei_dummy ja");
}
if ($Kalendertext =~ /Besuch/) {
fhem("set Gast_dummy ja");
}
}
}
sub Kalenderende ($) {
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids = split(/;/,$Ereignisteil1);
foreach my $uid (@uids) {
my $Kalendertext = fhem("get Kalender_Christian summary uid=$uid 1");
if ($Kalendertext =~ /Urlaub/) {
fhem("set Urlaub_dummy nein");
}
if ($Kalendertext =~ /Frei/) {
fhem("set Frei_dummy nein");
}
if ($Kalendertext =~ /Besuch/) {
fhem("set Gast_dummy nein");
}
}
}

sub checkAllFritzMACpresent($) {
  # Benötigt: nur die zu suchende MAC ($MAC),
  # Es werden alle Instanzen vom Type FRITZBOX abgefragt
  #
  # Rückgabe: 1 = Gerät gefunden
  #           0 = Gerät nicht gefunden
  my ($MAC) = @_;
  # Wird in keiner Instanz die MAC Adresse gefunden bleibt der Status 0
  my $Status = 0;
  $MAC =~ tr/:/_/;
  $MAC = "mac_".uc($MAC);
  my @FBS = devspec2array("TYPE=FRITZBOX");
    foreach( @FBS ) {
my $StatusFritz = ReadingsVal($_, $MAC, "weg");
if ($StatusFritz eq "weg") {
} elsif ($StatusFritz eq "inactive") {
} else {
  # Reading existiert, Rückgabewert ist nicht "inactive", also ist das Gerät am Netzwerk angemeldet.
  $Status = 1;
}
    }
  return $Status
}

sub eq3StateFormat() {
  my $name = "eq3";

  my $ret ="";
  my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");
  $ret .= '<div style="text-align:left">';   
  $ret .= 'last <a title="eq3-downloads" href="http://www.eq-3.de/downloads.html">homematic</a>-fw-check => '.$lastCheck;   
  $ret .= '<br><br>';   
  $ret .= '<pre>';   
  $ret .= "| device                  | model                   | old_fw | new_fw | release    |\n"; 
  $ret .= "------------------------------------------------------------------------------------\n"; 
  my $check = ReadingsVal($name,"newFwForDevices","???");   
  if($check eq "no fw-updates needed!") {       
    $ret .= '| '.$check.'                                                            |';     
  } else {         
    my @devices = split(',',$check);         
    foreach my $devStr (@devices) {
      my ($dev,$md,$ofw,$idx,$nfw,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\sfw_(\d+\.\d+)\s=>\sfw(\d\d)_([\d\.]+)\s\|\s([^\)]+)\)$/;         
      my $link = ReadingsVal($name,"fw_link-".$idx,"???");           
      $ret .= '| ';         
      $ret .= '<a href="/fhem?detail='.$dev.'">';           
      $ret .= sprintf("%-23s",$dev);             
      $ret .= '</a>';           
      $ret .= " | ";             
      $ret .= '<b'.(($md eq "?")?' title="missing attribute model => set device in teach mode to receive missing data" style="color:yellow"':' style="color:lightgray"').'>';           
      $ret .= sprintf("%-23s",$md);         
      $ret .= '</b>';           
      $ret .= " | ";             
      $ret .= '<b'.(($ofw eq "0.0")?' title="missing attribute firmware => set device in teach mode to receive missing data" style="color:yellow"':' style="color:lightgray"').'>';             
      $ret .= sprintf("%6s",$ofw);           
      $ret .= '</b>';           
      $ret .= " | ";             
      $ret .= '<a title="eq3-firmware.tgz" href="'.$link.'">';           
      $ret .= '<b style="color:red">';           
      $ret .= sprintf("%6s",$nfw);           
      $ret .= '</b>';           
      $ret .= '</a>';           
      $ret .= " | ";             
      $ret .= sprintf("%-10s",$date);           
      $ret .= " |\n";       
    }   
  } 
  $ret .= '</pre>'; 
  $ret .= '</div>'; 
  return $ret;
}


1;

CoolTux

Funktionieren die anderen Routinen aus dieser Datei? Sowas wie StatusFensterOffen und so?
Kannst Du die Funktion mal von Hand ausführen
Also oben in der FHEMWEB Kommandozeile eingeben

{checkAllFritzMACpresent("90:A5:AD:xx:xx:xx")}

Bitte die Mac Adresse fertig ergänzen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Christian72D

Auch da kommt ein "not found".

Ebenso wie bei einer anderen Funktion eq3:

Internals:
   BUSY       0
   DEF        http://www.eq-3.de/service/downloads.html 86400
   Interval   86400
   LASTSEND   1537591170.41869
   MainURL    http://www.eq-3.de/service/downloads.html
   MaxAgeEnabled 1
   ModuleVersion 3.5.1 - 5.7.2018
   NAME       eq3
   NR         351
   STATE      Error evaluating eq3 stateFormat: Bareword "eq3StateFormat" not allowed while "strict subs" in use at (eval 427) line 1.

   TRIGGERTIME 1537677570.41759
   TRIGGERTIME_FMT 2018-09-23 06:39:30
   TYPE       HTTPMOD
   addr       http://www.eq-3.de:80
   auth       0
   data       suchtext=&suche_in=2&downloadart=11
   displayurl http://www.eq-3.de/service/downloads.html
   header     
   host       www.eq-3.de
   httpversion 1.0
   ignoreredirects 0
   loglevel   4
   path       /service/downloads.html
   protocol   http
   redirects  0
   timeout    2
   url        http://www.eq-3.de/service/downloads.html
   value      0
   QUEUE:
   READINGS:
     2018-09-22 06:39:33   LAST_ERROR      connect to http://www.eq-3.de:80 timed out
     2018-09-22 06:39:33   LAST_REQUEST    update
     2018-09-21 09:22:08   MATCHED_READINGS fw_link-01 fw_link-02 fw_link-03 fw_link-04 fw_link-05 fw_link-06 fw_link-07 fw_link-08 fw_link-09 fw_link-10 fw_link-11 fw_link-12 fw_link-13 fw_link-14 fw_link-15 fw_link-16 fw_link-17 fw_link-18 fw_link-19 fw_link-20
     2018-09-21 09:22:08   UNMATCHED_READINGS
     2018-09-21 09:22:08   newFwForDevices no fw-updates needed!
   REQUEST:
     data       suchtext=&suche_in=2&downloadart=11
     header     
     ignoreredirects 0
     retryCount 0
     type       update
     url        http://www.eq-3.de/service/downloads.html
     value      0
   defptr:
     readingBase:
     readingNum:
     readingOutdated:
     readingSubNum:
     requestReadings:
       update:
   sslargs:
Attributes:
   enableControlSet 1
   event-on-change-reading .*
   event-on-update-reading LAST_ERROR,MATCHED_READINGS
   reading01AutoNumLen 2
   reading01Format http://www.eq-3.de/%s
   reading01Name fw_link
   reading01RegOpt g
   reading01Regex <a.href="(Downloads\/Software\/Firmware\/[^"]+)
   readingMaxAge 10
   readingMaxAgeReplacementMode delete
   requestData.* suchtext=&suche_in=2&downloadart=11
   room       Info
   showError  1
   showMatched 1
   stateFormat {eq3StateFormat}
   userReadings newFwForDevices:MATCHED_READINGS:.* {
  my $ret = "";
  my @data;
  my @eq3FwList = map{@data = ReadingsVal("eq3","fw_link-".$_,"?") =~ m/Firmware\/(.*?)_update_V([\d_]+)_(\d\d)(\d\d)(\d\d)/;
            $data[0] =~ s/_/-/g;
            sprintf("%s:%s:%s.%s.%s:%s",$data[0],$data[1],$data[4],$data[3],"20".$data[2],$_);
            } ReadingsVal("eq3","MATCHED_READINGS","?") =~ m/fw_link-(\d\d)/g;
           
  foreach my $dev (devspec2array("TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=(virtual|)")) {
    my $md = AttrVal($dev,"model","?");
    my $v = AttrVal($dev,"firmware","0.0");
    my ($h,$l) = split('\.',$v);
    foreach my $newFw (grep m/^${md}:/i,@eq3FwList) {
      my ($nh,$nl,$no,$date,$idx) = $newFw =~ m/^[^:]+:(\d+)_(\d+)_?(\d*):([^:]+):(\d\d)$/;
      if(($nh > $h) || (($nh == $h) && ($nl > $l))) {
        $ret .= "," if($ret ne "");
        $ret .= $dev." (".$md." | fw_".$v." => fw".$idx."_".$nh.".".$nl.($no?sprintf(".%d",$no):"")." | ".$date.")";
      }
    }
  }
  return ($ret eq "")?"no fw-updates needed!":$ret;
}
   userattr   enableControlSet event-on-change-reading event-on-update-reading reading01AutoNumLen reading01Format reading01Name reading01RegOpt reading01RegOpt:s,i,g reading01Regex readingMaxAge readingMaxAgeReplacementMode readingMaxAgeReplacementMode:text,expression,delete readingMaxAgeReplacementMode:text,reading,internal,expression,delete requestData.* showError showMatched stateFormat userReadings webCmd
   webCmd     reread


Also laut Timestamp auf meinem NUC ist die Datei das letzte mal am 1.5. verändert worden, also an der Datei an sich kann es eher nicht liegen, die Rechte stimmen auch.

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Christian72D

Hatte ich oben schon geschrieben: Rechte sind OK.

christian@fhem:/opt/fhem/FHEM$ ls -l 99*
-rw-rw-rw- 1 fhem dialout  6689 Mai  1 11:59 99_myUtils.pm
-rw-rw-rw- 1 fhem dialout 26187 Apr 19 15:58 99_SUNRISE_EL.pm
-rw-rw-rw- 1 fhem dialout  9321 Mär 22  2018 99_Utils.pm

CoolTux

Dann schau bitte einmal ins FHEM Log Files. Die 99er werden immer automatisch geladen, es muss einen Eintrag geben.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Christian72D

Interessante Sache, auf dem Ubuntu Server war ein Modul fehlerhaft...

2018.09.15 09:58:39 1: reload: Error:Modul 99_myUtils deactivated:
Can't locate Net/SNMP.pm in @INC (you may need to install the Net::SNMP module) (@INC contains: . /etc/perl /usr/local/lib/i386-linux-gnu/perl/5.26.1 /usr/local/share/perl/5.26.1 /usr/lib/i386-linux-gnu/perl5/5.26 /usr/share/perl5 /usr/lib/i386-linux-gnu/perl/5.26 /usr/share/perl/5.26 /usr/local/lib/site_perl /usr/lib/i386-linux-gnu/perl-base ./FHEM) at ./FHEM/99_myUtils.pm line 20.
BEGIN failed--compilation aborted at ./FHEM/99_myUtils.pm line 20.


Modul neu eingepflegt, es läuft.

Danke, auf SOWAS wäre ich evtl. ewig nicht gekommen...

misux

HI!

Ich beabsichtige mein System auch upzudaten aber nachdem ich das so lese bin ich mir nicht Sicher ob ich das machen soll. Ist das häufiger der Fall das so ein Fehler Passiert? kann nicht auf meine Presence Erkennung verzichten und auf anhieb wüsste ich auch nicht wie ich so ein Modul neu einpflegen soll...