diff --git a/fhem/CHANGED b/fhem/CHANGED index ebe55ec76..e9b7f7d01 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -552,7 +552,8 @@ - bugfix: Path in the examples fixed (got corrupted) - bugfix: PachLog fixes from Axel - bugfix: HOWTO/Examples revisited for correctness - - bugfix: DEFINED & INITIALIZED triggers. + - bugfix: INITIALIZED, DEFINED, RENAMED, DELETED triggers + - feature: image weblinks from Stefan - feature: 20_OWFS.pm support for passive Devices e.g. DS9097 (see commandref.html) - bugfix: 20_OWFS.pm crash fhem with PGM2/3, xmllist (M.Fischer) - bugfix: 21_OWTEMP.pm Defining a device now fail when no OWFS device was defined (M.Fischer) @@ -562,4 +563,3 @@ - bugfix: 21_OWTEMP.pm missing space within state logging (M.Fischer) - bugfix: 21_OWTEMP.pm interval fixed (M.Fischer) - bugfix: 21_OWTEMP.pm complete rewrite with errorcontrol and demo mode (M.Fischer) - diff --git a/fhem/FHEM/00_CUL.pm b/fhem/FHEM/00_CUL.pm index f09c2f093..65477a895 100755 --- a/fhem/FHEM/00_CUL.pm +++ b/fhem/FHEM/00_CUL.pm @@ -808,7 +808,7 @@ CUL_Ready($) if($hash->{STATE} eq "disconnected"); # This is relevant for windows/USB only - my $po=$hash->{USBDev}; + my $po = $hash->{USBDev}; my ($BlockingFlags, $InBytes, $OutBytes, $ErrorFlags) = $po->status; return ($InBytes>0); } diff --git a/fhem/FHEM/09_BS.pm b/fhem/FHEM/09_BS.pm index ccf9ef441..b7b8e60d6 100644 --- a/fhem/FHEM/09_BS.pm +++ b/fhem/FHEM/09_BS.pm @@ -83,8 +83,9 @@ BS_Parse($$) my $def= $defptr{$dev}; if(!defined($def)) { - Log 3, sprintf("BS Unknown device %s, please define it", $sensor); - return "UNDEFINED BS"; + $sensor =~ s/^0//; + Log 3, "BS Unknown device $sensor, please define it"; + return "UNDEFINED BS_$sensor BS $sensor"; } my $name= $def->{NAME}; diff --git a/fhem/FHEM/09_CUL_FHTTK.pm b/fhem/FHEM/09_CUL_FHTTK.pm index b98c621cd..f5ccad6c7 100644 --- a/fhem/FHEM/09_CUL_FHTTK.pm +++ b/fhem/FHEM/09_CUL_FHTTK.pm @@ -129,8 +129,8 @@ CUL_FHTTK_Define($$) my $name = $a[0]; my $sensor = lc($a[2]); - if($sensor !~ /[0123456789abcdef]/) { - return "erroneous sensor specification $sensor, use one of 0..9..f"; + if($sensor !~ /^[0-9a-f]{6}$/) { + return "wrong sensor specification $sensor, need a 6 digit hex number"; } # $hash->{SENSOR}= "$sensor"; @@ -164,8 +164,8 @@ CUL_FHTTK_Parse($$) my $def = $defptr{$sensor}; my $self = $def->{NAME}; if(!defined($def)) { - Log 3, sprintf("FHTTK Unknown device %s, please define it", $sensor); - return "UNDEFINED FHTTK"; + Log 3, "FHTTK Unknown device $sensor, please define it"; + return "UNDEFINED CUL_FHTTK_$sensor CUL_FHTTK $sensor"; } # if it's not our device diff --git a/fhem/FHEM/09_USF1000.pm b/fhem/FHEM/09_USF1000.pm index 658ea1d7f..7f5c608d7 100644 --- a/fhem/FHEM/09_USF1000.pm +++ b/fhem/FHEM/09_USF1000.pm @@ -92,7 +92,7 @@ USF1000_Parse($$) if(!defined($defptr{$dev})) { Log 3, "USF1000 Unknown device, please define it"; - return "UNDEFINED USF1000"; + return "UNDEFINED USF1000 USF1000 cylv 1 1 0.5"; } my $def= $defptr{$dev}; diff --git a/fhem/FHEM/10_FS20.pm b/fhem/FHEM/10_FS20.pm index 0923b6352..1f17da09e 100755 --- a/fhem/FHEM/10_FS20.pm +++ b/fhem/FHEM/10_FS20.pm @@ -354,6 +354,8 @@ FS20_Parse($$) my @list; foreach my $n (keys %{ $def }) { my $lh = $def->{$n}; + $n = $lh->{NAME}; # It may be renamed + $lh->{CHANGED}[0] = $v; $lh->{STATE} = $v; $lh->{READINGS}{state}{TIME} = TimeNow(); @@ -386,7 +388,7 @@ FS20_Parse($$) my $btn_four = hex2four($btn); Log 3, "FS20 Unknown device $dev ($dev_four), " . "Button $btn ($btn_four) Code $cde ($v), please define it"; - return "UNDEFINED FS20: $dev/$btn/$cde"; + return "UNDEFINED FS20_$dev$btn FS20 $dev $btn"; } } diff --git a/fhem/FHEM/11_FHT.pm b/fhem/FHEM/11_FHT.pm index 4e6b6ee46..fd5390d18 100755 --- a/fhem/FHEM/11_FHT.pm +++ b/fhem/FHEM/11_FHT.pm @@ -156,7 +156,6 @@ FHT_Set($@) my $ret = ""; return "\"set $a[0]\" needs at least two parameters" if(@a < 2); - my $name = shift(@a); # Replace refreshvalues with report1 and report2, and time with hour/minute @@ -340,7 +339,7 @@ FHT_Parse($$) if(!defined($defptr{$dev})) { Log 3, "FHT Unknown device $dev, please define it"; - return "UNDEFINED FHT $dev"; + return "UNDEFINED FHT_$dev FHT $dev"; } my $def = $defptr{$dev}; @@ -415,14 +414,15 @@ FHT_Parse($$) $def->{READINGS}{$cmd}{TIME} = $tn; $def->{READINGS}{$cmd}{VAL} = $val; - if(defined($def->{READINGS}{"measured-low"}{VAL})) { + if(defined($def->{READINGS}{"measured-low"}) && + defined($def->{READINGS}{"measured-low"}{VAL})) { my $off = ($attr{$name} && $attr{$name}{tmpcorr}) ? $attr{$name}{tmpcorr} : 0; $val = $val*256 + $def->{READINGS}{"measured-low"}{VAL}; $val /= 10; $val = sprintf("%.1f (Celsius)", $val+$off); - $cmd = "measured-temp" + $cmd = "measured-temp"; } else { return ""; diff --git a/fhem/FHEM/12_HMS.pm b/fhem/FHEM/12_HMS.pm index d2afa224d..982e571cc 100755 --- a/fhem/FHEM/12_HMS.pm +++ b/fhem/FHEM/12_HMS.pm @@ -102,7 +102,8 @@ HMS_Parse($$) if(!defined($defptr{$dev})) { Log 3, "Unknown HMS device $dev/$odev, please define it"; $type = "HMS" if(!$type); - return "UNDEFINED $type $odev"; + $type =~ s/-//; # RM100-2, - is special in fhem names + return "UNDEFINED ${type}_$odev HMS $odev"; } my $def = $defptr{$dev}; diff --git a/fhem/FHEM/13_KS300.pm b/fhem/FHEM/13_KS300.pm index f000f35e4..13ef2ba4b 100755 --- a/fhem/FHEM/13_KS300.pm +++ b/fhem/FHEM/13_KS300.pm @@ -322,10 +322,10 @@ KS300_Parse($$) } else { Log 4, "KS300 detected: $msg"; + return "UNDEFINED KS300 KS300 1234"; } - return ""; } 1; diff --git a/fhem/FHEM/14_CUL_WS.pm b/fhem/FHEM/14_CUL_WS.pm index 2bb1e805e..0bda0666f 100755 --- a/fhem/FHEM/14_CUL_WS.pm +++ b/fhem/FHEM/14_CUL_WS.pm @@ -39,7 +39,6 @@ CUL_WS_Define($$) return "wrong syntax: define CUL_WS [corr1...corr4]" if(int(@a) < 3 || int(@a) > 7); - $a[2] = lc($a[2]); return "Define $a[0]: wrong CODE format: valid is 1-8" if($a[2] !~ m/^[1-8]$/); @@ -92,7 +91,7 @@ CUL_WS_Parse($$) $def = $defptr{$cde} if(!$def); if(!$def) { Log 1, "CUL_WS UNDEFINED $type sensor detected, code $cde"; - return "UNDEFINED CUL_WS: $cde"; + return "UNDEFINED CUL_WS_$cde CUL_WS $cde"; } my $tm=TimeNow(); diff --git a/fhem/FHEM/15_CUL_EM.pm b/fhem/FHEM/15_CUL_EM.pm index 6096e3040..db17983a1 100755 --- a/fhem/FHEM/15_CUL_EM.pm +++ b/fhem/FHEM/15_CUL_EM.pm @@ -32,7 +32,8 @@ CUL_EM_Define($$) my ($hash, $def) = @_; my @a = split("[ \t][ \t]*", $def); - return "wrong syntax: define CUL_EM [corr1 corr2 CostPerUnit BasicFeePerMonth]" + return "wrong syntax: define CUL_EM ". + "[corr1 corr2 CostPerUnit BasicFeePerMonth]" if(int(@a) < 3 || int(@a) > 7); return "Define $a[0]: wrong CODE format: valid is 1-12" if($a[2] !~ m/^\d$/ || $a[2] < 1 || $a[2] > 12); @@ -235,10 +236,10 @@ CUL_EM_Parse($$) } else { Log 1, "CUL_EM detected, Code $cde $val"; + return "UNDEFINED CUL_EM_$cde CUL_EM $cde"; } - return ""; } 1; diff --git a/fhem/FHEM/16_CUL_RFR.pm b/fhem/FHEM/16_CUL_RFR.pm index aecfe9325..02c544769 100755 --- a/fhem/FHEM/16_CUL_RFR.pm +++ b/fhem/FHEM/16_CUL_RFR.pm @@ -85,7 +85,7 @@ CUL_RFR_Parse($$) if(!$defptr{$cde}) { Log 1, "CUL_RFR detected, Id $id, Router $rid, MSG $smsg"; - return; + return "UNDEFINED CUL_RFR_$id CUL_RFR $id $rid"; } my $hash = $defptr{$cde}; my $name = $hash->{NAME}; diff --git a/fhem/FHEM/20_X10.pm b/fhem/FHEM/20_X10.pm index 985f74d26..7ef4903ed 100755 --- a/fhem/FHEM/20_X10.pm +++ b/fhem/FHEM/20_X10.pm @@ -315,7 +315,7 @@ X10_Parse($$) Log 3, "X10 No units with housecode $housecode, command $command, " . "please define one"; push(@list, - "UNDEFINED X10 device $housecode ?, command $command"); + "UNDEFINED X10_$housecode X10 lm15 $housecode ?"); return @list; } } @@ -328,7 +328,7 @@ X10_Parse($$) # but no unit was previously selected Log 3, "X10 No unit selected for housecode $housecode, command $command"; push(@list, - "UNDEFINED X10 device $housecode ?, command $command"); + "UNDEFINED X10_$housecode X10 lm15 $housecode ?"); return @list; } @@ -359,7 +359,7 @@ X10_Parse($$) Log 3, "X10 Unknown device $housecode $unitcode, command $command, " . "please define it"; push(@list, - "UNDEFINED X10 device $housecode $unitcode, command $command"); + "UNDEFINED X10_$housecode X10 lm15 $housecode $unitcode"); } } return @list; diff --git a/fhem/FHEM/50_WS300.pm b/fhem/FHEM/50_WS300.pm index 345675ad3..7c7caff80 100644 --- a/fhem/FHEM/50_WS300.pm +++ b/fhem/FHEM/50_WS300.pm @@ -255,7 +255,8 @@ WS300_Parse($$) Log $ll,"Sensor $s vorhanden"; if(!defined($defptr{$s})) { - Log(3,"WS300 $s: undefined"); + Log 3, "WS300 Unknown device $s, please define it"; + return "UNDEFINED WS300_$s WS300 $s"; } else { @@ -446,7 +447,8 @@ WS300_Parse($$) } if(!defined($defptr{9})) { - Log(3,"WS300 9: undefined"); + Log 3, "WS300 Unknown device 9, please define it"; + return "UNDEFINED WS300_9 WS300 9"; } else { diff --git a/fhem/FHEM/92_FileLog.pm b/fhem/FHEM/92_FileLog.pm index aad3c9b85..48eda5a13 100755 --- a/fhem/FHEM/92_FileLog.pm +++ b/fhem/FHEM/92_FileLog.pm @@ -288,7 +288,7 @@ FileLog_Get($@) } - next if(!defined($val)); + next if(!defined($val) || $val !~ m/^[-\.\d]+$/o); $min[$i] = $val if($val < $min[$i]); $max[$i] = $val if($val > $max[$i]); $sum[$i] += $val; diff --git a/fhem/fhem.pl b/fhem/fhem.pl index 9431f04ac..b1dd575e1 100755 --- a/fhem/fhem.pl +++ b/fhem/fhem.pl @@ -58,6 +58,7 @@ sub HandleArchiving($); sub HandleTimeout(); sub IOWrite($@); sub InternalTimer($$$$); +sub LoadModule($); sub Log($$); sub OpenLogfile($); sub PrintHash($$); @@ -156,7 +157,7 @@ my $nextat; # Time when next timer will be triggered. my $intAtCnt=0; my %duplicate; # Pool of received msg for multi-fhz/cul setups my $duplidx=0; # helper for the above pool -my $cvsid = '$Id: fhem.pl,v 1.91 2009-12-09 13:29:47 rudolfkoenig Exp $'; +my $cvsid = '$Id: fhem.pl,v 1.92 2009-12-21 18:03:56 rudolfkoenig Exp $'; my $namedef = "where is either:\n" . "- a single device name\n" . @@ -172,7 +173,8 @@ $modules{_internal_}{LOADED} = 1; $modules{_internal_}{AttrList} = "archivecmd allowfrom archivedir configfile lastinclude logfile " . "modpath nrarchive pidfilename port statefile title userattr " . - "verbose:1,2,3,4,5 mseclog version nofork logdir holiday2we"; + "verbose:1,2,3,4,5 mseclog version nofork logdir holiday2we " . + "autoload_undefined_devices"; $modules{_internal_}{AttrFn} = "GlobalAttr"; @@ -638,7 +640,7 @@ devspec2array($) eval { # a bad regexp may shut down fhem.pl foreach my $l (sort keys %defs) { push @ret, $l - if($defs{$l}{$lattr} && (!$re || $defs{$l}{$lattr} =~ m/$re/)); + if($defs{$l}{$lattr} && (!$re || $defs{$l}{$lattr}=~m/^$re$/)); } }; if($@) { @@ -658,7 +660,7 @@ devspec2array($) my $regok; eval { # a bad regexp may shut down fhem.pl if($l =~ m/[*\[\]^\$]/) { # Regexp - push @ret, grep($_ =~ m/$l/, sort keys %defs); + push @ret, grep($_ =~ m/^$l$/, sort keys %defs); $regok = 1; } }; @@ -978,6 +980,29 @@ CommandGet($$) return join("\n", @rets); } +##################################### +sub +LoadModule($) +{ + my ($m) = @_; + + if($modules{$m} && !$modules{$m}{LOADED}) { # autoload + my $o = $modules{$m}{ORDER}; + CommandReload(undef, "${o}_$m"); + + if(!$modules{$m}{LOADED}) { # Case corrected by reload? + foreach my $i (keys %modules) { + if(uc($m) eq uc($i) && $modules{$i}{LOADED}) { + delete($modules{$m}); + $m = $i; + last; + } + } + } + } + return $m; +} + ##################################### sub CommandDefine($$) @@ -1001,20 +1026,7 @@ CommandDefine($$) } } - if($modules{$m} && !$modules{$m}{LOADED}) { # autoload - my $o = $modules{$m}{ORDER}; - CommandReload($cl, "${o}_$m"); - - if(!$modules{$m}{LOADED}) { # Case corrected by reload? - foreach my $i (keys %modules) { - if(uc($m) eq uc($i) && $modules{$i}{LOADED}) { - delete($modules{$m}); - $m = $i; - last; - } - } - } - } + $m = LoadModule($m); if(!$modules{$m} || !$modules{$m}{DefFn}) { my @m = grep { $modules{$_}{DefFn} || !$modules{$_}{LOADED} } @@ -1043,7 +1055,7 @@ CommandDefine($$) CommandAttr($cl, "$a[0] $da $defaultattr{$da}"); } } - DoTrigger($a[0], "DEFINED"); + DoTrigger("global", "DEFINED $a[0]"); return $ret; } @@ -1121,6 +1133,7 @@ CommandDelete($$) delete($attr{$sdev}); delete($defs{$sdev}); # Remove the main entry + DoTrigger("global", "DELETED $sdev"); } return join("\n", @rets); @@ -1330,6 +1343,7 @@ CommandRename($$) $oldvalue{$new} = $oldvalue{$old} if(defined($oldvalue{$old})); delete($oldvalue{$old}); + DoTrigger("global", "RENAMED $old $new"); return undef; } @@ -1877,7 +1891,6 @@ DoTrigger($$) my $ret = ""; foreach my $n (sort keys %defs) { next if(!defined($defs{$n})); # Was deleted in a previous notify - next if($n eq $dev && defined($ns) && $ns eq "DEFINED"); if(defined($modules{$defs{$n}{TYPE}})) { if($modules{$defs{$n}{TYPE}}{NotifyFn}) { Log 5, "$dev trigger: Checking $n for notify"; @@ -2081,30 +2094,41 @@ Dispatch($$$) my $h = $iohash->{MatchList}; if(defined($h)) { foreach my $m (sort keys %{$h}) { + if($dmsg =~ m/$h->{$m}/) { - my (undef, $mname) = split(":", $m); - Log GetLogLevel($name,3), + my ($order, $mname) = split(":", $m); + + if($attr{global}{autoload_undefined_devices}) { + $mname = LoadModule($mname); + no strict "refs"; + @found = &{$modules{$mname}{ParseFn}}($hash,$dmsg); + use strict "refs"; + $last_module = $mname; + + } else { + Log GetLogLevel($name,3), "$name: Unknown $mname device detected, " . "define one to get detailed information."; - return undef; + return undef; + + } } } } - Log GetLogLevel($name,3), "$name: Unknown code $dmsg, help me!"; - return undef; + if(!int(@found)) { + Log GetLogLevel($name,3), "$name: Unknown code $dmsg, help me!"; + return undef; + } } return undef if($found[0] eq ""); # Special return: Do not notify foreach my $found (@found) { - if($found =~ m/^(UNDEFINED) ([^ ]*) (.*)$/) { - # The trigger needs a device: we create a minimal temporary one - my $d = $1; - $defs{$d}{NAME} = $1; - $defs{$d}{TYPE} = $last_module; - DoTrigger($d, "$2 $3"); - CommandDelete(undef, $d); # Remove the device + + if($found =~ m/^(UNDEFINED.*)/) { + DoTrigger("global", $1); return undef; + } else { if($defs{$found}) { $defs{$found}{MSGCNT}++; diff --git a/fhem/webfrontend/pgm2/01_FHEMWEB.pm b/fhem/webfrontend/pgm2/01_FHEMWEB.pm index 637a215fe..10d3358e7 100755 --- a/fhem/webfrontend/pgm2/01_FHEMWEB.pm +++ b/fhem/webfrontend/pgm2/01_FHEMWEB.pm @@ -148,8 +148,9 @@ FW_Read($) my @clientsock = sockaddr_in($clientinfo[1]); my %nhash; + my $cname = "FHEMWEB:". inet_ntoa($clientsock[1]) .":".$clientsock[0]; $nhash{NR} = $devcount++; - $nhash{NAME} = "FHEMWEB:". inet_ntoa($clientsock[1]) .":".$clientsock[0]; + $nhash{NAME} = $cname; $nhash{FD} = $clientinfo[0]->fileno(); $nhash{CD} = $clientinfo[0]; # sysread / close won't work on fileno $nhash{TYPE} = "FHEMWEB"; @@ -157,6 +158,7 @@ FW_Read($) $nhash{SNAME} = $name; $nhash{TEMPORARY} = 1; # Don't want to save it $nhash{BUF} = ""; + $attr{$cname}{room} = "hidden"; $defs{$nhash{NAME}} = \%nhash; $selectlist{$nhash{NAME}} = \%nhash; @@ -1391,6 +1393,10 @@ FW_showWeblink($$$) if($t eq "link") { pO "$d\n"; + + } elsif($t eq "image") { + pO "
$d\n"; + } elsif($t eq "fileplot") { my @va = split(":", $v, 3); if(@va != 3 || !$defs{$va[0]} || !$defs{$va[0]}{currentlogfile}) { diff --git a/fhem/webfrontend/pgm2/98_weblink.pm b/fhem/webfrontend/pgm2/98_weblink.pm index e4ddc10f2..c1c49e7a4 100755 --- a/fhem/webfrontend/pgm2/98_weblink.pm +++ b/fhem/webfrontend/pgm2/98_weblink.pm @@ -21,10 +21,11 @@ weblink_Define($$) { my ($hash, $def) = @_; my ($type, $name, $wltype, $link) = split("[ \t]+", $def, 4); - my %thash = ( link=>1, fileplot=>1 ); + my %thash = ( link=>1, fileplot=>1, image=>1 ); if(!$link || !$thash{$wltype}) { - return "Usage: define weblink [" . join("|",sort keys %thash) . "] "; + return "Usage: define weblink [" . + join("|",sort keys %thash) . "] "; } $hash->{WLTYPE} = $wltype; $hash->{LINK} = $link; diff --git a/fhem/webfrontend/pgm2/hms_tf.gplot b/fhem/webfrontend/pgm2/hms.gplot similarity index 98% rename from fhem/webfrontend/pgm2/hms_tf.gplot rename to fhem/webfrontend/pgm2/hms.gplot index f307fd829..104b26b6e 100644 --- a/fhem/webfrontend/pgm2/hms_tf.gplot +++ b/fhem/webfrontend/pgm2/hms.gplot @@ -28,7 +28,7 @@ set y2label "Temperature in C" set ylabel "Humidity (%)" #FileLog 4:T:0: -#FileLog 6:T:0: +#FileLog 6:H:0: plot \ "< awk '/T:/ {print $1, $4}' "\ diff --git a/fhem/webfrontend/pgm2/ks300_1.gplot b/fhem/webfrontend/pgm2/ks300.gplot similarity index 100% rename from fhem/webfrontend/pgm2/ks300_1.gplot rename to fhem/webfrontend/pgm2/ks300.gplot