2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-13 05:06:35 +00:00

UNDEFINED changes

git-svn-id: https://svn.fhem.de/fhem/trunk@519 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2009-12-21 18:03:56 +00:00
parent 41bc867c8a
commit db2efd2cd4
20 changed files with 101 additions and 64 deletions

View File

@ -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)

View File

@ -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);
}

View File

@ -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};

View File

@ -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

View File

@ -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};

View File

@ -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";
}
}

View File

@ -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 "";

View File

@ -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};

View File

@ -322,10 +322,10 @@ KS300_Parse($$)
} else {
Log 4, "KS300 detected: $msg";
return "UNDEFINED KS300 KS300 1234";
}
return "";
}
1;

View File

@ -39,7 +39,6 @@ CUL_WS_Define($$)
return "wrong syntax: define <name> CUL_WS <code> [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();

View File

@ -32,7 +32,8 @@ CUL_EM_Define($$)
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
return "wrong syntax: define <name> CUL_EM <code> [corr1 corr2 CostPerUnit BasicFeePerMonth]"
return "wrong syntax: define <name> CUL_EM <code> ".
"[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;

View File

@ -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};

View File

@ -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;

View File

@ -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
{

View File

@ -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;

View File

@ -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 <name> 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}++;

View File

@ -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 "<td><a href=\"$v\">$d</a></td>\n";
} elsif($t eq "image") {
pO "<td><img src=\"$v\"><br><a href=\"$__ME?detail=$d\">$d</a></td>\n";
} elsif($t eq "fileplot") {
my @va = split(":", $v, 3);
if(@va != 3 || !$defs{$va[0]} || !$defs{$va[0]}{currentlogfile}) {

View File

@ -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 <name> weblink [" . join("|",sort keys %thash) . "] <httplink>";
return "Usage: define <name> weblink [" .
join("|",sort keys %thash) . "] <arg>";
}
$hash->{WLTYPE} = $wltype;
$hash->{LINK} = $link;

View File

@ -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}' <IN>"\