From 873ccc570c992ef32946892d7e200b347305b438 Mon Sep 17 00:00:00 2001 From: rudolfkoenig <> Date: Tue, 9 Dec 2008 14:12:40 +0000 Subject: [PATCH] See the changes file git-svn-id: https://svn.fhem.de/fhem/trunk@284 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 8 ++- fhem/FHEM/00_CM11.pm | 3 +- fhem/FHEM/00_CUL.pm | 37 +++++----- fhem/FHEM/00_FHZ.pm | 3 +- fhem/FHEM/14_CUL_WS.pm | 140 +++++++++++++++++++++++--------------- fhem/FHEM/15_CUL_EM.pm | 6 +- fhem/FHEM/60_EM.pm | 3 +- fhem/FHEM/80_M232.pm | 3 +- fhem/HISTORY | 6 ++ fhem/docs/commandref.html | 21 ------ fhem/examples/01_fs20 | 6 +- fhem/examples/02_fs20 | 6 +- fhem/examples/03_fht | 6 +- fhem/examples/04_log | 6 +- fhem/examples/05_rm100 | 6 +- fhem/examples/sample_fhem | 6 +- fhem/examples/sample_pgm2 | 8 +-- fhem/fhem.pl | 107 ++++------------------------- 18 files changed, 166 insertions(+), 215 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index cd4816750..8f52c8785 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,12 +1,12 @@ - 2005-10-27 (1.3) - - Bugfix: multiple at commands at the same time.</pre> + - Bugfix: multiple at commands at the same time. - 2005-11-10 (1.4) - Reformatting the package and the documentation - New links - 2005-12-26 (1.5) - - "modularized" in preparation for the FHZ80B -> each device has a type + - "modularized" in preparation for the FHT80B -> each device has a type - added relative "at" commands (with +HH:MM:SS) - multiple commands on one line separated with ; - sleeping 0.22 seconds after an ST command @@ -450,9 +450,11 @@ - feature: CUL / CUL_EM / CUL_WS documentation - feature: do not block fhem when the CUR is disconnected - bugfix: correct correction factors for EMEM in 15_CUL_EM.pm + - bugfix: more stable CUL initialization - feature: reworked 15_CUL_EM.pm to account for timer wraparounds, more readings added - feature: speed gain through disabled refreshvalues query to all FHTs at definition; if you want it back at a "set myFHT report1 255 report2 255" command to the config file. - + - feature: fhem commands may be added in modules. XmlList is external now. + - bugfix: rereadcfg from webpgm2 does not crash fhem.pl diff --git a/fhem/FHEM/00_CM11.pm b/fhem/FHEM/00_CM11.pm index b12610872..086f55a63 100755 --- a/fhem/FHEM/00_CM11.pm +++ b/fhem/FHEM/00_CM11.pm @@ -208,7 +208,8 @@ CM11_Undef($$) defined($defs{$d}{IODev}) && $defs{$d}{IODev} == $hash) { - Log GetLogLevel($name,2), "deleting port for $d"; + my $lev = ($reread_active ? 4 : 2); + Log GetLogLevel($name,$lev), "deleting port for $d"; delete $defs{$d}{IODev}; } } diff --git a/fhem/FHEM/00_CUL.pm b/fhem/FHEM/00_CUL.pm index 2d0a57055..3e787ea04 100755 --- a/fhem/FHEM/00_CUL.pm +++ b/fhem/FHEM/00_CUL.pm @@ -128,7 +128,8 @@ CUL_Undef($$) defined($defs{$d}{IODev}) && $defs{$d}{IODev} == $hash) { - Log GetLogLevel($name,2), "deleting port for $d"; + my $lev = ($reread_active ? 4 : 2); + Log GetLogLevel($name,$lev), "deleting port for $d"; delete $defs{$d}{IODev}; } } @@ -197,7 +198,7 @@ GOTBW: } else { return "Expecting a 0-padded hex number" - if((length($arg)&1) == 1 && $type ne "raw"); + if((length($arg)&1) == 0 && $type ne "raw"); $initstr = "X$arg" if($type eq "verbose"); Log GetLogLevel($name,4), "set $name $type $arg"; CUL_Write($hash, $sets{$type}, $arg); @@ -409,21 +410,21 @@ CUL_Write($$$) my $bstring = "$fn$msg\n"; if($fn eq "F") { - if(!$hash->{QUEUECNT}) { - CUL_XmitLimitCheck($hash, $bstring); + + if(!$hash->{QUEUE}) { + + CUL_XmitLimitCheck($hash,$bstring); + $hash->{QUEUE} = [ $bstring ]; $hash->{PortObj}->write($bstring); ############## - # Write the next buffer not earlier than 0.227 seconds (= 65.6ms + 10ms + - # 65.6ms + 10ms + 65.6ms + 10ms) + # Write the next buffer not earlier than 0.22 seconds (= 65.6ms + 10ms + + # 65.6ms + 10ms + 65.6ms), else it will be discarded by the FHZ1X00 PC InternalTimer(gettimeofday()+0.25, "CUL_HandleWriteQueue", $hash, 1); - } elsif($hash->{QUEUECNT} == 1) { - $hash->{QUEUE} = [ $bstring ]; } else { push(@{$hash->{QUEUE}}, $bstring); } - $hash->{QUEUECNT}++; } else { @@ -438,14 +439,18 @@ sub CUL_HandleWriteQueue($) { my $hash = shift; - if($hash->{QUEUECNT} > 0) { - $hash->{QUEUECNT}--; - my $bstring = shift(@{$hash->{QUEUE}}); - if(defined($bstring)) { - CUL_XmitLimitCheck($hash,$bstring); - $hash->{PortObj}->write($bstring); - InternalTimer(gettimeofday()+0.25, "CUL_HandleWriteQueue", $hash, 1); + my $arr = $hash->{QUEUE}; + + if(defined($arr) && @{$arr} > 0) { + shift(@{$arr}); + if(@{$arr} == 0) { + delete($hash->{QUEUE}); + return; } + my $bstring = $arr->[0]; + CUL_XmitLimitCheck($hash,$bstring); + $hash->{PortObj}->write($bstring); + InternalTimer(gettimeofday()+0.25, "CUL_HandleWriteQueue", $hash, 1); } } diff --git a/fhem/FHEM/00_FHZ.pm b/fhem/FHEM/00_FHZ.pm index 0fbb8bde9..b198b2f0a 100755 --- a/fhem/FHEM/00_FHZ.pm +++ b/fhem/FHEM/00_FHZ.pm @@ -326,7 +326,8 @@ FHZ_Undef($$) defined($defs{$d}{IODev}) && $defs{$d}{IODev} == $hash) { - Log GetLogLevel($name,2), "deleting port for $d"; + my $lev = ($reread_active ? 4 : 2); + Log GetLogLevel($name,$lev), "deleting port for $d"; delete $defs{$d}{IODev}; } } diff --git a/fhem/FHEM/14_CUL_WS.pm b/fhem/FHEM/14_CUL_WS.pm index d2fb7c94b..5a66f0767 100755 --- a/fhem/FHEM/14_CUL_WS.pm +++ b/fhem/FHEM/14_CUL_WS.pm @@ -78,8 +78,8 @@ CUL_WS_Parse($$) my $firstbyte = hex($a[1]); my $cde = ($firstbyte&7) + 1; - my $type = $tlist{$a[2]} ? $tlist{$a[2]} : "unknown"; + if(!$defptr{$cde}) { Log 1, "CUL_WS UNDEFINED $type sensor detected, code $cde"; return "UNDEFINED CUL_WS: $cde"; @@ -87,78 +87,110 @@ CUL_WS_Parse($$) $hash = $defptr{$cde}; my $name = $hash->{NAME}; - + my $typbyte = hex($a[2]) & 7; + my $sfirstbyte = $firstbyte & 7; my $val = ""; + my $devtype = "unknown"; - if(@a == 5) { # 433MHz RainSensor - - my $c = $hash->{corr1} ? $hash->{corr1} : 1; - $val = "R: " . (hex($a[5].$a[2].$a[3]) * $c); - - } elsif(@a == 9) { # S300TH - - my $sgn = ($firstbyte&8) ? -1 : 1; - my $tmp = $sgn * ($a[6].$a[3].".".$a[4]) + $hash->{corr1}; - my $hum = ($a[7].$a[8].".".$a[5]) + $hash->{corr2}; - $val = "T: $tmp H: $hum"; - - } elsif(@a == 13) { # WS7000 sensors + if($sfirstbyte == 7) { - if($type eq "brightness") { + if($typbyte == 0) { + my $sgn = ($firstbyte&8) ? -1 : 1; + my $tmp = $sgn * ($a[6].$a[3].".".$a[4]) + $hash->{corr1}; + $val = "T: $tmp"; + $devtype = "CUL_WS WS7000 Temp"; + + } - # TODO - my $br = hex($a[3].$a[4].$a[5].$a[6]) + $hash->{corr1}; + if($typbyte == 1) { + my $sgn = ($firstbyte&8) ? -1 : 1; + my $tmp = $sgn * ($a[6].$a[3].".".$a[4]) + $hash->{corr1}; + my $hum = ($a[7].$a[8].".".$a[5]) + $hash->{corr2}; + $val = "T: $tmp H: $hum"; + $devtype = "CUL_WS WS7000 Temp/Hum"; + } + + if($typbyte == 2) { + #my $more = ($firstbyte&8) ? 0 : 1000; + my $c = $hash->{corr1} ? $hash->{corr1} : 1; + my $hexcount = hex($a[5].$a[3].$a[4]) + $c; + $val = "R: $hexcount"; + $devtype = "CUL_WS WS7000 Rain"; + } + + if($typbyte == 3) { + my $hun = ($firstbyte&8) ? 100 : 0; + my $speed = ($a[6].$a[3].".".$a[4])+$hun; + my $dir = (($a[7]&3).$a[8].$a[5])+0; + my $swing = ($a[7]&6) >> 2; + $val = "W: $speed D: $dir A: $swing"; + $devtype = "CUL_WS WS7000 Wind"; + } + + if($typbyte == 4) { + my $sgn = ($firstbyte&8) ? -1 : 1; + my $tmp = $sgn * ($a[6].$a[3].".".$a[4]) + $hash->{corr1}; + my $hum = ($a[7].$a[8].".".$a[5]) + $hash->{corr2}; + my $prs = ($a[9].$a[10])+ 900 + $hash->{corr3}; + if ($prs < 930) { + $prs = $prs + 100; + } + if(@a == 13) { + $val = "T: $tmp H: $hum P: $prs"; + } else { + $val = "T: $tmp H: $hum P: $prs lenerr"; + } + $devtype = "CUL_WS WS7000 Indoor"; + } + + if($typbyte == 5) { + my $fakt = 1; + my $rawfakt = ($a[5])+0; + if($rawfakt == 1) { $fakt = 10; } + if($rawfakt == 2) { $fakt = 100; } + if($rawfakt == 3) { $fakt = 1000; } + + my $br = (hex($a[5].$a[4].$a[3])*$fakt) + $hash->{corr1}; $val = "B: $br"; + $devtype = "CUL_WS WS7000 Brightness"; + } - } elsif($type eq "temp/hum/press") { + if($typbyte == 6) { #wurde nie gebaut + $devtype = "CUL_WS WS7000 Pyro"; + } + if($typbyte == 7) { + $devtype = "CUL_WS unknown"; + } + + } else { + + if(@a == 9) { # S300TH my $sgn = ($firstbyte&8) ? -1 : 1; my $tmp = $sgn * ($a[6].$a[3].".".$a[4]) + $hash->{corr1}; my $hum = ($a[7].$a[8].".".$a[5]) + $hash->{corr2}; - my $prs = ($a[9].$a[10].".".$a[11]) + $hash->{corr3}; - $val = "T: $tmp H: $hum P: $prs"; + $val = "T: $tmp H: $hum"; + $devtype = "S300TH"; - } elsif($type eq "wind") { + } elsif(@a == 15) { # KS300/2 - # TODO - my $wnd = hex($a[3].$a[4].$a[5].$a[6]) + $hash->{corr1}; - $val = "W: $wnd"; - - } elsif($type eq "rain") { - - # TODO - my $c = $hash->{corr1} ? $hash->{corr1} : 1; - my $rain = hex($a[3].$a[4].$a[5].$a[6]) * $c; - $val = "R: $rain"; - - } else { - - Log 1, "CUL_WS UNKNOWN sensor detected, $msg"; - return "UNKNOWN CUL_WS: $cde"; - - } - - } elsif(@a == 15) { # KS300/2 - - my $c = $hash->{corr4} ? $hash->{corr4} : 255; - my $rain = sprintf("%0.1f", hex("$a[14]$a[11]$a[12]") * $c / 1000); - my $wnd = sprintf("%0.1f", "$a[9]$a[10].$a[7]" + $hash->{corr3}); - my $hum = sprintf( "%02d", "$a[8]$a[5]" + $hash->{corr2}); - my $tmp = sprintf("%0.1f", ("$a[6]$a[3].$a[4]"+$hash->{corr1}) * + my $c = $hash->{corr4} ? $hash->{corr4} : 255; + my $rain = sprintf("%0.1f", hex("$a[14]$a[11]$a[12]") * $c / 1000); + my $wnd = sprintf("%0.1f", "$a[9]$a[10].$a[7]" + $hash->{corr3}); + my $hum = sprintf( "%02d", "$a[8]$a[5]" + $hash->{corr2}); + my $tmp = sprintf("%0.1f", ("$a[6]$a[3].$a[4]"+$hash->{corr1}) * (($a[3] & 8) ? -1 : 1)); - my $ir = ((hex($a[1]) & 0x2)) ? "yes" : "no"; + my $ir = ((hex($a[1]) & 0x2)) ? "yes" : "no"; - $val = "T: $tmp H: $hum W: $wnd R: $rain IR: $ir"; + $val = "T: $tmp H: $hum W: $wnd R: $rain IR: $ir"; + $devtype = "KS300/2"; - } else { - - Log 1, "CUL_WS UNKNOWN sensor detected, $msg"; - return "UNKNOWN CUL_WS: $cde"; + } } - Log GetLogLevel($name,4), "CUL_WS $name: $val"; + Log GetLogLevel($name,4), "CUL_WS $devtype sensor $name: $val"; $hash->{STATE} = $val; # List overview $hash->{READINGS}{state}{TIME} = TimeNow(); # For list diff --git a/fhem/FHEM/15_CUL_EM.pm b/fhem/FHEM/15_CUL_EM.pm index a599ad5d0..7841895f2 100755 --- a/fhem/FHEM/15_CUL_EM.pm +++ b/fhem/FHEM/15_CUL_EM.pm @@ -30,7 +30,7 @@ CUL_EM_Define($$) my @a = split("[ \t][ \t]*", $def); return "wrong syntax: define <name> CUL_EM <code> [corr1 corr2]" - if(int(@a) != 3 && int(@a) != 5); + if(int(@a) < 3 || int(@a) > 5); return "Define $a[0]: wrong CODE format: valid is 1-12" if($a[2] !~ m/^\d$/ || $a[2] < 1 || $a[2] > 12); @@ -45,11 +45,11 @@ CUL_EM_Define($$) # corr1 is the correction factor for power $hash->{corr1} = (int(@a) > 3 ? $a[3] : 0.01); # corr2 is the correction factor for energy - $hash->{corr2} = (int(@a) > 3 ? $a[4] : 0.001); + $hash->{corr2} = (int(@a) > 4 ? $a[4] : 0.001); } elsif($a[2] >= 9 && $a[2] <= 12) { # EMGZ: 0.01 $hash->{corr1} = (int(@a) > 3 ? $a[3] : 0.01); - $hash->{corr2} = (int(@a) > 3 ? $a[4] : 0.01); + $hash->{corr2} = (int(@a) > 4 ? $a[4] : 0.01); } else { $hash->{corr1} = 1; diff --git a/fhem/FHEM/60_EM.pm b/fhem/FHEM/60_EM.pm index 4817fc080..7689575fe 100755 --- a/fhem/FHEM/60_EM.pm +++ b/fhem/FHEM/60_EM.pm @@ -85,7 +85,8 @@ EM_Undef($$) defined($defs{$d}{IODev}) && $defs{$d}{IODev} == $hash) { - Log GetLogLevel($name,2), "deleting port for $d"; + my $lev = ($reread_active ? 4 : 2); + Log GetLogLevel($name, $lev), "deleting port for $d"; delete $defs{$d}{IODev}; } } diff --git a/fhem/FHEM/80_M232.pm b/fhem/FHEM/80_M232.pm index 99e5dfe91..64ce19051 100644 --- a/fhem/FHEM/80_M232.pm +++ b/fhem/FHEM/80_M232.pm @@ -96,7 +96,8 @@ M232_Undef($$) defined($defs{$d}{IODev}) && $defs{$d}{IODev} == $hash) { - Log GetLogLevel($name,2), "deleting port for $d"; + my $lev = ($reread_active ? 4 : 2); + Log GetLogLevel($name,$lev), "deleting port for $d"; delete $defs{$d}{IODev}; } } diff --git a/fhem/HISTORY b/fhem/HISTORY index ec40aa211..7a9d0c453 100644 --- a/fhem/HISTORY +++ b/fhem/HISTORY @@ -349,3 +349,9 @@ - speed gain through disabled refreshvalues query to all FHTs at definition; if you want it back at a "set myFHT report1 255 report2 255" command to the config file. + +- Mon Dec 8 21:26 MET 2008 (Rudi) + - Modules can now modify the cmds hash, i.e. modules can add / overwrite / + delete internal fhem commands. See 99_XmlList.pm for an example. Since this + modules is called 99_xxx, it will be always loaded, but user of webpgm2 do + not need it. diff --git a/fhem/docs/commandref.html b/fhem/docs/commandref.html index fb08dfc44..f7d4d294a 100644 --- a/fhem/docs/commandref.html +++ b/fhem/docs/commandref.html @@ -59,7 +59,6 @@ <a href="#EMWZ">EMWZ</a> <a href="#FHT">FHT</a> <a href="#FHZ">FHZ</a> - <a href="#FS10">FS10</a> <a href="#FS20">FS20</a> <a href="#HMS">HMS</a> <a href="#FHEMWEB">FHEMWEB</a> @@ -2353,26 +2352,6 @@ A line ending with \ will be concatenated with the next one, so long lines </ul> -<a name="FS10"></a> -<h3>FS10</h3> -<ul> - <br> - - <b>Define</b> <ul>N/A</ul><br> - - <b>Set </b> <ul>N/A</ul><br> - - <b>Get</b> <ul>N/A</ul><br> - - <b>Attributes</b> - <ul> - <li><a href="#loglevel">loglevel</a></li> - <li><a href="#model">model</a> (FS10)</li> - </ul> - <br> - -</ul> - <a name="WS2000"></a> <h3>WS2000</h3> <ul> diff --git a/fhem/examples/01_fs20 b/fhem/examples/01_fs20 index 5e833bd24..39c3b4ea4 100644 --- a/fhem/examples/01_fs20 +++ b/fhem/examples/01_fs20 @@ -7,11 +7,11 @@ # # Common part -attr global logfile /tmp/fhem-%Y-%m.log -attr global statefile /tmp/fhem.save # where to save the state of the devices +attr global logfile /tmp/fhem/fhem-%Y-%m.log +attr global statefile /tmp/fhem/fhem.save # where to save the state of the devices attr global verbose 3 # "normal" verbosity (min 1, max 5) attr global port 7072 # our TCP/IP port (localhost only) -attr global modpath . # where our FHEM directory is +attr global modpath /tmp/fhem/fhem # where our FHEM directory is define FHZ FHZ /dev/tts/USB0 # the serial port of an FHZ 1000 PC diff --git a/fhem/examples/02_fs20 b/fhem/examples/02_fs20 index 7962d1f76..4db4389d9 100644 --- a/fhem/examples/02_fs20 +++ b/fhem/examples/02_fs20 @@ -10,11 +10,11 @@ # Common part -attr global logfile /tmp/fhem-%Y-%m.log -attr global statefile /tmp/fhem.save # where to save the state of the devices +attr global logfile /tmp/fhem/fhem-%Y-%m.log +attr global statefile /tmp/fhem/fhem.save # where to save the state of the devices attr global verbose 3 # "normal" verbosity attr global port 7072 # our TCP/IP port (localhost only) -attr global modpath . # where our FHEM directory is +attr global modpath /tmp/fhem/fhem # where our FHEM directory is define FHZ FHZ /dev/tts/USB0 # the serial port of an FHZ 1000 PC diff --git a/fhem/examples/03_fht b/fhem/examples/03_fht index ccb1c5137..7c6f266fa 100644 --- a/fhem/examples/03_fht +++ b/fhem/examples/03_fht @@ -8,11 +8,11 @@ # After about 5-10 minutes, check if "list wz" returns something meaningful # -attr global logfile /tmp/fhem-%Y-%m.log -attr global statefile /tmp/fhem.save # where to save the state of the devices +attr global logfile /tmp/fhem/fhem-%Y-%m.log +attr global statefile /tmp/fhem/fhem.save # where to save the state of the devices attr global verbose 3 # "normal" verbosity attr global port 7072 # our TCP/IP port (localhost only) -attr global modpath . # where our FHEM directory is +attr global modpath /tmp/fhem/fhem # where our FHEM directory is define FHZ FHZ /dev/tts/USB0 # the serial port of an FHZ 1000 PC diff --git a/fhem/examples/04_log b/fhem/examples/04_log index 77c76ae24..5a01df040 100644 --- a/fhem/examples/04_log +++ b/fhem/examples/04_log @@ -4,11 +4,11 @@ # contrib/91_DbLog.pm # -attr global logfile /tmp/fhem-%Y-%m.log -attr global statefile /tmp/fhem.save # where to save the state of the devices +attr global logfile /tmp/fhem/fhem-%Y-%m.log +attr global statefile /tmp/fhem/fhem.save # where to save the state of the devices attr global verbose 3 # "normal" verbosity attr global port 7072 # our TCP/IP port (localhost only) -attr global modpath . # where our FHEM directory is +attr global modpath /tmp/fhem/fhem # where our FHEM directory is define FHZ FHZ /dev/tts/USB0 # the serial port of an FHZ 1000 PC diff --git a/fhem/examples/05_rm100 b/fhem/examples/05_rm100 index 2d2ccc7d9..8abb03658 100644 --- a/fhem/examples/05_rm100 +++ b/fhem/examples/05_rm100 @@ -8,11 +8,11 @@ # if there is no definition for it. Check the commandref.html define, Type HMS # section for details -attr global logfile /tmp/fhem-%Y-%m.log -attr global statefile /tmp/fhem.save # where to save the state of the devices +attr global logfile /tmp/fhem/fhem-%Y-%m.log +attr global statefile /tmp/fhem/fhem.save # where to save the state of the devices attr global verbose 3 # "normal" verbosity (min 1, max 5) attr global port 7072 # our TCP/IP port (localhost only) -attr global modpath . # where our FHEM directory is +attr global modpath /tmp/fhem/fhem # where our FHEM directory is define FHZ FHZ /dev/tts/USB0 # the serial port of an FHZ 1000 PC diff --git a/fhem/examples/sample_fhem b/fhem/examples/sample_fhem index 1db3333ab..814107132 100644 --- a/fhem/examples/sample_fhem +++ b/fhem/examples/sample_fhem @@ -1,8 +1,8 @@ # # Minimalistic fhem.pl configfile. Take a look at the other examples for more. # -attr global logfile /tmp/fhem-%Y-%m.log -attr global statefile /tmp/fhem.save # where to save the state of the devices +attr global logfile /tmp/fhem/fhem-%Y-%m.log +attr global statefile /tmp/fhem/fhem.save # where to save the state of the devices attr global verbose 3 # "normal" verbosity (min 1, max 5) attr global port 7072 # our TCP/IP port (localhost only) -attr global modpath . # where our FHEM directory is +attr global modpath /tmp/fhem/fhem # where our FHEM directory is diff --git a/fhem/examples/sample_pgm2 b/fhem/examples/sample_pgm2 index 6c395e8d2..e23b92245 100644 --- a/fhem/examples/sample_pgm2 +++ b/fhem/examples/sample_pgm2 @@ -2,14 +2,14 @@ # Minimalistic fhem.pl & pgm2 configfile. Take a look at the other examples for # more. # -attr global logfile /tmp/fhem-%Y-%m.log -attr global statefile /tmp/fhem.save # where to save the state of the devices +attr global logfile /tmp/fhem/fhem-%Y-%m.log +attr global statefile /tmp/fhem/fhem.save # where to save the state of the devices attr global verbose 3 # "normal" verbosity (min 1, max 5) attr global port 7072 # our TCP/IP port (localhost only) -attr global modpath . # where our FHEM directory is +attr global modpath /tmp/fhem/fhem # where our FHEM directory is define WEB FHEMWEB 8083 attr WEB plotmode SVG # Fake logfile, to access the global log -define Logfile FileLog /tmp/fhem-%Y-%m.log fakelog +define Logfile FileLog /tmp/fhem/fhem-%Y-%m.log fakelog diff --git a/fhem/fhem.pl b/fhem/fhem.pl index a2d727280..f504a3d30 100755 --- a/fhem/fhem.pl +++ b/fhem/fhem.pl @@ -4,7 +4,8 @@ # # Copyright notice # -# (c) 2005 Copyright: Rudolf Koenig (r dot koenig at koeniglich dot de) +# (c) 2005-2008 +# Copyright: Rudolf Koenig (r dot koenig at koeniglich dot de) # All rights reserved # # This script free software; you can redistribute it and/or modify @@ -48,7 +49,6 @@ sub DoClose($); sub FmtDateTime($); sub FmtTime($); sub GetLogLevel(@); -sub GlobalAttr($$); sub GetTimeSpec($); sub HandleArchiving($); sub HandleTimeout(); @@ -89,7 +89,6 @@ sub CommandSet($$); sub CommandSetstate($$); sub CommandSleep($$); sub CommandShutdown($$); -sub CommandXmlList($$); sub CommandTrigger($$); ################################################## @@ -131,7 +130,9 @@ use vars qw(%value); # Current values, see commandref.html use vars qw(%oldvalue); # Old values, see commandref.html use vars qw($init_done); # use vars qw($internal_data); # +use vars qw(%cmds); # Global command name hash. To be expanded +use vars qw($reread_active); my $server; # Server socket my $currlogfile; # logfile, without wildcards @@ -146,9 +147,8 @@ my %defaultattr; # Default attributes my %intAt; # Internal at timer hash. my $nextat; # Time when next timer will be triggered. my $intAtCnt=0; -my $reread_active = 0; my $AttrList = "room comment"; -my $cvsid = '$Id: fhem.pl,v 1.58 2008-12-03 16:42:48 rudolfkoenig Exp $'; +my $cvsid = '$Id: fhem.pl,v 1.59 2008-12-09 14:12:40 rudolfkoenig Exp $'; my $namedef = "where <name> is either:\n" . "- a single device name\n" . @@ -165,9 +165,10 @@ $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"; +$modules{_internal_}{AttrFn} = "GlobalAttr"; -my %cmds = ( +%cmds = ( "?" => { Fn=>"CommandHelp", Hlp=>",get this help" }, "attr" => { Fn=>"CommandAttr", @@ -212,8 +213,6 @@ my %cmds = ( Hlp=>"<sec>,sleep for sec, 3 decimal places" }, "trigger" => { Fn=>"CommandTrigger", Hlp=>"<devspec> <state>,trigger notify command" }, - "xmllist" => { Fn=>"CommandXmlList", - Hlp=>",list definitions and status info as xml" }, ); @@ -721,6 +720,8 @@ CommandRereadCfg($$) WriteStatefile(); + $reread_active=1; + foreach my $d (keys %defs) { my $ret = CallFn($d, "UndefFn", $defs{$d}, $d); return $ret if($ret); @@ -729,11 +730,11 @@ CommandRereadCfg($$) my $cfgfile = $attr{global}{configfile}; %defs = (); %attr = (); + %selectlist = (); + %readyfnlist = (); + doGlobalDef($cfgfile); - - $reread_active=1; - my $ret = CommandInclude($cl, $cfgfile); if(!$ret && $attr{global}{statefile} && -r $attr{global}{statefile}) { $ret = CommandInclude($cl, $attr{global}{statefile}); @@ -1061,7 +1062,6 @@ sub CommandDelete($$) { my ($cl, $def) = @_; - return "Usage: delete <name>$namedef\n" if(!$def); my @rets; @@ -1205,77 +1205,6 @@ CommandList($$) } -##################################### -sub -XmlEscape($) -{ - my $a = shift; - return "" if(!$a); - $a =~ s/\\\n/<br>/g; # Multi-line - $a =~ s/&/&/g; - $a =~ s/"/"/g; - $a =~ s/</</g; - $a =~ s/>/>/g; - $a =~ s/([^ -~])/sprintf("#%02x;", ord($1))/ge; - return $a; -} - -##################################### -sub -CommandXmlList($$) -{ - my ($cl, $param) = @_; - my $str = "<FHZINFO>\n"; - my $lt = ""; - - delete($modules{""}) if(defined($modules{""})); - for my $d (sort { my $x = $modules{$defs{$a}{TYPE}}{ORDER} cmp - $modules{$defs{$b}{TYPE}}{ORDER}; - $x = ($a cmp $b) if($x == 0); $x; } keys %defs) { - - my $p = $defs{$d}; - my $t = $p->{TYPE}; - - if($t ne $lt) { - $str .= "\t</${lt}_LIST>\n" if($lt); - $str .= "\t<${t}_LIST>\n"; - } - $lt = $t; - - my $a1 = XmlEscape($p->{STATE}); - my $a2 = XmlEscape(getAllSets($d)); - my $a3 = XmlEscape(getAllAttr($d)); - - $str .= "\t\t<$t name=\"$d\" state=\"$a1\" sets=\"$a2\" attrs=\"$a3\">\n"; - - foreach my $c (sort keys %{$p}) { - next if(ref($p->{$c})); - $str .= sprintf("\t\t\t<INT key=\"%s\" value=\"%s\"/>\n", - XmlEscape($c), XmlEscape($p->{$c})); - } - $str .= sprintf("\t\t\t<INT key=\"IODev\" value=\"%s\"/>\n", - $p->{IODev}{NAME}) if($p->{IODev}); - - foreach my $c (sort keys %{$attr{$d}}) { - $str .= sprintf("\t\t\t<ATTR key=\"%s\" value=\"%s\"/>\n", - XmlEscape($c), XmlEscape($attr{$d}{$c})); - } - - my $r = $p->{READINGS}; - if($r) { - foreach my $c (sort keys %{$r}) { - $str .= - sprintf("\t\t\t<STATE key=\"%s\" value=\"%s\" measured=\"%s\"/>\n", - XmlEscape($c), XmlEscape($r->{$c}{VAL}), $r->{$c}{TIME}); - } - } - $str .= "\t\t</$t>\n"; - } - $str .= "\t</${lt}_LIST>\n" if($lt); - $str .= "</FHZINFO>\n"; - return $str; -} - ##################################### sub CommandReload($$) @@ -1379,7 +1308,9 @@ getAllSets($) sub GlobalAttr($$) { - my ($name, $val) = @_; + my ($type, $me, $name, $val) = @_; + + return if($type ne "set"); ################ if($name eq "logfile") { @@ -1497,14 +1428,6 @@ CommandAttr($$) $attr{$sdev}{$a[1]} = "1"; } - if($sdev eq "global") { - $ret = GlobalAttr($a[1], $a[2]); - if($ret) { - push @rets, $ret; - next; - } - } - } return join("\n", @rets); }