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
}
Wie heißt die pm in der die Funktion drin steht? Und zeige bitte einmal den Inhalt der gesamten pm
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
Nein. Ich meine die Datei in der Du die Funktion reingeschrieben hast.
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;
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.
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.
Check mal die Dateirechte von der 99_myUtils.pm
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
Dann schau bitte einmal ins FHEM Log Files. Die 99er werden immer automatisch geladen, es muss einen Eintrag geben.
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...
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...