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:
parent
41bc867c8a
commit
db2efd2cd4
@ -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)
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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};
|
||||
|
@ -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
|
||||
|
@ -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};
|
||||
|
@ -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";
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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 "";
|
||||
|
@ -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};
|
||||
|
@ -322,10 +322,10 @@ KS300_Parse($$)
|
||||
} else {
|
||||
|
||||
Log 4, "KS300 detected: $msg";
|
||||
return "UNDEFINED KS300 KS300 1234";
|
||||
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
1;
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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};
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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;
|
||||
|
88
fhem/fhem.pl
88
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 <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}++;
|
||||
|
@ -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}) {
|
||||
|
@ -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;
|
||||
|
@ -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>"\
|
Loading…
x
Reference in New Issue
Block a user