Initial version

git-svn-id: https://svn.fhem.de/fhem/trunk@3 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2007-01-30 12:47:36 +00:00
parent 76ecb6a788
commit 71fe020f84
107 changed files with 14766 additions and 0 deletions

301
fhem/CHANGED Normal file
View File

@ -0,0 +1,301 @@
- 2005-10-27 (1.3)
- Bugfix: multiple at commands at the same time.</pre>
- 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
- added relative "at" commands (with +HH:MM:SS)
- multiple commands on one line separated with ;
- sleeping 0.22 seconds after an ST command
- some commands/syntax changed:
- switch => set
- device => fhzdevice
- define <name> ... => define <name> <type> ...
- the state of the devices and the at commands are saved
- at start always sending a "set 0001 00 01" to enable the FHZ receiever.
This is a workaround.
- doc rewrite, examples directory
- 2006-01-03 (1.6)
- signal handling (to save the state on shutdown)
- module FHZ addded (for the FHZ1000PC device itself)
- added the get function (to make the initialization prettier)
- the module ST was renamed to FS20
- FS20 timer commands added
- modules command removed (we are loading everything from the modpath
directory)
- FHT80b module added (yes, it is already useful, you can set
and view a lot of values)
- documentation adapted
- Added a TODO file
- 2006-01-04 (1.7)
- the at command can be used to execute something repeatedly with *
- ntfy can filter on device or on device+event with a regexp
- checking the delete and notify regexps if they make sense
- the FHT init string is now a set command (refreshvalues)
- shutdown saves the detailed device information too
- 2006-01-05 (1.8)
- Bugfix: detailed FS20 status was not set from external event
- Bugfix: setstate for FS20 returned the last state set
- Bugfix: undefined FS20 devices (can) crash the server
- HMS module added by Martin Mueller
(currently supporting the HMS100T & HMS100TF)
- Log modules added, the first one being a simple FileLog
(inspired by Martin Mueller)
- A little gnuplot script to display temperature and actuator changes
- 2006-02-10 (1.9)
(aka as the Juergen release)
- The FHZ1300 is reported to work
- Bugfix: spaces before comment in the config file should be ignored
- added FS20STR codes to 10_FS20.pm
- names restricted to A-Za-z0-9.:- (especially _ is not allowed)
- delete calles now an UndefFn in the module
- implementation of FS20 function group/local master/global master
- the list command tells you the definition of the device too
- 2006-02-12 (1.9a)
- Bugfix: wrong rights for HMS and wrong place for readonly
(thanks to Juergen)
- 2006-02-12 (1.9b)
- Bugfix: Fixing the same bug again (thanks to Martin)
- 2006-04-02 (2.0)
- XmlList and webfrontend/pgm1 programs from Raoul Matthiessen
- list tries to display the state and not the last command
- Both log facilities (FileLog and Log) take wildcards
(week, year, month, etc) to make logfile rotating easier
- webfrontend/pgm2
- 2006-04-15 (2.1)
- webfrontend/pgm2 changes:
- make it work on Asus dsl-routers (no "use warnings")
- css/readonly configurable
- Formatting for HMS data
- comments can be added to each device (setstate <dev> comment:xxx)
- testbed to dry-test functionality (test directory)
- added an empty hull for the KS300 weather module
- added undocumented "exec" function to call arbitrary program parts
for debugging. Example: exec FhzDecode("81xx04xx0101a0011234030011");
- webfrontend/pgm3, contributed by Martin Haas
- fixed pgm1: changing values should work now
- 2006-05-20 (2.2)
- FHZ1300 support verified (+ doc changes)
- KS300 support added (with Temperature, Humidity, Wind speed, Rain).
Not verified/undecoded: subzero temp, weak battery, Is-raining flag,
wind speed > 100km/h
- webpgm2 log fix for "offed" FHT devices (with no actuator data)
- webpgm3 upgrade (by Martin Haas, see webpgm/pgm3/docs/CHANGES for details)
- HMS logging/state format changed to make it similar to KS300
- added HMS100WD (thanks to Sascha Pollok)
- ntfy/logging changed to be able to notify for multiple attributes
arriving in one message
- central FHTcode settable (see commandref.html)
- optionally listen for non-local requests (port <num> global)
- unknown logging
- FAQ
- 2006-6-22 (2.3)
- CRC checking (i.e. ignoring messages with bad CRC, message on verbose 4)
- contrib/checkmesg.pl added to check message consistency (debugging)
- FHT: unknown_aa, unknown_ba codes added. What they are for?
- Empty modpath / no modpath error messages added (some user think modpath is
superfluous)
- Unparsed messages (verbose 5) now printed as hex
- Try to reattach to the usb device if it disappears: no need to
restart the server if the device is pulled out from the USB socket and
plugged in again (old versions go into a busy loop here).
- Supressing the seldom (ca 1 out of 700) short KS300 messages.
(not sure how to interpret them)
- Added KS300 "israining" status flag. Note: this not always triggers when it
is raining, but there seems to be a correlation. To be evaluated in more
detail.
- notifyon can now execute "private" perl code as well (updated
commandref.html, added the file example/99_PRIV.pm)
- another "perl code" example is logging the data into the database
(with DBI), see the file contrib/91_DbLog.pm. Tested with an Oracle DB.
- logs added to the xmllist
- FHT80b: Fix measured-temp over 25.5 (handling the tempadd messages better)
- 2006-07-23 (2.4)
- contrib/four2hex (to convert between ELV and our codes) by Peter Stark
- make dist added to set version (it won't work in a released version)
- reload function to reload (private) perl modules
- 20_FHT.pm fix: undef occures once without old data
- "setstate comment" is replaced with the attr command (i.e. attribute).
The corresponding xmllist COMMENT tag is replaced with the ATTR tag.
Devices or logs can have attr definitions.
- webfrontend/pgm2 (fhzweb.pl) updated to handle "room" attributes(showing
only devices in this room).
- version 0.4.2 of webfrontend/pgm3 integrated.
- contrib/ks300avg.pl to compute daily and monthly avarage values.
- the 40_KS300.pm module is computing daily and monthly avarages for the
temp/hum and wind values and sum of the rain. The cum_day and cum_month
state variables are used as helper values. To log the avarage use the
.*avg.* regexp. The regexp for the intraday log will trigger it also.
- Added the contrib file garden.pl as a more complex example: garden
irrigation. The program computes the time for irrigation from the avarage
temperature reported by the ks300-2.
- Enable uppercase hex codes (Bug reported by STefan Mayer)
- Renamed the unknown_XX FHT80b codes to code_XXXXXX, this will produce
"Undefined type" messages when reading the old save file
- RM100-2 added (thanks for the codes from andikt).
- 2006-08-13 (2.5)
Special thanks to STefan Mayer for a lot of suggestions and bug reports
- If a command is enclosed in {}, then it will be evaluated as a perl
expression, if it is enclosed in "" then it is a shell command, else it is
a "normal" fhz1000 command.
"at" and "notifyon" follow this convention too.
Note: a shell command will always be issued in the background.
- won't die anymore if the at spec contains an unknown command
- rereadcfg added. Sending a HUP should work better now
- escaping % and @ in the notify argument is now possible with %% or @@
- new command trigger to test notify commands
- where you could specify an fhz command, now you can specify a list of
them, separated by ";". Escape is ;;
- KS300 sometimes reports "negative" rain when it begins to rain. Filter
such values. israining is set when the raincounter changed or the ks300
israining bit is set.
- sleep command, with millisecond accuracy
- HMS 100MG support by Peter Stark.
- Making FHT and FS20 messages more uniform
- contrib/fs20_holidays.sh by STefan Mayer
(simulate presence while on holiday)
- webfrontends/pgm4 by STefan Mayer: fs20.php
- KS300 avg. monthly values fixed (hopefully)
- deleted undocumented "exec" function (you can write it now as {...})
- 2006-09-08 (2.6)
- bugfix: updated the examples (hint from Juergen)
- bugfix: leading and trailing whitespaces in commands are ignored now
- feature: making life easier for perl oneliners: see commandref.html
(motivated by STefans suggestions)
- feature: include command and multiline commands in the configfiles (\)
- bugfix: web/pgm2 KS300 rain plot knows about the avg data
- bugfix: the FHT > 25.5 problem. Needs to be tested.
- feature: log unknown devices (peters idea, see notifyon description)
- feature: HMS wildcard device id for all HMS devices. See the define/HMS
section in the commandref.html for details.
NOTE: the wildcard for RM100-2 changed from 1001 to 1003.
(peters idea)
- feature: rolwzo_no_off.sh contrib file (for those who were already closed
out by automatically closing rollades, by Martin)
- feature: the current version (0.4.5) of the pgm3 from Martin.
- 2006-09-13 (2.6a)
- bugfix: the FHT > 25.5 problem again. A never ending story.
- 2006-10-03 (2.7)
- bugfix: Another try on the > 25.5 problem. (Peters suggestion)
- feature: 99_ALARM.pm from Martin (in the contrib directory)
- feature: HMS100TFK von Peter P.
- feature: attribute loglevel
- feature: attribute dummy
- feature: attr command documented
- feature: the current version (0.5a) of the pgm3 from Martin.
- 2006-11-08 (2.8)
- feature: store oldvalue for triggers. perl only. requested by peter.
- feature: inform cmd. Patch by Martin. There are many Martins around here :-)
- bugfix: XML: fix & and < and co
- bugfix: Accept KS300 negative temperature values
- change: the FS20 msg "rain-msg" is called now "activate"
- feature: start/stop rc script from Stefan (in the contrib directory)
- feature: attribute extra_notify: setting the device will trigger a notify
- feature: optional repeat count for the at command
- feature: skip_next attribute for the at command
- feature: WS300 support by Martin. Check the contrib/ws300 directory.
- bugfix: 91_DbLog.pm: retry if the connection is broken by Peter
- feature: Martin's pgm3-0.5.2 (see the CHANGELOG on his webpage)
- feature: RRD logging example by Peter (in the contrib/rrd directory)
- 2006-11-19 (2.9)
- bugfix: fhz1000.pl dies at startup if the savefile does not exist
- bugfix: oldvalue hash is not initialized at startup (peter, Nov 09)
- feature: Notify reorganization (requested by juergen and matthias) :
- inform will be notified on both real events and set or trigger commands
- filelogs will additionally be notified on set or trigger commands
- the extra_notify flag is gone: it is default now, there is a
do_not_notify flag for the opposite behaviour.
- feature: at timespec as a function. Example: at +*{sunset()}
commandref.html and examples revisited.
- feature: 99_SUNRISE.pm added to use with the new at functionality
(replaces the old 99_SUNSET.pm)
- feature: webpgm2 "everything" room, at/notify section, arbitrary command
- bugfix: resetting the KS300
- feature: updated ws300pc (from martin klerx, Nov 08)
- bugfix: parsing timed commands implemented => thermo-off,thermo-on and
activate replaced with timed off-for-timer,on-for-timer and
on-old-for-timer (reported by martin klerx, Nov 08)
- feature: pidfile (requested by peter, Nov 10)
- bugfix: function 81 is not allowed
- 2006-11-27 (2.9a)
- bugfix: FileLog+Unknown device generates undefined messages
- bugfix: trigger with unknown device generates undefined messages
- 2006-12-28 (3.0)
- bugfix: KS300: Make the temperature negative, not the humidity
- bugfix: generate correct xmllist even with fhzdev none (Martin, 12.12)
- feature: one set command can handle multiple devices (range and enumeration)
- feature: new FS20 command on-till
- feature: perl: the current state is stored in the %value hash
- feature: perl: sunset renamed to sunset_rel, sunset_abs added (for on-till)
- feature: perl: isday function added
- feature: follow-on-for-timer attribute added to set the state to off
- bugfix: the ws300pc negative-temp bugfix included (from Martin Klerx)
- feature: version 0.6.2 of the webpgm3 included (from Martin Haas)
- 2007-01-08 (3.1)
- bugfix: delete checks the arg first "exactly", then as a regexp
- bugfix: sun*_rel does not work correctly with offset (Martin)
- feature: FAQ entry on how to install the sunrise stuff.
- feature: the inner core is modified to be able to handle
more than one "IO" device, i.e multiple FHZ at the same time,
or FHZ + FS10 + WS300. Consequences:
- "fhzdev <usbdevice>" replaced with "define <FHZNAME> FHZ <usbdevice>"
- "sendraw <fn> <code>" replaced with "set <FHZNAME> raw <fn> <code>"
- module function parameters changed (for module developers)
- set FHZ activefor dev
- select instead sleep after sending FHZ commands
- the at timer is more exact (around 1msec instead of 1 sec)
- ignoring FS20 device 0001/00/00
- feature: contrib/serial.pm to debug serial devices.
- feature: WS300 integrated: no external program needed (Martin)
- feature: updated to pgm3-0.7.0, see the CHANGELOG at Martins site
- 2007-01-14 (3.2)
- bugfix: example $state changed to $value (remco)
- bugfix: sun*_rel does not work correctly with offset (Sebastian)
- feature: new HMS100TF codes (Sebastian)
- feature: logging unknown HMS with both unique and class ID (Sebastian)
- feature: WS300: "Wetter-Willi-Status", rain_raw/rain_cum added, historic
data (changes by Martin & Markus)
- bugfix: broken rereadcfg / CommandChain after init
(reported by Sebastian and Peter)
- bugfix: sunrise_coord returned "3", which is irritating
- 2007-01-25 (3.3)
- bugfix: 50_WS300.pm fix from Martin
- bugfix: pidfile does not work as expected (reported by Martin)
- bugfix: %U in the log-filename is wrong (bugreport by Juergen)
- feature: %V added to the log-filename
- feature: KS300 wind calibration possibility added
- feature: (software) filtering repeater messages (suggested by Martin)
- feature: the "client" fhz1000.pl can address another host
- bugfix: empty FHT battery is not reported (by Holger)
- feature: new FHT codes, e.g. month/day/hour/minute setting (by Holger)
- ==DATE== (3.4)
- bugfix: deny at +{3}... (only +*{3} allowed), reported by Bernd, 25.02
- bugfix: allow numbers greater then 9 in at +{<number>}
- feature: new 50_WS300.pm from Martin (bugfix + rain statistics, 26.02)
- feature: renamed fhz1000 to fhem

574
fhem/FHEM/00_FHZ.pm Executable file
View File

@ -0,0 +1,574 @@
##############################################
package main;
use strict;
use warnings;
use Time::HiRes qw(gettimeofday);
use Device::SerialPort;
sub FHZ_Write($$$);
sub FHZ_Read($);
sub FHZ_ReadAnswer($$);
sub FhzCrc(@);
sub CheckFhzCrc($);
my $fhzdata = "";
my $msgstart = pack('H*', "81");# Every msg starts wit this
my %gets = (
"init1" => "c9 02011f64",
"init2" => "c9 02011f60",
"init3" => "c9 02011f0a",
"serial" => "04 c90184570208",
"fhtbuf" => "04 c90185",
);
my %sets = (
"time" => "c9 020161",
"initHMS" => "04 c90186",
"initFS20" => "04 c90196",
"FHTcode" => "04 c901839e0101",
"activefor"=> "xx xx",
"raw" => "xx xx",
);
my %setnrparam = (
"time" => 0,
"initHMS" => 0,
"initFS20" => 0,
"FHTcode" => 0,
"activefor"=> 1,
"raw" => 2,
);
my %codes = (
"^8501..\$" => "fhtbuf",
);
my %readings;
my $def;
my %msghist; # Used when more than one FHZ is attached
my $msgcount = 0;
#####################################
# Note: we are a data provider _and_ a consumer at the same time
sub
FHZ_Initialize($)
{
my ($hash) = @_;
$hash->{Category}= "DEV";
# Provider
$hash->{ReadFn} = "FHZ_Read";
$hash->{WriteFn} = "FHZ_Write";
$hash->{Clients} = ":FHZ:FS20:FHT:HMS:KS300:";
# Consumer
$hash->{Match} = "^81..C9..0102";
$hash->{DefFn} = "FHZ_Define";
$hash->{UndefFn} = "FHZ_Undef";
$hash->{GetFn} = "FHZ_Get";
$hash->{SetFn} = "FHZ_Set";
$hash->{StateFn} = "FHZ_SetState";
$hash->{ListFn} = "FHZ_List";
$hash->{ParseFn} = "FHZ_Parse";
}
#####################################
sub
FHZ_Set($@)
{
my ($hash, @a) = @_;
return "Need one to three parameter" if(@a > 4);
return "invalid parameter, use one of:\n " . join("\n ", sort keys %sets)
if(!defined($sets{$a[1]}));
return "Wrong number of parameters, need " . ($setnrparam{$a[1]} + 2)
if(@a != ($setnrparam{$a[1]} + 2));
my ($fn, $arg) = split(" ", $sets{$a[1]});
my $v = join(" ", @a);
Log GetLogLevel("FHZ"), "FHZ set $v";
if($a[1] eq "activefor") {
my $dhash = $defs{$a[2]};
return "device $a[2] unknown" if(!defined($dhash));
return "Cannot handle $dhash->{TYPE} devices"
if($devmods{FHZ}->{Clients} !~ m/:$dhash->{TYPE}:/);
$dhash->{IODev} = $hash;
return undef;
} elsif($a[1] eq "raw") {
$fn = $a[2];
$arg = $a[3];
} elsif($a[1] eq "time") {
my @t = localtime;
$arg .= sprintf("%02x%02x%02x%02x%02x",
$t[5]%100, $t[4]+1, $t[3], $t[2], $t[1]);
} elsif($a[1] eq "FHTcode") {
return "invalid argument, must be hex" if(!$a[2] ||
$a[2] !~ m/^[A-F0-9]{2}$/);
$arg .= $a[2];
}
FHZ_Write($hash, $fn, $arg) if(!IsDummy("FHZ"));
return undef;
}
#####################################
sub
FHZ_Get($@)
{
my ($hash, @a) = @_;
return "\"get FHZ\" needs only one parameter" if(@a != 2);
if(!defined($gets{$a[1]})) {
return "Unknown set value $a[1], please specify one of: " .
join(" ", sort(keys %gets));
}
my ($fn, $arg) = split(" ", $gets{$a[1]});
my $v = join(" ", @a);
Log GetLogLevel("FHZ"), "FHZ get $v";
FHZ_Write($hash, $fn, $arg) if(!IsDummy("FHZ"));
my $msg = FHZ_ReadAnswer($hash, $a[1]);
return $msg if(!$msg || $msg !~ /^81..c9..0102/);
if($a[1] eq "serial") {
$v = substr($msg, 22, 8)
} elsif($a[1] eq "fhtbuf") {
$v = substr($msg, 16, 2);
} else {
$v = substr($msg, 12);
}
$readings{$a[1]}{VAL} = $v;
$readings{$a[1]}{TIM} = TimeNow();
return "$a[0] $a[1] => $v";
}
#####################################
sub
FHZ_List($)
{
my ($hash) = @_;
my $str = "";
foreach my $m (sort keys %readings) {
$str .= sprintf("%-19s %-15s %s\n",
$readings{$m}{TIM},$m,$readings{$m}{VAL});
}
return $str;
}
#####################################
sub
FHZ_SetState($$$$)
{
my ($hash, $tim, $vt, $val) = @_;
return "Undefined value $vt" if(!defined($gets{$vt}));
if(!$readings{$vt} || $readings{$vt}{TIM} lt $tim) {
$readings{$vt}{TIM} = $tim;
$readings{$vt}{VAL} = $val;
}
return undef;
}
#####################################
sub
DoInit($)
{
my $name = shift;
my @init;
push(@init, "get $name init2");
push(@init, "get $name serial");
push(@init, "set $name initHMS");
push(@init, "set $name initFS20");
push(@init, "set $name time");
# Workaround: Sending "set 0001 00 off" after initialization to enable
# the fhz1000 receiver, else we won't get anything reported.
push(@init, "set $name raw 04 01010100010000");
CommandChain(3, \@init);
}
#####################################
sub
FHZ_Define($$)
{
my ($hash, @a) = @_;
$hash->{STATE} = "Initialized";
delete $hash->{PortObj};
delete $hash->{FD};
my $dev = $a[2];
if($dev eq "none") {
Log 1, "FHZ device is none, commands will be echoed only";
return undef;
}
my $po = new Device::SerialPort ($dev);
return "Can't open $dev: $!\n" if(!$po);
$po->reset_error();
$po->baudrate(9600);
$po->databits(8);
$po->parity('none');
$po->stopbits(1);
$po->handshake('none');
$hash->{PortObj} = $po;
$hash->{FD} = $po->FILENO;
$hash->{DeviceName} = $dev;
DoInit($a[0]);
return undef;
}
#####################################
sub
FHZ_Undef($$)
{
my ($hash, $arg) = @_;
foreach my $d (keys %defs) {
if(defined($defs{$d}) &&
defined($defs{$d}{IODev}) &&
$defs{$d}{IODev} == $hash)
{
Log 4, "deleting port for $d";
delete $defs{$d}{IODev};
}
}
$hash->{PortObj}->close();
return undef;
}
#####################################
sub
FHZ_Parse($$)
{
my ($hash,$msg) = @_;
my $omsg = $msg;
$msg = substr($msg, 12); # The first 12 bytes are not really interesting
my $type = "";
foreach my $c (keys %codes) {
if($msg =~ m/$c/) {
$type = $codes{$c};
last;
}
}
if(!$type) {
Log 4, "FHZ unknown: $omsg";
$def->{CHANGED}[0] = "$msg";
return $hash->{NAME};
}
if($type eq "fhtbuf") {
$msg = substr($msg, 4, 2);
}
Log 4, "FHZ $type: $msg)";
$def->{CHANGED}[0] = "$type: $msg";
return $hash->{NAME};
}
#####################################
sub
FhzCrc(@)
{
my $sum = 0;
map { $sum += $_; } @_;
return $sum & 0xFF;
}
#####################################
sub
CheckFhzCrc($)
{
my $msg = shift;
return 0 if(length($msg) < 8);
my @data;
for(my $i = 8; $i < length($msg); $i += 2) {
push(@data, ord(pack('H*', substr($msg, $i, 2))));
}
my $crc = hex(substr($msg, 6, 2));
# FS20 Repeater generate a CRC which is one or two greater then the computed
# one. The FHZ1000 filters such pakets, so we do not see them
return (($crc eq FhzCrc(@data)) ? 1 : 0);
}
#####################################
# This is a direct read for commands like get
sub
FHZ_ReadAnswer($$)
{
my ($hash,$arg) = @_;
return undef if(!$hash || !defined($hash->{FD}));
my ($mfhzdata, $rin) = ("", '');
for(;;) {
vec($rin, $hash->{FD}, 1) = 1;
my $nfound = select($rin, undef, undef, 3);
if($nfound < 0) {
next if ($! == EAGAIN() || $! == EINTR() || $! == 0);
die("Select error $nfound / $!\n");
}
return "Timeout reading answer for get $arg" if($nfound == 0);
my $buf = $hash->{PortObj}->input();
Log 5, "FHZ/RAW: " . unpack('H*',$buf);
$mfhzdata .= $buf;
next if(length($mfhzdata) < 2);
my $len = ord(substr($mfhzdata,1,1)) + 2;
if($len>20) {
Log 1, "Oversized message (" . unpack('H*',$mfhzdata) .
"), dropping it ...";
return undef;
}
return unpack('H*', $mfhzdata) if(length($mfhzdata) == $len);
}
}
##############
sub
FHZ_CompleteMsg($$)
{
my ($fn,$msg) = @_;
my $len = length($msg);
my @data;
for(my $i = 0; $i < $len; $i += 2) {
push(@data, ord(pack('H*', substr($msg, $i, 2))));
}
return pack('C*', 0x81, $len/2+2, ord(pack('H*',$fn)), FhzCrc(@data), @data);
}
#####################################
sub
FHZ_Write($$$)
{
my ($hash,$fn,$msg) = @_;
if(!$hash || !defined($hash->{PortObj})) {
Log 5, "FHZ device $hash->{NAME} is not active, cannot send";
return;
}
###############
# insert value into the msghist. At the moment this only makes sense for FS20
# devices. As the transmitted value differs from the received one, we have to
# recompute.
if($fn eq "04" && substr($msg,0,6) eq "010101") {
my $nmsg = "0101a001" . substr($msg, 6, 6) . "00" . substr($msg, 12);
$msghist{$msgcount}{TIME} = gettimeofday();
$msghist{$msgcount}{NAME} = $hash->{NAME};
$msghist{$msgcount}{MSG} = unpack('H*', FHZ_CompleteMsg($fn, $nmsg));
$msgcount++;
}
my $bstring = FHZ_CompleteMsg($fn, $msg);
Log 5, "Sending " . unpack('H*', $bstring);
if(!$hash->{QUEUECNT}) {
$hash->{PortObj}->write($bstring);
##############
# 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, "FHZ_HandleWriteQueue", $hash);
} elsif($hash->{QUEUECNT} == 1) {
$hash->{QUEUE} = [ $bstring ];
} else {
push(@{$hash->{QUEUE}}, $bstring);
}
$hash->{QUEUECNT}++;
}
#####################################
sub
FHZ_HandleWriteQueue($)
{
my $hash = shift;
my $cnt = --$hash->{QUEUECNT};
if($cnt > 0) {
my $bstring = shift(@{$hash->{QUEUE}});
$hash->{PortObj}->write($bstring);
InternalTimer(gettimeofday()+0.25, "FHZ_HandleWriteQueue", $hash);
}
}
#####################################
sub
FHZ_Read($)
{
my ($hash) = @_;
my $buf = $hash->{PortObj}->input();
my $iohash = $devmods{$hash->{TYPE}};
my $name = $hash->{NAME};
###########
# Lets' try again: Some drivers return len(0) on the first read...
if(defined($buf) && length($buf) == 0) {
$buf = $hash->{PortObj}->input();
}
if(!defined($buf) || length($buf) == 0) {
my $devname = $hash->{DeviceName};
Log 1, "USB device $devname disconnected, waiting to reappear";
$hash->{PortObj}->close();
for(;;) {
sleep(5);
$hash->{PortObj} = new Device::SerialPort($devname);
if($hash->{PortObj}) {
Log 1, "USB device $devname reappeared";
$hash->{FD} = $hash->{PortObj}->FILENO;
DoInit($name);
return;
}
}
}
Log 5, "FHZ/RAW: " . unpack('H*',$buf) .
" (Unparsed: " . unpack('H*', $fhzdata) . ")";
$fhzdata .= $buf;
while(length($fhzdata) > 2) {
###################################
# Skip trash.
my $si = index($fhzdata, $msgstart);
if($si) {
if($si == -1) {
Log(5, "Bogus message received, no start character found");
$fhzdata = "";
last;
} else {
Log(5, "Bogus message received, skipping to start character");
$fhzdata = substr($fhzdata, $si);
}
}
my $len = ord(substr($fhzdata,1,1)) + 2;
if($len>20) {
Log 4,
"Oversized message (" . unpack('H*',$fhzdata) . "), dropping it ...";
$fhzdata = "";
next;
}
last if(length($fhzdata) < $len);
my $dmsg = unpack('H*', substr($fhzdata, 0, $len));
if(CheckFhzCrc($dmsg)) {
if(substr($fhzdata,2,1) eq $msgstart) { # Skip function 0x81
$fhzdata = substr($fhzdata, 2);
next;
}
###############
# check for duplicate msg from different FHZ's
my $now = gettimeofday();
my $skip;
my $meetoo = ($attr{$name}{repeater} ? 1 : 0);
my $to = 3;
if(defined($attr{$name}) && defined($attr{$name}{filtertimeout})) {
$to = $attr{$name}{filtertimeout};
}
foreach my $oidx (keys %msghist) {
if($now-$msghist{$oidx}{TIME} > $to) {
delete($msghist{$oidx});
next;
}
if($msghist{$oidx}{MSG} eq $dmsg &&
($meetoo || $msghist{$oidx}{NAME} ne $name)) {
Log 5, "Skipping $msghist{$oidx}{MSG}";
$skip = 1;
}
}
goto NEXTMSG if($skip);
$msghist{$msgcount}{TIME} = $now;
$msghist{$msgcount}{NAME} = $name;
$msghist{$msgcount}{MSG} = $dmsg;
$msgcount++;
my @found;
foreach my $m (sort { $devmods{$a}{ORDER} cmp $devmods{$b}{ORDER} }
keys %devmods) {
next if($iohash->{Clients} !~ m/:$m:/);
next if($dmsg !~ m/$devmods{$m}{Match}/i);
no strict "refs";
@found = &{$devmods{$m}{ParseFn}}($hash,$dmsg);
use strict "refs";
last if(int(@found));
}
if(!int(@found)) {
Log 1, "Unknown code $dmsg, help me!";
goto NEXTMSG;
}
goto NEXTMSG if($found[0] eq ""); # Special return: Do not notify
if($found[0] =~ m/^(UNDEFINED) ([^ ]*) (.*)$/) {
my $d = $1;
$defs{$d}{NAME} = $1;
$defs{$d}{TYPE} = $2;
DoTrigger($d, "$2 $3");
delete $defs{$d};
goto NEXTMSG;
}
foreach my $found (@found) {
DoTrigger($found, undef);
}
NEXTMSG:
$fhzdata = substr($fhzdata, $len);
} else {
Log 4, "Bad CRC message, skipping it (Bogus message follows)";
$fhzdata = substr($fhzdata, 2);
}
}
}
1;

331
fhem/FHEM/10_FS20.pm Executable file
View File

@ -0,0 +1,331 @@
##############################################
package main;
use strict;
use warnings;
my %codes = (
"00" => "off",
"01" => "dim06%",
"02" => "dim12%",
"03" => "dim18%",
"04" => "dim25%",
"05" => "dim31%",
"06" => "dim37%",
"07" => "dim43%",
"08" => "dim50%",
"09" => "dim56%",
"0a" => "dim62%",
"0b" => "dim68%",
"0c" => "dim75%",
"0d" => "dim81%",
"0e" => "dim87%",
"0f" => "dim93%",
"10" => "dim100%",
"11" => "on", # Set to previous dim value (before switching it off)
"12" => "toggle", # between off and previous dim val
"13" => "dimup",
"14" => "dimdown",
"15" => "dimupdown",
"16" => "timer",
"17" => "sendstate",
"18" => "off-for-timer",
"19" => "on-for-timer",
"1a" => "on-old-for-timer",
"1b" => "reset",
"1c" => "ramp-on-time", #time to reach the desired dim value on dimmers
"1d" => "ramp-off-time", #time to reach the off state on dimmers
);
my %readonly = (
"thermo-on" => 1,
"thermo-off" => 1,
);
use vars qw(%fs20_c2b); # Peter would like to access it from outside
my %defptr;
my %readings;
my %follow;
sub
FS20_Initialize($)
{
my ($hash) = @_;
foreach my $k (keys %codes) {
$fs20_c2b{$codes{$k}} = $k;
}
$fs20_c2b{"on-till"} = 99;
$hash->{Category} = "DEV";
$hash->{Match} = "^81..(04|0c)..0101a001";
$hash->{SetFn} = "FS20_Set";
$hash->{GetFn} = "FS20_Get";
$hash->{ListFn} = "FS20_List";
$hash->{StateFn} = "FS20_SetState";
$hash->{DefFn} = "FS20_Define";
$hash->{UndefFn} = "FS20_Undef";
$hash->{ParseFn} = "FS20_Parse";
}
###################################
sub
FS20_Get($@)
{
my ($hash, @a) = @_;
return "No get function implemented";
}
###################################
sub
FS20_List($)
{
my ($hash) = @_;
my $n = $hash->{NAME};
if(!defined($readings{$n})) {
return "No information about $n\n";
} else {
return sprintf("%-19s %s\n", $readings{$n}{TIM}, $readings{$n}{VAL});
}
}
#####################################
sub
FS20_SetState($$$$)
{
my ($hash, $tim, $vt, $val) = @_;
return "Undefined value $vt" if(!defined($fs20_c2b{$vt}));
my $name = $hash->{NAME};
if(!$readings{$name} || $readings{$name}{TIM} lt $tim) {
$readings{$name}{TIM} = $tim;
$readings{$name}{VAL} = $vt;
}
return undef;
}
#############################
sub
Do_On_Till($@)
{
my ($hash, @a) = @_;
return "Timespec (HH:MM[:SS]) needed for the on-till command" if(@a != 3);
my ($err, $hr, $min, $sec, $fn) = GetTimeSpec($a[2]);
return $err if($err);
my @lt = localtime;
my $hms_till = sprintf("%02d:%02d:%02d", $hr, $min, $sec);
my $hms_now = sprintf("%02d:%02d:%02d", $lt[2], $lt[1], $lt[0]);
if($hms_now ge $hms_till) {
Log 4, "on-till: won't switch as now ($hms_now) is later than $hms_till";
return "";
}
my @b = ($a[0], "on");
FS20_Set($hash, @b);
CommandAt(undef, "$hms_till set $a[0] off");
}
###################################
sub
FS20_Set($@)
{
my ($hash, @a) = @_;
my $ret = undef;
my $na = int(@a);
return "no set value specified" if($na < 2 || $na > 3);
return "Readonly value $a[1]" if(defined($readonly{$a[1]}));
my $c = $fs20_c2b{$a[1]};
if(!defined($c)) {
return "Unknown set value $a[1], please specify one of:\n " .
join("\n ", sort(keys %fs20_c2b));
}
return Do_On_Till($hash, @a) if($a[1] eq "on-till");
return "Bad time spec" if($na == 3 && $a[2] !~ m/^\d*\.?\d+$/);
my $v = join(" ", @a);
Log GetLogLevel($a[0]), "FS20 set $v";
(undef, $v) = split(" ", $v, 2); # Not interested in the name...
my $val;
if($na == 2) {
IOWrite($hash, "04", "010101" . $hash->{XMIT} . $hash->{BTN} . $c)
if(!IsDummy($a[0]));
} else {
$c =~ s/1/3/; # Set the extension bit
########################
# Calculating the time.
LOOP: for(my $i = 0; $i <= 12; $i++) {
for(my $j = 0; $j <= 15; $j++) {
$val = (2**$i)*$j*0.25;
if($val >= $a[2]) {
if($val != $a[2]) {
$ret = "FS20 Setting timeout to $val from $a[2]";
Log GetLogLevel($a[0]), $ret;
}
$c .= sprintf("%x%x", $i, $j);
last LOOP;
}
}
}
return "Specified timeout too large, max is 15360" if(length($c) == 2);
IOWrite($hash, "04", "010101" . $hash->{XMIT} . $hash->{BTN} . $c)
if(!IsDummy($a[0]));
}
###########################################
# Set the state of a device to off if on-for-timer is called
if($follow{$a[0]}) {
CommandDelete(undef, "at .*setstate.*$a[0]");
delete $follow{$a[0]};
}
if($a[1] eq "on-for-timer" && $na == 3 &&
defined($attr{$a[0]}) && defined($attr{$a[0]}{"follow-on-for-timer"})) {
my $to = sprintf("%02d:%02d:%02d", $val/3600, ($val%3600)/60, $val%60);
$follow{$a[0]} = $to;
Log 4, "Follow: +$to setstate $a[0] off";
CommandAt(undef, "+$to setstate $a[0] off");
}
##########################
# Look for all devices with the same code, and set state, timestamp
my $code = "$hash->{XMIT} $hash->{BTN}";
my $tn = TimeNow();
foreach my $n (keys %{ $defptr{$code} }) {
$defptr{$code}{$n}->{CHANGED}[0] = $v;
$defptr{$code}{$n}->{STATE} = $v;
$readings{$n}{TIM} = $tn;
$readings{$n}{VAL} = $v;
}
return $ret;
}
#############################
sub
FS20_Define($@)
{
my ($hash, @a) = @_;
my $u =
"wrong syntax: define <name> FS20 housecode addr [fg addr] [lm addr] [gm FF]";
return $u if(int(@a) < 4);
return "Define $a[0]: wrong housecode format: specify a 4 digit hex value"
if($a[2] !~ m/^[a-f0-9]{4}$/i);
return "Define $a[0]: wrong btn format: specify a 2 digit hex value"
if($a[3] !~ m/^[a-f0-9]{2}$/i);
$hash->{XMIT} = lc($a[2]);
$hash->{BTN} = lc($a[3]);
my $code = "$a[2] $a[3]";
my $ncode = 1;
my $name = $a[0];
$hash->{CODE}{$ncode++} = $code;
$defptr{$code}{$name} = $hash;
for(my $i = 4; $i < int(@a); $i += 2) {
return "No address specified for $a[$i]" if($i == int(@a)-1);
$a[$i] = lc($a[$i]);
if($a[$i] eq "fg") {
return "Bad fg address, see the doc" if($a[$i+1] !~ m/^f[a-f0-9]$/);
} elsif($a[$i] eq "lm") {
return "Bad lm address, see the doc" if($a[$i+1] !~ m/^[a-f0-9]f$/);
} elsif($a[$i] eq "gm") {
return "Bad gm address, mus be ff" if($a[$i+1] ne "ff");
} else {
return $u;
}
$code = "$a[2] $a[$i+1]";
$hash->{CODE}{$ncode++} = $code;
$defptr{$code}{$name} = $hash;
}
AssignIoPort($hash);
}
#############################
sub
FS20_Undef($$)
{
my ($hash, $name) = @_;
foreach my $c (keys %{ $hash->{CODE} } ) {
delete($defptr{$c}{$name});
}
return undef;
}
sub
FS20_Parse($)
{
my ($hash, $msg) = @_;
# Msg format:
# 81 0b 04 f7 0101 a001 HHHH 01 00 11
my $dev = substr($msg, 16, 4);
my $btn = substr($msg, 20, 2);
my $cde = substr($msg, 24, 2);
my $def = $defptr{"$dev $btn"};
my $dur = 0;
my $cx = hex($cde);
if($cx & 0x20) {
$dur = hex(substr($msg, 26, 2));
my $i = ($dur & 0xf0) / 16;
my $j = ($dur & 0xf);
$dur = (2**$i)*$j*0.25;
$cde = sprintf("%02x", $cx & ~0x20);
}
my $v = $codes{$cde};
$v = "unknown:$cde" if(!defined($v));
$v .= " $dur" if($dur);
if($def) {
my @list;
foreach my $n (keys %{ $def }) {
$readings{$n}{TIM} = TimeNow();
$readings{$n}{VAL} = $v;
$def->{$n}->{CHANGED}[0] = $v;
$def->{$n}->{STATE} = $v;
Log GetLogLevel($n), "FS20 $n $v";
push(@list, $n);
}
return @list;
} else {
# Special FHZ initialization parameter. In Multi-FHZ-Mode we receive
# it by the second FHZ
return "" if($dev eq "0001" && $btn eq "00" && $cde eq "00");
Log 3, "FS20 Unknown device $dev, Button $btn Code $cde ($v), " .
"please define it";
return "UNDEFINED FS20 $dev/$btn/$cde";
}
}
1;

404
fhem/FHEM/20_FHT.pm Executable file
View File

@ -0,0 +1,404 @@
##############################################
package main;
use strict;
use warnings;
my %codes = (
"0000.6" => "actuator",
"00002c" => "synctime", # Not verified
"0100.6" => "actuator1", # Not verified (1-8)
"0200.6" => "actuator2",
"0300.6" => "actuator3",
"0400.6" => "actuator4",
"0500.6" => "actuator5",
"0600.6" => "actuator6",
"0700.6" => "actuator7",
"0800.6" => "actuator8",
"140069" => "mon-from1",
"150069" => "mon-to1",
"160069" => "mon-from2",
"170069" => "mon-to2",
"180069" => "tue-from1",
"190069" => "tue-to1",
"1a0069" => "tue-from2",
"1b0069" => "tue-to2",
"1c0069" => "wed-from1",
"1d0069" => "wed-to1",
"1e0069" => "wed-from2",
"1f0069" => "wed-to2",
"200069" => "thu-from1",
"210069" => "thu-to1",
"220069" => "thu-from2",
"230069" => "thu-to2",
"240069" => "fri-from1",
"250069" => "fri-to1",
"260069" => "fri-from2",
"270069" => "fri-to2",
"280069" => "sat-from1",
"290069" => "sat-to1",
"2a0069" => "sat-from2",
"2b0069" => "sat-to2",
"2c0069" => "sun-from1",
"2d0069" => "sun-to1",
"2e0069" => "sun-from2",
"2f0069" => "sun-to2",
"3e0069" => "mode",
"3f0069" => "holiday1", # Not verified
"400069" => "holiday2", # Not verified
"410069" => "desired-temp",
"XX0069" => "measured-temp", # sum of next. two, never "really" sent
"420069" => "measured-low",
"430069" => "measured-high",
"440069" => "state",
"600069" => "year",
"610069" => "month",
"620069" => "day",
"630069" => "hour",
"640069" => "minute",
"650069" => "init",
"820069" => "day-temp",
"840069" => "night-temp",
"850069" => "unknown_85",
"8a0069" => "windowopen-temp",
"0000aa" => "code_0000aa",
"0000ba" => "code_0000ba",
"430079" => "code_430079",
"440079" => "code_440079",
"4b0067" => "code_4b004b",
"4b0077" => "code_4b0077",
"7e0067" => "code_7e0067",
);
my %cantset = (
"actuator" => 1,
"actuator1" => 1,
"actuator2" => 1,
"actuator3" => 1,
"actuator4" => 1,
"actuator5" => 1,
"actuator6" => 1,
"actuator7" => 1,
"actuator8" => 1,
"synctime" => 1,
"measured-temp" => 1,
"measured-high" => 1,
"measured-low" => 1,
"state" => 1,
"init" => 1,
"code_0000aa" => 1,
"code_0000ba" => 1,
"code_430079" => 1,
"code_440079" => 1,
"code_4b004b" => 1,
"code_4b0077" => 1,
"code_7e0067" => 1,
);
my %nosetarg = (
"help" => 1,
"refreshvalues" => 1,
);
my %c2m = (0 => "auto", 1 => "manual", 2 => "holiday");
my %m2c = ("auto" => 0, "manual" => 1, "holiday" => 2);
my %readings;
my %defptr;
my %c2b; # command->button hash (reverse of codes)
my %c2bset; # Setteable values
#####################################
sub
FHT_Initialize($)
{
my ($hash) = @_;
foreach my $k (keys %codes) {
my $v = $codes{$k};
$c2b{$v} = $k;
$c2bset{$v} = substr($k, 0, 2) if(!defined($cantset{$v}));
}
$c2bset{refreshvalues} = "65ff66ff";
$hash->{Category} = "DEV";
# 810c0426 0909a001 1111 1600
# 810c04b3 0909a001 1111 44006900
# 810b0402 83098301 1111 41301d
# 81090421 c409c401 1111 00
# 810c0d20 0909a001 3232 7e006724 (NYI)
$hash->{Match} = "^81..(04|09|0d)..(0909a001|83098301|c409c401)..";
$hash->{SetFn} = "FHT_Set";
$hash->{GetFn} = "FHT_Get";
$hash->{StateFn} = "FHT_SetState";
$hash->{ListFn} = "FHT_List";
$hash->{DefFn} = "FHT_Define";
$hash->{UndefFn} = "FHT_Undef";
$hash->{ParseFn} = "FHT_Parse";
}
#####################################
sub
FHT_Set($@)
{
my ($hash, @a) = @_;
my $ret = undef;
return "\"set $a[0]\" needs two parameters"
if(@a != 3 && !(@a == 2 && $nosetarg{$a[1]}));
return "invalid parameter, use one of:\n " .
join("\n ", sort {$c2bset{$a} cmp $c2bset{$b} } keys %c2bset)
if(!defined($c2bset{$a[1]}));
Log GetLogLevel($a[0]), "FHT set " . join(" ", @a);
my $arg = "020183" . $hash->{CODE} . $c2bset{$a[1]};
if($a[1] eq "refreshvalues") {
# This is special. Without the sleep the next FHT won't send its data
if(!IsDummy($a[0])) {
my $havefhz;
$havefhz = 1 if($hash->{IODev} && defined($hash->{IODev}->{FD}));
IOWrite($hash, "04", $arg);
sleep(1) if($havefhz);
IOWrite($hash, "04", "c90185"); # Check the fht buffer
sleep(1) if($havefhz);
}
return $ret;
} elsif($a[1] =~ m/-temp/) {
return "Invalid temperature, use NN.N" if($a[2] !~ m/^\d*\.?\d+$/);
my $a = int($a[2]*2);
$arg .= sprintf("%02x", $a);
$ret = "Rounded temperature to " . $a/2 if($a/2 != $a[2]);
} elsif($a[1] =~ m/-from/ || $a[1] =~ m/-to/) {
return "Invalid timeformat, use HH:MM" if($a[2] !~ m/^([0-2]\d):([0-5]\d)/);
my $a = ($1*6) + ($2/10);
$arg .= sprintf("%02x", $a);
my $nt = sprintf("%02d:%02d", $1, ($2/10)*10);
$ret = "Rounded time to $nt" if($nt ne $a[2]);
} elsif($a[1] eq "mode") {
return "Invalid mode, use one of " . join(" ", sort keys %m2c)
if(!defined($m2c{$a[2]}));
$arg .= sprintf("%02x", $m2c{$a[2]});
} else { # Holiday1, Holiday2
$arg .= sprintf("%02x", $a[2]);
}
IOWrite($hash, "04", $arg) if(!IsDummy($a[0]));
return $ret;
}
#####################################
sub
FHT_Get($@)
{
my ($hash,@a) = @_;
return "NYI";
}
#####################################
sub
FHT_List($)
{
my ($hash) = @_;
my $n = $hash->{CODE};
if(!defined($readings{$n})) {
return "No information about " . $hash->{NAME} . "\n";
} else {
my $str = "";
foreach my $m (sort { $c2b{$a} cmp $c2b{$b} } keys %{ $readings{$n} }) {
$str .= sprintf("%-19s %-15s %s\n",
$readings{$n}{$m}{TIM}, $m, $readings{$n}{$m}{VAL});
}
return $str;
}
}
#####################################
sub
FHT_SetState($$$$)
{
my ($hash, $tim, $vt, $val) = @_;
return "Undefined type $vt" if(!defined($c2b{$vt}));
my $n = $hash->{CODE};
if(!$readings{$n}{$vt} || $readings{$n}{$vt}{TIM} lt $tim) {
$readings{$n}{$vt}{TIM} = $tim;
$readings{$n}{$vt}{VAL} = $val;
}
return undef;
}
#####################################
sub
FHT_Define($@)
{
my ($hash, @a) = @_;
return "wrong syntax: define <name> FHT CODE" if(int(@a) != 3);
$a[2] = lc($a[2]);
return "Define $a[0]: wrong CODE format: specify a 4 digit hex value"
if($a[2] !~ m/^[a-f0-9][a-f0-9][a-f0-9][a-f0-9]$/i);
$hash->{CODE} = $a[2];
$defptr{$a[2]} = $hash;
AssignIoPort($hash);
Log 1, "Asking the FHT device $a[0]/$a[2] to send its data";
FHT_Set($hash, ($a[0], "refreshvalues"));
return undef;
}
#####################################
sub
FHT_Undef($$)
{
my ($hash, $name) = @_;
delete($defptr{$hash->{CODE}});
return undef;
}
#####################################
sub
FHT_Parse($$)
{
my ($hash,$msg) = @_;
my $dev = substr($msg, 16, 4);
my $cde = substr($msg, 20, 6);
my $val = substr($msg, 26, 2) if(length($msg) > 26);
if(!defined($defptr{$dev})) {
Log 3, "FHT Unknown device $dev, please define it";
return "UNDEFINED FHT $dev";
}
my $def = $defptr{$dev};
# Unknown, but don't want report it. Should come with c409c401
if($cde eq "00") {
return "";
}
if(length($cde) < 6) {
Log 4, "FHT Unknown code from $def->{NAME} : $cde";
$def->{CHANGED}[0] = "unknown code $cde";
return $def->{NAME};
}
if(!$val) {
# This is a confirmation message. We reformat it so that
# it looks like a real message, and let the rest parse it
Log 4, "FHT $def->{NAME} confirmation: $cde)";
$val = substr($cde, 2, 2);
$cde = substr($cde, 0, 2) . "0069";
}
my $type;
foreach my $c (keys %codes) {
if($cde =~ m/$c/) {
$type = $codes{$c};
last;
}
}
$val = hex($val);
if(!$type) {
Log 4, "FHT $def->{NAME} (Unknown: $cde => $val)";
$def->{CHANGED}[0] = "unknown $cde: $val";
return $def->{NAME};
}
my $tn = TimeNow();
###########################
# Reformat the values so they are readable
if($type eq "actuator") {
$val = sprintf("%02d%%", int(100*$val/255 + 0.5));
} elsif($cde ge "140069" && $cde le "2f0069") { # Time specs
Log 5, "FHT $def->{NAME} ($type: $val)";
return "" if($val == 144); # Empty, forget it
my $hour = $val / 6;
my $min = ($val % 6) * 10;
$val = sprintf("%02d:%02d", $hour, $min);
} elsif($type eq "mode") {
$val = $c2m{$val} if(defined($c2m{$val}));
} elsif($type eq "measured-low") {
$readings{$dev}{$type}{TIM} = $tn;
$readings{$dev}{$type}{VAL} = $val;
return "";
} elsif($type eq "measured-high") {
$readings{$dev}{$type}{TIM} = $tn;
$readings{$dev}{$type}{VAL} = $val;
if(defined($readings{$dev}{"measured-low"}{VAL})) {
$val = $val*256 + $readings{$dev}{"measured-low"}{VAL};
$val /= 10;
$val = sprintf("%.1f (Celsius)", $val);
$type = "measured-temp"
} else {
return "";
}
} elsif($type =~ m/.*-temp/) {
$val = sprintf("%.1f (Celsius)", $val / 2)
} elsif($type eq "state") {
my $nval;
$nval = "Bat: " . (($val & 1) ? "empty" : "ok");
$nval .= ", Window: " . (($val & 32) ? "open" : "closed");
$nval .= ", Fault: " . (($val & 16) ? "yes" : "no");
$val = $nval;
} elsif($type =~ m/echo_/) { # Ignore these messages
return "";
}
$readings{$dev}{$type}{TIM} = $tn;
$readings{$dev}{$type}{VAL} = $val;
Log 4, "FHT $def->{NAME} ($type: $val)";
$def->{CHANGED}[0] = "$type: $val";
$def->{STATE} = "$type: $val" if($type eq "measured-temp");
return $def->{NAME};
}
1;

262
fhem/FHEM/30_HMS.pm Executable file
View File

@ -0,0 +1,262 @@
##############################################
package main;
use strict;
use warnings;
my %codes = (
"0" => "HMS100TF",
"1" => "HMS100T",
"2" => "HMS100WD",
"3" => "RM100-2",
"4" => "HMS100TFK", # Depending on the onboard jumper it is 4 or 5
"5" => "HMS100TFK",
"6" => "HMS100MG",
);
my %readings;
my %defptr;
#####################################
sub
HMS_Initialize($)
{
my ($hash) = @_;
$hash->{Category} = "DEV";
# 810e047e0510a001473a000000120233 HMS100TF
# 810e04b90511a0018e63000001100000 HMS100T
# 810e04e80212a001ec46000001000000 HMS100WD
# 810e04d70213a001b16d000003000000 RM100-2
# 810e047f0214a001a81f000001000000 HMS100TFK
# 810e048f0295a0010155000001000000 HMS100TFK (jumper)
# 810e04330216a001b4c5000001000000 HMS100MG
$hash->{Match} = "^810e04....(1|5|9)[0-6]a001";
$hash->{SetFn} = "HMS_Set";
$hash->{GetFn} = "HMS_Get";
$hash->{StateFn} = "HMS_SetState";
$hash->{ListFn} = "HMS_List";
$hash->{DefFn} = "HMS_Define";
$hash->{UndefFn} = "HMS_Undef";
$hash->{ParseFn} = "HMS_Parse";
}
###################################
sub
HMS_Set($@)
{
my ($hash, @a) = @_;
return "No set function implemented";
}
###################################
sub
HMS_Get($@)
{
my ($hash,@a) = @_;
return "No get function implemented";
}
#####################################
sub
HMS_SetState($$$$)
{
my ($hash, $tim, $vt, $val) = @_;
my $n = $hash->{CODE};
if(!$readings{$n}{$vt} || $readings{$n}{$vt}{TIM} lt $tim) {
$readings{$n}{$vt}{TIM} = $tim;
$readings{$n}{$vt}{VAL} = $val;
}
return undef;
}
#####################################
sub
HMS_List($)
{
my ($hash) = @_;
my $n = $hash->{CODE};
if(!defined($readings{$n})) {
return "No information about " . $hash->{NAME} . "\n";
} else {
my $str = "";
foreach my $m (keys %{ $readings{$n} }) {
$str .= sprintf("%-19s %-15s %s\n",
$readings{$n}{$m}{TIM}, $m, $readings{$n}{$m}{VAL});
}
return $str;
}
}
#####################################
sub
HMS_Define($@)
{
my ($hash, @a) = @_;
return "wrong syntax: define <name> HMS CODE" if(int(@a) != 3);
$a[2] = lc($a[2]);
return "Define $a[0]: wrong CODE format: specify a 4 digit hex value"
if($a[2] !~ m/^[a-f0-9][a-f0-9][a-f0-9][a-f0-9]$/);
$hash->{CODE} = $a[2];
$defptr{$a[2]} = $hash;
return undef;
}
#####################################
sub
HMS_Undef($$)
{
my ($hash, $name) = @_;
delete($defptr{$hash->{CODE}});
return undef;
}
#####################################
sub
HMS_Parse($$)
{
my ($hash, $msg) = @_;
my $dev = substr($msg, 16, 4);
my $cde = substr($msg, 11, 1);
my $val = substr($msg, 24, 8) if(length($msg) == 32);
my $type = "";
foreach my $c (keys %codes) {
if($cde =~ m/$c/) {
$type = $codes{$c};
last;
}
}
# As the HMS devices change their id on each battery change, we offer
# a wildcard too for each type: 100<device-code>,
my $odev = $dev;
if(!defined($defptr{$dev})) {
Log 4, "HMS device $dev not defined, using the wildcard device 100$cde";
$dev = "100$cde";
}
if(!defined($defptr{$dev})) {
Log 3, "Unknown HMS device $dev/$odev, please define it";
$type = "HMS" if(!$type);
return "UNDEFINED $type $odev";
}
my $def = $defptr{$dev};
my (@v, @txt, @sfx);
if($type eq "HMS100TF") {
@txt = ( "temperature", "humidity", "battery");
@sfx = ( "(Celsius)", "(%)", "");
# Codierung <s1><s0><t1><t0><f0><t2><f2><f1>
my $status = hex(substr($val, 0, 1));
$v[0] = int(substr($val, 5, 1) . substr($val, 2, 2))/10;
$v[1] = int(substr($val, 6, 2) . substr($val, 4, 1))/10;
$v[2] = "ok";
if ( $status & 2 ) { $v[2] = "empty"; }
if ( $status & 4 ) { $v[2] = "replaced"; }
if ( $status & 8 ) { $v[0] = -$v[0]; }
$val = "T: $v[0] H: $v[1] Bat: $v[2]";
} elsif ($type eq "HMS100T") {
@txt = ( "temperature", "battery");
@sfx = ( "(Celsius)", "");
my $status = hex(substr($val, 0, 1));
$v[0] = int(substr($val, 5, 1) . substr($val, 2, 2))/10;
$v[1] = "ok";
if ( $status & 2 ) { $v[1] = "empty"; }
if ( $status & 4 ) { $v[1] = "replaced"; }
if ( $status & 8 ) { $v[0] = -$v[0]; }
$val = "T: $v[0] Bat: $v[1]";
} elsif ($type eq "HMS100WD") {
@txt = ( "water_detect", "battery");
@sfx = ( "", "");
# Battery-low condition detect is not yet properly
# implemented. As soon as my WD's batteries get low
# I am willing to supply a patch ;-) SEP7-RIPE, 2006/05/13
my $status = hex(substr($val, 1, 1));
$v[1] = "ok";
$v[0] = "off";
if ( $status & 1 ) { $v[0] = "on"; }
$val = "Water Detect: $v[0]";
} elsif ($type eq "HMS100TFK") { # By Peter P.
@txt = ( "switch_detect", "battery");
@sfx = ( "", "");
# Battery-low condition detect is not yet properly implemented.
my $status = hex(substr($val, 1, 1));
$v[0] = ($status ? "on" : "off");
$v[1] = "off";
$val = "Switch Detect: $v[0]";
} elsif($type eq "RM100-2") {
@txt = ( "smoke_detect", "battery");
@sfx = ( "", "");
$v[0] = ( hex(substr($val, 1, 1)) != "0" ) ? "on" : "off";
$v[1] = "unknown"; # Battery-low detect is _NOT_ implemented.
$val = "smoke_detect: $v[0]";
} elsif ($type eq "HMS100MG") { # By Peter Stark
@txt = ( "gas_detect", "battery");
@sfx = ( "", "");
# Battery-low condition detect is not yet properly
# implemented.
my $status = hex(substr($val, 1, 1));
$v[0] = ($status != "0") ? "on" : "off";
$v[1] = "off";
if ($status & 1) { $v[0] = "on"; }
$val = "Gas Detect: $v[0]";
} else {
Log 4, "HMS Device $dev (Unknown type: $type)";
return "";
}
my $now = TimeNow();
Log 4, "HMS Device $dev ($type: $val)";
my $max = int(@txt);
for( my $i = 0; $i < $max; $i++) {
$readings{$dev}{$txt[$i]}{TIM} = $now;
my $v = "$v[$i] $sfx[$i]";
$readings{$dev}{$txt[$i]}{VAL} = $v;
$def->{CHANGED}[$i] = "$txt[$i]: $v";
}
$readings{$dev}{type}{TIM} = $now;
$readings{$dev}{type}{VAL} = $type;
$def->{STATE} = $val;
$def->{CHANGED}[$max] = $val;
return $def->{NAME};
}
1;

308
fhem/FHEM/40_KS300.pm Executable file
View File

@ -0,0 +1,308 @@
##############################################
package main;
use strict;
use warnings;
my %readings;
my %defptr;
my $negcount = 0;
######################
# Note: this is just an empty hull.
#####################################
sub
KS300_Initialize($)
{
my ($hash) = @_;
# Message is like
# 810d04f94027a00171212730000008
# 81 0d 04 f9 4027a00171 212730000008
$hash->{Category} = "DEV";
$hash->{Match} = "^810.04..402.a001";
$hash->{SetFn} = "KS300_Set";
$hash->{GetFn} = "KS300_Get";
$hash->{StateFn} = "KS300_SetState";
$hash->{ListFn} = "KS300_List";
$hash->{DefFn} = "KS300_Define";
$hash->{UndefFn} = "KS300_Undef";
$hash->{ParseFn} = "KS300_Parse";
}
###################################
sub
KS300_Set($@)
{
my ($hash, @a) = @_;
return "No set function implemented";
}
###################################
sub
KS300_Get($@)
{
my ($hash,@a) = @_;
return "No get function implemented";
}
#####################################
sub
KS300_SetState($$$$)
{
my ($hash, $tim, $vt, $val) = @_;
my $n = $hash->{CODE};
if(!$readings{$n}{$vt} || $readings{$n}{$vt}{TIM} lt $tim) {
$readings{$n}{$vt}{TIM} = $tim;
$readings{$n}{$vt}{VAL} = $val;
}
return undef;
}
#####################################
sub
KS300_List($)
{
my ($hash) = @_;
my $str = "";
my $n = $hash->{CODE};
if(!defined($readings{$n})) {
$str .= "No information about " . $hash->{NAME} . "\n";
} else {
foreach my $m (keys %{ $readings{$n} }) {
$str .= sprintf("%-19s %-15s %s\n",
$readings{$n}{$m}{TIM}, $m, $readings{$n}{$m}{VAL});
}
}
return $str;
}
#####################################
sub
KS300_Define($@)
{
my ($hash, @a) = @_;
return "wrong syntax: define <name> KS300 <code> " .
"[ml/raincounter] [wind-factor]" if(int(@a) < 3 || int(@a) > 5);
$a[2] = lc($a[2]);
return "Define $a[0]: wrong CODE format: specify a 4 digit hex value"
if($a[2] !~ m/^[a-f0-9][a-f0-9][a-f0-9][a-f0-9]$/);
$hash->{CODE} = $a[2];
my $rainunit = ((int(@a) > 3) ? $a[3] : 255);
my $windunit = ((int(@a) > 4) ? $a[4] : 1.0);
$hash->{CODE} = $a[2];
$hash->{RAINUNIT} = $rainunit;
$hash->{WINDUNIT} = $windunit;
$defptr{$a[2]} = $hash;
return undef;
}
#####################################
sub
KS300_Undef($$)
{
my ($hash, $name) = @_;
delete($defptr{$hash->{CODE}});
return undef;
}
#####################################
sub
KS300_Parse($)
{
my ($hash,$msg) = @_;
if($msg !~ m/^810d04..4027a001/) {
Log 4, "KS300 unknown message $msg";
return "";
}
###############################
# 1 2
#0123456789012345 67890123456789
#
#810d04f94027a001 71212730000008
###############################
my @a = split("", $msg);
##########################
# I've seldom (1 out of 700) seen messages of length 10 and 11 with correct
# CRC, they seem to contain partial data (e.g. temp/wind/hum but not rain)
# They are suppressed as of now.
if(hex($a[3]) != 13) {
Log 4, "Strange KS400 message received, wont decode ($msg)";
return "";
}
if(int(keys %defptr)) {
my @arr = keys(%defptr); # No code is known yet
my $dev = shift(@arr);
my $def = $defptr{$dev};
my $haverain = 0;
my @v;
my @txt = ( "rain_raw", "rain", "wind", "humidity", "temperature",
"israining", "unknown1", "unknown2", "unknown3");
my @sfx = ( "(counter)", "(l/m2)", "(km/h)", "(%)", "(Celsius)",
"(yes/no)", "","","");
# The next instr wont work for empty hashes, so we init it now
$readings{$dev}{$txt[0]}{VAL} = 0 if(!$readings{$dev});
my $r = $readings{$dev};
$v[0] = hex("$a[28]$a[27]$a[26]");
#############################
# My KS300 sends a (quite huge) "negative" rain, when the rain begins,
# then the value is "normal" again. So we have to filter neg. rain out.
# But if the KS300 is sending this value more than once, then accept it,
# as the KS300 was probably reset
if($r->{rain_raw}{VAL}) {
my ($rrv, undef) = split(" ", $r->{rain_raw}{VAL});
$haverain = 1 if($v[0] != $rrv);
if($v[0] < $rrv) {
if($negcount++ < 3) {
Log 3, "KS300 negative rain, ignoring it";
$v[0] = $rrv;
} else {
Log 1, "KS300 was probably reset, accepting new rain value";
}
} else {
$negcount = 0;
}
}
$v[1] = sprintf("%0.1f", $v[0] * $def->{RAINUNIT} / 1000);
$v[2] = sprintf("%0.1f", ("$a[25]$a[24].$a[23]"+0) * $def->{WINDUNIT});
$v[3] = "$a[22]$a[21]" + 0;
$v[4] = "$a[20]$a[19].$a[18]" + 0; $v[4] = "-$v[4]" if($a[17] eq "7");
$v[4] = sprintf("%0.1f", $v[4]);
$v[5] = ((hex($a[17]) & 0x2) || $haverain) ? "yes" : "no";
$v[6] = $a[29];
$v[7] = $a[16];
$v[8] = $a[17];
# Negative temp
$v[4] = -$v[4] if($v[8] & 8);
my $tm = TimeNow();
Log 4, "KS300 $dev: $msg";
my $max = int(@v);
for(my $i = 0; $i < $max; $i++) {
$r->{$txt[$i]}{TIM} = $tm;
my $val = "$v[$i] $sfx[$i]";
$r->{$txt[$i]}{VAL} = $val;
$def->{CHANGED}[$i] = "$txt[$i]: $val";
}
# For logging/summary
my $val = "T: $v[4] H: $v[3] W: $v[2] R: $v[1] IR: $v[5]";
$def->{STATE} = $val;
$def->{CHANGED}[$max++] = $val;
###################################
# AVG computing
if(!$r->{cum_day}) {
$r->{cum_day}{VAL} = "$tm T: 0 H: 0 W: 0 R: $v[1]";
$r->{avg_day}{VAL} = "T: $v[4] H: $v[3] W: $v[2] R: $v[1]";
} else {
my @cv = split(" ", $r->{cum_day}{VAL});
my @cd = split("[ :-]", $r->{cum_day}{TIM});
my $csec = 3600*$cd[3] + 60*$cd[4] + $cd[5]; # Sec of last reading
my @d = split("[ :-]", $tm);
my $sec = 3600*$d[3] + 60*$d[4] + $d[5]; # Sec now
my @sd = split("[ :-]", "$cv[0] $cv[1]");
my $ssec = 3600*$sd[3] + 60*$sd[4] + $sd[5]; # Sec at start of day
my $difft = $sec - $csec;
$difft += 86400 if($d[2] != $cd[2]); # Sec since last reading
my $t = $cv[3] + $difft * $v[4];
my $h = $cv[5] + $difft * $v[3];
my $w = $cv[7] + $difft * $v[2];
my $e = $cv[9];
$r->{cum_day}{VAL} = "$cv[0] $cv[1] T: $t H: $h W: $w R: $e";
$difft = $sec - $ssec;
$difft += 86400 if($d[2] != $sd[2]); # Sec since last reading
$t /= $difft; $h /= $difft; $w /= $difft; $e = $v[1] - $cv[9];
$r->{avg_day}{VAL} =
sprintf("T: %.1f H: %d W: %.1f R: %.1f", $t, $h, $w, $e);
if($d[2] != $sd[2]) { # Day changed, report it
$def->{CHANGED}[$max++] = "avg_day $r->{avg_day}{VAL}";
$r->{cum_day}{VAL} = "$tm T: 0 H: 0 W: 0 R: $v[1]";
if(!$r->{cum_month}) { # Check the month
$r->{cum_month}{VAL} = "1 $r->{avg_day}{VAL}";
$r->{avg_month}{VAL} = $r->{avg_day}{VAL};
} else {
my @cmv = split(" ", $r->{cum_month}{VAL});
$t += $cmv[2]; $w += $cmv[4]; $h += $cmv[6];
$cmv[0]++;
$r->{cum_month}{VAL} =
sprintf("%d T: %.1f H: %d W: %.1f R: %.1f",
$cmv[0], $t, $h, $w, $cmv[8]+$e);
$r->{avg_month}{VAL} =
sprintf("T: %.1f H: %d W: %.1f R: %.1f",
$t/$cmv[0], $h/$cmv[0], $w/$cmv[0], $cmv[8]+$e);
if($d[1] != $sd[1]) { # Month changed, report it
$def->{CHANGED}[$max++] = "avg_month $r->{avg_month}{VAL}";
$r->{cum_month}{VAL} = "0 T: 0 H: 0 W: 0 R: 0";
}
}
$r->{cum_month}{TIM} = $r->{avg_month}{TIM} = $tm;
}
}
$r->{cum_day}{TIM} = $r->{avg_day}{TIM} = $tm;
# AVG computing
###################################
return $def->{NAME};
} else {
Log 4, "KS300 detected: $msg";
}
return "";
}
1;

698
fhem/FHEM/50_WS300.pm Normal file
View File

@ -0,0 +1,698 @@
################################################################
#
# Copyright notice
#
# (c) 2007 Copyright: Martin Klerx (Martin at klerx dot de)
# All rights reserved
#
# This script free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# The GNU General Public License can be found at
# http://www.gnu.org/copyleft/gpl.html.
# A copy is found in the textfile GPL.txt and important notices to the license
# from the author is found in LICENSE.txt distributed with these scripts.
#
# This script is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# This copyright notice MUST APPEAR in all copies of the script!
#
################################################################
# examples:
# define WS300Device WS300 /dev/ttyUSB1 (fixed name, must be first)
# define ash2200-1 WS300 0
# define ash2200-2 WS300 1
# ...
# define ash2200-8 WS300 7
# define ks300 WS300 8 (always 8)
# define ws300 WS300 9 (always 9)
# set WS300Device <interval(5-60 min.)> <height(0-2000 m)> <rainvalume(ml)>
################################################################
package main;
use strict;
use warnings;
my %readings;
my %defptr;
my $DeviceName="";
my $inbuf="";
my $config;
my $cmd=0x32;
my $errcount=0;
my $ir="no";
my $willi=0;
my $oldwind=0.0;
my $polling=0;
my $acthour=99;
my $actday=99;
my $actmonth=99;
my $oldrain=0;
my $rain_hour=0;
my $rain_day=0;
my $rain_month=0;
#####################################
sub
WS300_Initialize($)
{
my ($hash) = @_;
$hash->{Category} = "DEV";
# Provider
$hash->{Clients} = ":WS300:";
$hash->{ReadFn} = "WS300_Read";
$hash->{WriteFn} = "WS300_Write";
$hash->{Type} = "FHZ1000";
$hash->{Match} = "^WS300.*";
$hash->{SetFn} = "WS300_Set";
$hash->{GetFn} = "WS300_Get";
$hash->{StateFn} = "WS300_SetState";
$hash->{ListFn} = "WS300_List";
$hash->{DefFn} = "WS300_Define";
$hash->{UndefFn} = "WS300_Undef";
$hash->{ParseFn} = "WS300_Parse";
$hash->{ReadFn} = "WS300_Read";
}
###################################
sub
WS300_Set($@)
{
my ($hash, @a) = @_;
if($hash->{NAME} eq "WS300Device")
{
return "wrong syntax: set WS300Device <Interval(5-60 min.)> <height(0-2000 m)> <rainvolume(ml)>" if(int(@a) < 4 || int($a[1]) < 5 || int($a[1]) > 60 || int($a[2]) > 2000);
my $bstring = sprintf("%c%c%c%c%c%c%c%c",0xfe,0x30,(int($a[1])&0xff),((int($a[2])>>8)&0xff),(int($a[2])&0xff),((int($a[3])>>8)&0xff),(int($a[3])&0xff),0xfc);
$hash->{PortObj}->write($bstring);
Log 1,"WS300 synchronization started (".unpack('H*',$bstring).")";
return "the ws300pc will now synchronize for 10 minutes";
}
return "No set function implemented";
}
###################################
sub
WS300_Get(@)
{
my ($hash, @a) = @_;
if($hash->{NAME} eq "WS300Device")
{
Log 5,"WS300_Get $a[0] $a[1]";
WS300_Poll($hash);
return undef;
}
return "No get function implemented";
}
#####################################
sub
WS300_SetState($$$$)
{
my ($hash, $tim, $vt, $val) = @_;
return undef if(!defined($hash->{SENSOR}));
my $n = $hash->{SENSOR};
if(!$readings{$n}{$vt} || $readings{$n}{$vt}{TIM} lt $tim) {
$readings{$n}{$vt}{TIM} = $tim;
$readings{$n}{$vt}{VAL} = $val;
}
return undef;
}
#####################################
sub
WS300_List($)
{
my ($hash) = @_;
my $str = "";
return "No information about $hash->{NAME}" if(!defined($hash->{SENSOR}));
my $n = $hash->{SENSOR};
if(!defined($readings{$n}))
{
$str .= "No information about " . $hash->{NAME} . "\n";
}
else
{
foreach my $m (keys %{ $readings{$n} })
{
$str .= sprintf("%-19s %-15s %s\n",$readings{$n}{$m}{TIM}, $m, $readings{$n}{$m}{VAL});
}
}
return $str;
}
#####################################
sub
WS300_Define($@)
{
my ($hash, @a) = @_;
if($a[0] eq "WS300Device")
{
return "wrong syntax: define WS300Device WS300 <DeviceName>" if(int(@a) < 3);
$DeviceName = $a[2];
$hash->{STATE} = "Initializing";
$hash->{SENSOR} = 10;
$readings{10}{WS300Device}{VAL} = "Initializing";
$readings{10}{WS300Device}{TIM} = TimeNow;
my $po = new Device::SerialPort ($a[2]);
if(!$po)
{
$hash->{STATE} = "error opening device";
$readings{10}{WS300Device}{VAL} = "error opening device";
$readings{10}{WS300Device}{TIM} = TimeNow;
Log 1,"Error opening WS300 Device $a[2]";
return "Can't open $a[2]: $!\n";
}
$po->reset_error();
$po->baudrate(19200);
$po->databits(8);
$po->parity('even');
$po->stopbits(1);
$po->handshake('none');
$po->rts_active(1);
$po->dtr_active(1);
sleep(1);
$po->rts_active(0);
$hash->{PortObj} = $po;
$hash->{DeviceName} = $a[2];
$hash->{STATE} = "opened";
$readings{10}{WS300Device}{VAL} = "opened";
$readings{10}{WS300Device}{TIM} = TimeNow;
CommandAt($hash,"+*00:00:05 get WS300Device data");
Log 1,"WS300 Device $a[2] opened";
return undef;
}
return "wrong syntax: define <name> WS300 <sensor (0-9)>\n0-7=ASH2200\n8=KS300\n9=WS300" if(int(@a) < 3);
return "no device: define WS300Device WS300 <DeviceName> first" if($DeviceName eq "");
$a[2] = lc($a[2]);
return "Define $a[0]: wrong sensor number." if($a[2] !~ m/^[0-9]$/);
$hash->{SENSOR} = $a[2];
$defptr{$a[2]} = $hash;
return undef;
}
#####################################
sub
WS300_Undef($$)
{
my ($hash, $name) = @_;
return undef if(!defined($hash->{SENSOR}));
delete($defptr{$hash->{SENSOR}});
return undef;
}
#####################################
sub
WS300_Parse($)
{
my $msg = shift;
my $ll = GetLogLevel("WS300Device");
$ll = 5 if($ll == 2);
my @c = split("", $config);
my @cmsg = split("",unpack('H*',$config));
my $dmsg = unpack('H*',$msg);
my @a = split("", $dmsg);
my $val = "";
my $tm;
my $h;
my $t;
my $b;
my $l;
my $value;
my $offs=0;
my $ref;
my $def;
my $zeit;
my @txt = ( "temperature", "humidity", "wind", "rain_raw", "israining", "battery", "lost_receives", "pressure", "rain_cum", "rain_hour", "rain_day", "rain_month");
my @sfx = ( "(Celsius)", "(%)", "(km/h)", "(counter)", "(yes/no)", " ", "(counter)", "(hPa)", "(mm)", "(mm)", "(mm)", "(mm)");
# 1 2 3 4 5 6 7 8
# 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
# 3180800001005d4e00000000000000000000000000000000000000000000594a0634001e00f62403f1fc stored
# aaaatttthhtttthhtttthhtttthhtttthhtttthhtttthhtttthhtttthhrrrrwwwwtttthhpppp
# 3300544a0000000000000000000000000000000000000000000057470634002c00f32303ee32fc current
# tttthhtttthhtttthhtttthhtttthhtttthhtttthhtttthhtttthhrrrrwwwwtttthhppppss
# 3210000000000000001005003a0127fc config
# 001122334455667788iihhhhmmmm
$offs = 2 if(hex($a[0].$a[1]) == 0x33);
$offs = 10 if(hex($a[0].$a[1]) == 0x31);
if($offs == 0)
{
Log 1,"WS300 illegal data in WS300_Parse";
return undef;
}
$zeit = time;
my $wind = hex($a[58+$offs].$a[59+$offs].$a[60+$offs].$a[61+$offs]);
$wind /= 10.0;
if(hex($a[0].$a[1]) == 0x33)
{
return undef if(hex($a[74].$a[75]) == $willi && $wind == $oldwind );
$willi = hex($a[74].$a[75]);
$ir="no";
$ir="yes" if(($willi&0x80));
}
else
{
$zeit -= (hex($a[6].$a[7].$a[8].$a[9])*60);
}
my @lt = localtime($zeit);
$tm = sprintf("%04d-%02d-%02d %02d:%02d:%02d",$lt[5]+1900, $lt[4]+1, $lt[3], $lt[2], $lt[1], $lt[0]);
$oldwind = $wind;
my $press = hex($a[68+$offs].$a[69+$offs].$a[70+$offs].$a[71+$offs]);
my $hpress = hex($cmsg[22].$cmsg[23].$cmsg[24].$cmsg[25]);
$hpress /= 8.5;
$press += $hpress;
$press = sprintf("%.1f",$press);
my $rainc = hex($a[54+$offs].$a[55+$offs].$a[56+$offs].$a[57+$offs]);
my $rain = hex($cmsg[26].$cmsg[27].$cmsg[28].$cmsg[29]);
$rain *= $rainc;
$rain /= 1000;
$rain = sprintf("%.1f",$rain);
for(my $s=0;$s<9;$s++)
{
if((ord($c[$s+1])&0x10))
{
my $p=($s*6)+$offs;
Log $ll,"Sensor $s vorhanden";
if(!defined($defptr{$s}))
{
Log(3,"WS300 $s: undefined");
}
else
{
$readings{$s}{$txt[0]}{VAL} = 0 if(!$readings{$s});
$ref = $readings{$s};
$def = $defptr{$s};
$t = hex($a[$p].$a[$p+1].$a[$p+2].$a[$p+3]);
$t -= 65535 if( $t > 32767 );
$t /= 10.0;
$h = hex($a[$p+4].$a[$p+5]);
if((ord($c[$s+1])&0xe0))
{
$b = "Empty"
}
else
{
$b = "Ok"
}
$l = (ord($c[$s+1])&0x0f);
if($s < 8)
{
# state
$val = "T: $t H: $h Bat: $b LR: $l";
$def->{STATE} = $val;
$def->{CHANGED}[0] = $val;
$def->{CHANGETIME}[0] = $tm;
# temperatur
$ref->{$txt[0]}{TIM} = $tm;
$value = "$t $sfx[0]";
$ref->{$txt[0]}{VAL} = $value;
$def->{CHANGED}[1] = "$txt[0]: $value";
$def->{CHANGETIME}[1] = $tm;
# humidity
$ref->{$txt[1]}{TIM} = $tm;
$value = "$h $sfx[1]";
$ref->{$txt[1]}{VAL} = $value;
$def->{CHANGED}[2] = "$txt[1]: $value";
$def->{CHANGETIME}[2] = $tm;
# battery
$ref->{$txt[5]}{TIM} = $tm;
$value = "$b $sfx[5]";
$ref->{$txt[5]}{VAL} = $value;
$def->{CHANGED}[3] = "$txt[5]: $value";
$def->{CHANGETIME}[3] = $tm;
# lost receives
$ref->{$txt[6]}{TIM} = $tm;
$value = "$l $sfx[6]";
$ref->{$txt[6]}{VAL} = $value;
$def->{CHANGED}[4] = "$txt[6]: $value";
$def->{CHANGETIME}[4] = $tm;
Log 2,"WS300 $def->{NAME}: $val";
DoTrigger($def->{NAME},undef);
}
else
{
# state
$val = "T: $t H: $h W: $wind R: $rain IR: $ir Bat: $b LR: $l";
$def->{STATE} = $val;
$def->{CHANGED}[0] = $val;
$def->{CHANGETIME}[0] = $tm;
# temperature
$ref->{$txt[0]}{TIM} = $tm;
$value = "$t $sfx[0]";
$ref->{$txt[0]}{VAL} = $value;
$def->{CHANGED}[1] = "$txt[0]: $value";
$def->{CHANGETIME}[1] = $tm;
# humidity
$ref->{$txt[1]}{TIM} = $tm;
$value = "$h $sfx[1]";
$ref->{$txt[1]}{VAL} = $value;
$def->{CHANGED}[2] = "$txt[1]: $value";
$def->{CHANGETIME}[2] = $tm;
# wind
$ref->{$txt[2]}{TIM} = $tm;
$value = "$wind $sfx[2]";
$ref->{$txt[2]}{VAL} = $value;
$def->{CHANGED}[3] = "$txt[2]: $value";
$def->{CHANGETIME}[3] = $tm;
#rain counter
$ref->{$txt[3]}{TIM} = $tm;
$value = "$rainc $sfx[3]";
$ref->{$txt[3]}{VAL} = $value;
$def->{CHANGED}[4] = "$txt[3]: $value";
$def->{CHANGETIME}[4] = $tm;
# is raining
$ref->{$txt[4]}{TIM} = $tm;
$value = "$ir $sfx[4]";
$ref->{$txt[4]}{VAL} = $value;
$def->{CHANGED}[5] = "$txt[4]: $value";
$def->{CHANGETIME}[5] = $tm;
# battery
$ref->{$txt[5]}{TIM} = $tm;
$value = "$b $sfx[5]";
$ref->{$txt[5]}{VAL} = $value;
$def->{CHANGED}[6] = "$txt[5]: $value";
$def->{CHANGETIME}[6] = $tm;
# lost receives
$ref->{$txt[6]}{TIM} = $tm;
$value = "$l $sfx[6]";
$ref->{$txt[6]}{VAL} = $value;
$def->{CHANGED}[7] = "$txt[6]: $value";
$def->{CHANGETIME}[7] = $tm;
# rain cumulative
$ref->{$txt[8]}{TIM} = $tm;
$value = "$rain $sfx[8]";
$ref->{$txt[8]}{VAL} = $value;
$def->{CHANGED}[8] = "$txt[8]: $value";
$def->{CHANGETIME}[8] = $tm;
# statistics
if($actday == 99)
{
$oldrain = $rain;
$acthour = $ref->{acthour}{VAL} if(defined($ref->{acthour}{VAL}));
$actday = $ref->{actday}{VAL} if(defined($ref->{actday}{VAL}));
$actmonth = $ref->{actmonth}{VAL} if(defined($ref->{actmonth}{VAL}));
$rain_day = $ref->{rain_day}{VAL} if(defined($ref->{rain_day}{VAL}));
$rain_month = $ref->{rain_month}{VAL} if(defined($ref->{rain_month}{VAL}));
$rain_hour = $ref->{rain_hour}{VAL} if(defined($ref->{rain_hour}{VAL}));
}
if($acthour != $lt[2])
{
$acthour = $lt[2];
$rain_hour = sprintf("%.1f",$rain_hour);
$rain_day = sprintf("%.1f",$rain_day);
$rain_month = sprintf("%.1f",$rain_month);
$ref->{acthour}{TIM} = $tm;
$ref->{acthour}{VAL} = "$acthour";
$ref->{$txt[9]}{TIM} = $tm;
$ref->{$txt[9]}{VAL} = $rain_hour;
$def->{CHANGED}[9] = "$txt[9]: $rain_hour $sfx[9]";
$def->{CHANGETIME}[9] = $tm;
$ref->{$txt[10]}{TIM} = $tm;
$ref->{$txt[10]}{VAL} = $rain_day;
$def->{CHANGED}[10] = "$txt[10]: $rain_day $sfx[10]";
$def->{CHANGETIME}[10] = $tm;
$ref->{$txt[11]}{TIM} = $tm;
$ref->{$txt[11]}{VAL} = $rain_month;
$def->{CHANGED}[11] = "$txt[11]: $rain_month $sfx[11]";
$def->{CHANGETIME}[11] = $tm;
$rain_hour=0;
}
if($actday != $lt[3])
{
$actday = $lt[3];
$ref->{actday}{TIM} = $tm;
$ref->{actday}{VAL} = "$actday";
$rain_day=0;
}
if($actmonth != $lt[4]+1)
{
$actmonth = $lt[4]+1;
$ref->{actmonth}{TIM} = $tm;
$ref->{actmonth}{VAL} = "$actmonth";
$rain_month=0;
}
if($rain != $oldrain)
{
$rain_hour += ($rain-$oldrain);
$rain_hour = sprintf("%.1f",$rain_hour);
$rain_day += ($rain-$oldrain);
$rain_day = sprintf("%.1f",$rain_day);
$rain_month += ($rain-$oldrain);
$rain_month = sprintf("%.1f",$rain_month);
$oldrain = $rain;
$ref->{acthour}{TIM} = $tm;
$ref->{acthour}{VAL} = "$acthour";
$ref->{$txt[9]}{TIM} = $tm;
$ref->{$txt[9]}{VAL} = $rain_hour;
$def->{CHANGED}[9] = "$txt[9]: $rain_hour $sfx[9]";
$def->{CHANGETIME}[9] = $tm;
$ref->{$txt[10]}{TIM} = $tm;
$ref->{$txt[10]}{VAL} = $rain_day;
$def->{CHANGED}[10] = "$txt[10]: $rain_day $sfx[10]";
$def->{CHANGETIME}[10] = $tm;
$ref->{$txt[11]}{TIM} = $tm;
$ref->{$txt[11]}{VAL} = $rain_month;
$def->{CHANGED}[11] = "$txt[11]: $rain_month $sfx[11]";
$def->{CHANGETIME}[11] = $tm;
}
Log 2,"WS300 $def->{NAME}: $val";
DoTrigger($def->{NAME},undef);
}
}
}
}
if(!defined($defptr{9}))
{
Log(3,"WS300 9: undefined");
}
else
{
$readings{9}{$txt[0]}{VAL} = 0 if(!$readings{9});
$ref = $readings{9};
$def = $defptr{9};
$t = hex($a[62+$offs].$a[63+$offs].$a[64+$offs].$a[65+$offs]);
$t -= 65535 if( $t > 32767 );
$t /= 10.0;
$h = hex($a[66+$offs].$a[67+$offs]);
# state
$val = "T: $t H: $h P: $press Willi: $willi";
$def->{STATE} = $val;
$def->{CHANGED}[0] = $val;
$def->{CHANGETIME}[0] = $tm;
# temperature
$ref->{$txt[0]}{TIM} = $tm;
$value = "$t $sfx[0]";
$ref->{$txt[0]}{VAL} = $value;
$def->{CHANGED}[1] = "$txt[0]: $value";
$def->{CHANGETIME}[1] = $tm;
# humidity
$ref->{$txt[1]}{TIM} = $tm;
$value = "$h $sfx[1]";
$ref->{$txt[1]}{VAL} = $value;
$def->{CHANGED}[2] = "$txt[1]: $value";
$def->{CHANGETIME}[2] = $tm;
# pressure
$ref->{$txt[7]}{TIM} = $tm;
$value = "$press $sfx[7]";
$ref->{$txt[7]}{VAL} = $value;
$def->{CHANGED}[3] = "$txt[7]: $value";
$def->{CHANGETIME}[3] = $tm;
# willi
$ref->{willi}{TIM} = $tm;
$value = "$willi";
$ref->{willi}{VAL} = $value;
$def->{CHANGED}[4] = "willi: $value";
$def->{CHANGETIME}[4] = $tm;
Log 2,"WS300 $def->{NAME}: $val";
DoTrigger($def->{NAME},undef);
}
return undef;
}
#####################################
sub
WS300_Read($)
{
my ($hash) = @_;
}
#####################################
sub
WS300_Write($$$)
{
my ($hash,$fn,$msg) = @_;
}
#####################################
sub
WS300_Poll($)
{
my $hash = shift;
my $bstring=" ";
my $count;
my $inchar='';
my $escape=0;
my $ll = GetLogLevel("WS300Device");
$ll = 5 if($ll == 2);
if(!$hash || !defined($hash->{PortObj}))
{
return;
}
return if($polling);
$polling=1;
NEXTPOLL:
$inbuf = $hash->{PortObj}->input();
$bstring = sprintf("%c%c%c",0xfe,$cmd,0xfc);
my $ret = $hash->{PortObj}->write($bstring);
if($ret <= 0)
{
my $devname = $hash->{DeviceName};
Log 1, "USB device $devname disconnected, waiting to reappear";
$hash->{PortObj}->close();
$hash->{STATE} = "disconnected";
$readings{10}{WS300Device}{VAL} = "disconnected";
$readings{10}{WS300Device}{TIM} = TimeNow;
sleep(1);
my $po = new Device::SerialPort($devname);
if($po)
{
$po->reset_error();
$po->baudrate(19200);
$po->databits(8);
$po->parity('even');
$po->stopbits(1);
$po->handshake('none');
$po->rts_active(1);
$po->dtr_active(1);
sleep(1);
$po->rts_active(0);
Log 1, "USB device $devname reappeared";
$hash->{PortObj} = $po;
$hash->{STATE} = "opened";
$readings{10}{WS300Device}{VAL} = "opened";
$readings{10}{WS300Device}{TIM} = TimeNow;
$polling=0;
return;
}
}
$inbuf = "";
my $start=0;
my $tout=time();
my $rcount=0;
my $ic=0;
for(;;)
{
($count,$inchar) = $hash->{PortObj}->read(1);
if($count == 0)
{
last if($tout < time());
}
else
{
$ic = hex(unpack('H*',$inchar));
if(!$start)
{
if($ic == 0xfe)
{
$start = 1;
}
}
else
{
if($ic == 0xf8)
{
$escape = 1;
$count = 0;
}
else
{
if($escape)
{
$ic--;
$inbuf .= chr($ic);
$escape = 0;
}
else
{
$inbuf .= $inchar;
last if($ic == 0xfc);
}
}
}
$rcount += $count;
$tout=time();
}
}
Log($ll,"WS300/RAW: ".$rcount." ".unpack('H*',$inbuf));
if($ic != 0xfc)
{
$errcount++ if($errcount < 10);
if($errcount == 10)
{
$hash->{STATE} = "timeout";
$readings{10}{WS300Device}{VAL} = "timeout";
$readings{10}{WS300Device}{TIM} = TimeNow;
$errcount++;
}
Log 1,"WS300: no data" if($rcount == 0);
Log 1,"WS300: wrong data ".unpack('H*',$inbuf) if($rcount > 0);
$polling=0;
return;
}
if($hash->{STATE} ne "connected" && $errcount > 10)
{
$hash->{STATE} = "connected";
$readings{10}{WS300Device}{VAL} = "connected";
$readings{10}{WS300Device}{TIM} = TimeNow;
}
$errcount = 0;
$ic = ord(substr($inbuf,0,1));
if($ic == 0x32)
{
$config = $inbuf if($rcount == 16);
$cmd=0x31;
goto NEXTPOLL;
}
if($ic == 0x31)
{
if($rcount == 42)
{
WS300_Parse($inbuf);
goto NEXTPOLL;
}
else
{
$cmd=0x33;
goto NEXTPOLL;
}
}
if($ic == 0x33)
{
WS300_Parse($inbuf) if($rcount == 39);
$cmd=0x32;
}
$polling=0;
}
1;

97
fhem/FHEM/90_FileLog.pm Executable file
View File

@ -0,0 +1,97 @@
##############################################
package main;
use strict;
use warnings;
use IO::File;
#####################################
sub
FileLog_Initialize($)
{
my ($hash) = @_;
$hash->{Category}= "LOG";
$hash->{DefFn} = "FileLog_Define";
$hash->{UndefFn} = "FileLog_Undef";
$hash->{LogFn} = "FileLog_Log";
}
#####################################
sub
FileLog_Define($@)
{
my ($hash, @a) = @_;
my $fh;
return "wrong syntax: define <name> FileLog filename regexp" if(int(@a) != 4);
eval { "Hallo" =~ m/^$a[3]$/ };
return "Bad regexp: $@" if($@);
my @t = localtime;
my $f = ResolveDateWildcards($a[2], @t);
$fh = new IO::File ">>$f";
return "Can't open $f" if(!defined($fh));
$hash->{FH} = $fh;
$hash->{REGEXP} = $a[3];
$hash->{FILENAME} = $a[2];
$hash->{CURRENT} = $f;
return undef;
}
#####################################
sub
FileLog_Undef($$)
{
my ($hash, $name) = @_;
close($hash->{FH});
return undef;
}
#####################################
sub
FileLog_Log($$)
{
my ($log, $dev) = @_;
my $n = $dev->{NAME};
my $re = $log->{REGEXP};
my $max = int(@{$dev->{CHANGED}});
for (my $i = 0; $i < $max; $i++) {
my $s = $dev->{CHANGED}[$i];
$s = "" if(!defined($s));
if($n =~ m/^$re$/ || "$n:$s" =~ m/^$re$/) {
my $t = TimeNow();
$t = $dev->{CHANGETIME}[$i] if(defined($dev->{CHANGETIME}[$i]));
$t =~ s/ /_/;
my $fh = $log->{FH};
my @t = localtime;
my $cn = ResolveDateWildcards($log->{FILENAME}, @t);
if($cn ne $log->{CURRENT}) { # New logfile
$fh->close();
$fh = new IO::File ">>$cn";
if(!defined($fh)) {
Log(0, "Can't open $cn");
return;
}
$log->{CURRENT} = $cn;
$log->{FH} = $fh;
}
print $fh "$t $n $s\n";
$fh->flush;
$fh->sync;
}
}
}
1;

27
fhem/Makefile Normal file
View File

@ -0,0 +1,27 @@
BINDIR=/usr/local/bin
MODDIR=/usr/local/lib
VERS=3.3
DATE=2006-01-25
DIR=fhem-$(VERS)
all:
@echo Nothing to do for all.
@echo To install, check the Makefile, and then \'make install\'
install:
cp fhem.pl $(BINDIR)
cp -rp FHEM $(MODDIR)
perl -pi -e 's,modpath .,modpath $(MODDIR),' examples/*
dist:
@echo Version is $(VERS), Date is $(DATE)
mkdir .f
cp -rp * .f
find .f -name \*.orig -print | xargs rm -f
find .f -type f -print |\
xargs perl -pi -e 's/=VERS=/$(VERS)/g;s/=DATE=/$(DATE)/g'
mv .f fhem-$(VERS)
tar cf - fhem-$(VERS) | gzip > fhem-$(VERS).tar.gz
mv fhem-$(VERS)/docs/*.html .
rm -rf fhem-$(VERS)

99
fhem/contrib/91_DbLog.pm Executable file
View File

@ -0,0 +1,99 @@
##############################################
# Example for logging KS300 data into a DB.
#
# Prerequisites:
# - The DBI and the DBD::<dbtype> modules must be installed.
# - a Database is created/configured
# - a db table: create table FHZLOG (TIMESTAMP varchar(20), TEMP varchar(5),
# HUM varchar(3), WIND varchar(4), RAIN varchar(8));
# - Change the content of the dbconn variable below
# - extend your FHEM config file with
# notify .*H:.* {DbLog("@","%")}
# - copy this file into the <modpath>/FHEM and restart fhem.pl
#
# If you want to change this setup, your starting point is the DbLog function
my $dbconn = "Oracle:DBNAME:user:password";
package main;
use strict;
use warnings;
use DBI;
my $dbh;
sub DbDo($);
sub DbConnect();
################################################################
sub
DbLog_Initialize($)
{
my ($hash) = @_;
$hash->{Category} = "none";
# Lets connect here, so we see the error at startup
DbConnect();
}
################################################################
sub
DbLog($$)
{
my ($a1, $a2) = @_;
# a2 is like "T: 21.2 H: 37 W: 0.0 R: 0.0 IR: no"
my @a = split(" ", $a2);
my $tm = TimeNow();
DbDo("insert into FHZLOG (TIMESTAMP, TEMP, HUM, WIND, RAIN) values " .
"('$tm', '$a[1]', '$a[3]', '$a[5]', '$a[7]')");
}
################################################################
sub
DbConnect()
{
return 1 if($dbh);
Log 5, "Connecting to database $dbconn";
my @a = split(":", $dbconn);
$dbh = DBI->connect("dbi:$a[0]:$a[1]", $a[2], $a[3]);
if(!$dbh) {
Log 1, "Can't connect to $a[1]: $DBI::errstr";
return 0;
}
Log 5, "Connection to db $a[1] established";
return 1;
}
################################################################
sub
DbDo($)
{
my $str = shift;
return 0 if(!DbConnect());
Log 5, "Executing $str";
my $sth = $dbh->do($str);
if(!$sth) {
Log 2, "DB: " . $DBI::errstr;
$dbh->disconnect;
$dbh = 0;
return 0 if(!DbConnect());
#retry
$sth = $dbh->do($str);
if($sth)
{
Log 2, "Retry ok: $str";
return 1;
}
#
return 0;
}
return 1;
}
1;

153
fhem/contrib/99_ALARM.pm Executable file
View File

@ -0,0 +1,153 @@
##############################################
# Low Budget ALARM System
##############################################
# ATTENTION! This is more a toy than a real alarm system! You must know what you do!
##############################################
#
# Concept:
# 1x Signal Light (FS20 allight) to show the status (activated/deactivated)
# 1x Sirene (FS20 alsir1)
# 2x PIRI-2 (FS20 piriu pirio)
# 1x Sender (FS20 alsw) to activate/deactivate the system.
# Tip: use the KeyMatic CAC with pin code
# optional a normal sender (not a Keymatic CAC) FS20 alsw2
#
# Add something like the following lines to the configuration file :
# notifyon alsw {MyAlsw()}
# notifyon alsw2 {MyAlswNoPin()}
# notifyon piriu {MyAlarm()}
# notifyon pirio {MyAlarm()}
# and put this file in the <modpath>/FHEM directory.
#
# Martin Haas
##############################################
package main;
use strict;
use warnings;
sub
ALARM_Initialize($)
{
my ($hash) = @_;
$hash->{Category} = "none";
}
##############################################
# Switching Alarm System on or off
sub
MyAlsw()
{
my $ON="set allight on; setstate alsw on";
my $OFF1="set allight off";
my $OFF2="set alsir1 off";
my $OFF3="setstate alsw off";
if ( -e "/var/tmp/alertsystem")
{
unlink "/var/tmp/alertsystem";
for (my $i = 0; $i < 2; $i++ )
{
fhz "$OFF1";
fhz "$OFF2";
fhz "$OFF3";
};
Log 2, "alarm system is OFF";
} else {
system "touch /var/tmp/alertsystem";
for (my $i = 0; $i < 2; $i++ )
{
fhz "$ON"
}
Log 2, "alarm system is ON";
};
}
##############################################
# If you have no Keymatic then use this workaround:
# After 4x pushing a fs20-button within some seconds it will activate/deactivate the alarm system.
sub
MyAlswNoPin()
{
my $timedout=5;
## first time
if ( ! -e "/var/tmp/alontest1")
{
for (my $i = 1; $i < 4; $i++ )
{
system "touch /var/tmp/alontest$i";
system "touch -t 200601010101 /var/tmp/alontest$i";
}
}
## test 4 times
my $now= `date +%s`;
for (my $i = 1; $i < 4; $i++ )
{
my $tagx=`date -r /var/tmp/alontest$i +%s`;
my $testx=$now-$tagx;
if ( $testx > $timedout )
{
system "touch /var/tmp/alontest$i";
Log 2, "test$i: more than $timedout sec\n";
die;
}
}
system "touch -t 200601010101 /var/tmp/alontest*";
Log 2, "ok, let's switch the alarm system...";
#if you only allow to activate (and not deactivate) with this script:
# if ( -e "/var/tmp/alertsystem") { die; };
MyAlsw();
}
##############################################
# ALARM! Do what you want!
sub
MyAlarm()
{
#alarm-system activated??
if ( -e "/var/tmp/alertsystem")
{
my $timer=180; # time until the sirene will be quit
my $ON1="set alsir1 on-for-timer $timer";
#Paranoia
for (my $i = 1; $i < 3; $i++ )
{
fhz "$ON1";
}
Log 2, "ALARM! $ON1" ;
# have fun
my @lights=("stuwz1", "stuwz2", "stunacht", "stonacht", "stoliba");
my @rollos=("rolu4", "rolu5", "roloadi", "rololeo", "roloco", "rolowz", "rolunik1", "rolunik2");
foreach my $light (@lights) {
fhz "set $light on"
}
foreach my $rollo (@rollos) {
fhz "set $rollo on"
}
}
}
1;

33
fhem/contrib/99_PRIV.pm Executable file
View File

@ -0,0 +1,33 @@
##############################################
# Example for notifying with perl-code, in a proper file, not inline.
# Add the following line to the configuration file (02_fs20):
# notifyon btn3 {MyFunc("@", "%")}
# and put this file in the <modpath>/FHEM directory.
package main;
use strict;
use warnings;
sub
PRIV_Initialize($$)
{
my ($hash, $init) = @_;
$hash->{Category} = "none";
}
sub
MyFunc($$)
{
my ($a1, $a2) = @_;
Log 2, "Device $a1 was set to $a2 (type: $defs{$a1}{TYPE})";
if($a2 eq "on") {
fhz "roll1 on-for-timer 10";
fhz "roll2 on-for-timer 16");
} else {
fhz "roll1 off";
fhz "roll2 off";
}
}
1;

90
fhem/contrib/99_SUNRISE.pm Executable file
View File

@ -0,0 +1,90 @@
##############################################
# - Be aware: Installing the DateTime modules might be tedious, one way is:
# perl -MCPAN -e shell
# cpan> install DateTime::Event::Sunrise
# - Please call sunrise_coord before using this module, else you'll get times
# for frankfurt am main (germany). See the "at" entry in commandref.html
package main;
use strict;
use warnings;
use DateTime;
use DateTime::Event::Sunrise;
sub sr($$$$);
sub sunrise_rel(@);
sub sunset_rel(@);
sub sunrise_abs(@);
sub sunset_abs(@);
sub isday();
sub sunrise_coord($$$);
sub SUNRISE_Initialize($);
# See perldoc DateTime::Event::Sunrise for details
my $long = "8.686";
my $lat = "50.112";
my $tz = "Europe/Berlin";
sub
SUNRISE_Initialize($)
{
my ($hash) = @_;
$hash->{Category} = "none";
}
##########################
# Compute:
# rise: 1: event is sunrise (else sunset)
# isrel: 1: _relative_ times until the next event (else absolute for today)
# seconds: second offset to event
# daycheck: if set, then return 1 if the sun is visible, 0 else
sub
sr($$$$)
{
my ($rise, $seconds, $isrel, $daycheck) = @_;
my $sunrise = DateTime::Event::Sunrise ->new(
longitude => $long,
latitude => $lat,
altitude => '-6', # Civil twilight
iteration => '3');
my $now = DateTime->now(time_zone => $tz);
my $stm = ($rise ? $sunrise->sunrise_datetime( $now ) :
$sunrise->sunset_datetime( $now ));
if($daycheck) {
return 0 if(DateTime->compare($now, $stm) < 0);
$stm = $sunrise->sunset_datetime( $now );
return 0 if(DateTime->compare($now, $stm) > 0);
return 1;
}
if(!$isrel) {
$stm = $stm->add(seconds => $seconds) if($seconds);
return $stm->hms();
}
$stm = $stm->add(seconds => $seconds) if($seconds);
if(DateTime->compare($now, $stm) >= 0) {
my $tom = DateTime->now(time_zone => $tz)->add(days => 1);
$stm = ($rise ? $sunrise->sunrise_datetime( $tom ) :
$sunrise->sunset_datetime( $tom ));
$stm = $stm->add(seconds => $seconds) if($seconds);
}
my $diff = $stm->epoch - $now->epoch;
return sprintf("%02d:%02d:%02d", $diff/3600, ($diff/60)%60, $diff%60);
}
sub sunrise_rel(@) { return sr(1, shift, 1, 0) }
sub sunset_rel(@) { return sr(0, shift, 1, 0) }
sub sunrise_abs(@) { return sr(1, shift, 0, 0) }
sub sunset_abs(@) { return sr(0, shift, 0, 0) }
sub isday() { return sr(1, 0, 0, 1) }
sub sunrise_coord($$$) { ($long, $lat, $tz) = @_; return undef; }
1;

21
fhem/contrib/README Executable file
View File

@ -0,0 +1,21 @@
- 91_DbLog.pm
Example to log data in a (DBI supported) database (MySQL, Oracle, etc)
- 99_ALARM.pm
Example for a Low Budget ALARM System by Martin
- checkmsg.pl
Check cwthe CRC of an FS20 hex message
- fhem
RC script by Stefan to be put into /etc/init.d and then symlinked
to /etc/rc3.d or similar.
- four2hex
Convert housecode from ELV notation (4) to fhem.pl notation (hex)
- fs20_holidays.sh
STefan's "presence simulator" for holidays
- garden.pl
Garden irrigation regulator with weather dependency (KS300 temp + rain)
- ks300avg.pl
Computing daily/monthly avarage values from a KS300 log
- rolwzo_not_off.sh
Martin's "don't lock me out" program: look at the comment
- rrd
Peter's RRD support. See the HOWTO

26
fhem/contrib/checkmsg.pl Executable file
View File

@ -0,0 +1,26 @@
die("Usage: checkmsg HEX-FHZ-MESSAGE\n") if(int(@ARGV) != 1);
my $msg = $ARGV[0];
die("Bad prefix (not 0x81)\n") if($msg !~ m/^81/);
print("Prefix is ok (0x81)\n");
my $l = hex(substr($msg, 2, 2));
my $rl = length($msg)/2-2;
die("Bad length $l (should be $rl)\n") if($rl != $l);
print("Length is ok ($l)\n");
my @data;
for(my $i = 8; $i < length($msg); $i += 2) {
push(@data, ord(pack('H*', substr($msg, $i, 2))));
}
my $rcrc = 0;
map { $rcrc += $_; } @data;
$rcrc &= 0xFF;
my $crc = hex(substr($msg, 6, 2));
my $str = sprintf("Bad CRC 0x%02x (should be 0x%02x)\n", $crc, $rcrc);
die($str) if($crc ne $rcrc);
printf("CRC is ok (0x%02x)\n", $crc);
exit(0);

33
fhem/contrib/crc.pl Executable file
View File

@ -0,0 +1,33 @@
die("Usage: crc HEX-MESSAGE\n") if(int(@ARGV) != 2);
my $msg = $ARGV[0];
$msg =~ s/ //g;
my $des = $ARGV[1];
$des =~ s/ //g;
# FFFF: 77 72 statt 2c 7f
# FFFF: 5C AC statt DC D9
#for(my $ic = 0; $ic < 65536; $ic++) {
for(my $ic = 0; $ic < 2; $ic++) {
my $crc = ($ic == 0?0:0xffffffff);
for(my $i = 0; $i < length($msg); $i += 2) {
my $n = ord(pack('H*', substr($msg, $i, 2)));
my $od = $n;
for my $b (0..7) {
my $crcbit = ($crc & 0x80000000) ? 1 : 0;
my $databit = ($n & 0x80) ? 1 : 0;
$crc <<= 1;
$n <<= 1;
$crc ^= 0x04C11DB7 if($crcbit != $databit);
# printf("%3d.%d %02x CRC %x ($crcbit $databit)\n", $i/2, $b, $n, $crc);
}
# printf("%3d %02x CRC %02x %02x\n", $i/2, $od, ($crc&0xff00)>>8, $crc&0xff);
}
# print "$ic\n" if($ic % 10000 == 0);
printf("%02x %02x\n",($crc&0xff00)>>8,$crc&0xff);
print "got $ic\n"
if(sprintf("%02x%02x",($crc&0xff00)>>8,$crc&0xff) eq $des);
}

33
fhem/contrib/fht.gnuplot Normal file
View File

@ -0,0 +1,33 @@
############################
# Display the measured temperature and actuator data logged
# as described in the 04_log config file.
# Copy your logfile to fht.log and then call
# gnuplot fht.gnuplot
# (i.e. this file)
# Note: The webfrontend pgm2 and pgm3 does this for you.
###########################
# Uncomment the following if you want to create a postscript file
# and comment out the pause at the end
#set terminal postscript color "Helvetica" 11
#set output 'saplogins-lrn.ps'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set ylabel "Temperature (Celsius)"
set y2label "Actuator (%)"
set ytics nomirror
set y2tics
set y2label "Actuator (%)"
set title 'FHT log'
plot \
"< awk '/measured/{print $1, $4}' fht.log"\
using 1:2 axes x1y1 title 'Measured temperature' with lines,\
"< awk '/actuator/{print $1, $4+0}' fht.log"\
using 1:2 axes x1y2 title 'Actuator (%)' with lines\
pause 100000

View File

@ -0,0 +1,6 @@
CC=gcc
four2hex : four2hex.c
install : four2hex
install -m 0755 four2hex /usr/local/bin/four2hex

View File

@ -0,0 +1,23 @@
Four2hex was written to convert the housecode based on digits ranging from 1
to 4 into hex code and vica versa.
Four2hex is freeware based on the GNU Public license.
To built it:
$ make four2hex
Install it to /usr/local/bin:
$ su
# make install
Here an example from "four"-based to hex:
$ four2hex 12341234
1b1b
Here an example in the other (reverse) direction:
$ four2hex -r 1b1b
12341234
Enjoy.
Peter Stark, (Peter dot stark at t-online dot de)

BIN
fhem/contrib/four2hex/four2hex Executable file

Binary file not shown.

View File

@ -0,0 +1,94 @@
/*
Four2hex was written to convert the housecode based on digits ranging from 1
to 4 into hex code and vica versa.
Four2hex is freeware based on the GNU Public license.
To built it:
$ make four2hex
Install it to /usr/local/bin:
$ su
# make install
Here an example from "four"-based to hex:
$ four2hex 12341234
1b1b
Here an example in the other (reverse) direction:
$ four2hex -r 1b1b
12341234
Enjoy.
Peter Stark, (Peter dot stark at t-online dot de)
*/
#include <stdio.h>
#include <ctype.h>
int atoh (const char c)
{
int ret=0;
ret = (int) (c - '0');
if (ret > 9) {
ret = (int) (c - 'a' + 10);
}
return ret;
}
int strlen(const char *);
main (int argc, char **argv)
{
char c, *s, *four;
long int result;
int b, i, h;
if (argc < 2 || argc >3) {
fprintf (stderr, "usage: four2hex four-string\n");
fprintf (stderr, " or: four2hex -r hex-string\n");
return (1);
}
result = 0L;
if (strcmp(argv[1], "-r") == 0) {
/* reverse (hex->4) */
for (s = argv[2]; *s != '\0'; s++) {
c = tolower(*s);
b = atoh(c);
for (i = 0; i < 2; i++) {
h = ((b & 0xc) >> 2) + 1;
b = (b & 0x3) << 2;
printf ("%d", h);
}
}
printf ("\n");
} else {
/* normal (4->hex) */
four = argv[1];
if (strlen(four) == 4 || strlen(four) == 8) {
for (s = four; *s != '\0'; s++) {
result = result << 2;
switch (*s) {
case '1' : result = result + 0; break;
case '2' : result = result + 1; break;
case '3' : result = result + 2; break;
case '4' : result = result + 3; break;
default :
fprintf (stderr, "four-string may contain '1' to '4' only\n");
break;
}
}
if (strlen(four) == 8) {
printf ("%04x\n", result);
} else {
printf ("%02x\n", result);
}
} else {
fprintf (stderr, "four-string must be of length 4 or 8\n");
return (1);
}
}
return (0);
}

94
fhem/contrib/fs20_holidays.sh Executable file
View File

@ -0,0 +1,94 @@
#!/bin/sh
#
# script to generate a random number of on/off events to simulate presence eg.
# while on holidays. normally this script would be executed by an event like a
# dawn-sensor (you wouldn't want light during the day...:-)
#
# Copyright STefan Mayer <stefan@clumsy.ch>
################## configuration ###########################
#number of events (min - max)
event_min=5
event_max=20
#maximum delay in minutes
delay_max=240
#minimum and maximum ontime in minutes
ontime_min=5
ontime_max=60
#devices to consider
declare -a devices='("dg.gang" "dg.wand" "dg.dusche" "dg.bad" "dg.reduit")'
#output variant [oft|onoff]
#oft: use one at with on-for-timer of system
#onoff: use two at, one for on one for off
variant="onoff"
#command to execute
#command_start="/opt/fhem/fhem.pl 7072 \""
command_start="echo /opt/fhem/fhem.pl 7072 \""
command_end="\""
##################### Shouldnt need any changes below here #####################
# count number of devices
count=0
for i in ${devices[*]}
do
((count++))
done
# echo $count
# maximum random in bash: 32768
random_max=32768
#number of events
event=$(($RANDOM * (($event_max - $event_min)) / $random_max +$event_min))
#initialize command
command=$command_start
for ((i=0; i<$event; i++))
do
#calculate starttime
starttime=$(($RANDOM * $delay_max / $random_max))
hour=$(($starttime / 60))
minute=$(($starttime % 60))
second=$(($RANDOM * 60 / $random_max))
#calculate ontime
ontime=$(($RANDOM * (($ontime_max - $ontime_min)) / $random_max +$ontime_min))
#choose device
dev=$(($RANDOM * $count / $random_max))
case $variant in
oft)
printf "event %02d: at +%02d:%02d:%02d set %s on-for-timer %d\n" $i $hour $minute $second ${devices[$dev]} $ontime
command=`printf "$command at +%02d:%02d:%02d set %s on-for-timer %d;;" $hour $minute $second ${devices[$dev]} $ontime`
;;
onoff)
offtime=$(($starttime + $ontime))
hour_off=$(($offtime / 60))
minute_off=$(($offtime % 60))
second_off=$(($RANDOM * 60 / $random_max))
printf "event %02d/on : at +%02d:%02d:%02d set %s on\n" $i $hour $minute $second ${devices[$dev]}
printf "event %02d/off: at +%02d:%02d:%02d set %s off\n" $i $hour_off $minute_off $second_off ${devices[$dev]}
command=`printf "$command at +%02d:%02d:%02d set %s on;;" $hour $minute $second ${devices[$dev]}`
command=`printf "$command at +%02d:%02d:%02d set %s off;;" $hour_off $minute_off $second_off ${devices[$dev]}`
;;
*)
echo "no variant specifieno variant specified!!"
;;
esac
done
command="$command $command_end"
#execute command
eval "$command"

212
fhem/contrib/garden.pl Executable file
View File

@ -0,0 +1,212 @@
#!/usr/bin/perl
use warnings;
use strict;
use IO::Socket::INET;
use IO::Handle;
STDOUT->autoflush(1);
#################
# Formula:
# Compute for the last <navg> days + today the avarage temperature and the
# sum of rain, then compute the multiplier: (temp/20)^2 - rain/5
# Now multiply the duration of each vent with this multiplier
# If the value is less than a minimum, then store the value and add it
# the next day
#################
my $test = 0; # Test only, do not switch anything
my $fhzport = 7072; # Where to contact it
my $avg = "/home/rudi/log/avg.log"; # KS300 avarage log file
my $navg = 2; # Number of last avg_days to consider
my $min = 300; # If the duration is < min (sec) then collect
my $col = "/home/rudi/log/gardencoll.log"; # File where it will be collected
my $pmp = "GPumpe"; # Name of the water pump, will be switched in first
my $maxmult = 4; # Maximum factor (corresponds to 40 degree avg.
# temp over $navg days, no rain)
if(@ARGV) {
if($ARGV[0] eq "test") {
$test = 1;
} else {
print "Usage: garden.pl [test]\n";
exit(1);
}
}
my %list = (
GVent1 => { Nr => 1, Dur => 720 },
GVent2 => { Nr => 2, Dur => 480 },
GVent3 => { Nr => 3, Dur => 720 },
GVent4 => { Nr => 4, Dur => 720 },
GVent6 => { Nr => 5, Dur => 720 },
GVent7 => { Nr => 6, Dur => 480 },
GVent8 => { Nr => 7, Dur => 480 },
);
##############################
# End of config
sub fhzcommand($);
sub doswitch($$);
sub donext($$);
my ($nlines, $temp, $rain) = (0, 0, 0);
my ($KS300name, $server, $last);
my @t = localtime;
printf("%04d-%02d-%02d %02d:%02d:%02d\n",
$t[5]+1900, $t[4]+1, $t[3], $t[2], $t[1], $t[0]);
###########################
# First read in the last avg_days
open(FH, $avg) || die("$avg: $!\n");
my @avg = <FH>;
close(FH);
my @tarr; # Want the printout in the right order
while(my $l = pop(@avg)) {
next if($l !~ m/avg_day/);
my @v = split(" ", $l);
push(@tarr, "$v[0]: T: $v[4], R: $v[10]") if($test);
$temp += $v[4]; $rain += $v[10];
$KS300name = $v[1];
$nlines++;
last if($nlines >= $navg);
}
###########################
# Now get the current day
foreach my $l (split("\n", fhzcommand("list $KS300name"))) {
next if($l !~ m/avg_day/);
my @v = split(" ", $l);
print("$v[0] $v[1]: T: $v[4], R: $v[10]\n") if($test);
$temp += $v[4]; $rain += $v[10];
$nlines++;
last;
}
if($test) {
foreach my $l (@tarr) {
print "$l\n";
}
}
###########################
# the collected data
my %coll;
if(open(FH, $col)) {
while(my $l = <FH>) {
my ($k, $v) = split("[ \n]", $l);
$coll{$k} = $v;
}
close(FH);
}
###########################
# The formula
$temp /= $nlines;
$rain /= $nlines;
# safety measures
$rain = 0 if($rain < 0);
$temp = 0 if($temp < 0);
$temp = 40 if($temp > 40);
my $mult = exp( 2.0 * log( $temp / 20 )) - $rain/5;
$mult = $maxmult if($mult > $maxmult);
if($mult <= 0) {
print("Multiplier is not positive ($mult), exiting\n");
exit(0);
}
printf("Multiplier is %.2f (T: $temp, R: $rain)\n", $mult, $temp, $rain);
my $have = 0;
if(!$test) {
open(FH, ">$col") || die("Can't open $col: $!\n");
}
foreach my $a (sort { $list{$a}{Nr} <=> $list{$b}{Nr} } keys %list) {
my $dur = int($list{$a}{Dur} * $mult);
if(defined($coll{$a})) {
$dur += $coll{$a};
printf(" $a: $dur ($coll{$a})\n");
} else {
printf(" $a: $dur\n");
}
if($dur > $min) {
$list{$a}{Act} = $dur;
$have += $dur;
} else {
print FH "$a $dur\n" if(!$test);
}
}
print("Total time is $have\n");
exit(0) if($test);
close(FH);
if($have) {
doswitch($pmp, "on") if($pmp);
sleep(3) if(!$test);
foreach my $a (sort { $list{$a}{Nr} <=> $list{$b}{Nr} } keys %list) {
next if(!$list{$a}{Act});
donext($a, $list{$a}{Act});
}
donext("", 0);
doswitch($pmp, "off") if($pmp);
}
###########################
# Switch the next dev on and the last one off
sub
donext($$)
{
my ($dev, $sl) = @_;
doswitch($dev, "on");
doswitch($last, "off");
$last = $dev;
if($test) {
print "sleeping $sl\n";
} else {
sleep($sl);
}
}
###########################
# Paranoid setting.
sub
doswitch($$)
{
my ($dev, $how) = @_;
return if(!$dev || !$how);
if($test) {
print "set $dev $how\n";
return;
}
fhzcommand("set $dev $how");
sleep(1);
fhzcommand("set $dev $how");
}
###########################
sub
fhzcommand($)
{
my $cmd = shift;
my ($ret, $buf) = ("", "");
$server = IO::Socket::INET->new(PeerAddr => "localhost:$fhzport");
die "Can't connect to the server at port $fhzport\n" if(!$server);
syswrite($server, "$cmd;quit\n");
while(sysread($server, $buf, 256) > 0) {
$ret .= $buf;
}
close($server);
return $ret;
}

View File

@ -0,0 +1,46 @@
#! /bin/sh -e
#
#
#
# Written by Stefan Manteuffel
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin
DAEMON=/usr/local/bin/fhem.pl
PIDFILE=/var/run/fhem.pid
# Arguments to atd
#
ARGS="/etc/FHZ/fhem.cfg"
test -x $DAEMON || exit 0
. /lib/lsb/init-functions
case "$1" in
start)
echo "Starting deferred execution scheduler..."
start-stop-daemon -b --start --quiet --pidfile $PIDFILE --startas $DAEMON -- $ARGS
log_end_msg $?
;;
stop)
log_begin_msg "Stopping deferred execution scheduler..."
start-stop-daemon --oknodo --stop --quiet --retry 30 --pidfile $PIDFILE --name fhem.pl
log_end_msg $?
;;
force-reload|restart)
log_begin_msg "Restarting deferred execution scheduler..."
if start-stop-daemon --stop --quiet --retry 30 --pidfile $PIDFILE --name fhem.pl; then
start-stop-daemon -b --start --quiet --pidfile $PIDFILE --startas $DAEMON -- $ARGS
log_end_msg $?
else
log_end_msg 1
fi
;;
*)
echo "Usage: /etc/init.d/fhem.pl {start|stop|restart|force-reload|reload}"
exit 1
;;
esac
exit 0

View File

@ -0,0 +1,25 @@
#!/bin/sh
# by Matthias Bauer
case "$1" in
start)
echo "Starting $0"
fhem.pl /etc/fhem/fhem.conf
;;
stop)
echo "Stopping $0"
killall fhem.pl
;;
status)
cnt=`ps -ef | grep "fhem.pl" | grep -v grep | wc -l`
if [ "$cnt" -eq "0" ] ; then
echo "$0 is not running"
else
echo "$0 is running"
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0

77
fhem/contrib/ks300avg.pl Executable file
View File

@ -0,0 +1,77 @@
#!/usr/bin/perl
# Compute Daily and monthly avarage temp/hum/wind and cumulative rain values
# from the "standard" KS300 logs.
# Best to concatenate all KS300-logs into one big file (cat out*.log > big.log)
# and then start the program with ks300avg.pl big.log
# Note: the program assumes that there are no "holes" in the logs.
use strict;
use warnings;
if(@ARGV != 1) {
print "Usage: ks300avg.pl KS300-logfile\n";
exit(1);
}
open(FH, $ARGV[0]) || die("$ARGV[0]: $!\n");
my ($mt, $mh, $mw, $md) = (0,0,0,0);
my ($t, $h, $w) = (0,0,0);
my (@ld, $lsec, $lr, $mr, $ldsec);
my ($dt, $dev, $sec, @a);
while(my $l = <FH>) {
next if($l =~ m/avg/);
chomp $l;
@a = split(" ", $l);
$dev = $a[1];
$dt = $a[0];
my @d = split("[_:-]", $a[0]);
$sec = $d[3]*3600+$d[4]*60+$d[5];
if(!$lsec) {
@ld = @d;
$lr = $a[9];
$mr = $a[9];
$lsec = $ldsec = $sec;
next;
}
my $difft = $sec - $lsec;
$difft += 86400 if($d[2] != $ld[2]);
$lsec = $sec;
$t += $difft * $a[3];
$h += $difft * $a[5];
$w += $difft * $a[7];
$l = <FH>;
if($d[2] != $ld[2]) { # Day changed
my $diff = ($sec - $ldsec) + 86400;
$t /= $diff; $h /= $diff; $w /= $diff;
printf("$dt $dev avg_day T: %.1f H: %d W: %0.1f R: %.1f\n",
$t, $h, $w, $a[9]-$lr);
$lr = $a[9];
$md++;
$mt += $t; $mh += $h; $mw += $w;
$t = $h = $w = 0;
$ldsec = $sec;
}
if($d[1] != $ld[1]) { # Month changed
printf("$dt $dev avg_month T: %.1f H: %d W: %0.1f R: %.1f\n",
$mt/$md, $mh/$md, $mw/$md, $a[9]-$mr);
$mr = $a[9];
$mt = $mh = $mw = $md = 0;
}
@ld = @d;
}
printf("$dt $dev avg_day T: %.1f H: %d W: %0.1f R: %.1f\n",
$t/$sec, $h/$sec, $w/$sec, $a[9]-$lr);
printf("$dt $dev avg_month T: %.1f H: %d W: %0.1f R: %.1f\n",
$mt/$md, $mh/$md, $mw/$md, $a[9]-$mr);

15
fhem/contrib/rolwzo_not_off.sh Executable file
View File

@ -0,0 +1,15 @@
#!/bin/bash
# What do I want: If I'am sitting e.g. outside I don't want that the rollo goes
# down. solution: if the button for e.g. rollo will be pressed after 16:59
# o'clock then the at-job for going down by sunset will be deleted
# put something like the following into your fhz100.cfg:
# notifyon rolwzo /usr/local/bin/rolwzo_not_off.sh
FHZ="/usr/local/bin/fhem.pl 7072"
order="delete at set rolwzo off"
DATESTRING=`date +"%H"`
[[ $DATESTRING > 16 ]] && $FHZ "$order"

View File

@ -0,0 +1,76 @@
##############################################
# Example for writing to RRD.
# notify .*T:.* {RRDUpdateTemp("@","%")}
# and put this file in the <modpath>/FHEM directory.
package main;
use strict;
use warnings;
use RRDs;
my $DB = "/var/lib/collectd/temperature.rrd";
sub
RRD_Initialize($$)
{
my ($hash, $init) = @_;
$hash->{Type} = "none";
if(! -f $DB)
{
Log 3, "***RRD Init";
RRDs::create($DB, "--step=300",
"DS:innen:GAUGE:1800:-30.0:70.0",
"DS:bad:GAUGE:1800:-30.0:70.0",
"DS:wasser:GAUGE:1800:-30.0:70.0",
"RRA:AVERAGE:0.5:1:288",
"RRA:MAX:0.5:12:168",
"RRA:MIN:0.5:12:168",
"RRA:AVERAGE:0.5:288:365") or die "Create error: ($RRDs::error)";
}
}
### FHT80 ###
sub
RRDUpdateInnen($$)
{
my ($a1, $a2) = @_;
my @a = split(" ", $a2);
my $tm = TimeNow();
my $value = $a[1];
Log 5, "Device $a1 was set to $a2 (type: $defs{$a1}{TYPE})";
Log 2, "***InnenTemp:$value um $tm RRD";
RRDs::update($DB, "--template", "innen", "N:$value") or
die "Update error: ($RRDs::error)";
}
### HMS ###
sub
RRDUpdateTemp($$)
{
my ($a1, $a2) = @_;
# a2 is like "T: 21.2 H: 37 "
my @a = split(" ", $a2);
my $tm = TimeNow();
my $value = $a[1];
Log 5, "Device $a1 was set to $a2 (type: $defs{$a1}{TYPE})";
if($a1 eq "viebadtemp")
{
Log 2, "***BadTemp:$value um $tm RRD";
RRDs::update($DB, "--template", "bad", "N:$value") or
die "Update error: ($RRDs::error)";
}
if($a1 eq "viewassertemp")
{
Log 2, "***WasserTemp:$value um $tm RRD";
RRDs::update($DB, "--template", "wasser", "N:$value") or
die "Update error: ($RRDs::error)";
}
}
1;

View File

@ -0,0 +1,52 @@
apt-get install rrdtool
if RRDs.pm is missing apt-get install librrds-perl
apt-get collectd
Zum weiterlesen
Messdaten mit RRDtool und Perl verwalten http://www.linux-magazin.de/Artikel/ausgabe/2004/06/perl/perl.html
my example:
RRDs::create($DB, "--step=300", #300 = every 5 min
"DS:innen:GAUGE:1800:-30.0:70.0", #FHT80 room temperature
"DS:bad:GAUGE:1800:-30.0:70.0", #HMS100TF bath temperature
"DS:wasser:GAUGE:1800:-30.0:70.0", #HMS100T water temperature
"RRA:AVERAGE:0.5:1:288",
"RRA:MAX:0.5:12:168",
"RRA:MIN:0.5:12:168",
"RRA:AVERAGE:0.5:288:365") or die "Create error: ($RRDs::error)";
Modification on collection.cgi
temperature => [
'DEF:temp_avg={file}:bad:AVERAGE',
'DEF:temp_min={file}:bad:MIN',
'DEF:temp_max={file}:bad:MAX',
'DEF:i_avg={file}:innen:AVERAGE',
'DEF:i_min={file}:innen:MIN',
'DEF:i_max={file}:innen:MAX',
'DEF:w_avg={file}:wasser:AVERAGE',
'DEF:w_min={file}:wasser:MIN',
'DEF:w_max={file}:wasser:MAX',
"AREA:temp_max#$HalfBlue",
"AREA:temp_min#$Canvas",
"LINE1:temp_avg#$FullRed:Bad",
'GPRINT:temp_min:MIN:%4.1lf Min,',
'GPRINT:temp_avg:AVERAGE:%4.1lf Avg,',
'GPRINT:temp_max:MAX:%4.1lf Max,',
'GPRINT:temp_avg:LAST:%4.1lf zuletzt\l',
"LINE2:i_avg#$FullGreen:Innen",
'GPRINT:i_min:MIN:%4.1lf Min,',
'GPRINT:i_avg:AVERAGE:%4.1lf Avg,',
'GPRINT:i_max:MAX:%4.1lf Max,',
'GPRINT:i_avg:LAST:%4.1lf zuletzt\l',
"LINE3:w_avg#$FullBlue:Wasser",
'GPRINT:w_min:MIN:%4.1lf Min,',
'GPRINT:w_avg:AVERAGE:%4.1lf Avg,',
'GPRINT:w_max:MAX:%4.1lf Max,',
'GPRINT:w_avg:LAST:%4.1lf zuletzt\l'
],

89
fhem/contrib/serial.pl Executable file
View File

@ -0,0 +1,89 @@
#!/usr/bin/perl
use strict;
use warnings;
use Device::SerialPort;
use Time::HiRes qw(gettimeofday);
sub pp($$);
if(@ARGV != 3) {
printf("Usage: perl serial.pl serial-device outfile initial-hex-msg\n");
exit(1);
}
my $ser = $ARGV[0];
my $fil = $ARGV[1];
my $hm = $ARGV[2];
my $fd;
open($fd, ">$fil") || die("Can't open $fil for writing\n");
select $fd;
$| = 1;
my $serport = new Device::SerialPort ($ser);
die "Can't open $ser: $!\n" if(!$serport);
$serport->reset_error();
$serport->baudrate(38400);
$serport->databits(8);
$serport->parity('none');
$serport->stopbits(1);
$serport->handshake('none');
my $interval = 2.0; # Seconds
my $nto = gettimeofday();
my $nfound;
$hm=~ s/ //g;
$hm = pack('H*', $hm);
while (1) {
my ($rout, $rin) = ('', '');
vec($rin, 0, 1) = 1; # stdin
vec($rin, $serport->FILENO, 1) = 1;
my $to = $nto - gettimeofday();
if($to > 0) {
$nfound = select($rout=$rin, undef, undef, $to);
die("Select error $nfound / $!\n") if($nfound < 0);
}
if($to <= 0 || $nfound == 0) { # Timeout
$serport->write($hm);
pp("S>", $hm);
$nto = gettimeofday() + $interval;
}
if(vec($rout, 0, 1)) {
my $buf = <STDIN>;
die "EOF on STDIN\n" if(!defined($buf) || length($buf) == 0);
$buf=~ s/[ \r\n]//g;
$buf = pack('H*', $buf);
$serport->write($buf);
pp("X>", $buf);
}
if(vec($rout, $serport->FILENO, 1)) {
my $buf = $serport->input();
die "EOF on $ser\n" if(!defined($buf) || length($buf) == 0);
pp("S<", $buf);
}
}
sub
pp($$) {
my ($prompt, $txt) = @_;
my ($s, $ms) = gettimeofday();
my @t = localtime($s);
my $tim = sprintf("%02d:%02d:%02d.%03d", $t[2],$t[1],$t[0], $ms/1000);
for(my $i = 0; $i < length($txt); $i += 16) {
my $a = substr($txt, $i, 16);
my $h = unpack("H*", $a);
$a =~ s/[\r\n]/./g;
$a =~ s/\P{IsPrint}/\./g;
$h =~ s/(....)/$1 /g;
printf $fd "%s %s %04d %-40s %s\n", $prompt, $tim, $i, $h, $a;
}
print $fd "\n";
}

6
fhem/docs/README Normal file
View File

@ -0,0 +1,6 @@
The snippet files are here just for reference, some of them were created by me,
some of them were sent to me by fellow users of the FHZ1000, others found in
the newsgroups.
Do not assume that they were verified, they are by no means thought as an
official documentation.

1176
fhem/docs/commandref.html Normal file

File diff suppressed because it is too large Load Diff

163
fhem/docs/faq.html Normal file
View File

@ -0,0 +1,163 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>FHEM FAQ</title>
</head>
<body style="background-color: white;">
<h2>FHEM FAQ</h2>
<b>I get "undefined" messages in the log after upgrading fhem.pl</b>
<ul>
Stop fhem.pl, delete the previous .save file and restart fhem.pl.
If the problem still exists, send a bugreport.
</ul>
<b>I switched on a FS20 device directly (without the remote), but
the fhem.pl did not noticed it.<br>Is it a bug?</b>
<ul>
The protocol used by the FS20 family is quite simple: it is </b>not</b>
encrypted in any way, and there is no feedback to the sender. So if you
push any buttons on a pure receiver, no radio waves will be sent out, and
the FHZ1000 won't notice anything. The FHZ1000PC does not even know if
somebody received its message, it simply sends it out 3 times and hopes
for good luck.<br>
To answer the question: it is not a bug :-)
</ul>
<b>I have some FS20/FHT/HMS devices.<br>
How do I know their housecode?</b><br>
<ul>
If you already programmed some devices, then just start fhem.pl with one
of the example configuration files, and watch the log. When activating a
deivce (e.g. with the remote) then it will be logged as an unknown device
with the housecode. Note: the verbose level must be 3 or higher. KS300
devices do not have a proper code, so you can use anything.
</ul>
<b>I have the code for my devices in the ELV notation, which contains 1,2,3 and
4, but you require a hex code.<br>
How should I convert it?</b>
<ul>
The code used by ELV is in the "quaternal" (?) system plus one added to each
digit, so you can even use the 4 button remote for programming. To convert,
you have two choices: the program four2hex in the contrib directory, or the
good old unix program bc.
<ul>
<li>From quaternal (ELV Remote) to hex (fhem.pl):<br>
<pre>
% bc
obase=16
ibase=4
&lt;elv number&gt;</pre>
where &lt;elv number&gt; is the number used on the remote, but 1
substracted from every digit (so each digit is between 0 and 3).</li>
<li>From hex (fhem.pl) to quaternal (ELV Remote):<br>
<pre>
% bc
ibase=16
obase=4
&lt;hex number&gt;</pre>
Now add 1 to each digit of the result, and prepend it with 1's if
it has less than 4 digits.</li> </ul>
</ul>
<b>I replaced my FHZ1X00PC, now the FHT80b's does not work anymore.<br>
Help me!</b>
<ul>
The FHT80b's are talking to a single FHZ1XXX device, which has a unique
"FHTcode". You have two choices: if you know the old FHTcode, then you can
set it, or you can tell the FHT80b to forget the old FHZ, and start talking
with the new one.
<ul>
<li>Set the FHTcode: The problem with this method is that I don't know how
to read out the value, we just can change it with<br>
<code>set FHZ FHTcode &lt;hex-code&gt;</code></li>
<li>Resync the FHT80b: Press PROG until "Sond" appears, then select "CEnt"
with the wheel, press PROG again, Select "nA" with the wheel, press PROG
again.</li>
</ul>
</ul>
<b>I can specify an optional ml/raincounter for a KS300.<br>
Why do you think that 255 should be the default?</b>
<ul>
The manual talks about 0.3l resolution, but I wanted to calibrate my device.
So I filled a plastic bottle with 0.5 liter water from the measuring cup,
drilled a small hole in the bottom of the bottle, let the water flow slowly
in the KS300 rain-cup, and looked at the counter after the bottle was empty.<br>
The raincounter was incremented by 130 ticks. The diameter of my KS300
rain-cup is 13.9 cm, the area ca 151.75 cm<sup>2</sup>, which
is ca 1/65.9 m<sup>2</sup>.
The 0.5 liter corresponds to 32.95 liter per m<sup>2</sup>. 130 ticks
correspond to 32.95 l/m<sum>2</sup> -> 1 tick is ca 253 ml. I estimate
the error margin to +/- 2%<br>
You are welcome to do your own experiments, I am interested in the results.
</ul>
<b>The time specification of the builtin at command is not very flexible.<br>
Please add day/month/weekday to it.</b>
<ul>
I think the command is complex and flexible enough. Use a perl expression
for this functionality like (described in the commandref.html):
<pre>at *07:00:00 { fhz "set lamp on" if($we) }</pre>
</ul>
<b>I defined my FS20STR as an FHT device, but I do not get any data from it.</b>
<ul>
The FS20STR is an FS20 device, even if it looks like an FHT80b.
You'll get "only" on-for-timer and off-fot-timer events sent.
</ul>
<b>How to convert the FHT8b code seen in its display to the hex code needed by fhem.pl?</b>
<ul>
Convert the first 2 digits first from decimal to hex, then the next two. Example:<br>
<pre>
% bc
set obase=16
&lt;first two digits&gt;
&lt;last two digits&gt;</pre>
E.g The FHT8b code 1121 is 0b15 for the fhem.pl
</ul>
<b>I'd like to use this sunrise/sunset stuff, can you help me?</b>
<ul>
First you (most probably) have to install the DateTime::Event::Sunrise perl
module, as it is not part of the standard distributions. If it is not
installed and you copy the contrib/99_SUNRISE.pm into your module (FHEM)
directory, then the program will not start up, telling you that this module
is missing.
The (IMHO) easiest way to install it is via the following command (probably
as root):<br>
<pre>
perl -MCPAN -e shell
cpan> install DateTime::Event::Sunrise</pre>
This will fetch the module from a CPAN archive, compile it and install it,
and will do the same with each perl module which is needed by this one.<br>
Next look for the geographic coordinates of your home, e.g with a GPS
receiver or with googleearth. Compute the latitude/longitude as needed, and
enter them in your init file (fhem.cfg) with the command:
<pre>{sunrise_coord("<latitude>", "<longitude>", "Europe/Berlin") }</pre>
If you are living in a different timezone, then change the string above
according to the <code>perldoc DateTime</code> manpage.<br>
Now copy the contrib/99_SUNRISE.pm file into your module directory, and
restart the program. If everything is ok, typing
<pre>{ sunrise_abs() }</pre>
in the telnet prompt, will return the time of the sunrise today, in a
HH:MM:SS format.
</ul>
</body>
</html>

218
fhem/docs/fhem.html Normal file
View File

@ -0,0 +1,218 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Home of FHEM</title>
</head>
<body style="background-color: white">
<h1>FHEM (GPL'd FS20/HMS/FHT/KS300/WS300 server for linux, formerly known as fhz1000.pl)</h1>
<h2>News (as of =DATE=, Version =VERS=)</h2>
<ul>
</ul>
<h2>Description</h2>
<ul>
This program makes the FHZ1000/FHZ1300/WS300 USB devices sold by ELV, Conrad and
others useable with Linux. In fact, there is nothing Linux special in it, you
should be able to use it on other platforms as long as you can access the
hardware as a serial device.<br>
The program runs as a server, you can control it via telnet, command line
program or TCP/IP directly, like the supplied web frontends do.<br> <br>
Currently implemented features:<br>
<ul>
<li>reading and sending FS20 events (on/off/dimming, timer commands, etc)<br>
<li>support of FS20 address features function group, local and global master
<li>reading and changing FHT80b parameters (temp, actuator, etc).<br>
The FHT8b seems to work too. <b>Note:</b> the FHT8 wont work.</li>
<li>reading HMS data (HMS100-T,-TF,-WD,-MG,-TFK and RM100-2)</li>
<li>reading KS300 data</li>
<li>reading WS300 data</li>
<li>logging events to files (or database), with regexp filters</li>
<li>notifying external programs or internal modules when receiving certain
events</li>
<li>timed commands (e.g. switching a lamp on from sunset till midnight)</li>
<li>modular architecture</li>
<li>a lot of web frontends, choose your favorite</li>
<br>
</ul>
See <a href="commandref.html">commandref.html</a> for a detailed command
description and <a href="faq.html">faq.html</a> for the F.A.Q.
</ul>
<h2>Links:</h2>
<ul>
Homepage: <a href="http://www.koeniglich.de/fhem/fhem.html">
http://www.koeniglich.de/fhem/fhem.html</a><br>
Download: <a href="http://www.koeniglich.de/fhem/fhem-=VERS=.tar.gz">
http://www.koeniglich.de/fhem/fhem-=VERS=.tar.gz</a><br>
Google-Group: <a href="http://groups.google.com/group/FHZ1000-users-on-unix">
http://groups.google.com/group/FHZ1000-users-on-unix</a><br>
Martins Web frontend: <a href="http://www.martin-haas.de/fhz">
http://www.martin-haas.de/fhz</a><br>
fhz1000 on Nas/Routers: <a href="http://www.martin-haas.de/fhz/nslu2fhz">
http://www.martin-haas.de/fhz/nslu2fhz</a><br>
LinViex (home automation frontend): <a href="http://sourceforge.net/projects/linviex">
http://sourceforge.net/projects/linviex</a><br>
</ul>
<h2>Related projects:</h2>
<ul>
<a href="http://fhz4linux.info/">http://fhz4linux.info/</a><br>
</ul>
<h2>Installation</h2>
<ul>
<h3>Linux driver</h3>
<ul>
For kernels newer than 2.6.14 add one of the following lines
to /etc/modprobe.conf:<br>
<pre>
# FHZ1000 PC
options ftdi_sio vendor=0x0403 product=0xf06f
# FHZ1300 PC
options ftdi_sio vendor=0x0403 product=0xe0e8</pre>
If in doubt, look at the id of the device with lsusb.
For older kernels apply the patch from the doc directory to your kernel.<br>
Recompile your kernel and reboot or load/reload the ftdi_sio module.
</ul>
<h3>Perl modules</h3>
<ul>
You need perl with the Device::SerialPort (<a
href="http://search.cpan.org/dist/Device-SerialPort/">
http://search.cpan.org/dist/Device-SerialPort/</a>)
module. All other needed modules were present in my installation.
If this module reports <code>Can't call method "opened" on an undefined
value...</code> when starting the server, then you either may ignore
this message, or replace the mentioned line with:<pre>
$self->{HANDLE}->close if (defined($self->{HANDLE}) &&
$self->{HANDLE}->opened);</pre>
</ul>
<h3>Server installation</h3>
<ul>
<li>Copy the file <code>fhem.pl</code> into your path (e.g.
<code>/usr/local/bin</code>), and the FHEM directory e.g. to
<code>/usr/local/lib</code>. </li>
<li>Make sure that you can access the serial USB
device (e.g. <code>/dev/tts/USB0</code>).</li>
<li>Create a configuration file (see the examples directory and
docs/commandref.html), and change at least the modpath
(<code>/usr/local/lib</code>) and define FHZ FHZ (<code>/dev/tts/USB0</code>)
parameters.</li>
<li>Delete the savefile if you are upgrading from an older version.</li>
<li>Start the server with <code>fhem.pl &lt;configfile&gt;</code></li>
<li>For using the WS300, look into the contrib/ws300 directory.</li>
</ul>
<h3>General Notes for Webfrontends:</h3>
<ul>
<li>You don't have to install all of them, one is probably more than
enough :-)</li>
<li>The web server and the fhem server must be on the same host</li>
<li><b>Important:</b> Make sure you add some protection (.htaccess, etc)
else everybody will be able to set your devices</li>
</ul>
<h3>Web frontend 2 (webfrontend/pgm2, the simple one)</h3>
<ul>
This frontend is CGI/CSS based. It has support for rooms, and FHT/KS300 logs.<br>
Screenshots: <a href="pgm2-1.gif">overview</a>
and <a href="pgm2-2.png">temperature logs</a><br><br>
<ul>
<li>Copy the file <code>fhemweb.pl</code> to your cgi-bin directory
(/home/httpd/cgi-bin), and all the icons (*.gif) to your httpd icons
directory (/home/httpd/icons).<br>
Note: The program looks for icons in the following order:
&lt;device-name&gt;.&lt;state&gt;, &lt;device-name&gt;,
&lt;device-type&gt;.&lt;state&gt;, &lt;device-type&gt;<br>
</li>
<li>Edit <code>fhemweb.pl</code>, and check the "Config" section.</li>
<li>If you want to have access to the FHT temperature logs, then
make sure that gnuplot is installed and you log the temperatures like
in example/04_log. Note: There is still a bug with displaying empty
logfiles.</li>
<li>Call &lt;your-site&gt;/cgi-bin/fhemweb.pl
</ul>
For special features like assigning devices to rooms see the README file.
</ul>
<h3>Web frontend 3 (webfrontend/pgm3, the professional one)</h3>
<ul>
This frontend is PHP based and was contributed by Martin Haas.
Look at the webfrontends/pgm3/docs for more documentation or at
<a href="pgm3-0.5.1.png">this screenshot</a>. A lot more details can be
found on Martins page: <a href="http://www.martin-haas.de/fhz">
http://www.martin-haas.de/fhz</a>
<br><br>
<ul>
<li>Install PHP and enable it by commenting in the "LoadModule
phpX_module ..." directive in httpd.conf (perhaps it is already
done by your distro). Restart/reload httpd.</li>
<li>Create a directory (e.g.: /home/httpd/html/pgm3) and copy all the
files from the webfrontend/pgm3 to this directory.<br>Make sure that this
directory is writeable by the webserver!</li>
<li>Edit index.php (/home/httpd/html/pgm3/index.php), and check the
required settings section</li>
<li>If you want to have access to the FHT temperature logs, then:
<ul>
<li>Make sure gnuplot is installed</li>
<li>check the showgnuplot section in index.php</li>
<li>For each FHT device copy the file docs/gnuplot/gnuplot.wz to
gnuplot.fhtdevicename (to the /home/httpd/html/pgm3 directory) and
replace fht.log in this file with the absolute name of the current
logfile.</li>
</ul>
<li>Call &lt;your-site&gt;/pgm3/index.php</li>
</ul>
</ul>
<h3>Web frontend 4 (webfrontend/pgm4, the template)</h3>
<ul>
This frontend is PHP based and was contributed by Stefan Mayer. It won't work
for you without modification, it is meant as a template or as an example. See
the <a href="pgm4.gif">screenshot</a>. To install:
<ul>
<li>Copy the directory webfrontend/pgm4 to your html directory.</li>
<li>Install/enable PHP (see the description for frontend3)</li>
<li>Call the program with http://webserver/pgm4/fs20.php</li>
</ul>
Now you can go on, and modify it to suit your needs :-)
</ul>
</ul>
<h2>License:</h2>
<ul>
Copyright:<br>
<ul>
<li>Rudolf Koenig (r dot koenig at koeniglich dot de)</li>
<li>Raoul Matthiessen (webfrontends/pgm1)</li>
<li>Martin Haas (webfrontends/pgm3)</li>
</ul>
License: GPL (v2)
</ul>
</ul>
<h2>Misc:</h2>
<ul>
Thanks for Tosti for inspiration and numerous other people for help. <br>
</ul>
</body>
</html>

View File

@ -0,0 +1,44 @@
*** orig/drivers/usb/serial/ftdi_sio.c 2004-12-14 02:54:04.000000000 +0100
--- linux/drivers/usb/serial/ftdi_sio.c 2004-12-13 19:04:24.000000000 +0100
*************** static struct usb_device_id id_table_8U2
*** 350,355 ****
--- 350,356 ----
{ USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_3, 0, 0x3ff) },
{ USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_4, 0, 0x3ff) },
{ USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UO100_PID, 0, 0x3ff) },
+ { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_FHZ1000_PID, 0, 0x3ff) },
{ } /* Terminating entry */
};
*************** static struct usb_device_id id_table_FT2
*** 431,436 ****
--- 432,438 ----
{ USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_3, 0x400, 0xffff) },
{ USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_4, 0x400, 0xffff) },
{ USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UO100_PID, 0x400, 0xffff) },
+ { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_FHZ1000_PID, 0x400, 0xffff) },
{ USB_DEVICE(FTDI_VID, FTDI_CCSICDU20_0_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CCSICDU40_1_PID) },
{ } /* Terminating entry */
*************** static __devinitdata struct usb_device_i
*** 531,536 ****
--- 533,539 ----
{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_3) },
{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_4) },
{ USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) },
+ { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1000_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CCSICDU20_0_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_CCSICDU40_1_PID) },
{ } /* Terminating entry */
*** orig/drivers/usb/serial/ftdi_sio.h 2004-12-14 02:54:04.000000000 +0100
--- linux/drivers/usb/serial/ftdi_sio.h 2004-12-13 19:03:21.000000000 +0100
***************
*** 143,148 ****
--- 143,149 ----
/* ELV USB Module UO100 (PID sent by Stefan Frings) */
#define FTDI_ELV_UO100_PID 0xFB58 /* Product Id */
+ #define FTDI_ELV_FHZ1000_PID 0xF06F /* Product Id */
/*
* Definitions for ID TECH (www.idt-net.com) devices

BIN
fhem/docs/pgm1-1.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
fhem/docs/pgm1-2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

BIN
fhem/docs/pgm2-1.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
fhem/docs/pgm2-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

BIN
fhem/docs/pgm3-0.5.1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

BIN
fhem/docs/pgm4.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

16
fhem/docs/raw-codes Normal file
View File

@ -0,0 +1,16 @@
On the telnet prompt do:
{FhzDecode("<code>")}
where <code> is one of:
81xx04xx0101a0011234030011 FS20 dev: 1234 button: 03 on (11)
81xx04xx0101a0011234030000 FS20 dev: 1234 button: 03 off (00)
810d04xx4027a001de53187654321f KS300: Raincounter hex:123 (ca 75l/m2),
Wind 45.6 km/h Humidity: 78%, Temp: 13.5
Unknown fields: d,e,f
{FhzDecode("810d04xx4027a001de53187654321f")}
810e04d70213a001b16d000003000000 RM100-2 smoke on
810e04d70213a001b16d000000000000 RM100-2 smoke off
81xx04xx0101a00180c2030011 FS20 dev: 1234 button: 03 on (11)

28
fhem/docs/rm100 Normal file
View File

@ -0,0 +1,28 @@
810e041f0213a001d396000000000000
// Reset:
810e04ea0293a001ae06000000000000
// Normal:
810e046a0213a001ae06000000000000
==========
810e04ba0293a001b1d3000000000000
810e04a90293a0016a09000000000000
By andikt:
// Batteries are inserted into the smoke detector
810e04540293a001b16d000000000000
[the same comes 10 times]
// No smoke applied, status messages each 30min
810e04d40213a001b16d000000000000
// Smoke applied, detector beeps loud
810e04d70213a001b16d000003000000
// no more smoke, detector stops beeping, red LED flashes for some more
// seconds
810e04d40213a001b16d000000000000

74
fhem/docs/snippet_1.txt Normal file
View File

@ -0,0 +1,74 @@
Startup
-------
1a
PUT C9 - 02 01 1F 64
1.st fhz1000: C9 - 01 02 1F 02 78 05 5C 24 FF
2.nd fhz1000: C9 - 01 02 1F 02 78 05 5C 24 FF
3.rd fhz1000: C9 - 01 02 1F 02 78 05 5C 0A FF
1b
PUT C9 - 02 01 1F 0A
4.th fhz1000: C9 - 01 02 1F 02 78 07 B6 22 80
1c
PUT C9 - 02 01 1F 60
C9 - 01 02 1F 02 78 07 1C 22 80
2
PUT 04 - C9 01 84 57 02 08
1.st fhz1000: C9 - 01 02 84 01 08 05 FF 13 6E 21 BC 4B 1B # Serial no: 136E21BC (?)
3.rd fhz1000: C9 - 01 02 84 01 08 05 FF 13 6E 29 0E 51 18 # Serial no: 136E290E (?)
3
PUT: 04 - C9 01 86
PUT: 04 - C9 01 96
PUT: C9 - 02 01 61 04 0C 10 12 0A # Set Date to 2004-12-16 14:10
Switching FS20 device on / off
------------------------------
PUT: 04 - 020101 - HHHH BT VL
HHHH: Transmitter (Hauscode)
BT: Button
VL: Values:
00 => off,
01 => dim06%,
02 => dim12%,
03 => dim18%,
04 => dim25%,
05 => dim31%,
06 => dim37%,
07 => dim43%,
08 => dim50%,
09 => dim56%,
0A => dim62%,
0B => dim68%,
0C => dim75%,
0D => dim81%,
0E => dim87%,
0F => dim93%,
10 => dim100%,
11 => on, # Set to previous dim value (before switching it off)
12 => toggle, # between off and previous dim val
13 => dimup,
14 => dimdown,
15 => dimupdown,
16 => timer,
17 => sendstate,
18 => off-for-timer,
19 => on-for-timer,
1a => on-old-for-timer,
1b => reset,
The FSST20 switches on for dim*.
When setting bit 6 (counted from 1) in the value, you can also
send a further byte, the time as suggested in snippet_6.
The FS20ST only respects this for the values
timer, off-for-timer, on-for-timer
If the timer is set, then it works for dim*, on, *-for-timer
sendstate does not work for the FS20ST
=================================

102
fhem/docs/snippet_2.txt Normal file
View File

@ -0,0 +1,102 @@
// Init FHZ1000PC (Studio) mit FHT80b und HMS
<- 81 06 c9 2c 02 01 1f 0a
-> 81 0b c9 fb 01 02 1f 02 78 07 b6 22 80
<- 81 08 04 ba c9 01 84 5e 0b 03
-> 81 0a c9 ea 01 02 84 01 03 01 5b 03
<- 81 05 04 50 c9 01 86
<- 81 0b 04 __ 02 01 83 HH HH 65 ff 66 ff // FHT80b 1
<- 81 0b 04 __ 02 01 83 HH HH 65 ff 66 ff // FHT80b 2
<- 81 06 04 62 c9 01 96 02
<- 81 0a c9 af 02 01 61 05 0a 0e 16 18 // Datum Uhrzeit
// Init FHZ1000PC (Standard) mit FHT80b und HMS
<- 81 06 c9 82 02 01 1f 60
-> 81 0b c9 61 01 02 1f 02 78 07 1c 22 80
<- 81 08 04 af c9 01 84 57 02 08
-> 81 0f c9 __ 01 02 84 01 08 07 80 xx xx xx xx 51 0f // Seriennummer
<- 81 05 04 50 c9 01 86
<- 81 0b 04 __ 02 01 83 HH HH 65 ff 66 ff // FHT80b 1
<- 81 05 04 60 c9 01 96
<- 81 0a c9 __ 02 01 61 jj mm tt ss mm // Datum Uhrzeit
<- 81 05 04 4f c9 01 85 // Speicherabfrage
-> 81 07 c9 ac 01 02 85 01 23 // 23 ?bytes? frei
<- 81 0b 04 __ 02 01 83 HH HH 65 ff 66 ff // FHT80b 2
<- 81 05 04 4f c9 01 85 // Speicherabfrage
-> 81 07 c9 a5 01 02 85 01 1c // 1c ?bytes? frei
// FHZ1000PC
<- 81 0a c9 __ 02 01 61 jj mm tt ss mm // Uhrzeit 50 mal am Anfang einer Minute
<- 81 05 04 4f c9 01 85 // Speicherabfrage
-> 81 07 c9 __ 01 02 85 01 xx // xx = ?bytes? frei
// FHT80b
// SB=StartByte LL=Laenge TT=TelegrammType BC=BlockCheck ST=Status
// HH=Hauscode
// SB LL TT BC CODE FUNKT ST Param
-> 81 0c 04 __ 09 09 a0 01 HH HH 00 00 _6 xx // Istwert Stellantrieb
-> 81 0c 04 __ 09 09 a0 01 HH HH 00 00 2c xx // Synczeit
-> 81 0c 04 __ 09 09 a0 01 HH HH 14 00 69 xx // Montag von1 in 1/6 Stunde (10 Min.)
-> 81 0c 04 __ 09 09 a0 01 HH HH 15 00 69 xx // Montag bis1
-> 81 0c 04 __ 09 09 a0 01 HH HH 16 00 69 xx // Montag von2 (90 = frei)
-> 81 0c 04 __ 09 09 a0 01 HH HH 17 00 69 xx // Montag bis2
-> 81 0c 04 __ 09 09 a0 01 HH HH 18 00 69 xx // Dienstag von1
-> 81 0c 04 __ 09 09 a0 01 HH HH 19 00 69 xx // bis 1
-> 81 0c 04 __ 09 09 a0 01 HH HH 1a 00 69 xx // von2
-> 81 0c 04 __ 09 09 a0 01 HH HH 1b 00 69 xx // bis2
-> 81 0c 04 __ 09 09 a0 01 HH HH 1c 00 69 xx //Mittwoch von1
-> 81 0c 04 __ 09 09 a0 01 HH HH 1d 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 1e 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 1f 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 20 00 69 xx // Donnerstag
-> 81 0c 04 __ 09 09 a0 01 HH HH 21 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 22 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 23 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 24 00 69 xx // Freitag
-> 81 0c 04 __ 09 09 a0 01 HH HH 25 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 26 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 27 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 28 00 69 xx // Samstag
-> 81 0c 04 __ 09 09 a0 01 HH HH 29 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 2a 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 2b 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 2c 00 69 xx // Sonntag
-> 81 0c 04 __ 09 09 a0 01 HH HH 2d 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 2e 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 2f 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 3e 00 69 xx // 0=auto 1=manuell 2=Urlaub
-> 81 0c 04 __ 09 09 a0 01 HH HH 3f 00 69 xx // Urlaub Endeuhrzeit oder Endetag
-> 81 0c 04 __ 09 09 a0 01 HH HH 40 00 69 xx // Urlaub Endetag 10=heute 11=morgen 0x=Endemonat
-> 81 0c 04 __ 09 09 a0 01 HH HH 41 00 69 xx // aktuelle Solltemperatur (x*0.5)
-> 81 0c 04 __ 09 09 a0 01 HH HH 42 00 69 xx // ist Temperatur (x/10)
-> 81 0c 04 __ 09 09 a0 01 HH HH 43 00 69 xx // ?????
-> 81 0c 04 __ 09 09 a0 01 HH HH 44 00 69 xx // bit0=Batterie 0=OK 1=leer bit5=Fenster 0=zu 1=offen
-> 81 0c 04 __ 09 09 a0 01 HH HH 4b 00 67 xx // ?????
-> 81 0c 04 __ 09 09 a0 01 HH HH 82 00 69 xx // Tag Temperatur (x*0.5)
-> 81 0c 04 __ 09 09 a0 01 HH HH 84 00 69 xx // Nacht Temperatur (x*0.5)
-> 81 0c 04 __ 09 09 a0 01 HH HH 85 00 69 04 // ?????
-> 81 0c 04 __ 09 09 a0 01 HH HH 8a 00 69 xx // Fenster offen Temperatur (x*0.5)
-> 81 0c 04 __ 09 09 a0 01 HH HH 7e 00 67 xx // ?????
<- 81 09 04 __ 02 01 83 HH HH 3e xx // Modus setzen 00=auto 01=manu 02=Urlaub
-> 81 0b 04 __ 84 09 83 01 HH HH 3e xx yy // Übernahmequittung yy=Speicherstelle
<- 81 09 04 __ 02 01 83 HH HH 41 xx // Solltemp setzen (x=soll/0.5)
Die anderen Register können genauso verändert werden.
//HMS100TF
-> 81 0e 04 __ 05 10 a0 01 HH HH 00 00 ss tt gu ff // Temp = (utt*0.04) Feuchte = (ffg*100/4096)
// Status bit7=Negative Temp. bit6=Batterie
//ST-2
<- 81 09 04 __ 02 01 01 a0 01 HH HH xx yy // xx=Taste yy=Funktion
//Funktionen
00 Aus
01-10 Dimmen direkt
11 Ein
12 Dimmen Eintastenmodus
13 Dimmen runter
14 Dimmen rauf
15 Umschalten
16 Timerprogrammierung start/stop
1b Auslieferungszustand

60
fhem/docs/snippet_3.txt Normal file
View File

@ -0,0 +1,60 @@
// FHT80b
// SB=StartByte LL=Laenge TT=TelegrammType CC=CRC ST=Status HH=Hauscode
// SB LL TT CC CODE FUNKT ST Param
-> 81 0c 04 __ 09 09 a0 01 HH HH 00 00 _6 xx // Istwert Stellantrieb
-> 81 0c 04 __ 09 09 a0 01 HH HH 00 00 2c xx // Synczeit ???
-> 81 0c 04 __ 09 09 a0 01 HH HH 14 00 69 xx // Montag von1 in 1/6
Stunde (10 Min.)
-> 81 0c 04 __ 09 09 a0 01 HH HH 15 00 69 xx // Montag bis1
-> 81 0c 04 __ 09 09 a0 01 HH HH 16 00 69 xx // Montag von2 (90 = frei)
-> 81 0c 04 __ 09 09 a0 01 HH HH 17 00 69 xx // Montag bis2
-> 81 0c 04 __ 09 09 a0 01 HH HH 18 00 69 xx // Dienstag von1
-> 81 0c 04 __ 09 09 a0 01 HH HH 19 00 69 xx // bis 1
-> 81 0c 04 __ 09 09 a0 01 HH HH 1a 00 69 xx // von2
-> 81 0c 04 __ 09 09 a0 01 HH HH 1b 00 69 xx // bis2
-> 81 0c 04 __ 09 09 a0 01 HH HH 1c 00 69 xx // Mittwoch von1
-> 81 0c 04 __ 09 09 a0 01 HH HH 1d 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 1e 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 1f 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 20 00 69 xx // Donnerstag
-> 81 0c 04 __ 09 09 a0 01 HH HH 21 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 22 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 23 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 24 00 69 xx // Freitag
-> 81 0c 04 __ 09 09 a0 01 HH HH 25 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 26 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 27 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 28 00 69 xx // Samstag
-> 81 0c 04 __ 09 09 a0 01 HH HH 29 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 2a 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 2b 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 2c 00 69 xx // Sonntag
-> 81 0c 04 __ 09 09 a0 01 HH HH 2d 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 2e 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 2f 00 69 xx
-> 81 0c 04 __ 09 09 a0 01 HH HH 3e 00 69 xx // 0=auto 1=manuell
2=Urlaub lang, 3=Urlaub kurz
-> 81 0c 04 __ 09 09 a0 01 HH HH 3f 00 69 xx // für Mode3 Uhrzeit, für
Mode2 Endtag des Monats
-> 81 0c 04 __ 09 09 a0 01 HH HH 40 00 69 xx // für Mode3 Resttage ab
aktuellem Datum, für Mode2 Endmonat
-> 81 0c 04 __ 09 09 a0 01 HH HH 41 00 69 xx // aktuelle Solltemperatur
(x*0.5)
-> 81 0c 04 __ 09 09 a0 01 HH HH 42 00 69 xx // ist Temperatur (Teil 1)
-> 81 0c 04 __ 09 09 a0 01 HH HH 43 00 69 xx // Ist-Temperatur (Teil 2)
(Die Ermittlung der Temperatur erfolgt nach der Formel Ist-Temp = (Teil2
* 255 +Teil1) / 10)
-> 81 0c 04 __ 09 09 a0 01 HH HH 44 00 69 xx // Status (Bit0=LowBatt,
Bit1=Untertemperatur, Bit4=Störung Fenterkontakt, Bit5=Fenster auf)
-> 81 0c 04 __ 09 09 a0 01 HH HH 45 00 69 xx // Manuelle Temperatur ??
-> 81 0c 04 __ 09 09 a0 01 HH HH 4b 00 67 xx // ?????
-> 81 0c 04 __ 09 09 a0 01 HH HH 7e 00 67 xx // ?????
-> 81 0c 04 __ 09 09 a0 01 HH HH 82 00 69 xx // Komfort-Temperatur
(x*0.5)
-> 81 0c 04 __ 09 09 a0 01 HH HH 84 00 69 xx // Absenk-Temperatur
(x*0.5)
-> 81 0c 04 __ 09 09 a0 01 HH HH 85 00 69 04 // Alarm-Temp.-Differenz
-> 81 0c 04 __ 09 09 a0 01 HH HH 8a 00 69 xx // Fenster offen Temperatur
(x*0.5)

39
fhem/docs/snippet_4.txt Normal file
View File

@ -0,0 +1,39 @@
fs20:
Modulation: 100% Amplitude, also pulse und spaces
Keine festen Bitraster, ein Bit besteht immer aus pulse UND space
Bit 0: pulse+space insgesamt ca 800us,
Bit 1: ca. 1200us
Beginn einer Uebertragung: ca 20 Startbits 0, zum Start eine 1
dann Uebertragung der Datenbytes jeweils 8 Bit + Pruefbit:
msb
...
lsb
pruefbit = xor-Verknuepfung der Datenbits.
Die Uebertragung hat folgenden Aufbau:
1. hausadr1
2. hausadr0
3. adr
4. cmd
5. arg1
...
n-1. argn optional
n. pruefbyte
pruefbyte = unterste 8 Bit aus summe aller bytes 1..n-1 +6
Hauscode=hausadr1*256 + hausadr
Dass ein hauscode 11111111 tatsaechlich fuer 0 steht, ist wohl klar.
cmd 0..31: Keine Argumente
cmd 32..63: Ein Argumentbyte
Jede Uebertragung wird 3* ausgesendet.
Grueße,
automat

60
fhem/docs/snippet_5.txt Normal file
View File

@ -0,0 +1,60 @@
Fs20-Codes
0 Aus
1..15 setze auf Helligkeit
16 An auf max
17 An alter wert
18 Toggel
19 Dim UP
20 Dim Down
21 DIM up/down
22 Prog.Modus/Zeit-Messung
23 Adressmeldung / Nix
24 Sofort Aus - Timer, sofort wieder an, evtl slow off
25 Sofort Max - timer, sofort aus
26 Sofort An alter Wert - timer, sofort aus
27 ?? AUS - RESET?
28 ?
29 ?
30 sofort Max, timer, dann sofort alter wert
31 sofort An alter Wert, nach Timer - sofort Aus
32-47 S auf Helligkeit mit Speed S
48 S An auf max,
49 S An alter wert
50 T Toggel fuer T, dann alter Wert
51 T Dim up, T ?
52 T Dim down, T ?
53 T Dim up/down, T ?
54 T Programmiere Einschaltzeit
55 ?
56 T Aus fuer EinT
57 T Ein Max fuer T, dann alter Wert
58 T Ein alter Wert fuer T, dann AUS
59 ??? RESET
60 T Progr. Einschalt-Speed mit T
61 T Progr. Ausschalt-Speed mit T
62 T Ein Max fuer T, dann alter Wert
63 T Alter Wert fuer T, dann wieder aktueller Wert
S und T Argumente 2. Byte. Zeit T=0: endlos
Übrigens ein paar Anfänge zum HMS-Protokoll:
adr1 adr2 typ arg1 arg2/seqnr arg3
typ:
0 temp/feucht hms100tf
1 temp hms100t
2 Wasser hms100w/wd
3 Rauch hms100rm
4 TuerFenster hms100tfk
5 TuerFenster hms100tfk
6 Gas hms100 MG/PG/CO
7 Gas hms100 MG/PG/CO
8 Gas hms100 MG/PG/CO
9-13 unbekannt
14 hms100 FI
15 ?
+16 ??
+32 Batteriewarnung
+64 neue Batterie
+128 Vorzeichen

127
fhem/docs/snippet_6.txt Normal file
View File

@ -0,0 +1,127 @@
S20-Funkschaltsystem
1. Protokoll
1.1. Datenrahmen:
Hauscode 16 bit
Adresse 8 bit
Befehl 8 bit (16bit, wenn im ersten Befehlsbyte das Erweiterungsbit gesetzt
ist.)
Quersumme 8 bit
1.1.1. Hauscode:
0-65535
Hauscode1: 8bit (High-Byte)
Hauscode2: 8bit (Low-Byte)
1.1.2. Adresse:
High-Nibble (4bit): Adreß-Gruppe (Bank / Raum)
15 = Master- / Funktionsgruppen-Bereich
0-14 = Adreßraum für Einzeladressen
Low-Nibble (4bit): Unter-Adresse
15 = alle der Adreß-Gruppe (lokal Master)
0-14 = Einzel-Adresse / Adresse der Funktionsgruppe
Das High-Nibble wählt die Adreß-Gruppe aus. Es stehen 15 Adreß-Gruppen zur
Verfügung. Die Adreß-Gruppe 15 wählt den Master- bzw.
Funktionsgruppen-Adreßbereich aus. Das Low-Nibble bestimmt innerhalb der
gewählten Adreß-Gruppe die anzusprechende Unter-Adresse. Zum Ausführen einer
globalen Master-Funktion müssen High- und Low-Nibble der Adresse 15 sein!
Reihenfolge der Eingabe und Speicherung von Hauscode und Adresse beim Setup
von Sendern:
1. HC1: [A1|A0|B1|B0|C1|C0|D1|D0]
2. HC2: [E1|E0|F1|F0|G1|G0|H1|H0]
3. Adr: [I1|I0|J1|J0|K1|K0|L1|L0]
1.1.3. Befehl:
Unteren 5 bit:
0 00h aus
1 01h an, 6,25% Einschalten auf Helligkeitsstufe 1 (min.)
2 02h an, 12,5%
...
15 0fh an, 93,75%
16 10h an, 100% Einschalten auf Helligkeitsstufe 16 (max.)
17 11h an, alter Wert Auf letztem Helligkeitswert einschalten
18 12h toggle Wechsel zwischen aus und an, alter Wert
19 13h dim up Eine Helligkeitsstufe heller
20 14h dim down Eine Helligkeitsstufe dunkler
21 15h dim up and down ..., + bis max, kurz warten, - bis min, kurz warten,
22 16h timeset Timerprogrammierung (Start, Ende)
23 17h send status Nur bei bidirektionalen Komponenten!
24 18h aus, für Timerzeit
25 19h an, 100%, für Timerzeit
26 1ah an, alter Wert, für Timerzeit
27 1bh reset (auf Auslieferzustand)
28 1ch frei
29 1dh frei
30 1eh frei
31 1fh frei
Bit 5: Erweiterungsbit (0 = ohne, 1 = Erweiterungsbyte zwischen Befehl und
Quersumme)
Bit 6: bidirektionaler Befehl (normal = 0)
Bit 7: Antwort eines Empfängers (normal = 0)
Erweiterungsbyte bei gesetztem Erweiterungsbit:
Ist im ersten Befehlsbyte das Erweiterungsbit gesetzt, wird ein
Erweiterungsbyte eingeschoben.
Für die Befehle 0 bis 18 und 24 bis 26 gilt folgende Codierung des
Erweiterungsbytes:
Das Byte gibt die einmalige Zeitdauer für den Timer in Schritten von 0,25s an.
Bei Befehl 22 wird der Timer des Empfängers fest auf den übertragenen
Timerwert gestellt.
Das Low-Nibble gibt den Zahlenwert an. Ist es Null (= 0), wird die
Timerfunktion ignoriert und der Verbraucher dauerhaft/sofort geschaltet.
Das High-Nibble dient als Multiplikator mit dem Faktor 2^x. Es sind nur Werte
kleiner oder gleich 12 sinnvoll. Größere Werte werden auf 12 begrenzt!
Zeit = 2^(High-Nibble) * Low-Nibble * 0,25s
Die maximale Zeitdauer beträgt damit ca. 4,25Std, die minimale 0,25s, sofern
dies jeweils von den Empfängern bis zu den angegebenen Grenzen unterstützt
wird.
1.1.4. Quersumme
8bit-Summe aus 6, Hauscode, Adresse und Befehl (und Erweiterungsbyte) bilden
Werden Repeater verwendet, so treten auch um 1 oder 2 erhöhte Quersummen auf,
die von den Empfängern im Normalfall akzeptiert werden sollten. Wurde von
einem Empfänger bis 1,6s vor einem Repeater-Befehl ein normaler Befehl
empfangen, so wird der Repeater-Befehl ignoriert.
1.1.5. Komplette Übertragung:
Synchr, HC1, Parity, HC2, Parity, Adresse, Parity, Befehl, Parity, Quersumme, Parity, EOT
13 bit 8 bit 1 bit 8 bit 1 bit 8 bit 1 bit 8 bit 1 bit 8 bit 1 bit 1 bit
oder:
Synchr, HC1, Parity, HC2, Parity, Adr, Parity, Bef1, Parity, Bef2, Par, Quersumme, Par, EOT
13 bit 8 bit 1 bit 8 bit 1 bit 8 bit 1 bit 8 bit 1 bit 8 bit 1 bit 8 bit 1 bit 1 bit
Übertragung beginnt mit MSB.
Die Übertragung für ein komplettes Datenpaket mit 1 Befehl dauert 47,6ms bis
65,6ms.
Wird an der Hand-FB eine Taste < 400ms gedrückt, so wird beim Loslassen
folgendes gesendet: DAT, 10msPAUSE, DAT, 10msPAUSE, DAT, 110msPAUSE
Wird eine Taste an der Hand-FB länger als 400ms gedrückt, so wird alle 250ms
folgendes gesendet: DAT, 10msPAUSE, DAT
Im AUS-Zustand schaltet ein Dimmer bei EIN mit alter Helligkeit ein.
Im AUS-Zustand schaltet ein Dimmer bei DIMUP mit voller Helligkeit ein.
Im EIN-Zustand wird bei DIMUP eine Stufe aufgedimmt.
Alle Befehle dürfen von Empfängern immer nur 1x ausgewertet werden. Gesendet
wird der Befehl 3x mit einer Pause von 10ms. Dim-Befehle werden nur 2x mit
einer Pause von ca. 10ms und 130ms gesendet. Nach einem erkannten Befehl
ignorieren die Empfänger für 120ms weitere Befehle. Befehle von Repeatern
werden für 1,6s ignoriert.

14
fhem/docs/snippet_7.txt Normal file
View File

@ -0,0 +1,14 @@
Get 81 0c c9 78 0102 1f04a0ffb6ffffff
Get 81 0c c9 da 0102 1f04a0ffb661ffff
Set 81 05 04 61 c90197
Set 81 05 04 63 c90199
Get 81 0d 04 ac 4027a0017100215000b30f KS300 msg
Set 81 05 04 50 c90186 initHMS
Set 81 06 04 62 c9019602 InitFS20 (+02?)
Set 81 06 c9 2c 02011f0a Init3 string
Set 81 09 04 46 020101xxxx0000 Set FS20 device off
Set 81 09 04 4e c901839e010161 Set fhtcode 97 (0x61)
Set 81 09 04 57 020101xxxx0011 Set FS20 device on
Set 81 0a c9 93 02016106050f1500 Time: 2006-05-15 21:00
Set 81 0a c9 a4 02016106050f1511 Time: 2006-05-15 21:17
Set 81 0b 04 8f 020183xxxx65ff66ff Request FHT refreshvalues

17
fhem/docs/web-tipps Normal file
View File

@ -0,0 +1,17 @@
=========================================
#httpd.conf entry: no password for for distinguished hosts
ScriptAlias /cgi-bin/ "/home/httpd/cgi-bin/"
<Directory "/home/httpd/cgi-bin">
AuthType Basic
AuthName "Password Required"
AuthUserFile /home/httpd/etc/passwd
Require valid-user
Order deny,allow
Deny from all
Allow from 192.168.0.207
Allow from 192.168.0.208
Satisfy any
</Directory>
=========================================

18
fhem/examples/01_fs20 Normal file
View File

@ -0,0 +1,18 @@
#
# fhem.pl configfile
#
# Define a lamp (which is plugged in via an FS20ST).
# To program the FS20ST, start the server, plug the FS20ST in pressing its
# button, and then execute fhem.pl 7072 "set lamp on"
#
# Common part
logfile /tmp/fhem-%Y-%m.log
savefile /tmp/fhem.save # where to save the state of the devices
verbose 3 # "normal" verbosity (min 1, max 5)
port 7072 # our TCP/IP port (working from localhost only)
modpath . # where our FHEM directory is
define FHZ FHZ /dev/tts/USB0 # the serial port of an FHZ 1000 PC
define lamp FS20 8765 01 # type FS20, transmitter code 8765, button 2

72
fhem/examples/02_fs20 Normal file
View File

@ -0,0 +1,72 @@
#
# fhem.pl configfile
#
# We have 2 rollades (which are connected via the FS20MS). Button 3 on the
# FS20S20 should activate both rollades. There are three solutions:
# 1. Builtin commands
# 2. Perl expression
# 3. Shell script (realized via external script at the end of this file)
# Common part
logfile /tmp/fhem-%Y-%m.log
savefile /tmp/fhem.save # where to save the state of the devices
verbose 3 # "normal" verbosity
port 7072 # our TCP/IP port (working from localhost only)
modpath . # where our FHEM directory is
define FHZ FHZ /dev/tts/USB0 # the serial port of an FHZ 1000 PC
define roll1 FS20 7777 02 # type FS20, transmitter code 7777, button 3
define roll2 FS20 7777 03 # type FS20, transmitter code 7777, button 4
define btn3 FS20 8765 03 # define a button from the FS20S20
setstate roll1 off # initial state is closed
# Note: Only one of the methods should be used
# Method 1a: builtin commands. Note the double ;
notifyon btn3 set roll1 %;; set roll2 %
# Method 1b: shorter:
notifyon btn3 set roll1,roll2 %
# Method 2a: perl.
notifyon btn3 { fhz "set roll1 %;; set roll2 %" }
# Method 2b: perl. open the rollades only to a certain amount if they are
# closed. Else do the required command.
notifyon btn3 {\
if("%" eq "on" && $value{roll1} eq "off") {\
fhz "set roll1 on-for-timer 10";;\
fhz "set roll2 on-for-timer 16";;\
} else { \
fhz "set roll1,roll2 %"\
} \
}
# Method 3: shell. The script follows after "quit". Dont forget to chmod u+x it.
notifyon btn3 "/usr/local/bin/roll.sh %"
quit # Ignore the rest of this file
#!/bin/sh
#
# roll1 needs 10 sec to open to a certain level, roll2 16 sec. The following
# shell script opens both of them when called woth "on", and closes both of
# them else. We rely on the fact, that the FS20MS switches off after ca 60s.
#
# Note that for greater time values the FS20 timer gets inaccurate, you
# can use something like
# $fhz 7072 "set roll1 on; at +00:00:21 set roll1 on"
# instead.
#
fhz=/usr/local/bin/fhem.pl
if test $1 = "on"; then
$fhz 7072 "set roll1 on-for-timer 10
$fhz 7072 "set roll2 on-for-timer 16
else
$fhz 7072 "set roll1,roll2 off"
fi

30
fhem/examples/03_fht Normal file
View File

@ -0,0 +1,30 @@
#
# fhem.pl configfile
#
# Define an FHT80b device. You have to know its transmitter code,
# or set verbose to 4 and wait for a while watching the log.
#
# wz stands for "wohnzimmer".
# After about 5-10 minutes, check if "list wz" returns something meaningful
#
logfile /tmp/fhem-%Y-%m.log
savefile /tmp/fhem.save # where to save the state of the devices
verbose 3 # "normal" verbosity
port 7072 # our TCP/IP port (working from localhost only)
modpath . # where our FHEM directory is
define FHZ FHZ /dev/tts/USB0 # the serial port of an FHZ 1000 PC
define wz FHT 3232 # type FHT, transmitter code 3232 (default value)
#########################
# Some documentation suggests that the FHZ time should be set every minute.
# I only set it once a day.
at *03:30:00 set FHZ time
#########################
# If you wish to have up-to date information on certain strange parameters
# then comment out the line below. My devices send a message when a value
# changes, and send measured-temp, actuator and state messages regularly.
# Be patient: the reply comes in 5-10 minutes.
at *04:00:00 set wz refreshvalues

49
fhem/examples/04_log Normal file
View File

@ -0,0 +1,49 @@
#
# fhem.pl configfile
# Logging FS20/KS300 data
# See the file fht.gnuplot for displaying the logged data (or webfrontend/pgm2)
#
logfile /tmp/fhem-%Y-%m.log
savefile /tmp/fhem.save # where to save the state of the devices
verbose 3 # "normal" verbosity
port 7072 # our TCP/IP port (working from localhost only)
modpath . # where our FHEM directory is
define FHZ FHZ /dev/tts/USB0 # the serial port of an FHZ 1000 PC
define wz FHT 3232 # type FHT, transmitter code 3232 (default value)
define ks1 KS300 1234 250 # type KS300, with 250ml rain / counter
#########################
# Log temperature and actuator changes into a file, its name changes weekly
define wzlog FileLog /var/tmp/wz-%Y-%U.log wz:.*(temp|actuator).*
# ks300 log
define kslog FileLog /var/log/wz-%Y-%U.log ks1:.*H:.*
define avglog FileLog /var/log/avg.log ks1:.*avg.*
##############################
# Alternative log method. It does the same, but it is somewhat slower as it
# starts the shellscript below. Don't forget the "", as some values contain
# paranthesis, and your shell will probably bark.
notifyon wz:temp.* "/usr/local/bin/log.sh @ "@ %""
##############################
# If using the frontends pgm2 or pgm3, then you can put the devices
# into separate rooms, see the corresponding README:
attr wz room InDoor
attr wzlog room InDoor
attr ks1 room OutDoor
attr kslog room OutDoor
attr avglog room OutDoor
quit
#########################
And here is /usr/local/bin/log.sh, don't forget chmod +x
#!/bin/sh
fname=$1
shift
echo `date +"%Y-%m-%d_%H:%M:%S"` "$*" >> /var/log/$fname.log

23
fhem/examples/05_rm100 Normal file
View File

@ -0,0 +1,23 @@
#
# fhem.pl configfile
#
# Define RM100-2 devices:
#
# As the RM100-2 changes its code after the battery is changed (or the switch
# on the device itself is changed), we map _all_ RM100-2 to the device id 1001
# Check the commandref.html define, Type HMS section for details
logfile /tmp/fhem-%Y-%m.log
savefile /tmp/fhem.save # where to save the state of the devices
verbose 3 # "normal" verbosity (min 1, max 5)
port 7072 # our TCP/IP port (working from localhost only)
modpath . # where our FHEM directory is
define FHZ FHZ /dev/tts/USB0 # the serial port of an FHZ 1000 PC
define rm100 HMS 1001 # type HMS
define rm100log FileLog /var/log/wz-%Y-%U.log rm100:.*
notifyon rm100:smoke.*on "wall "FIRE: @ %""
# Test the log/notify
# fhem.pl 7072 'trigger rm100 smoke on'

39
fhem/examples/06_at Normal file
View File

@ -0,0 +1,39 @@
# These are only examples for the at and notify command
##################################
# absolute ones:
at 17:00:00 set lamp on # fhz command
at 17:00:00 { Log 1, "Teetime" } # Perl command
at 17:00:00 "/bin/echo "Teetime" > /dev/console" # shell command
at *17:00:00 set lamp on # repeat every day
##################################
# relative ones
at +00:00:10 set lamp on # switch the lamp on in 10 seconds
at +00:00:02 set lamp on-for-timer 1 # Blink once in 2 seconds
at +*{3}00:00:02 set lamp on-for-timer 1 # Blink 3 times
##################################
# Switch the lamp on from sunset to 11 PM each day
# You have to install 99_SUNRISE.pm in the FHEM directory to have sunset()
# We have to use the relative versions, as the next event is computed now
{ sunrise_coord("8.686", "50.112", "Europe/Berlin") }
at +*{sunset_rel()} set lamp on
at *23:00:00 set lamp off
##################################
# A more elegant solution, which even works if sunset is after 23:00
at +*{sunset_rel()} set lamp on-till 23:00
##################################
# Only do this on weekend. For the preset perl variables see commandref.html
at +*{sunset_rel()} { fhz("set lamp on-till 23:00") if($we) }
##################################
# Switch lamp1 and lamp2 on from 7:00 till 10 minutes after sunrise
at *07:00 set lamp1,lamp2 on-till {sunrise_abs(+600)}
##################################
# Blink 3 times if the piri sends a command
notify piri:on.* at +*{3}00:00:02 set lamp on-for-timer 1

1659
fhem/fhem.pl Executable file

File diff suppressed because it is too large Load Diff

26
fhem/test/fhem.cfg Normal file
View File

@ -0,0 +1,26 @@
logfile -
port 7072 global
verbose 3
savefile test/fhem.save
modpath .
define FHZ FHZ none
define floor-lamp FS20 1234 00
define window-lamp FS20 1234 02
define marqee FS20 1234 07
define cellar FS20 1234 13
define btn4 FS20 1234 03
define wz FHT 1235
define fl FHT 1236
define tf1 HMS 1237
def ks1 KS300 1238
# The path must be absolute, else it won't work appear in fhemweb.pl (webpgm2)
define fllog FileLog /tmp/fhem/test/fl-%Y-%U.log fl:.*(temp|actuator).*
define wzlog FileLog /tmp/fhem/test/wz-%Y-%U.log wz:.*(temp|actuator).*
define outlog FileLog /tmp/fhem/test/out-%Y-%U.log out1:.*(H:).*
notifyon btn4 /usr/local/bin/shared/setroll "%"

12
fhem/test/fhem.log Normal file
View File

@ -0,0 +1,12 @@
2007.01.16 11:59:19 1: FHZ device is none, FHZ1000 commands will be echoed only
2007.01.16 11:59:19 1: Asking the FHT device wz/1235 to send its data
2007.01.16 11:59:19 2: FHT set wz refreshvalues
2007.01.16 11:59:19 1: Can't open /tmp/fhz1000-2.1/test/wz-2007-03.log
2007.01.16 11:59:19 0: Server started (version =VERS= from =DATE=, pid 31112)
2007.01.16 12:00:00 0: Server shutdown
2007.01.16 12:00:09 1: FHZ device is none, FHZ1000 commands will be echoed only
2007.01.16 12:00:09 1: Asking the FHT device wz/1235 to send its data
2007.01.16 12:00:09 2: FHT set wz refreshvalues
2007.01.16 12:00:09 1: Can't open /tmp/fhz1000-2.1/test/wz-2007-03.log
2007.01.16 12:00:09 0: Server started (version =VERS= from =DATE=, pid 31142)
2007.01.16 12:00:24 0: Server shutdown

75
fhem/test/fhem.save Normal file
View File

@ -0,0 +1,75 @@
#Mon Jan 8 10:37:18 2007
setstate FHZ fhtbuf: 1c
setstate FHZ 2006-02-12 14:03:39 fhtbuf 23
setstate FHZ 2006-03-26 08:47:36 init2 deadbeefdeadbe
setstate FHZ 2006-03-26 08:47:36 serial deadbeef
setstate btn4 on
setstate btn4 2006-04-12 15:19:33 on
setstate cellar ???
setstate fl measured-temp: 21.6 (Celsius)
setstate fl 2006-03-29 23:02:30 actuator 00%
setstate fl 2006-03-26 08:50:43 mon-from1 06:00
setstate fl 2006-03-26 08:50:43 mon-to1 23:00
setstate fl 2006-03-26 08:50:45 tue-from1 06:00
setstate fl 2006-03-26 08:50:45 tue-to1 23:00
setstate fl 2006-03-26 08:50:46 wed-from1 06:00
setstate fl 2006-03-26 08:50:46 wed-to1 23:00
setstate fl 2006-03-26 08:50:47 thu-from1 06:00
setstate fl 2006-03-26 08:50:48 thu-to1 23:00
setstate fl 2006-03-26 08:50:49 fri-from1 06:00
setstate fl 2006-03-26 08:50:49 fri-to1 23:50
setstate fl 2006-03-26 08:50:50 sat-from1 08:00
setstate fl 2006-03-26 08:50:51 sat-to1 23:50
setstate fl 2006-03-26 08:50:53 sun-from1 08:00
setstate fl 2006-03-26 08:50:53 sun-to1 23:00
setstate fl 2006-03-26 08:50:57 mode auto
setstate fl 2006-03-29 23:01:06 desired-temp 18.0 (Celsius)
setstate fl 2006-03-29 23:04:28 state Bat: ok, Window: closed
setstate fl 2006-03-26 08:48:48 init 255
setstate fl 2006-03-26 08:50:54 day-temp 21.5 (Celsius)
setstate fl 2006-03-26 08:50:54 night-temp 18.0 (Celsius)
setstate fl 2006-03-26 08:50:55 unknown_85 4
setstate fl 2006-03-26 08:50:55 windowopen-temp 12.0 (Celsius)
setstate fl 2006-03-29 23:04:27 measured-temp 21.6 (Celsius)
setstate floor-lamp on
setstate floor-lamp 2006-03-29 12:05:34 on
setstate ks1 T: 26.5 H: 24 W: 0.0 R: 12.1
setstate ks1 2006-05-11 17:41:11 wind 0.0 (km/h)
setstate ks1 2006-05-11 17:41:11 rain 12.1 (l/m2)
setstate ks1 2006-05-11 17:41:11 temperature 26.5 (Celsius)
setstate ks1 2006-05-11 17:41:11 humidity 24 (%)
setstate marqee on
setstate marqee 2006-04-01 12:46:02 on
setstate tf1 T: 20.3 H: 31.3 Bat: ok
setstate tf1 2006-04-11 09:48:48 battery Bat: ok
setstate tf1 2006-04-11 09:48:48 type HMS100TF
setstate tf1 2006-04-11 09:48:48 temperature 20.3 (Celsius)
setstate tf1 2006-04-11 09:48:48 humidity 31.3 (%)
setstate window-lamp on
setstate window-lamp 2006-03-29 12:05:34 on
setstate wz measured-temp: 22.4 (Celsius)
setstate wz 2006-03-29 23:04:17 actuator 00%
setstate wz 2006-03-26 08:50:33 mon-from1 06:00
setstate wz 2006-03-26 08:50:33 mon-to1 23:00
setstate wz 2006-03-26 08:50:34 tue-from1 06:00
setstate wz 2006-03-26 08:50:35 tue-to1 23:00
setstate wz 2006-03-26 08:50:36 wed-from1 06:00
setstate wz 2006-03-26 08:50:36 wed-to1 23:00
setstate wz 2006-03-26 08:50:37 thu-from1 06:00
setstate wz 2006-03-26 08:50:37 thu-to1 23:00
setstate wz 2006-03-26 08:50:39 fri-from1 06:00
setstate wz 2006-03-26 08:50:39 fri-to1 23:50
setstate wz 2006-03-26 08:50:40 sat-from1 06:00
setstate wz 2006-03-26 08:50:40 sat-to1 23:50
setstate wz 2006-03-26 08:52:29 sun-from1 06:00
setstate wz 2006-03-26 08:52:29 sun-to1 23:00
setstate wz 2006-03-26 08:52:33 mode auto
setstate wz 2006-03-29 23:02:48 desired-temp 18.0 (Celsius)
setstate wz 2006-03-29 22:54:38 state Bat: ok, Window: closed
setstate wz 2006-03-26 08:48:38 init 255
setstate wz 2006-03-26 08:52:30 day-temp 22.0 (Celsius)
setstate wz 2006-03-26 08:52:31 night-temp 18.0 (Celsius)
setstate wz 2006-03-26 08:52:31 unknown_85 4
setstate wz 2006-03-26 08:52:31 windowopen-temp 12.0 (Celsius)
setstate wz 2006-03-29 22:54:38 measured-temp 22.4 (Celsius)
at *04:00:00 set wz refreshvalues

21
fhem/test/fhem_small.cfg Normal file
View File

@ -0,0 +1,21 @@
logfile -
port 7072
verbose 3
savefile test/fhem_small.save
modpath .
define FHZ FHZ none
pidfile test/fhz.pid
define floor-lamp FS20 1234 00
define window-lamps FS20 1234 01
define cellar-lamp FS20 1234 13
define btn4 FS20 1234 03
define wz FHT 1235
define tf1 HMS 1237
# The path must be abolute, else it won't work in the fhemweb.pl display
define wzlog FileLog /tmp/fhem-2.1/test/wz-%Y-%U.log wz:.*(temp|actuator).*
notifyon btn4 /usr/local/bin/shared/setroll "%"

37
fhem/test/fhem_small.save Normal file
View File

@ -0,0 +1,37 @@
#Fri Jan 26 10:49:05 2007
setstate FHZ fhtbuf: 1c
setstate btn4 off
setstate btn4 2006-04-15 11:46:39 off
setstate cellar-lamp on
setstate cellar-lamp 2006-03-29 12:05:34 on
setstate floor-lamp on
setstate floor-lamp 2007-01-26 10:40:17 on
setstate tf1 HMS100TF: T: 20.3°C, H: 31.3%, Bat: ok
setstate tf1 2006-04-11 09:48:48 HMS100TF T: 20.3°C, H: 31.3%, Bat: ok
setstate window-lamps on
setstate window-lamps 2006-03-29 12:05:34 on
setstate wz measured-temp: 22.4 (Celsius)
setstate wz 2006-03-29 23:04:17 actuator 00%
setstate wz 2006-03-26 08:50:33 mon-from1 06:00
setstate wz 2006-03-26 08:50:33 mon-to1 23:00
setstate wz 2006-03-26 08:50:34 tue-from1 06:00
setstate wz 2006-03-26 08:50:35 tue-to1 23:00
setstate wz 2006-03-26 08:50:36 wed-from1 06:00
setstate wz 2006-03-26 08:50:36 wed-to1 23:00
setstate wz 2006-03-26 08:50:37 thu-from1 06:00
setstate wz 2006-03-26 08:50:37 thu-to1 23:00
setstate wz 2006-03-26 08:50:39 fri-from1 06:00
setstate wz 2006-03-26 08:50:39 fri-to1 23:50
setstate wz 2006-03-26 08:50:40 sat-from1 06:00
setstate wz 2006-03-26 08:50:40 sat-to1 23:50
setstate wz 2006-03-26 08:52:29 sun-from1 06:00
setstate wz 2006-03-26 08:52:29 sun-to1 23:00
setstate wz 2006-03-26 08:52:33 mode auto
setstate wz 2006-03-29 23:02:48 desired-temp 18.0 (Celsius)
setstate wz 2006-03-29 22:54:38 state Bat: ok, Window: closed
setstate wz 2006-03-26 08:48:38 init 255
setstate wz 2006-03-26 08:52:30 day-temp 22.0 (Celsius)
setstate wz 2006-03-26 08:52:31 night-temp 18.0 (Celsius)
setstate wz 2006-03-26 08:52:31 unknown_85 4
setstate wz 2006-03-26 08:52:31 windowopen-temp 12.0 (Celsius)
setstate wz 2006-03-29 22:54:38 measured-temp 22.4 (Celsius)

1
fhem/test/fhz.pid Normal file
View File

@ -0,0 +1 @@
21698

423
fhem/test/fl-2006-13.log Normal file
View File

@ -0,0 +1,423 @@
2006-03-30_14:38:26 fl day-temp: 21.5 (Celsius)
2006-03-30_14:38:26 fl night-temp: 18.0 (Celsius)
2006-03-30_14:38:26 fl windowopen-temp: 12.0 (Celsius)
2006-03-30_14:38:27 fl desired-temp: 21.5 (Celsius)
2006-03-30_14:38:28 fl measured-temp: 21.8 (Celsius)
2006-03-30_14:38:28 fl measured-temp: 21.8 (Celsius)
2006-03-30_14:50:02 fl day-temp: 21.5 (Celsius)
2006-03-30_14:50:02 fl night-temp: 18.0 (Celsius)
2006-03-30_14:50:03 fl windowopen-temp: 12.0 (Celsius)
2006-03-30_14:50:04 fl desired-temp: 21.5 (Celsius)
2006-03-30_14:50:04 fl measured-temp: 21.7 (Celsius)
2006-03-30_14:50:05 fl measured-temp: 21.7 (Celsius)
2006-03-30_14:52:06 fl measured-temp: 21.7 (Celsius)
2006-03-30_14:52:07 fl measured-temp: 21.7 (Celsius)
2006-03-30_14:53:43 fl actuator: 06%
2006-03-30_14:57:35 fl actuator: 08%
2006-03-30_15:04:07 fl measured-temp: 21.6 (Celsius)
2006-03-30_15:04:07 fl measured-temp: 21.6 (Celsius)
2006-03-30_15:05:19 fl actuator: 08%
2006-03-30_15:07:15 fl actuator: 08%
2006-03-30_15:20:48 fl measured-temp: 21.5 (Celsius)
2006-03-30_15:20:48 fl measured-temp: 21.5 (Celsius)
2006-03-30_15:20:49 fl measured-temp: 21.5 (Celsius)
2006-03-30_15:38:12 fl measured-temp: 21.5 (Celsius)
2006-03-30_15:38:12 fl measured-temp: 21.5 (Celsius)
2006-03-30_15:52:07 fl measured-temp: 21.6 (Celsius)
2006-03-30_15:52:07 fl measured-temp: 21.6 (Celsius)
2006-03-30_15:53:39 fl actuator: 08%
2006-03-30_15:57:31 fl actuator: 08%
2006-03-30_16:04:07 fl measured-temp: 21.6 (Celsius)
2006-03-30_16:04:07 fl measured-temp: 21.6 (Celsius)
2006-03-30_16:05:15 fl actuator: 08%
2006-03-30_16:07:11 fl actuator: 08%
2006-03-30_16:20:44 fl measured-temp: 21.5 (Celsius)
2006-03-30_16:20:44 fl measured-temp: 21.5 (Celsius)
2006-03-30_16:38:08 fl measured-temp: 21.5 (Celsius)
2006-03-30_16:38:08 fl measured-temp: 21.5 (Celsius)
2006-03-30_16:47:47 fl actuator: 09%
2006-03-30_16:52:07 fl measured-temp: 21.6 (Celsius)
2006-03-30_16:52:07 fl measured-temp: 21.6 (Celsius)
2006-03-30_16:53:35 fl actuator: 07%
2006-03-30_16:57:27 fl actuator: 07%
2006-03-30_17:04:07 fl measured-temp: 21.6 (Celsius)
2006-03-30_17:04:07 fl measured-temp: 21.6 (Celsius)
2006-03-30_17:05:11 fl actuator: 07%
2006-03-30_17:07:07 fl actuator: 09%
2006-03-30_17:20:40 fl measured-temp: 21.5 (Celsius)
2006-03-30_17:20:40 fl measured-temp: 21.5 (Celsius)
2006-03-30_17:38:04 fl measured-temp: 21.5 (Celsius)
2006-03-30_17:38:04 fl measured-temp: 21.5 (Celsius)
2006-03-30_17:47:43 fl actuator: 09%
2006-03-30_17:52:07 fl measured-temp: 21.5 (Celsius)
2006-03-30_17:52:07 fl measured-temp: 21.5 (Celsius)
2006-03-30_17:53:31 fl actuator: 09%
2006-03-30_17:57:23 fl actuator: 09%
2006-03-30_18:04:07 fl measured-temp: 21.5 (Celsius)
2006-03-30_18:04:07 fl measured-temp: 21.5 (Celsius)
2006-03-30_18:05:07 fl actuator: 09%
2006-03-30_18:20:36 fl measured-temp: 21.5 (Celsius)
2006-03-30_18:20:36 fl measured-temp: 21.5 (Celsius)
2006-03-30_18:38:00 fl measured-temp: 21.6 (Celsius)
2006-03-30_18:38:00 fl measured-temp: 21.6 (Celsius)
2006-03-30_18:47:39 fl actuator: 09%
2006-03-30_18:52:07 fl measured-temp: 21.5 (Celsius)
2006-03-30_18:52:07 fl measured-temp: 21.5 (Celsius)
2006-03-30_18:53:27 fl actuator: 09%
2006-03-30_18:57:19 fl actuator: 09%
2006-03-30_19:05:04 fl measured-temp: 21.5 (Celsius)
2006-03-30_19:05:04 fl measured-temp: 21.5 (Celsius)
2006-03-30_19:20:32 fl measured-temp: 21.5 (Celsius)
2006-03-30_19:20:32 fl measured-temp: 21.5 (Celsius)
2006-03-30_19:37:56 fl measured-temp: 21.6 (Celsius)
2006-03-30_19:37:56 fl measured-temp: 21.6 (Celsius)
2006-03-30_19:47:35 fl actuator: 07%
2006-03-30_19:52:07 fl measured-temp: 21.6 (Celsius)
2006-03-30_19:52:07 fl measured-temp: 21.6 (Celsius)
2006-03-30_19:53:23 fl actuator: 07%
2006-03-30_19:57:15 fl actuator: 07%
2006-03-30_20:05:00 fl measured-temp: 21.5 (Celsius)
2006-03-30_20:05:00 fl measured-temp: 21.5 (Celsius)
2006-03-30_20:20:28 fl measured-temp: 21.7 (Celsius)
2006-03-30_20:20:28 fl measured-temp: 21.7 (Celsius)
2006-03-30_20:37:52 fl measured-temp: 21.8 (Celsius)
2006-03-30_20:37:52 fl measured-temp: 21.8 (Celsius)
2006-03-30_20:47:31 fl actuator: 05%
2006-03-30_20:52:07 fl measured-temp: 21.6 (Celsius)
2006-03-30_20:52:07 fl measured-temp: 21.6 (Celsius)
2006-03-30_20:53:19 fl actuator: 06%
2006-03-30_20:57:11 fl actuator: 08%
2006-03-30_21:04:56 fl measured-temp: 21.5 (Celsius)
2006-03-30_21:04:57 fl measured-temp: 21.5 (Celsius)
2006-03-30_21:20:24 fl measured-temp: 21.5 (Celsius)
2006-03-30_21:20:25 fl measured-temp: 21.5 (Celsius)
2006-03-30_21:37:47 fl actuator: 10%
2006-03-30_21:37:48 fl measured-temp: 21.4 (Celsius)
2006-03-30_21:37:49 fl measured-temp: 21.4 (Celsius)
2006-03-30_21:47:27 fl actuator: 10%
2006-03-30_21:52:07 fl measured-temp: 21.5 (Celsius)
2006-03-30_21:52:07 fl measured-temp: 21.5 (Celsius)
2006-03-30_21:52:08 fl measured-temp: 21.5 (Celsius)
2006-03-30_21:53:15 fl actuator: 09%
2006-03-30_21:57:07 fl actuator: 09%
2006-03-30_22:04:52 fl measured-temp: 21.5 (Celsius)
2006-03-30_22:04:53 fl measured-temp: 21.5 (Celsius)
2006-03-30_22:20:20 fl measured-temp: 21.5 (Celsius)
2006-03-30_22:20:21 fl measured-temp: 21.5 (Celsius)
2006-03-30_22:37:44 fl actuator: 09%
2006-03-30_22:37:44 fl measured-temp: 21.5 (Celsius)
2006-03-30_22:37:45 fl measured-temp: 21.5 (Celsius)
2006-03-30_22:47:24 fl actuator: 09%
2006-03-30_22:52:07 fl measured-temp: 21.5 (Celsius)
2006-03-30_22:52:07 fl measured-temp: 21.5 (Celsius)
2006-03-30_22:53:12 fl actuator: 09%
2006-03-30_23:01:07 fl desired-temp: 18.0 (Celsius)
2006-03-30_23:04:48 fl measured-temp: 21.5 (Celsius)
2006-03-30_23:04:49 fl measured-temp: 21.5 (Celsius)
2006-03-30_23:20:16 fl measured-temp: 21.5 (Celsius)
2006-03-30_23:20:17 fl measured-temp: 21.5 (Celsius)
2006-03-30_23:37:40 fl actuator: 00%
2006-03-30_23:37:40 fl measured-temp: 21.4 (Celsius)
2006-03-30_23:37:41 fl measured-temp: 21.4 (Celsius)
2006-03-30_23:47:20 fl actuator: 00%
2006-03-30_23:52:07 fl measured-temp: 21.4 (Celsius)
2006-03-30_23:52:07 fl measured-temp: 21.4 (Celsius)
2006-03-30_23:53:08 fl actuator: 00%
2006-03-31_00:04:44 fl measured-temp: 21.3 (Celsius)
2006-03-31_00:04:45 fl measured-temp: 21.3 (Celsius)
2006-03-31_00:20:12 fl measured-temp: 21.3 (Celsius)
2006-03-31_00:20:13 fl measured-temp: 21.3 (Celsius)
2006-03-31_00:37:36 fl actuator: 00%
2006-03-31_00:37:36 fl measured-temp: 21.2 (Celsius)
2006-03-31_00:37:37 fl measured-temp: 21.2 (Celsius)
2006-03-31_00:37:37 fl measured-temp: 21.2 (Celsius)
2006-03-31_00:47:16 fl actuator: 00%
2006-03-31_00:53:04 fl measured-temp: 21.2 (Celsius)
2006-03-31_00:53:05 fl measured-temp: 21.2 (Celsius)
2006-03-31_01:04:40 fl measured-temp: 21.2 (Celsius)
2006-03-31_01:04:41 fl measured-temp: 21.2 (Celsius)
2006-03-31_01:20:08 fl measured-temp: 21.1 (Celsius)
2006-03-31_01:20:09 fl measured-temp: 21.1 (Celsius)
2006-03-31_01:37:32 fl actuator: 00%
2006-03-31_01:37:32 fl measured-temp: 21.1 (Celsius)
2006-03-31_01:37:33 fl measured-temp: 21.1 (Celsius)
2006-03-31_01:47:12 fl actuator: 00%
2006-03-31_01:53:01 fl measured-temp: 21.1 (Celsius)
2006-03-31_01:53:01 fl measured-temp: 21.1 (Celsius)
2006-03-31_01:53:01 fl measured-temp: 21.1 (Celsius)
2006-03-31_02:04:37 fl measured-temp: 21.0 (Celsius)
2006-03-31_02:04:37 fl measured-temp: 21.0 (Celsius)
2006-03-31_02:20:07 fl measured-temp: 21.0 (Celsius)
2006-03-31_02:20:07 fl measured-temp: 21.0 (Celsius)
2006-03-31_02:27:48 fl actuator: 00%
2006-03-31_02:37:28 fl actuator: 00%
2006-03-31_02:37:29 fl measured-temp: 21.0 (Celsius)
2006-03-31_02:37:29 fl measured-temp: 21.0 (Celsius)
2006-03-31_02:47:08 fl actuator: 00%
2006-03-31_02:52:57 fl measured-temp: 20.9 (Celsius)
2006-03-31_02:52:57 fl measured-temp: 20.9 (Celsius)
2006-03-31_03:04:33 fl measured-temp: 20.9 (Celsius)
2006-03-31_03:04:33 fl measured-temp: 20.9 (Celsius)
2006-03-31_03:04:33 fl measured-temp: 20.9 (Celsius)
2006-03-31_03:20:07 fl measured-temp: 20.9 (Celsius)
2006-03-31_03:20:08 fl measured-temp: 20.9 (Celsius)
2006-03-31_03:27:44 fl actuator: 00%
2006-03-31_03:37:24 fl actuator: 00%
2006-03-31_03:37:25 fl measured-temp: 20.9 (Celsius)
2006-03-31_03:37:25 fl measured-temp: 20.9 (Celsius)
2006-03-31_03:52:53 fl measured-temp: 20.8 (Celsius)
2006-03-31_03:52:53 fl measured-temp: 20.8 (Celsius)
2006-03-31_04:04:29 fl measured-temp: 20.8 (Celsius)
2006-03-31_04:04:29 fl measured-temp: 20.8 (Celsius)
2006-03-31_04:12:12 fl actuator: 00%
2006-03-31_04:12:24 fl day-temp: 21.5 (Celsius)
2006-03-31_04:12:24 fl night-temp: 18.0 (Celsius)
2006-03-31_04:12:24 fl night-temp: 18.0 (Celsius)
2006-03-31_04:12:25 fl windowopen-temp: 12.0 (Celsius)
2006-03-31_04:12:26 fl desired-temp: 18.0 (Celsius)
2006-03-31_04:12:26 fl measured-temp: 20.8 (Celsius)
2006-03-31_04:12:27 fl measured-temp: 20.8 (Celsius)
2006-03-31_04:14:08 fl actuator: 00%
2006-03-31_04:16:04 fl actuator: 00%
2006-03-31_04:20:07 fl measured-temp: 20.8 (Celsius)
2006-03-31_04:20:07 fl measured-temp: 20.8 (Celsius)
2006-03-31_04:27:40 fl actuator: 00%
2006-03-31_04:37:20 fl actuator: 00%
2006-03-31_04:37:21 fl measured-temp: 20.8 (Celsius)
2006-03-31_04:37:21 fl measured-temp: 20.8 (Celsius)
2006-03-31_04:37:21 fl measured-temp: 20.8 (Celsius)
2006-03-31_04:37:22 fl measured-temp: 20.8 (Celsius)
2006-03-31_04:52:49 fl measured-temp: 20.7 (Celsius)
2006-03-31_04:52:49 fl measured-temp: 20.7 (Celsius)
2006-03-31_05:04:25 fl measured-temp: 20.7 (Celsius)
2006-03-31_05:04:25 fl measured-temp: 20.7 (Celsius)
2006-03-31_05:20:07 fl measured-temp: 20.7 (Celsius)
2006-03-31_05:20:08 fl measured-temp: 20.7 (Celsius)
2006-03-31_05:21:48 fl actuator: 00%
2006-03-31_05:27:36 fl actuator: 00%
2006-03-31_05:37:16 fl actuator: 00%
2006-03-31_05:37:17 fl measured-temp: 20.6 (Celsius)
2006-03-31_05:37:17 fl measured-temp: 20.6 (Celsius)
2006-03-31_05:52:45 fl measured-temp: 20.6 (Celsius)
2006-03-31_05:52:45 fl measured-temp: 20.6 (Celsius)
2006-03-31_06:01:07 fl desired-temp: 21.5 (Celsius)
2006-03-31_06:02:24 fl actuator: 25%
2006-03-31_06:04:21 fl measured-temp: 20.6 (Celsius)
2006-03-31_06:04:21 fl measured-temp: 20.6 (Celsius)
2006-03-31_06:20:08 fl measured-temp: 20.6 (Celsius)
2006-03-31_06:20:08 fl measured-temp: 20.6 (Celsius)
2006-03-31_06:21:44 fl actuator: 25%
2006-03-31_06:27:32 fl actuator: 25%
2006-03-31_06:37:12 fl actuator: 25%
2006-03-31_06:37:13 fl measured-temp: 20.6 (Celsius)
2006-03-31_06:37:13 fl measured-temp: 20.6 (Celsius)
2006-03-31_06:52:41 fl measured-temp: 20.5 (Celsius)
2006-03-31_06:52:41 fl measured-temp: 20.5 (Celsius)
2006-03-31_07:04:17 fl measured-temp: 20.6 (Celsius)
2006-03-31_07:04:17 fl measured-temp: 20.6 (Celsius)
2006-03-31_07:17:48 fl actuator: 30%
2006-03-31_07:20:07 fl measured-temp: 20.9 (Celsius)
2006-03-31_07:20:08 fl measured-temp: 20.9 (Celsius)
2006-03-31_07:21:40 fl actuator: 24%
2006-03-31_07:27:28 fl actuator: 24%
2006-03-31_07:37:08 fl actuator: 24%
2006-03-31_07:37:09 fl measured-temp: 21.1 (Celsius)
2006-03-31_07:37:09 fl measured-temp: 21.1 (Celsius)
2006-03-31_07:52:37 fl measured-temp: 21.2 (Celsius)
2006-03-31_07:52:37 fl measured-temp: 21.2 (Celsius)
2006-03-31_07:52:38 fl measured-temp: 21.2 (Celsius)
2006-03-31_08:04:13 fl measured-temp: 21.3 (Celsius)
2006-03-31_08:04:13 fl measured-temp: 21.3 (Celsius)
2006-03-31_08:17:44 fl actuator: 17%
2006-03-31_08:20:07 fl measured-temp: 21.3 (Celsius)
2006-03-31_08:20:08 fl measured-temp: 21.3 (Celsius)
2006-03-31_08:21:36 fl actuator: 17%
2006-03-31_08:27:24 fl actuator: 18%
2006-03-31_08:39:01 fl measured-temp: 21.7 (Celsius)
2006-03-31_08:39:01 fl measured-temp: 21.7 (Celsius)
2006-03-31_08:40:56 fl actuator: 10%
2006-03-31_08:42:52 fl actuator: 08%
2006-03-31_08:44:48 fl actuator: 08%
2006-03-31_08:46:44 fl actuator: 08%
2006-03-31_08:52:33 fl measured-temp: 21.8 (Celsius)
2006-03-31_08:52:33 fl measured-temp: 21.8 (Celsius)
2006-03-31_09:04:09 fl measured-temp: 21.8 (Celsius)
2006-03-31_09:04:09 fl measured-temp: 21.8 (Celsius)
2006-03-31_09:17:40 fl actuator: 07%
2006-03-31_09:20:07 fl measured-temp: 21.8 (Celsius)
2006-03-31_09:20:08 fl measured-temp: 21.8 (Celsius)
2006-03-31_09:21:32 fl actuator: 07%
2006-03-31_09:27:20 fl actuator: 07%
2006-03-31_09:38:57 fl measured-temp: 21.8 (Celsius)
2006-03-31_09:38:57 fl measured-temp: 21.8 (Celsius)
2006-03-31_09:52:29 fl measured-temp: 21.8 (Celsius)
2006-03-31_09:52:29 fl measured-temp: 21.8 (Celsius)
2006-03-31_10:04:08 fl measured-temp: 21.8 (Celsius)
2006-03-31_10:04:08 fl measured-temp: 21.8 (Celsius)
2006-03-31_10:17:36 fl actuator: 08%
2006-03-31_10:20:08 fl measured-temp: 21.7 (Celsius)
2006-03-31_10:20:08 fl measured-temp: 21.7 (Celsius)
2006-03-31_10:21:28 fl actuator: 08%
2006-03-31_10:27:16 fl actuator: 08%
2006-03-31_10:38:53 fl measured-temp: 21.7 (Celsius)
2006-03-31_10:38:53 fl measured-temp: 21.7 (Celsius)
2006-03-31_10:52:25 fl measured-temp: 21.7 (Celsius)
2006-03-31_10:52:25 fl measured-temp: 21.7 (Celsius)
2006-03-31_11:04:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_11:04:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_11:17:32 fl actuator: 09%
2006-03-31_11:20:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_11:20:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_11:21:24 fl actuator: 09%
2006-03-31_11:27:12 fl actuator: 09%
2006-03-31_11:38:49 fl measured-temp: 21.8 (Celsius)
2006-03-31_11:38:49 fl measured-temp: 21.8 (Celsius)
2006-03-31_11:52:21 fl measured-temp: 21.8 (Celsius)
2006-03-31_11:52:21 fl measured-temp: 21.8 (Celsius)
2006-03-31_12:04:08 fl measured-temp: 21.8 (Celsius)
2006-03-31_12:04:08 fl measured-temp: 21.8 (Celsius)
2006-03-31_12:07:48 fl actuator: 05%
2006-03-31_12:17:28 fl actuator: 04%
2006-03-31_12:20:08 fl measured-temp: 21.8 (Celsius)
2006-03-31_12:20:08 fl measured-temp: 21.8 (Celsius)
2006-03-31_12:21:20 fl actuator: 04%
2006-03-31_12:27:08 fl actuator: 06%
2006-03-31_12:38:45 fl measured-temp: 21.7 (Celsius)
2006-03-31_12:38:45 fl measured-temp: 21.7 (Celsius)
2006-03-31_12:52:17 fl measured-temp: 21.6 (Celsius)
2006-03-31_12:52:17 fl measured-temp: 21.6 (Celsius)
2006-03-31_13:04:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_13:04:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_13:05:48 fl actuator: 08%
2006-03-31_13:07:44 fl actuator: 08%
2006-03-31_13:17:24 fl actuator: 08%
2006-03-31_13:20:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_13:20:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_13:21:16 fl actuator: 08%
2006-03-31_13:38:41 fl measured-temp: 21.6 (Celsius)
2006-03-31_13:38:41 fl measured-temp: 21.6 (Celsius)
2006-03-31_13:52:13 fl measured-temp: 21.6 (Celsius)
2006-03-31_13:52:13 fl measured-temp: 21.6 (Celsius)
2006-03-31_14:04:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_14:04:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_14:05:44 fl actuator: 07%
2006-03-31_14:07:40 fl actuator: 07%
2006-03-31_14:17:20 fl actuator: 07%
2006-03-31_14:20:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_14:20:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_14:21:12 fl actuator: 07%
2006-03-31_14:38:37 fl measured-temp: 21.6 (Celsius)
2006-03-31_14:38:37 fl measured-temp: 21.6 (Celsius)
2006-03-31_14:52:09 fl measured-temp: 21.6 (Celsius)
2006-03-31_14:52:09 fl measured-temp: 21.6 (Celsius)
2006-03-31_15:04:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_15:04:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_15:05:40 fl actuator: 07%
2006-03-31_15:07:36 fl actuator: 07%
2006-03-31_15:17:16 fl actuator: 07%
2006-03-31_15:20:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_15:20:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_15:21:08 fl actuator: 07%
2006-03-31_15:38:33 fl measured-temp: 21.7 (Celsius)
2006-03-31_15:38:34 fl measured-temp: 21.7 (Celsius)
2006-03-31_15:52:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_15:52:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_16:04:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_16:04:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_16:05:36 fl actuator: 06%
2006-03-31_16:07:32 fl actuator: 06%
2006-03-31_16:17:12 fl actuator: 06%
2006-03-31_16:21:05 fl measured-temp: 21.6 (Celsius)
2006-03-31_16:21:06 fl measured-temp: 21.6 (Celsius)
2006-03-31_16:38:29 fl measured-temp: 21.6 (Celsius)
2006-03-31_16:38:30 fl measured-temp: 21.6 (Celsius)
2006-03-31_16:52:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_16:52:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_16:57:49 fl actuator: 06%
2006-03-31_17:04:08 fl measured-temp: 21.5 (Celsius)
2006-03-31_17:04:08 fl measured-temp: 21.5 (Celsius)
2006-03-31_17:05:33 fl actuator: 08%
2006-03-31_17:07:29 fl actuator: 08%
2006-03-31_17:17:09 fl actuator: 08%
2006-03-31_17:21:01 fl measured-temp: 21.5 (Celsius)
2006-03-31_17:21:02 fl measured-temp: 21.5 (Celsius)
2006-03-31_17:38:25 fl measured-temp: 21.5 (Celsius)
2006-03-31_17:38:26 fl measured-temp: 21.5 (Celsius)
2006-03-31_17:52:08 fl measured-temp: 21.5 (Celsius)
2006-03-31_17:52:08 fl measured-temp: 21.5 (Celsius)
2006-03-31_17:57:45 fl actuator: 09%
2006-03-31_18:04:08 fl measured-temp: 21.4 (Celsius)
2006-03-31_18:04:08 fl measured-temp: 21.4 (Celsius)
2006-03-31_18:05:29 fl actuator: 09%
2006-03-31_18:07:25 fl actuator: 10%
2006-03-31_18:20:57 fl measured-temp: 21.4 (Celsius)
2006-03-31_18:20:58 fl measured-temp: 21.4 (Celsius)
2006-03-31_18:38:21 fl measured-temp: 21.6 (Celsius)
2006-03-31_18:38:22 fl measured-temp: 21.6 (Celsius)
2006-03-31_18:52:08 fl measured-temp: 21.7 (Celsius)
2006-03-31_18:52:08 fl measured-temp: 21.7 (Celsius)
2006-03-31_18:53:49 fl actuator: 04%
2006-03-31_18:57:41 fl actuator: 04%
2006-03-31_19:04:08 fl measured-temp: 21.7 (Celsius)
2006-03-31_19:04:09 fl measured-temp: 21.7 (Celsius)
2006-03-31_19:04:09 fl measured-temp: 21.7 (Celsius)
2006-03-31_19:05:25 fl actuator: 06%
2006-03-31_19:07:21 fl actuator: 06%
2006-03-31_19:20:53 fl measured-temp: 21.6 (Celsius)
2006-03-31_19:20:54 fl measured-temp: 21.6 (Celsius)
2006-03-31_19:38:17 fl measured-temp: 21.6 (Celsius)
2006-03-31_19:38:18 fl measured-temp: 21.6 (Celsius)
2006-03-31_19:52:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_19:52:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_19:53:45 fl actuator: 07%
2006-03-31_19:57:37 fl actuator: 07%
2006-03-31_20:04:08 fl measured-temp: 21.5 (Celsius)
2006-03-31_20:04:08 fl measured-temp: 21.5 (Celsius)
2006-03-31_20:05:21 fl actuator: 07%
2006-03-31_20:07:17 fl actuator: 07%
2006-03-31_20:20:49 fl measured-temp: 21.6 (Celsius)
2006-03-31_20:20:50 fl measured-temp: 21.6 (Celsius)
2006-03-31_20:38:13 fl measured-temp: 21.7 (Celsius)
2006-03-31_20:38:14 fl measured-temp: 21.7 (Celsius)
2006-03-31_20:52:08 fl measured-temp: 21.7 (Celsius)
2006-03-31_20:52:08 fl measured-temp: 21.7 (Celsius)
2006-03-31_20:53:41 fl actuator: 03%
2006-03-31_20:57:33 fl actuator: 03%
2006-03-31_21:04:08 fl measured-temp: 21.7 (Celsius)
2006-03-31_21:04:08 fl measured-temp: 21.7 (Celsius)
2006-03-31_21:05:17 fl actuator: 03%
2006-03-31_21:07:13 fl actuator: 03%
2006-03-31_21:20:46 fl measured-temp: 21.6 (Celsius)
2006-03-31_21:20:46 fl measured-temp: 21.6 (Celsius)
2006-03-31_21:38:10 fl measured-temp: 21.6 (Celsius)
2006-03-31_21:38:10 fl measured-temp: 21.6 (Celsius)
2006-03-31_21:47:49 fl actuator: 04%
2006-03-31_21:52:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_21:52:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_21:53:37 fl actuator: 04%
2006-03-31_21:57:29 fl actuator: 04%
2006-03-31_22:04:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_22:04:08 fl measured-temp: 21.6 (Celsius)
2006-03-31_22:05:13 fl actuator: 04%
2006-03-31_22:07:09 fl actuator: 04%
2006-03-31_22:20:42 fl measured-temp: 21.5 (Celsius)
2006-03-31_22:20:42 fl measured-temp: 21.5 (Celsius)
2006-03-31_22:38:06 fl measured-temp: 21.4 (Celsius)
2006-03-31_22:38:06 fl measured-temp: 21.4 (Celsius)
2006-03-31_22:47:45 fl actuator: 08%
2006-03-31_22:52:08 fl measured-temp: 21.4 (Celsius)
2006-03-31_22:52:08 fl measured-temp: 21.4 (Celsius)
2006-03-31_22:53:33 fl actuator: 08%
2006-03-31_22:57:25 fl actuator: 08%
2006-03-31_23:04:08 fl measured-temp: 21.4 (Celsius)
2006-03-31_23:04:08 fl measured-temp: 21.4 (Celsius)
2006-03-31_23:05:09 fl actuator: 08%
2006-03-31_23:20:38 fl measured-temp: 21.4 (Celsius)
2006-03-31_23:20:38 fl measured-temp: 21.4 (Celsius)
2006-03-31_23:38:02 fl measured-temp: 21.4 (Celsius)
2006-03-31_23:38:02 fl measured-temp: 21.4 (Celsius)
2006-03-31_23:47:41 fl actuator: 08%
2006-03-31_23:51:34 fl desired-temp: 18.0 (Celsius)
2006-03-31_23:53:30 fl measured-temp: 21.4 (Celsius)
2006-03-31_23:53:30 fl measured-temp: 21.4 (Celsius)
2006-03-31_23:57:21 fl actuator: 00%

160
fhem/test/fl-2006-14.log Normal file
View File

@ -0,0 +1,160 @@
2006-04-01_00:05:06 fl measured-temp: 21.4 (Celsius)
2006-04-01_00:05:06 fl measured-temp: 21.4 (Celsius)
2006-04-01_00:20:34 fl measured-temp: 21.4 (Celsius)
2006-04-01_00:20:34 fl measured-temp: 21.4 (Celsius)
2006-04-01_00:37:58 fl measured-temp: 21.4 (Celsius)
2006-04-01_00:37:58 fl measured-temp: 21.4 (Celsius)
2006-04-01_00:47:37 fl actuator: 00%
2006-04-01_00:52:08 fl measured-temp: 21.3 (Celsius)
2006-04-01_00:52:09 fl measured-temp: 21.3 (Celsius)
2006-04-01_00:53:25 fl actuator: 00%
2006-04-01_00:57:17 fl actuator: 00%
2006-04-01_01:05:02 fl measured-temp: 21.4 (Celsius)
2006-04-01_01:05:02 fl measured-temp: 21.4 (Celsius)
2006-04-01_01:20:30 fl measured-temp: 21.4 (Celsius)
2006-04-01_01:20:30 fl measured-temp: 21.4 (Celsius)
2006-04-01_01:37:54 fl measured-temp: 21.3 (Celsius)
2006-04-01_01:37:54 fl measured-temp: 21.3 (Celsius)
2006-04-01_01:47:33 fl actuator: 00%
2006-04-01_01:52:08 fl measured-temp: 21.3 (Celsius)
2006-04-01_01:52:09 fl measured-temp: 21.3 (Celsius)
2006-04-01_01:53:21 fl actuator: 00%
2006-04-01_01:57:13 fl actuator: 00%
2006-04-01_02:04:58 fl measured-temp: 21.3 (Celsius)
2006-04-01_02:04:58 fl measured-temp: 21.3 (Celsius)
2006-04-01_02:20:26 fl measured-temp: 21.2 (Celsius)
2006-04-01_02:20:26 fl measured-temp: 21.2 (Celsius)
2006-04-01_02:37:49 fl actuator: 00%
2006-04-01_02:37:50 fl measured-temp: 21.2 (Celsius)
2006-04-01_02:37:50 fl measured-temp: 21.2 (Celsius)
2006-04-01_02:47:29 fl actuator: 00%
2006-04-01_02:52:08 fl measured-temp: 21.2 (Celsius)
2006-04-01_02:52:09 fl measured-temp: 21.2 (Celsius)
2006-04-01_02:52:09 fl measured-temp: 21.2 (Celsius)
2006-04-01_02:53:17 fl actuator: 00%
2006-04-01_02:57:09 fl actuator: 00%
2006-04-01_03:04:54 fl measured-temp: 21.2 (Celsius)
2006-04-01_03:04:54 fl measured-temp: 21.2 (Celsius)
2006-04-01_03:20:22 fl measured-temp: 21.2 (Celsius)
2006-04-01_03:20:22 fl measured-temp: 21.2 (Celsius)
2006-04-01_03:37:45 fl actuator: 00%
2006-04-01_03:37:46 fl measured-temp: 21.1 (Celsius)
2006-04-01_03:37:46 fl measured-temp: 21.1 (Celsius)
2006-04-01_03:47:25 fl actuator: 00%
2006-04-01_03:52:08 fl measured-temp: 21.1 (Celsius)
2006-04-01_03:52:09 fl measured-temp: 21.1 (Celsius)
2006-04-01_03:53:13 fl actuator: 00%
2006-04-01_04:04:50 fl measured-temp: 21.1 (Celsius)
2006-04-01_04:04:50 fl measured-temp: 21.1 (Celsius)
2006-04-01_04:12:33 fl actuator: 00%
2006-04-01_04:12:44 fl day-temp: 21.5 (Celsius)
2006-04-01_04:12:45 fl night-temp: 18.0 (Celsius)
2006-04-01_04:12:45 fl windowopen-temp: 12.0 (Celsius)
2006-04-01_04:12:46 fl desired-temp: 18.0 (Celsius)
2006-04-01_04:12:47 fl measured-temp: 21.1 (Celsius)
2006-04-01_04:12:47 fl measured-temp: 21.1 (Celsius)
2006-04-01_04:14:29 fl actuator: 00%
2006-04-01_04:16:25 fl actuator: 00%
2006-04-01_04:20:18 fl measured-temp: 21.1 (Celsius)
2006-04-01_04:20:18 fl measured-temp: 21.1 (Celsius)
2006-04-01_04:37:41 fl actuator: 00%
2006-04-01_04:37:42 fl measured-temp: 21.0 (Celsius)
2006-04-01_04:37:42 fl measured-temp: 21.0 (Celsius)
2006-04-01_04:47:21 fl actuator: 00%
2006-04-01_04:52:09 fl measured-temp: 21.0 (Celsius)
2006-04-01_04:52:09 fl measured-temp: 21.0 (Celsius)
2006-04-01_04:53:09 fl actuator: 00%
2006-04-01_05:04:46 fl measured-temp: 21.0 (Celsius)
2006-04-01_05:04:46 fl measured-temp: 21.0 (Celsius)
2006-04-01_05:20:14 fl measured-temp: 21.0 (Celsius)
2006-04-01_05:20:14 fl measured-temp: 21.0 (Celsius)
2006-04-01_05:37:37 fl actuator: 00%
2006-04-01_05:37:38 fl measured-temp: 20.9 (Celsius)
2006-04-01_05:37:38 fl measured-temp: 20.9 (Celsius)
2006-04-01_05:47:17 fl actuator: 00%
2006-04-01_05:53:06 fl measured-temp: 20.9 (Celsius)
2006-04-01_05:53:06 fl measured-temp: 20.9 (Celsius)
2006-04-01_06:04:42 fl measured-temp: 20.9 (Celsius)
2006-04-01_06:04:42 fl measured-temp: 20.9 (Celsius)
2006-04-01_06:20:10 fl measured-temp: 20.9 (Celsius)
2006-04-01_06:20:10 fl measured-temp: 20.9 (Celsius)
2006-04-01_06:37:33 fl actuator: 00%
2006-04-01_06:37:34 fl measured-temp: 20.9 (Celsius)
2006-04-01_06:37:34 fl measured-temp: 20.9 (Celsius)
2006-04-01_06:47:13 fl actuator: 00%
2006-04-01_06:53:02 fl measured-temp: 20.9 (Celsius)
2006-04-01_06:53:02 fl measured-temp: 20.9 (Celsius)
2006-04-01_07:04:38 fl measured-temp: 20.9 (Celsius)
2006-04-01_07:04:38 fl measured-temp: 20.9 (Celsius)
2006-04-01_07:20:09 fl measured-temp: 20.8 (Celsius)
2006-04-01_07:20:09 fl measured-temp: 20.8 (Celsius)
2006-04-01_07:27:49 fl actuator: 00%
2006-04-01_07:37:29 fl actuator: 00%
2006-04-01_07:37:30 fl measured-temp: 20.8 (Celsius)
2006-04-01_07:37:30 fl measured-temp: 20.8 (Celsius)
2006-04-01_07:47:09 fl actuator: 00%
2006-04-01_07:52:58 fl measured-temp: 20.8 (Celsius)
2006-04-01_07:52:58 fl measured-temp: 20.8 (Celsius)
2006-04-01_08:01:09 fl desired-temp: 21.5 (Celsius)
2006-04-01_08:02:37 fl actuator: 20%
2006-04-01_08:04:33 fl actuator: 20%
2006-04-01_08:04:34 fl measured-temp: 20.8 (Celsius)
2006-04-01_08:04:34 fl measured-temp: 20.8 (Celsius)
2006-04-01_08:20:09 fl measured-temp: 20.8 (Celsius)
2006-04-01_08:20:09 fl measured-temp: 20.8 (Celsius)
2006-04-01_08:27:45 fl actuator: 20%
2006-04-01_08:37:25 fl actuator: 11%
2006-04-01_08:37:26 fl measured-temp: 21.3 (Celsius)
2006-04-01_08:37:27 fl measured-temp: 21.3 (Celsius)
2006-04-01_08:52:54 fl measured-temp: 21.4 (Celsius)
2006-04-01_08:52:54 fl measured-temp: 21.4 (Celsius)
2006-04-01_09:04:30 fl measured-temp: 21.5 (Celsius)
2006-04-01_09:04:30 fl measured-temp: 21.5 (Celsius)
2006-04-01_09:20:09 fl measured-temp: 21.5 (Celsius)
2006-04-01_09:20:09 fl measured-temp: 21.5 (Celsius)
2006-04-01_09:27:41 fl actuator: 06%
2006-04-01_09:37:21 fl actuator: 04%
2006-04-01_09:37:22 fl measured-temp: 21.7 (Celsius)
2006-04-01_09:37:22 fl measured-temp: 21.7 (Celsius)
2006-04-01_09:52:50 fl measured-temp: 21.8 (Celsius)
2006-04-01_09:52:50 fl measured-temp: 21.8 (Celsius)
2006-04-01_10:04:26 fl measured-temp: 21.8 (Celsius)
2006-04-01_10:04:27 fl measured-temp: 21.8 (Celsius)
2006-04-01_10:20:09 fl measured-temp: 21.7 (Celsius)
2006-04-01_10:20:09 fl measured-temp: 21.7 (Celsius)
2006-04-01_10:21:49 fl actuator: 03%
2006-04-01_10:27:37 fl actuator: 01%
2006-04-01_10:37:17 fl actuator: 01%
2006-04-01_10:37:18 fl measured-temp: 21.8 (Celsius)
2006-04-01_10:37:19 fl measured-temp: 21.8 (Celsius)
2006-04-01_10:52:46 fl measured-temp: 21.7 (Celsius)
2006-04-01_10:52:47 fl measured-temp: 21.7 (Celsius)
2006-04-01_11:04:23 fl measured-temp: 21.7 (Celsius)
2006-04-01_11:04:23 fl measured-temp: 21.7 (Celsius)
2006-04-01_11:20:09 fl measured-temp: 21.6 (Celsius)
2006-04-01_11:20:09 fl measured-temp: 21.6 (Celsius)
2006-04-01_11:21:46 fl actuator: 06%
2006-04-01_11:27:34 fl actuator: 06%
2006-04-01_11:37:14 fl actuator: 06%
2006-04-01_11:37:14 fl measured-temp: 21.5 (Celsius)
2006-04-01_11:37:15 fl measured-temp: 21.5 (Celsius)
2006-04-01_11:52:42 fl measured-temp: 21.4 (Celsius)
2006-04-01_11:52:43 fl measured-temp: 21.4 (Celsius)
2006-04-01_12:04:18 fl measured-temp: 21.4 (Celsius)
2006-04-01_12:04:19 fl measured-temp: 21.4 (Celsius)
2006-04-01_12:17:50 fl actuator: 08%
2006-04-01_12:20:09 fl measured-temp: 21.4 (Celsius)
2006-04-01_12:20:09 fl measured-temp: 21.4 (Celsius)
2006-04-01_12:21:42 fl actuator: 08%
2006-04-01_12:27:30 fl actuator: 08%
2006-04-01_12:37:10 fl actuator: 10%
2006-04-01_12:37:10 fl measured-temp: 21.3 (Celsius)
2006-04-01_12:37:11 fl measured-temp: 21.3 (Celsius)
2006-04-01_12:52:38 fl measured-temp: 21.3 (Celsius)
2006-04-01_12:52:39 fl measured-temp: 21.3 (Celsius)
2006-04-01_13:04:15 fl measured-temp: 21.3 (Celsius)
2006-04-01_13:04:15 fl measured-temp: 21.3 (Celsius)
2006-04-01_13:17:46 fl actuator: 11%
2006-04-01_13:20:09 fl measured-temp: 21.3 (Celsius)
2006-04-01_13:20:09 fl measured-temp: 21.3 (Celsius)
2006-04-01_13:21:38 fl actuator: 11%

916
fhem/test/out-2006-19.log Normal file
View File

@ -0,0 +1,916 @@
2006-05-11_11:07:13 out1 T: 20.2 H: 36 W: 0.0 R: 12.4
2006-05-11_11:09:45 out1 T: 20.2 H: 35 W: 0.0 R: 12.4
2006-05-11_11:12:18 out1 T: 20.3 H: 34 W: 0.0 R: 12.4
2006-05-11_11:14:50 out1 T: 20.4 H: 34 W: 0.0 R: 12.4
2006-05-11_11:17:23 out1 T: 20.5 H: 33 W: 0.0 R: 12.4
2006-05-11_11:19:55 out1 T: 20.6 H: 32 W: 0.0 R: 12.4
2006-05-11_11:25:00 out1 T: 20.8 H: 28 W: 0.0 R: 12.4
2006-05-11_11:27:33 out1 T: 20.8 H: 30 W: 0.0 R: 12.4
2006-05-11_11:30:05 out1 T: 21.0 H: 30 W: 0.0 R: 12.4
2006-05-11_11:32:38 out1 T: 21.0 H: 31 W: 0.0 R: 12.4
2006-05-11_11:35:10 out1 T: 21.1 H: 31 W: 0.0 R: 12.4
2006-05-11_11:37:43 out1 T: 21.2 H: 30 W: 0.0 R: 12.4
2006-05-11_11:40:15 out1 T: 21.2 H: 28 W: 0.0 R: 12.4
2006-05-11_11:42:48 out1 T: 21.3 H: 28 W: 0.0 R: 12.4
2006-05-11_11:45:20 out1 T: 21.4 H: 29 W: 0.0 R: 12.4
2006-05-11_11:47:53 out1 T: 21.4 H: 30 W: 0.0 R: 12.4
2006-05-11_11:50:25 out1 T: 21.5 H: 30 W: 0.0 R: 12.4
2006-05-11_11:52:58 out1 T: 21.6 H: 28 W: 0.0 R: 12.4
2006-05-11_11:55:30 out1 T: 21.8 H: 30 W: 0.0 R: 12.4
2006-05-11_11:58:03 out1 T: 21.8 H: 25 W: 0.0 R: 12.4
2006-05-11_12:00:35 out1 T: 21.6 H: 26 W: 0.0 R: 12.4
2006-05-11_12:05:40 out1 T: 21.8 H: 26 W: 0.0 R: 12.4
2006-05-11_12:08:13 out1 T: 21.9 H: 26 W: 0.0 R: 12.4
2006-05-11_12:10:45 out1 T: 22.0 H: 27 W: 0.0 R: 12.4
2006-05-11_12:13:18 out1 T: 22.1 H: 26 W: 0.0 R: 12.4
2006-05-11_12:15:50 out1 T: 22.2 H: 24 W: 0.0 R: 12.4
2006-05-11_12:18:23 out1 T: 22.3 H: 23 W: 0.0 R: 12.4
2006-05-11_12:20:55 out1 T: 22.3 H: 24 W: 0.0 R: 12.4
2006-05-11_12:23:28 out1 T: 22.5 H: 26 W: 0.0 R: 12.4
2006-05-11_12:26:00 out1 T: 22.3 H: 25 W: 0.0 R: 12.4
2006-05-11_12:28:33 out1 T: 22.2 H: 25 W: 0.0 R: 12.4
2006-05-11_12:31:05 out1 T: 21.9 H: 25 W: 0.0 R: 12.4
2006-05-11_12:33:38 out1 T: 22.1 H: 27 W: 0.0 R: 12.4
2006-05-11_12:36:10 out1 T: 22.4 H: 30 W: 0.0 R: 12.4
2006-05-11_12:38:43 out1 T: 22.6 H: 29 W: 0.0 R: 12.4
2006-05-11_12:41:15 out1 T: 22.7 H: 27 W: 0.0 R: 12.4
2006-05-11_12:46:20 out1 T: 22.8 H: 26 W: 0.0 R: 12.4
2006-05-11_12:51:25 out1 T: 23.0 H: 28 W: 0.0 R: 12.4
2006-05-11_12:53:58 out1 T: 23.3 H: 28 W: 0.0 R: 12.4
2006-05-11_12:56:30 out1 T: 23.5 H: 26 W: 0.0 R: 12.4
2006-05-11_12:59:03 out1 T: 23.4 H: 25 W: 0.0 R: 12.4
2006-05-11_13:01:35 out1 T: 23.4 H: 24 W: 0.0 R: 12.4
2006-05-11_13:04:08 out1 T: 23.7 H: 24 W: 0.0 R: 12.4
2006-05-11_13:06:40 out1 T: 23.8 H: 24 W: 0.0 R: 12.4
2006-05-11_13:09:13 out1 T: 23.8 H: 24 W: 0.0 R: 12.4
2006-05-11_13:11:45 out1 T: 23.6 H: 23 W: 0.0 R: 12.4
2006-05-11_13:14:18 out1 T: 23.6 H: 23 W: 0.0 R: 12.4
2006-05-11_13:16:50 out1 T: 23.8 H: 23 W: 0.0 R: 12.4
2006-05-11_13:19:23 out1 T: 23.8 H: 22 W: 0.0 R: 12.4
2006-05-11_13:21:55 out1 T: 24.0 H: 22 W: 0.0 R: 12.4
2006-05-11_13:27:00 out1 T: 24.3 H: 25 W: 0.0 R: 12.4
2006-05-11_13:29:33 out1 T: 24.4 H: 24 W: 0.0 R: 12.4
2006-05-11_13:32:05 out1 T: 24.6 H: 24 W: 0.0 R: 12.4
2006-05-11_13:34:38 out1 T: 24.7 H: 24 W: 0.0 R: 12.4
2006-05-11_13:37:10 out1 T: 24.7 H: 25 W: 0.0 R: 12.4
2006-05-11_13:39:43 out1 T: 24.8 H: 24 W: 0.0 R: 12.4
2006-05-11_13:42:15 out1 T: 24.6 H: 24 W: 0.0 R: 12.4
2006-05-11_13:44:48 out1 T: 24.3 H: 24 W: 0.0 R: 12.4
2006-05-11_13:47:20 out1 T: 24.6 H: 25 W: 0.0 R: 12.4
2006-05-11_13:49:53 out1 T: 24.8 H: 24 W: 0.0 R: 12.4
2006-05-11_13:52:25 out1 T: 25.0 H: 25 W: 0.0 R: 12.4
2006-05-11_13:54:58 out1 T: 24.8 H: 24 W: 0.0 R: 12.4
2006-05-11_13:57:30 out1 T: 24.8 H: 24 W: 0.0 R: 12.4
2006-05-11_14:00:03 out1 T: 25.0 H: 24 W: 0.0 R: 12.4
2006-05-11_14:02:36 out1 T: 25.1 H: 23 W: 0.0 R: 12.4
2006-05-11_14:07:41 out1 T: 25.0 H: 24 W: 0.0 R: 12.4
2006-05-11_14:10:13 out1 T: 25.2 H: 24 W: 0.0 R: 12.4
2006-05-11_14:12:46 out1 T: 25.4 H: 24 W: 0.0 R: 12.4
2006-05-11_14:15:18 out1 T: 25.6 H: 23 W: 0.0 R: 12.4
2006-05-11_14:17:51 out1 T: 25.7 H: 23 W: 0.0 R: 12.4
2006-05-11_14:20:23 out1 T: 25.8 H: 22 W: 0.0 R: 12.4
2006-05-11_14:22:56 out1 T: 26.0 H: 22 W: 0.0 R: 12.4
2006-05-11_14:25:28 out1 T: 26.4 H: 22 W: 0.0 R: 12.4
2006-05-11_14:28:01 out1 T: 26.8 H: 21 W: 0.0 R: 12.4
2006-05-11_14:30:33 out1 T: 27.4 H: 22 W: 0.0 R: 12.4
2006-05-11_14:33:06 out1 T: 27.2 H: 21 W: 0.0 R: 12.4
2006-05-11_14:35:38 out1 T: 27.0 H: 21 W: 0.0 R: 12.4
2006-05-11_14:38:11 out1 T: 27.6 H: 21 W: 0.0 R: 12.4
2006-05-11_14:40:43 out1 T: 27.7 H: 21 W: 0.0 R: 12.4
2006-05-11_14:43:16 out1 T: 28.6 H: 21 W: 0.0 R: 12.4
2006-05-11_14:48:21 out1 T: 30.2 H: 20 W: 0.0 R: 12.4
2006-05-11_14:50:53 out1 T: 30.0 H: 20 W: 0.0 R: 12.4
2006-05-11_14:53:26 out1 T: 30.7 H: 19 W: 0.0 R: 12.4
2006-05-11_14:55:58 out1 T: 31.3 H: 18 W: 0.0 R: 12.4
2006-05-11_14:58:31 out1 T: 31.4 H: 18 W: 0.0 R: 12.4
2006-05-11_15:01:03 out1 T: 31.4 H: 18 W: 0.0 R: 12.4
2006-05-11_15:03:36 out1 T: 31.9 H: 17 W: 0.0 R: 12.4
2006-05-11_15:06:08 out1 T: 31.7 H: 17 W: 0.0 R: 12.4
2006-05-11_15:08:41 out1 T: 31.8 H: 16 W: 0.0 R: 12.4
2006-05-11_15:11:13 out1 T: 32.1 H: 16 W: 0.0 R: 12.4
2006-05-11_15:13:46 out1 T: 32.3 H: 18 W: 0.0 R: 12.4
2006-05-11_15:16:18 out1 T: 32.6 H: 18 W: 0.0 R: 12.4
2006-05-11_15:18:51 out1 T: 31.4 H: 17 W: 0.0 R: 12.4
2006-05-11_15:21:23 out1 T: 30.8 H: 18 W: 0.0 R: 12.4
2006-05-11_15:23:56 out1 T: 30.3 H: 17 W: 0.0 R: 12.4
2006-05-11_15:34:06 out1 T: 27.5 H: 19 W: 0.8 R: 12.4
2006-05-11_15:36:38 out1 T: 26.8 H: 20 W: 0.2 R: 12.4
2006-05-11_15:39:11 out1 T: 27.4 H: 21 W: 0.0 R: 12.4
2006-05-11_15:41:43 out1 T: 27.9 H: 20 W: 0.0 R: 12.4
2006-05-11_15:44:16 out1 T: 28.3 H: 20 W: 0.0 R: 12.4
2006-05-11_15:46:48 out1 T: 28.0 H: 20 W: 0.0 R: 12.4
2006-05-11_15:49:21 out1 T: 28.0 H: 20 W: 0.0 R: 12.4
2006-05-11_15:51:53 out1 T: 27.4 H: 20 W: 0.0 R: 12.4
2006-05-11_15:54:26 out1 T: 27.2 H: 21 W: 0.2 R: 12.4
2006-05-11_15:56:58 out1 T: 27.4 H: 21 W: 0.0 R: 12.4
2006-05-11_15:59:31 out1 T: 27.5 H: 21 W: 0.0 R: 12.4
2006-05-11_16:02:03 out1 T: 27.6 H: 21 W: 0.0 R: 12.4
2006-05-11_16:09:41 out1 T: 27.5 H: 20 W: 0.0 R: 12.4
2006-05-11_16:12:13 out1 T: 27.5 H: 21 W: 0.0 R: 12.4
2006-05-11_16:14:46 out1 T: 27.4 H: 21 W: 0.0 R: 12.4
2006-05-11_16:17:18 out1 T: 27.4 H: 21 W: 0.0 R: 12.4
2006-05-11_16:19:51 out1 T: 26.8 H: 21 W: 0.0 R: 12.4
2006-05-11_16:22:23 out1 T: 26.8 H: 21 W: 0.0 R: 12.4
2006-05-11_16:24:56 out1 T: 26.7 H: 21 W: 0.0 R: 12.4
2006-05-11_16:27:28 out1 T: 27.2 H: 21 W: 0.0 R: 12.4
2006-05-11_16:30:01 out1 T: 27.2 H: 21 W: 0.0 R: 12.4
2006-05-11_16:32:33 out1 T: 27.7 H: 21 W: 0.0 R: 12.4
2006-05-11_16:35:06 out1 T: 28.4 H: 21 W: 0.0 R: 12.4
2006-05-11_16:37:38 out1 T: 29.0 H: 21 W: 0.0 R: 12.4
2006-05-11_16:40:11 out1 T: 29.6 H: 20 W: 0.0 R: 12.4
2006-05-11_16:42:43 out1 T: 29.8 H: 20 W: 0.0 R: 12.4
2006-05-11_16:45:16 out1 T: 29.4 H: 20 W: 0.0 R: 12.4
2006-05-11_16:50:21 out1 T: 28.3 H: 20 W: 0.0 R: 12.4
2006-05-11_16:52:53 out1 T: 28.6 H: 21 W: 0.0 R: 12.4
2006-05-11_16:55:26 out1 T: 28.2 H: 21 W: 0.0 R: 12.4
2006-05-11_16:57:58 out1 T: 28.0 H: 22 W: 0.0 R: 12.4
2006-05-11_17:00:31 out1 T: 27.3 H: 23 W: 0.0 R: 12.4
2006-05-11_17:05:36 out1 T: 27.1 H: 23 W: 0.0 R: 12.4
2006-05-11_17:08:08 out1 T: 27.2 H: 23 W: 0.0 R: 12.4
2006-05-11_17:10:41 out1 T: 27.3 H: 23 W: 0.0 R: 12.4
2006-05-11_17:13:13 out1 T: 27.5 H: 22 W: 0.0 R: 12.4
2006-05-11_17:31:01 out1 T: 28.2 H: 22 W: 0.2 R: 12.4
2006-05-11_17:33:33 out1 T: 28.0 H: 22 W: 0.0 R: 12.4
2006-05-11_17:36:06 out1 T: 27.2 H: 22 W: 0.0 R: 12.4
2006-05-11_17:38:38 out1 T: 26.5 H: 23 W: 0.0 R: 12.4
2006-05-11_17:41:11 out1 T: 26.5 H: 24 W: 0.0 R: 12.4
2006-05-11_17:46:16 out1 T: 26.0 H: 24 W: 0.0 R: 12.4
2006-05-11_17:51:21 out1 T: 25.9 H: 25 W: 0.0 R: 12.4
2006-05-11_17:58:59 out1 T: 25.6 H: 25 W: 0.0 R: 12.4
2006-05-11_18:01:31 out1 T: 25.5 H: 26 W: 0.0 R: 12.4
2006-05-11_18:04:04 out1 T: 25.5 H: 27 W: 0.0 R: 12.4
2006-05-11_18:06:36 out1 T: 25.4 H: 27 W: 0.0 R: 12.4
2006-05-11_18:11:41 out1 T: 25.4 H: 27 W: 0.0 R: 12.4
2006-05-11_18:14:14 out1 T: 25.6 H: 26 W: 0.0 R: 12.4
2006-05-11_18:16:46 out1 T: 25.4 H: 25 W: 0.0 R: 12.4
2006-05-11_18:19:19 out1 T: 25.3 H: 25 W: 0.0 R: 12.4
2006-05-11_18:21:51 out1 T: 25.4 H: 27 W: 0.0 R: 12.4
2006-05-11_18:24:24 out1 T: 25.4 H: 27 W: 0.0 R: 12.4
2006-05-11_18:26:56 out1 T: 25.3 H: 26 W: 0.0 R: 12.4
2006-05-11_18:29:29 out1 T: 25.2 H: 27 W: 0.0 R: 12.4
2006-05-11_18:32:01 out1 T: 24.9 H: 27 W: 0.0 R: 12.4
2006-05-11_18:34:34 out1 T: 24.8 H: 27 W: 0.0 R: 12.4
2006-05-11_18:44:44 out1 T: 24.6 H: 27 W: 0.0 R: 12.4
2006-05-11_18:47:16 out1 T: 24.5 H: 28 W: 0.0 R: 12.4
2006-05-11_18:52:21 out1 T: 24.4 H: 27 W: 0.0 R: 12.4
2006-05-11_18:54:54 out1 T: 24.3 H: 27 W: 0.0 R: 12.4
2006-05-11_18:57:26 out1 T: 24.2 H: 28 W: 0.0 R: 12.4
2006-05-11_18:59:59 out1 T: 24.2 H: 28 W: 0.0 R: 12.4
2006-05-11_19:02:31 out1 T: 24.2 H: 28 W: 0.0 R: 12.4
2006-05-11_19:05:04 out1 T: 24.1 H: 29 W: 0.0 R: 12.4
2006-05-11_19:07:36 out1 T: 24.2 H: 29 W: 0.0 R: 12.4
2006-05-11_19:10:09 out1 T: 24.1 H: 28 W: 0.0 R: 12.4
2006-05-11_19:12:41 out1 T: 24.0 H: 28 W: 0.0 R: 12.4
2006-05-11_19:15:14 out1 T: 24.0 H: 29 W: 0.0 R: 12.4
2006-05-11_19:17:46 out1 T: 24.0 H: 29 W: 0.0 R: 12.4
2006-05-11_19:20:19 out1 T: 24.0 H: 29 W: 0.0 R: 12.4
2006-05-11_19:22:51 out1 T: 24.0 H: 29 W: 0.0 R: 12.4
2006-05-11_19:25:24 out1 T: 24.0 H: 30 W: 0.0 R: 12.4
2006-05-11_19:27:56 out1 T: 23.9 H: 30 W: 0.0 R: 12.4
2006-05-11_19:33:01 out1 T: 23.8 H: 30 W: 0.0 R: 12.4
2006-05-11_19:35:34 out1 T: 23.8 H: 30 W: 0.0 R: 12.4
2006-05-11_19:38:06 out1 T: 23.8 H: 30 W: 0.0 R: 12.4
2006-05-11_19:40:39 out1 T: 23.7 H: 30 W: 0.0 R: 12.4
2006-05-11_19:43:11 out1 T: 23.7 H: 30 W: 0.0 R: 12.4
2006-05-11_19:45:44 out1 T: 23.8 H: 30 W: 0.0 R: 12.4
2006-05-11_19:48:16 out1 T: 23.9 H: 30 W: 0.0 R: 12.4
2006-05-11_19:50:49 out1 T: 24.2 H: 31 W: 0.0 R: 12.4
2006-05-11_19:53:21 out1 T: 24.4 H: 30 W: 0.0 R: 12.4
2006-05-11_19:55:54 out1 T: 24.8 H: 30 W: 4.7 R: 12.4
2006-05-11_19:58:26 out1 T: 25.2 H: 30 W: 0.0 R: 12.4
2006-05-11_20:00:59 out1 T: 25.5 H: 30 W: 0.0 R: 12.4
2006-05-11_20:03:31 out1 T: 25.9 H: 29 W: 0.0 R: 12.4
2006-05-11_20:06:04 out1 T: 25.9 H: 28 W: 0.0 R: 12.4
2006-05-11_20:08:36 out1 T: 25.9 H: 29 W: 0.0 R: 12.4
2006-05-11_20:13:41 out1 T: 25.2 H: 31 W: 0.0 R: 12.4
2006-05-11_20:16:14 out1 T: 24.8 H: 32 W: 0.0 R: 12.4
2006-05-11_20:18:46 out1 T: 24.5 H: 32 W: 0.0 R: 12.4
2006-05-11_20:21:19 out1 T: 24.0 H: 33 W: 0.0 R: 12.4
2006-05-11_20:23:51 out1 T: 23.7 H: 34 W: 0.0 R: 12.4
2006-05-11_20:26:24 out1 T: 23.5 H: 34 W: 0.0 R: 12.4
2006-05-11_20:28:56 out1 T: 23.3 H: 34 W: 0.0 R: 12.4
2006-05-11_20:31:29 out1 T: 23.1 H: 34 W: 0.0 R: 12.4
2006-05-11_20:34:01 out1 T: 22.9 H: 34 W: 0.0 R: 12.4
2006-05-11_20:36:34 out1 T: 22.7 H: 35 W: 0.0 R: 12.4
2006-05-11_20:39:06 out1 T: 22.5 H: 36 W: 0.0 R: 12.4
2006-05-11_20:41:39 out1 T: 22.4 H: 36 W: 0.0 R: 12.4
2006-05-11_20:44:11 out1 T: 22.2 H: 35 W: 0.0 R: 12.4
2006-05-11_20:46:44 out1 T: 22.0 H: 36 W: 0.0 R: 12.4
2006-05-11_20:49:16 out1 T: 21.8 H: 37 W: 0.0 R: 12.4
2006-05-11_20:54:21 out1 T: 21.5 H: 37 W: 0.0 R: 12.4
2006-05-11_20:56:54 out1 T: 21.4 H: 37 W: 0.0 R: 12.4
2006-05-11_20:59:26 out1 T: 21.2 H: 39 W: 0.0 R: 12.4
2006-05-11_21:01:59 out1 T: 21.1 H: 38 W: 0.0 R: 12.4
2006-05-11_21:04:31 out1 T: 21.0 H: 41 W: 1.1 R: 12.7
2006-05-11_21:07:04 out1 T: 21.0 H: 43 W: 0.0 R: 13.0
2006-05-11_21:09:36 out1 T: 20.8 H: 43 W: 0.0 R: 13.2
2006-05-11_21:12:09 out1 T: 20.7 H: 44 W: 0.0 R: 13.5
2006-05-11_21:17:14 out1 T: 20.4 H: 43 W: 0.0 R: 13.8
2006-05-11_21:19:46 out1 T: 20.3 H: 43 W: 0.0 R: 14.1
2006-05-11_21:22:19 out1 T: 20.2 H: 43 W: 0.0 R: 14.4
2006-05-11_21:24:51 out1 T: 20.2 H: 44 W: 0.0 R: 14.7
2006-05-11_21:27:24 out1 T: 20.0 H: 44 W: 0.0 R: 15.0
2006-05-11_21:29:56 out1 T: 19.9 H: 42 W: 0.0 R: 15.3
2006-05-11_21:35:01 out1 T: 19.6 H: 44 W: 0.0 R: 15.6
2006-05-11_21:37:34 out1 T: 19.5 H: 44 W: 0.0 R: 15.9
2006-05-11_21:40:07 out1 T: 19.5 H: 44 W: 0.0 R: 15.9
2006-05-11_21:42:39 out1 T: 19.4 H: 45 W: 0.0 R: 15.9
2006-05-11_21:45:12 out1 T: 19.3 H: 45 W: 0.0 R: 15.9
2006-05-11_21:47:44 out1 T: 19.2 H: 45 W: 0.0 R: 15.9
2006-05-11_21:50:17 out1 T: 19.0 H: 47 W: 0.0 R: 15.9
2006-05-11_21:52:49 out1 T: 18.9 H: 46 W: 0.0 R: 15.9
2006-05-11_21:55:22 out1 T: 18.8 H: 46 W: 0.0 R: 15.9
2006-05-11_21:57:54 out1 T: 18.7 H: 47 W: 0.0 R: 15.9
2006-05-11_22:00:27 out1 T: 18.6 H: 47 W: 0.0 R: 16.2
2006-05-11_22:02:59 out1 T: 18.5 H: 47 W: 0.0 R: 16.2
2006-05-11_22:05:32 out1 T: 18.4 H: 48 W: 0.0 R: 16.2
2006-05-11_22:08:04 out1 T: 18.4 H: 48 W: 0.0 R: 16.2
2006-05-11_22:10:37 out1 T: 18.3 H: 48 W: 0.0 R: 16.2
2006-05-11_22:15:42 out1 T: 18.1 H: 49 W: 0.0 R: 16.2
2006-05-11_22:18:14 out1 T: 18.0 H: 49 W: 0.0 R: 16.2
2006-05-11_22:20:47 out1 T: 18.0 H: 49 W: 0.0 R: 16.2
2006-05-11_22:25:52 out1 T: 17.8 H: 49 W: 0.0 R: 16.2
2006-05-11_22:28:24 out1 T: 17.8 H: 50 W: 0.0 R: 16.2
2006-05-11_22:30:57 out1 T: 17.7 H: 50 W: 0.0 R: 16.2
2006-05-11_22:33:29 out1 T: 17.6 H: 50 W: 0.0 R: 16.2
2006-05-11_22:36:02 out1 T: 17.5 H: 50 W: 0.0 R: 16.2
2006-05-11_22:38:34 out1 T: 17.5 H: 50 W: 0.0 R: 16.2
2006-05-11_22:41:07 out1 T: 17.4 H: 51 W: 0.0 R: 16.2
2006-05-11_22:48:44 out1 T: 17.1 H: 52 W: 0.0 R: 16.2
2006-05-11_22:56:22 out1 T: 16.9 H: 51 W: 0.0 R: 16.2
2006-05-11_22:58:54 out1 T: 16.9 H: 50 W: 0.0 R: 16.2
2006-05-11_23:01:27 out1 T: 16.9 H: 51 W: 0.0 R: 16.2
2006-05-11_23:03:59 out1 T: 16.8 H: 51 W: 0.0 R: 16.2
2006-05-11_23:06:32 out1 T: 16.7 H: 51 W: 0.0 R: 16.2
2006-05-11_23:09:04 out1 T: 16.7 H: 52 W: 0.0 R: 16.2
2006-05-11_23:11:37 out1 T: 16.6 H: 52 W: 0.0 R: 16.2
2006-05-11_23:14:09 out1 T: 16.5 H: 52 W: 0.0 R: 16.2
2006-05-11_23:16:42 out1 T: 16.4 H: 53 W: 0.0 R: 16.2
2006-05-11_23:19:14 out1 T: 16.3 H: 53 W: 0.0 R: 16.2
2006-05-11_23:21:47 out1 T: 16.5 H: 53 W: 0.0 R: 16.2
2006-05-11_23:24:19 out1 T: 16.5 H: 53 W: 0.0 R: 16.2
2006-05-11_23:31:57 out1 T: 16.5 H: 53 W: 0.0 R: 16.2
2006-05-11_23:37:02 out1 T: 15.8 H: 54 W: 0.0 R: 16.5
2006-05-11_23:39:34 out1 T: 15.8 H: 54 W: 0.0 R: 16.5
2006-05-11_23:42:07 out1 T: 15.8 H: 54 W: 0.0 R: 16.5
2006-05-11_23:44:39 out1 T: 15.7 H: 54 W: 0.0 R: 16.5
2006-05-11_23:47:12 out1 T: 15.7 H: 54 W: 0.0 R: 16.5
2006-05-11_23:49:44 out1 T: 15.6 H: 54 W: 0.0 R: 16.5
2006-05-11_23:52:17 out1 T: 15.6 H: 55 W: 0.0 R: 16.5
2006-05-11_23:54:49 out1 T: 15.6 H: 54 W: 0.0 R: 16.5
2006-05-11_23:57:22 out1 T: 15.4 H: 54 W: 0.0 R: 16.5
2006-05-11_23:59:54 out1 T: 15.4 H: 54 W: 0.0 R: 16.5
2006-05-12_00:02:27 out1 T: 15.3 H: 55 W: 0.0 R: 16.5
2006-05-12_00:04:59 out1 T: 15.2 H: 55 W: 0.0 R: 16.5
2006-05-12_00:07:32 out1 T: 15.0 H: 55 W: 0.0 R: 16.5
2006-05-12_00:10:04 out1 T: 15.0 H: 55 W: 0.0 R: 16.5
2006-05-12_00:12:37 out1 T: 15.0 H: 55 W: 0.0 R: 16.5
2006-05-12_00:17:42 out1 T: 15.0 H: 56 W: 0.0 R: 16.5
2006-05-12_00:20:14 out1 T: 14.9 H: 56 W: 0.0 R: 16.5
2006-05-12_00:22:47 out1 T: 15.0 H: 56 W: 0.0 R: 16.5
2006-05-12_00:25:19 out1 T: 14.9 H: 56 W: 0.0 R: 16.5
2006-05-12_00:27:52 out1 T: 14.8 H: 56 W: 0.0 R: 16.5
2006-05-12_00:30:24 out1 T: 14.8 H: 57 W: 0.0 R: 16.5
2006-05-12_00:32:57 out1 T: 14.7 H: 57 W: 0.0 R: 16.5
2006-05-12_00:35:29 out1 T: 14.7 H: 57 W: 0.0 R: 16.5
2006-05-12_00:38:02 out1 T: 14.6 H: 57 W: 0.0 R: 16.5
2006-05-12_00:40:34 out1 T: 14.5 H: 58 W: 0.0 R: 16.5
2006-05-12_00:43:07 out1 T: 14.4 H: 58 W: 0.0 R: 16.5
2006-05-12_00:45:39 out1 T: 14.4 H: 58 W: 0.0 R: 16.5
2006-05-12_00:48:12 out1 T: 14.4 H: 58 W: 0.0 R: 16.5
2006-05-12_00:50:44 out1 T: 14.3 H: 59 W: 0.0 R: 16.5
2006-05-12_00:53:17 out1 T: 14.2 H: 58 W: 0.0 R: 16.5
2006-05-12_00:58:22 out1 T: 14.1 H: 59 W: 0.0 R: 16.5
2006-05-12_01:00:54 out1 T: 14.0 H: 59 W: 0.0 R: 16.5
2006-05-12_01:03:27 out1 T: 14.0 H: 59 W: 0.0 R: 16.5
2006-05-12_01:06:00 out1 T: 14.0 H: 59 W: 0.0 R: 16.5
2006-05-12_01:08:32 out1 T: 14.0 H: 59 W: 0.0 R: 16.5
2006-05-12_01:11:05 out1 T: 14.0 H: 59 W: 0.0 R: 16.5
2006-05-12_01:13:37 out1 T: 14.0 H: 59 W: 0.0 R: 16.5
2006-05-12_01:16:10 out1 T: 14.0 H: 59 W: 0.0 R: 16.5
2006-05-12_01:18:42 out1 T: 13.9 H: 59 W: 0.0 R: 16.5
2006-05-12_01:21:15 out1 T: 13.9 H: 59 W: 0.0 R: 16.5
2006-05-12_01:23:47 out1 T: 13.8 H: 59 W: 0.0 R: 16.5
2006-05-12_01:26:20 out1 T: 13.7 H: 59 W: 0.0 R: 16.5
2006-05-12_01:28:52 out1 T: 13.6 H: 60 W: 0.0 R: 16.5
2006-05-12_01:31:25 out1 T: 13.6 H: 60 W: 0.0 R: 16.5
2006-05-12_01:39:02 out1 T: 13.6 H: 60 W: 0.0 R: 16.5
2006-05-12_01:44:07 out1 T: 13.5 H: 61 W: 0.0 R: 16.5
2006-05-12_02:01:55 out1 T: 13.3 H: 61 W: 0.0 R: 16.5
2006-05-12_02:04:27 out1 T: 13.2 H: 61 W: 0.0 R: 16.5
2006-05-12_02:07:00 out1 T: 13.2 H: 61 W: 0.0 R: 16.5
2006-05-12_02:09:32 out1 T: 13.1 H: 61 W: 0.0 R: 16.5
2006-05-12_02:12:05 out1 T: 13.0 H: 62 W: 0.0 R: 16.5
2006-05-12_02:14:37 out1 T: 13.0 H: 62 W: 0.0 R: 16.5
2006-05-12_02:19:42 out1 T: 13.0 H: 62 W: 0.0 R: 16.5
2006-05-12_02:22:15 out1 T: 13.0 H: 62 W: 0.0 R: 16.5
2006-05-12_02:24:47 out1 T: 13.0 H: 62 W: 0.0 R: 16.5
2006-05-12_02:27:20 out1 T: 12.9 H: 62 W: 0.0 R: 16.5
2006-05-12_02:29:52 out1 T: 12.9 H: 62 W: 0.0 R: 16.5
2006-05-12_02:32:25 out1 T: 12.9 H: 62 W: 0.0 R: 16.5
2006-05-12_02:34:57 out1 T: 13.0 H: 62 W: 0.0 R: 16.5
2006-05-12_02:37:30 out1 T: 13.0 H: 62 W: 0.0 R: 16.5
2006-05-12_02:40:02 out1 T: 12.9 H: 63 W: 0.0 R: 16.5
2006-05-12_02:42:35 out1 T: 12.9 H: 62 W: 0.0 R: 16.5
2006-05-12_02:45:07 out1 T: 12.8 H: 63 W: 0.0 R: 16.5
2006-05-12_02:47:40 out1 T: 12.8 H: 62 W: 0.0 R: 16.5
2006-05-12_02:50:12 out1 T: 12.8 H: 62 W: 0.0 R: 16.5
2006-05-12_02:52:45 out1 T: 12.8 H: 62 W: 0.0 R: 16.5
2006-05-12_02:55:17 out1 T: 12.8 H: 63 W: 0.0 R: 16.5
2006-05-12_03:00:22 out1 T: 12.8 H: 63 W: 0.0 R: 16.5
2006-05-12_03:02:55 out1 T: 12.8 H: 63 W: 0.0 R: 16.5
2006-05-12_03:05:27 out1 T: 12.7 H: 63 W: 0.0 R: 16.5
2006-05-12_03:08:00 out1 T: 12.7 H: 63 W: 0.0 R: 16.5
2006-05-12_03:10:32 out1 T: 12.7 H: 63 W: 0.0 R: 16.5
2006-05-12_03:13:05 out1 T: 12.6 H: 63 W: 0.0 R: 16.5
2006-05-12_03:15:37 out1 T: 12.6 H: 63 W: 0.0 R: 16.5
2006-05-12_03:18:10 out1 T: 12.6 H: 63 W: 0.0 R: 16.5
2006-05-12_03:20:42 out1 T: 12.6 H: 64 W: 0.0 R: 16.5
2006-05-12_03:23:15 out1 T: 12.6 H: 64 W: 0.0 R: 16.5
2006-05-12_03:25:47 out1 T: 12.6 H: 64 W: 0.0 R: 16.5
2006-05-12_03:28:20 out1 T: 12.5 H: 64 W: 0.0 R: 16.5
2006-05-12_03:30:52 out1 T: 12.5 H: 64 W: 0.0 R: 16.5
2006-05-12_03:33:25 out1 T: 12.4 H: 64 W: 0.0 R: 16.5
2006-05-12_03:35:57 out1 T: 12.4 H: 64 W: 0.0 R: 16.5
2006-05-12_03:41:02 out1 T: 12.4 H: 65 W: 0.0 R: 16.5
2006-05-12_03:43:35 out1 T: 12.3 H: 65 W: 0.0 R: 16.5
2006-05-12_03:46:07 out1 T: 12.3 H: 65 W: 0.0 R: 16.5
2006-05-12_03:48:40 out1 T: 12.3 H: 65 W: 0.0 R: 16.5
2006-05-12_03:51:12 out1 T: 12.3 H: 65 W: 0.0 R: 16.5
2006-05-12_03:53:45 out1 T: 12.3 H: 65 W: 0.0 R: 16.5
2006-05-12_03:56:17 out1 T: 12.2 H: 65 W: 0.0 R: 16.5
2006-05-12_03:58:50 out1 T: 12.2 H: 65 W: 0.0 R: 16.5
2006-05-12_04:03:55 out1 T: 12.0 H: 65 W: 0.0 R: 16.5
2006-05-12_04:06:27 out1 T: 12.0 H: 65 W: 0.0 R: 16.5
2006-05-12_04:14:05 out1 T: 11.9 H: 66 W: 0.0 R: 16.5
2006-05-12_04:16:37 out1 T: 11.9 H: 67 W: 0.0 R: 16.5
2006-05-12_04:21:43 out1 T: 11.8 H: 67 W: 0.0 R: 16.5
2006-05-12_04:24:15 out1 T: 11.9 H: 67 W: 0.0 R: 16.5
2006-05-12_04:26:48 out1 T: 11.9 H: 67 W: 0.0 R: 16.5
2006-05-12_04:29:20 out1 T: 11.9 H: 67 W: 0.0 R: 16.5
2006-05-12_04:31:53 out1 T: 11.9 H: 67 W: 0.0 R: 16.5
2006-05-12_04:34:25 out1 T: 11.9 H: 67 W: 0.0 R: 16.5
2006-05-12_04:36:58 out1 T: 11.9 H: 67 W: 0.0 R: 16.5
2006-05-12_04:39:30 out1 T: 11.9 H: 67 W: 0.0 R: 16.5
2006-05-12_04:42:03 out1 T: 11.9 H: 67 W: 0.0 R: 16.5
2006-05-12_04:44:35 out1 T: 11.9 H: 67 W: 0.0 R: 16.5
2006-05-12_04:47:08 out1 T: 11.9 H: 67 W: 0.0 R: 16.5
2006-05-12_04:49:40 out1 T: 11.9 H: 67 W: 0.0 R: 16.5
2006-05-12_04:52:13 out1 T: 11.9 H: 67 W: 0.0 R: 16.5
2006-05-12_04:54:45 out1 T: 11.8 H: 67 W: 0.0 R: 16.5
2006-05-12_04:57:18 out1 T: 11.8 H: 67 W: 0.0 R: 16.5
2006-05-12_05:02:23 out1 T: 11.7 H: 67 W: 0.0 R: 16.5
2006-05-12_05:04:55 out1 T: 11.7 H: 68 W: 0.0 R: 16.5
2006-05-12_05:07:28 out1 T: 11.6 H: 68 W: 0.0 R: 16.5
2006-05-12_05:10:00 out1 T: 11.6 H: 68 W: 0.0 R: 16.5
2006-05-12_05:12:33 out1 T: 11.6 H: 67 W: 0.0 R: 16.5
2006-05-12_05:15:05 out1 T: 11.6 H: 67 W: 0.0 R: 16.5
2006-05-12_05:17:38 out1 T: 11.7 H: 67 W: 0.0 R: 16.5
2006-05-12_05:20:10 out1 T: 11.7 H: 67 W: 0.0 R: 16.5
2006-05-12_05:22:43 out1 T: 11.6 H: 67 W: 0.0 R: 16.5
2006-05-12_05:25:15 out1 T: 11.6 H: 67 W: 0.0 R: 16.5
2006-05-12_05:27:48 out1 T: 11.6 H: 67 W: 0.0 R: 16.5
2006-05-12_05:30:20 out1 T: 11.5 H: 68 W: 0.0 R: 16.5
2006-05-12_05:32:53 out1 T: 11.5 H: 68 W: 0.0 R: 16.5
2006-05-12_05:35:25 out1 T: 11.4 H: 68 W: 0.0 R: 16.5
2006-05-12_05:37:58 out1 T: 11.3 H: 68 W: 0.0 R: 16.5
2006-05-12_05:43:03 out1 T: 11.2 H: 69 W: 0.0 R: 16.5
2006-05-12_05:45:35 out1 T: 11.2 H: 69 W: 0.0 R: 16.5
2006-05-12_05:48:08 out1 T: 11.2 H: 68 W: 0.0 R: 16.5
2006-05-12_05:50:40 out1 T: 11.2 H: 69 W: 0.0 R: 16.5
2006-05-12_05:53:13 out1 T: 11.1 H: 68 W: 0.0 R: 16.5
2006-05-12_05:55:45 out1 T: 11.1 H: 68 W: 0.0 R: 16.5
2006-05-12_05:58:18 out1 T: 11.1 H: 68 W: 0.0 R: 16.5
2006-05-12_06:00:50 out1 T: 11.1 H: 68 W: 0.0 R: 16.5
2006-05-12_06:03:23 out1 T: 11.1 H: 68 W: 0.0 R: 16.5
2006-05-12_06:05:55 out1 T: 11.0 H: 68 W: 0.0 R: 16.5
2006-05-12_06:08:28 out1 T: 11.0 H: 68 W: 0.0 R: 16.5
2006-05-12_06:11:00 out1 T: 11.0 H: 69 W: 0.0 R: 16.5
2006-05-12_06:13:33 out1 T: 11.0 H: 69 W: 0.0 R: 16.5
2006-05-12_06:16:05 out1 T: 10.9 H: 69 W: 0.0 R: 16.5
2006-05-12_06:18:38 out1 T: 11.0 H: 69 W: 0.0 R: 16.5
2006-05-12_06:23:43 out1 T: 11.0 H: 69 W: 0.0 R: 16.5
2006-05-12_06:26:15 out1 T: 11.0 H: 69 W: 0.0 R: 16.5
2006-05-12_06:28:48 out1 T: 11.1 H: 69 W: 0.0 R: 16.5
2006-05-12_06:31:20 out1 T: 11.2 H: 69 W: 0.0 R: 16.5
2006-05-12_06:33:53 out1 T: 11.2 H: 69 W: 0.0 R: 16.5
2006-05-12_06:36:25 out1 T: 11.2 H: 69 W: 0.0 R: 16.5
2006-05-12_06:38:58 out1 T: 11.2 H: 69 W: 0.0 R: 16.5
2006-05-12_06:41:30 out1 T: 11.2 H: 69 W: 0.0 R: 16.5
2006-05-12_06:44:03 out1 T: 11.4 H: 69 W: 0.0 R: 16.5
2006-05-12_06:46:35 out1 T: 11.4 H: 69 W: 0.0 R: 16.5
2006-05-12_06:49:08 out1 T: 11.5 H: 69 W: 0.0 R: 16.5
2006-05-12_06:51:40 out1 T: 11.5 H: 69 W: 0.0 R: 16.5
2006-05-12_06:54:13 out1 T: 11.5 H: 69 W: 0.0 R: 16.5
2006-05-12_06:56:45 out1 T: 11.6 H: 69 W: 0.0 R: 16.5
2006-05-12_06:59:18 out1 T: 11.6 H: 69 W: 0.0 R: 16.5
2006-05-12_07:04:23 out1 T: 11.7 H: 69 W: 0.0 R: 16.5
2006-05-12_07:06:55 out1 T: 11.8 H: 69 W: 0.0 R: 16.5
2006-05-12_07:09:28 out1 T: 11.8 H: 69 W: 0.0 R: 16.5
2006-05-12_07:12:00 out1 T: 11.8 H: 69 W: 0.0 R: 16.5
2006-05-12_07:14:33 out1 T: 11.9 H: 69 W: 0.0 R: 16.5
2006-05-12_07:17:05 out1 T: 12.0 H: 69 W: 0.0 R: 16.5
2006-05-12_07:19:38 out1 T: 12.2 H: 69 W: 0.0 R: 16.5
2006-05-12_07:22:10 out1 T: 12.1 H: 69 W: 0.0 R: 16.5
2006-05-12_07:24:43 out1 T: 12.3 H: 69 W: 0.0 R: 16.5
2006-05-12_07:27:16 out1 T: 12.4 H: 68 W: 0.5 R: 16.5
2006-05-12_07:29:48 out1 T: 12.5 H: 68 W: 0.0 R: 16.5
2006-05-12_07:32:21 out1 T: 12.6 H: 67 W: 0.0 R: 16.5
2006-05-12_07:34:53 out1 T: 12.7 H: 67 W: 0.0 R: 16.5
2006-05-12_07:37:26 out1 T: 12.8 H: 66 W: 0.0 R: 16.5
2006-05-12_07:39:58 out1 T: 12.8 H: 66 W: 0.0 R: 16.5
2006-05-12_07:45:03 out1 T: 13.2 H: 65 W: 0.0 R: 16.5
2006-05-12_07:47:36 out1 T: 13.2 H: 64 W: 0.0 R: 16.5
2006-05-12_07:50:08 out1 T: 13.3 H: 64 W: 0.0 R: 16.5
2006-05-12_07:52:41 out1 T: 13.4 H: 64 W: 0.0 R: 16.5
2006-05-12_07:55:13 out1 T: 13.4 H: 64 W: 0.0 R: 16.5
2006-05-12_07:57:46 out1 T: 13.5 H: 64 W: 0.0 R: 16.5
2006-05-12_08:00:18 out1 T: 13.6 H: 63 W: 0.0 R: 16.5
2006-05-12_08:02:51 out1 T: 13.6 H: 63 W: 0.0 R: 16.5
2006-05-12_08:05:23 out1 T: 13.8 H: 62 W: 0.0 R: 16.5
2006-05-12_08:07:56 out1 T: 13.9 H: 62 W: 0.0 R: 16.5
2006-05-12_08:10:28 out1 T: 14.0 H: 63 W: 0.0 R: 16.5
2006-05-12_08:20:38 out1 T: 14.3 H: 62 W: 0.0 R: 16.5
2006-05-12_08:28:16 out1 T: 14.6 H: 60 W: 0.0 R: 16.5
2006-05-12_08:30:48 out1 T: 14.6 H: 60 W: 0.0 R: 16.8
2006-05-12_08:33:21 out1 T: 14.8 H: 60 W: 0.0 R: 16.8
2006-05-12_08:35:53 out1 T: 14.8 H: 59 W: 0.0 R: 16.8
2006-05-12_08:38:26 out1 T: 15.0 H: 59 W: 0.0 R: 16.8
2006-05-12_08:40:58 out1 T: 15.0 H: 59 W: 0.0 R: 17.1
2006-05-12_08:43:31 out1 T: 15.0 H: 59 W: 0.0 R: 17.1
2006-05-12_08:46:03 out1 T: 15.0 H: 59 W: 0.0 R: 17.1
2006-05-12_08:48:36 out1 T: 15.1 H: 59 W: 0.0 R: 17.1
2006-05-12_08:51:08 out1 T: 15.2 H: 59 W: 0.0 R: 17.1
2006-05-12_08:53:41 out1 T: 15.4 H: 58 W: 0.0 R: 17.1
2006-05-12_08:56:13 out1 T: 15.4 H: 58 W: 0.0 R: 17.1
2006-05-12_08:58:46 out1 T: 15.6 H: 58 W: 0.0 R: 17.1
2006-05-12_09:01:18 out1 T: 15.7 H: 58 W: 0.0 R: 17.1
2006-05-12_09:06:23 out1 T: 16.0 H: 57 W: 0.0 R: 17.1
2006-05-12_09:08:56 out1 T: 16.1 H: 56 W: 0.0 R: 17.1
2006-05-12_09:11:28 out1 T: 16.5 H: 56 W: 0.0 R: 17.1
2006-05-12_09:14:01 out1 T: 16.3 H: 55 W: 0.0 R: 17.1
2006-05-12_09:16:33 out1 T: 16.3 H: 54 W: 0.0 R: 17.1
2006-05-12_09:19:06 out1 T: 16.4 H: 54 W: 0.0 R: 17.1
2006-05-12_09:21:38 out1 T: 16.4 H: 53 W: 0.0 R: 17.1
2006-05-12_09:24:11 out1 T: 16.5 H: 53 W: 0.0 R: 17.1
2006-05-12_09:26:43 out1 T: 16.7 H: 53 W: 0.0 R: 17.1
2006-05-12_09:29:16 out1 T: 16.8 H: 53 W: 0.0 R: 17.1
2006-05-12_09:31:48 out1 T: 16.9 H: 52 W: 0.0 R: 17.1
2006-05-12_09:34:21 out1 T: 17.0 H: 53 W: 0.0 R: 17.1
2006-05-12_09:36:53 out1 T: 17.1 H: 53 W: 0.0 R: 17.1
2006-05-12_09:39:26 out1 T: 17.2 H: 53 W: 0.0 R: 17.1
2006-05-12_09:41:58 out1 T: 17.4 H: 52 W: 0.0 R: 17.1
2006-05-12_09:47:03 out1 T: 17.7 H: 50 W: 0.0 R: 17.1
2006-05-12_09:49:36 out1 T: 17.8 H: 50 W: 0.0 R: 17.1
2006-05-12_09:52:08 out1 T: 17.9 H: 48 W: 0.0 R: 17.1
2006-05-12_09:54:41 out1 T: 18.0 H: 48 W: 0.0 R: 17.1
2006-05-12_09:57:13 out1 T: 18.0 H: 47 W: 0.0 R: 17.1
2006-05-12_09:59:46 out1 T: 18.0 H: 47 W: 0.0 R: 17.1
2006-05-12_10:02:18 out1 T: 18.1 H: 47 W: 0.0 R: 17.1
2006-05-12_10:04:51 out1 T: 18.2 H: 48 W: 0.0 R: 17.1
2006-05-12_10:07:23 out1 T: 18.3 H: 47 W: 0.0 R: 17.1
2006-05-12_10:09:56 out1 T: 18.5 H: 46 W: 0.0 R: 17.1
2006-05-12_10:12:28 out1 T: 18.6 H: 47 W: 0.0 R: 17.1
2006-05-12_10:17:33 out1 T: 18.6 H: 45 W: 0.0 R: 17.1
2006-05-12_10:20:06 out1 T: 18.8 H: 46 W: 0.0 R: 17.1
2006-05-12_10:22:38 out1 T: 19.0 H: 44 W: 0.0 R: 17.1
2006-05-12_10:27:43 out1 T: 19.1 H: 44 W: 0.0 R: 17.1
2006-05-12_10:30:16 out1 T: 19.2 H: 43 W: 0.0 R: 17.1
2006-05-12_10:32:48 out1 T: 19.4 H: 43 W: 0.0 R: 17.1
2006-05-12_10:35:21 out1 T: 19.5 H: 43 W: 0.0 R: 17.1
2006-05-12_10:37:53 out1 T: 19.7 H: 43 W: 0.0 R: 17.1
2006-05-12_10:42:58 out1 T: 19.9 H: 42 W: 0.2 R: 17.1
2006-05-12_10:45:31 out1 T: 20.0 H: 41 W: 0.2 R: 17.1
2006-05-12_10:48:03 out1 T: 20.1 H: 41 W: 1.3 R: 17.1
2006-05-12_10:50:36 out1 T: 20.1 H: 41 W: 0.2 R: 17.1
2006-05-12_10:53:08 out1 T: 20.1 H: 41 W: 0.8 R: 17.1
2006-05-12_10:55:41 out1 T: 20.1 H: 40 W: 1.1 R: 17.1
2006-05-12_10:58:14 out1 T: 20.2 H: 41 W: 0.0 R: 17.1
2006-05-12_11:00:46 out1 T: 20.4 H: 42 W: 0.2 R: 17.1
2006-05-12_11:03:19 out1 T: 20.4 H: 42 W: 0.0 R: 17.1
2006-05-12_11:08:24 out1 T: 20.7 H: 43 W: 0.0 R: 17.1
2006-05-12_11:10:56 out1 T: 20.7 H: 41 W: 0.0 R: 17.1
2006-05-12_11:16:01 out1 T: 20.8 H: 40 W: 0.0 R: 17.1
2006-05-12_11:18:34 out1 T: 20.8 H: 40 W: 0.0 R: 17.1
2006-05-12_11:23:39 out1 T: 21.0 H: 40 W: 0.5 R: 17.1
2006-05-12_11:26:11 out1 T: 21.0 H: 38 W: 1.1 R: 17.1
2006-05-12_11:28:44 out1 T: 21.2 H: 40 W: 0.0 R: 17.1
2006-05-12_11:31:16 out1 T: 21.2 H: 39 W: 0.0 R: 17.1
2006-05-12_11:33:49 out1 T: 21.4 H: 39 W: 0.0 R: 17.1
2006-05-12_11:36:21 out1 T: 21.6 H: 39 W: 0.0 R: 17.1
2006-05-12_11:38:54 out1 T: 21.6 H: 37 W: 0.0 R: 17.1
2006-05-12_11:41:26 out1 T: 21.7 H: 39 W: 0.0 R: 17.1
2006-05-12_11:43:59 out1 T: 21.7 H: 37 W: 0.0 R: 17.1
2006-05-12_11:49:04 out1 T: 21.8 H: 37 W: 0.0 R: 17.1
2006-05-12_11:51:36 out1 T: 21.7 H: 37 W: 0.0 R: 17.1
2006-05-12_11:54:09 out1 T: 21.8 H: 37 W: 0.0 R: 17.1
2006-05-12_14:34:16 out1 T: 26.7 H: 24 W: 0.2 R: 17.1
2006-05-12_14:36:49 out1 T: 27.4 H: 25 W: 0.0 R: 17.1
2006-05-12_14:39:21 out1 T: 28.1 H: 25 W: 0.0 R: 17.1
2006-05-12_14:41:54 out1 T: 28.4 H: 22 W: 0.8 R: 17.1
2006-05-12_14:44:26 out1 T: 28.2 H: 22 W: 0.8 R: 17.1
2006-05-12_14:46:59 out1 T: 27.9 H: 22 W: 0.5 R: 17.1
2006-05-12_14:49:32 out1 T: 28.4 H: 23 W: 0.0 R: 17.1
2006-05-12_14:52:04 out1 T: 29.2 H: 22 W: 0.0 R: 17.1
2006-05-12_14:54:37 out1 T: 28.6 H: 22 W: 0.0 R: 17.1
2006-05-12_14:57:09 out1 T: 29.2 H: 22 W: 0.0 R: 17.1
2006-05-12_14:59:42 out1 T: 30.0 H: 21 W: 0.0 R: 17.1
2006-05-12_15:02:14 out1 T: 30.2 H: 21 W: 0.0 R: 17.1
2006-05-12_15:04:47 out1 T: 29.4 H: 21 W: 0.0 R: 17.1
2006-05-12_15:07:19 out1 T: 28.6 H: 21 W: 0.5 R: 17.1
2006-05-12_15:12:24 out1 T: 28.9 H: 20 W: 1.6 R: 17.1
2006-05-12_15:14:57 out1 T: 28.3 H: 21 W: 2.2 R: 17.1
2006-05-12_15:17:29 out1 T: 27.9 H: 21 W: 0.0 R: 17.1
2006-05-12_15:20:02 out1 T: 27.5 H: 21 W: 0.0 R: 17.1
2006-05-12_15:25:07 out1 T: 27.4 H: 22 W: 0.0 R: 17.1
2006-05-12_15:27:39 out1 T: 27.8 H: 22 W: 1.1 R: 17.1
2006-05-12_15:30:12 out1 T: 27.6 H: 22 W: 0.5 R: 17.1
2006-05-12_15:32:44 out1 T: 27.6 H: 22 W: 0.0 R: 17.1
2006-05-12_15:35:17 out1 T: 27.2 H: 23 W: 0.0 R: 17.1
2006-05-12_15:37:49 out1 T: 27.4 H: 23 W: 0.5 R: 17.1
2006-05-12_15:45:27 out1 T: 27.1 H: 24 W: 0.0 R: 17.1
2006-05-12_15:47:59 out1 T: 27.4 H: 24 W: 0.0 R: 17.1
2006-05-12_15:55:37 out1 T: 26.9 H: 24 W: 0.0 R: 17.1
2006-05-12_16:00:42 out1 T: 26.9 H: 24 W: 0.0 R: 17.1
2006-05-12_16:03:14 out1 T: 27.0 H: 25 W: 0.0 R: 17.1
2006-05-12_16:08:19 out1 T: 26.9 H: 26 W: 0.0 R: 17.1
2006-05-12_16:10:52 out1 T: 26.6 H: 26 W: 0.0 R: 17.1
2006-05-12_16:13:24 out1 T: 26.8 H: 26 W: 0.0 R: 17.1
2006-05-12_16:15:57 out1 T: 27.0 H: 26 W: 0.5 R: 17.1
2006-05-12_16.51:02 out1 T: 26.3 H: 26 W: 0.5 R: 17.1
2006-05-12_16.53:34 out1 T: 26.2 H: 26 W: 1.1 R: 17.1
2006-05-12_16.56:07 out1 T: 26.0 H: 27 W: 0.0 R: 17.1
2006-05-12_16.58:39 out1 T: 26.4 H: 27 W: 0.0 R: 17.1
2006-05-12_16:33:44 out1 T: 26.8 H: 26 W: 0.0 R: 17.1
2006-05-12_16:36:17 out1 T: 26.9 H: 26 W: 0.0 R: 17.1
2006-05-12_16:38:49 out1 T: 26.9 H: 26 W: 0.2 R: 17.1
2006-05-12_16:41:22 out1 T: 26.9 H: 26 W: 0.0 R: 17.1
2006-05-12_16:43:54 out1 T: 26.6 H: 26 W: 0.0 R: 17.1
2006-05-12_16:46:27 out1 T: 26.4 H: 26 W: 0.0 R: 17.1
2006-05-12_16:48:59 out1 T: 26.4 H: 26 W: 0.2 R: 17.1
2006-05-12_16:51:32 out1 T: 26.8 H: 26 W: 0.0 R: 17.1
2006-05-12_16:54:04 out1 T: 26.8 H: 26 W: 0.0 R: 17.1
2006-05-12_16:56:37 out1 T: 26.6 H: 26 W: 0.0 R: 17.1
2006-05-12_16:59:09 out1 T: 26.8 H: 26 W: 0.0 R: 17.1
2006-05-12_17:01:42 out1 T: 26.9 H: 26 W: 0.0 R: 17.1
2006-05-12_17:04:14 out1 T: 27.1 H: 26 W: 0.5 R: 17.1
2006-05-12_17:06:47 out1 T: 27.0 H: 26 W: 1.1 R: 17.1
2006-05-12_17:09:19 out1 T: 27.1 H: 26 W: 0.0 R: 17.1
2006-05-12_17:14:24 out1 T: 26.6 H: 26 W: 0.0 R: 17.1
2006-05-12_17:16:57 out1 T: 26.4 H: 27 W: 0.0 R: 17.1
2006-05-12_17:19:29 out1 T: 26.4 H: 26 W: 0.0 R: 17.1
2006-05-12_17:22:02 out1 T: 26.6 H: 27 W: 0.0 R: 17.1
2006-05-12_17:24:34 out1 T: 26.9 H: 27 W: 0.0 R: 17.1
2006-05-12_17:27:07 out1 T: 26.8 H: 26 W: 0.0 R: 17.1
2006-05-12_17:29:39 out1 T: 26.8 H: 26 W: 0.0 R: 17.1
2006-05-12_17:32:12 out1 T: 27.1 H: 26 W: 1.1 R: 17.1
2006-05-12_17:34:44 out1 T: 26.9 H: 27 W: 0.0 R: 17.1
2006-05-12_17:37:17 out1 T: 26.9 H: 27 W: 0.0 R: 17.1
2006-05-12_17:39:49 out1 T: 26.9 H: 27 W: 0.0 R: 17.1
2006-05-12_17:42:22 out1 T: 26.7 H: 27 W: 0.2 R: 17.1
2006-05-12_17:44:54 out1 T: 26.5 H: 28 W: 0.0 R: 17.1
2006-05-12_17:47:27 out1 T: 26.4 H: 27 W: 0.0 R: 17.1
2006-05-12_17:49:59 out1 T: 26.2 H: 27 W: 0.8 R: 17.1
2006-05-12_17:55:04 out1 T: 25.9 H: 28 W: 0.2 R: 17.1
2006-05-12_17:57:37 out1 T: 25.8 H: 28 W: 1.3 R: 17.1
2006-05-12_18:02:42 out1 T: 25.9 H: 28 W: 0.0 R: 17.1
2006-05-12_18:07:47 out1 T: 25.9 H: 28 W: 0.0 R: 17.1
2006-05-12_18:10:19 out1 T: 25.9 H: 28 W: 0.0 R: 17.1
2006-05-12_18:12:52 out1 T: 25.8 H: 28 W: 0.0 R: 17.1
2006-05-12_18:15:24 out1 T: 25.9 H: 28 W: 0.0 R: 17.1
2006-05-12_18:17:57 out1 T: 26.0 H: 28 W: 0.0 R: 17.1
2006-05-12_18:20:29 out1 T: 26.0 H: 28 W: 0.5 R: 17.1
2006-05-12_18:25:34 out1 T: 25.8 H: 28 W: 0.0 R: 17.1
2006-05-12_18:30:39 out1 T: 25.5 H: 28 W: 0.0 R: 17.1
2006-05-12_18:35:44 out1 T: 25.5 H: 29 W: 0.2 R: 17.1
2006-05-12_18:38:17 out1 T: 25.4 H: 29 W: 0.2 R: 17.1
2006-05-12_18:40:49 out1 T: 25.4 H: 29 W: 0.0 R: 17.1
2006-05-12_18:43:22 out1 T: 25.4 H: 28 W: 0.0 R: 17.1
2006-05-12_18:45:54 out1 T: 25.3 H: 28 W: 0.0 R: 17.1
2006-05-12_18:48:27 out1 T: 25.4 H: 28 W: 0.0 R: 17.1
2006-05-12_18:50:59 out1 T: 25.3 H: 28 W: 0.0 R: 17.1
2006-05-12_18:53:32 out1 T: 25.2 H: 29 W: 0.0 R: 17.1
2006-05-12_18:56:04 out1 T: 25.3 H: 29 W: 0.0 R: 17.1
2006-05-12_18:58:37 out1 T: 25.2 H: 29 W: 0.2 R: 17.1
2006-05-12_19:01:09 out1 T: 25.1 H: 29 W: 0.0 R: 17.1
2006-05-12_19:08:47 out1 T: 24.8 H: 30 W: 0.0 R: 17.1
2006-05-12_19:11:20 out1 T: 24.8 H: 30 W: 0.0 R: 17.1
2006-05-12_19:16.55 out1 T: 24.7 H: 30 W: 0.0 R: 17.1
2006-05-12_19:18:57 out1 T: 24.5 H: 30 W: 0.5 R: 17.1
2006-05-12_19:21:30 out1 T: 24.5 H: 30 W: 0.0 R: 17.1
2006-05-12_19:24:02 out1 T: 24.5 H: 30 W: 0.0 R: 17.1
2006-05-12_19:26:35 out1 T: 24.4 H: 30 W: 0.0 R: 17.1
2006-05-12_19:29:07 out1 T: 24.4 H: 31 W: 0.0 R: 17.1
2006-05-12_19:31:40 out1 T: 24.4 H: 31 W: 0.0 R: 17.1
2006-05-12_19:34:12 out1 T: 24.3 H: 31 W: 0.0 R: 17.1
2006-05-12_19:36:45 out1 T: 24.2 H: 31 W: 0.0 R: 17.1
2006-05-12_19:39:17 out1 T: 24.2 H: 31 W: 0.2 R: 17.1
2006-05-12_19:41:50 out1 T: 24.1 H: 31 W: 0.0 R: 17.1
2006-05-12_19:44:22 out1 T: 24.0 H: 32 W: 0.2 R: 17.1
2006-05-12_19:46:55 out1 T: 24.0 H: 32 W: 0.0 R: 17.1
2006-05-12_19:49:27 out1 T: 24.0 H: 32 W: 0.0 R: 17.1
2006-05-12_19:52:00 out1 T: 24.0 H: 33 W: 0.0 R: 17.1
2006-05-12_19:57:05 out1 T: 23.9 H: 33 W: 0.0 R: 17.1
2006-05-12_19:59:37 out1 T: 23.8 H: 33 W: 0.0 R: 17.1
2006-05-12_20:02:10 out1 T: 23.8 H: 33 W: 0.0 R: 17.1
2006-05-12_20:04:42 out1 T: 23.8 H: 33 W: 0.0 R: 17.1
2006-05-12_20:07:15 out1 T: 23.8 H: 33 W: 0.0 R: 17.1
2006-05-12_20:09:47 out1 T: 23.8 H: 34 W: 0.0 R: 17.1
2006-05-12_20:12:20 out1 T: 23.7 H: 34 W: 0.0 R: 17.1
2006-05-12_20:14:52 out1 T: 23.7 H: 34 W: 0.0 R: 17.1
2006-05-12_20:17:25 out1 T: 23.6 H: 35 W: 0.0 R: 17.1
2006-05-12_20:19:57 out1 T: 23.6 H: 37 W: 0.0 R: 17.1
2006-05-12_20:22:30 out1 T: 23.5 H: 37 W: 0.0 R: 17.1
2006-05-12_20:25:02 out1 T: 23.3 H: 38 W: 0.0 R: 17.1
2006-05-12_20:27:35 out1 T: 23.2 H: 39 W: 0.0 R: 17.1
2006-05-12_20:30:07 out1 T: 23.1 H: 40 W: 0.0 R: 17.1
2006-05-12_20:32:40 out1 T: 23.0 H: 40 W: 0.0 R: 17.1
2006-05-12_20:42:50 out1 T: 22.4 H: 41 W: 0.0 R: 17.1
2006-05-12_20:45:22 out1 T: 22.3 H: 40 W: 0.0 R: 17.1
2006-05-12_20:47:55 out1 T: 22.2 H: 39 W: 0.0 R: 17.1
2006-05-12_20:50:27 out1 T: 21.9 H: 39 W: 0.0 R: 17.1
2006-05-12_20:58:05 out1 T: 21.6 H: 39 W: 0.0 R: 17.1
2006-05-12_21:00:37 out1 T: 21.6 H: 40 W: 0.0 R: 17.1
2006-05-12_21:03:10 out1 T: 21.6 H: 40 W: 0.0 R: 17.1
2006-05-12_21:05:42 out1 T: 21.5 H: 40 W: 0.0 R: 17.1
2006-05-12_21:08:15 out1 T: 21.4 H: 40 W: 0.0 R: 17.1
2006-05-12_21:10:47 out1 T: 21.4 H: 40 W: 0.0 R: 17.1
2006-05-12_21:13:20 out1 T: 21.3 H: 41 W: 0.0 R: 17.1
2006-05-12_21:18:25 out1 T: 21.2 H: 41 W: 0.0 R: 17.1
2006-05-12_21:20:57 out1 T: 21.1 H: 41 W: 0.0 R: 17.1
2006-05-12_21:23:30 out1 T: 21.1 H: 42 W: 0.0 R: 17.1
2006-05-12_21:26:02 out1 T: 21.0 H: 43 W: 0.0 R: 17.1
2006-05-12_21:28:35 out1 T: 21.0 H: 43 W: 0.0 R: 17.1
2006-05-12_21:31:07 out1 T: 20.9 H: 42 W: 0.0 R: 17.1
2006-05-12_21:33:40 out1 T: 20.8 H: 43 W: 0.0 R: 17.1
2006-05-12_21:36:12 out1 T: 20.8 H: 43 W: 0.0 R: 17.1
2006-05-12_21:38:45 out1 T: 20.7 H: 44 W: 0.0 R: 17.1
2006-05-12_21:41:17 out1 T: 20.6 H: 44 W: 0.0 R: 17.1
2006-05-12_21:43:50 out1 T: 20.5 H: 45 W: 0.0 R: 17.1
2006-05-12_21:46:22 out1 T: 20.4 H: 44 W: 0.5 R: 17.1
2006-05-12_21:48:55 out1 T: 20.3 H: 44 W: 7.7 R: 17.1
2006-05-12_21:51:27 out1 T: 20.2 H: 46 W: 0.0 R: 17.1
2006-05-12_21:54:00 out1 T: 20.1 H: 46 W: 0.0 R: 17.1
2006-05-12_21:59:05 out1 T: 20.0 H: 46 W: 0.0 R: 17.1
2006-05-12_22:01:37 out1 T: 19.9 H: 46 W: 0.0 R: 17.1
2006-05-12_22:04:10 out1 T: 19.8 H: 47 W: 0.0 R: 17.1
2006-05-12_22:06:42 out1 T: 19.7 H: 46 W: 0.0 R: 17.1
2006-05-12_22:09:15 out1 T: 19.6 H: 47 W: 0.0 R: 17.1
2006-05-12_22:11:47 out1 T: 19.6 H: 48 W: 0.0 R: 17.1
2006-05-12_22:14:20 out1 T: 19.5 H: 48 W: 0.0 R: 17.1
2006-05-12_22:16:52 out1 T: 19.4 H: 48 W: 0.0 R: 17.1
2006-05-12_22:19:25 out1 T: 19.3 H: 48 W: 0.0 R: 17.1
2006-05-12_22:21:57 out1 T: 19.2 H: 48 W: 0.0 R: 17.1
2006-05-12_22:24:30 out1 T: 19.1 H: 48 W: 0.0 R: 17.1
2006-05-12_22:27:02 out1 T: 19.1 H: 49 W: 0.0 R: 17.1
2006-05-12_22:29:35 out1 T: 19.1 H: 49 W: 0.0 R: 17.1
2006-05-12_22:42:17 out1 T: 18.9 H: 50 W: 0.0 R: 17.1
2006-05-12_22:44:50 out1 T: 18.8 H: 50 W: 0.0 R: 17.1
2006-05-12_22:47:22 out1 T: 18.8 H: 51 W: 0.0 R: 17.1
2006-05-12_22:49:55 out1 T: 18.8 H: 50 W: 0.0 R: 17.1
2006-05-12_22:52:27 out1 T: 18.8 H: 50 W: 0.0 R: 17.1
2006-05-12_22:55:00 out1 T: 18.7 H: 50 W: 0.0 R: 17.1
2006-05-12_22:57:32 out1 T: 18.7 H: 50 W: 0.0 R: 17.1
2006-05-12_23:00:05 out1 T: 18.7 H: 52 W: 0.0 R: 17.1
2006-05-12_23:02:38 out1 T: 18.6 H: 51 W: 0.0 R: 17.1
2006-05-12_23:05:10 out1 T: 18.5 H: 53 W: 0.0 R: 17.1
2006-05-12_23:07:43 out1 T: 18.5 H: 52 W: 0.0 R: 17.1
2006-05-12_23:10:15 out1 T: 18.4 H: 53 W: 0.0 R: 17.1
2006-05-12_23:12:48 out1 T: 18.3 H: 53 W: 0.0 R: 17.1
2006-05-12_23:15:20 out1 T: 18.2 H: 54 W: 0.0 R: 17.1
2006-05-12_23:20:25 out1 T: 18.2 H: 54 W: 0.0 R: 17.1
2006-05-12_23:22:58 out1 T: 18.1 H: 54 W: 0.0 R: 17.1
2006-05-12_23:25:30 out1 T: 18.0 H: 54 W: 0.0 R: 17.1
2006-05-12_23:28:03 out1 T: 18.0 H: 55 W: 0.0 R: 17.1
2006-05-12_23:30:35 out1 T: 18.0 H: 55 W: 0.0 R: 17.1
2006-05-12_23:33:08 out1 T: 17.9 H: 54 W: 0.0 R: 17.1
2006-05-12_23:35:40 out1 T: 17.9 H: 55 W: 0.0 R: 17.1
2006-05-12_23:38:13 out1 T: 17.8 H: 55 W: 0.0 R: 17.1
2006-05-12_23:40:45 out1 T: 17.8 H: 55 W: 0.0 R: 17.1
2006-05-12_23:43:18 out1 T: 17.8 H: 55 W: 0.0 R: 17.1
2006-05-12_23:45:50 out1 T: 17.8 H: 56 W: 0.0 R: 17.1
2006-05-12_23:48:23 out1 T: 17.7 H: 56 W: 0.0 R: 17.1
2006-05-12_23:50:55 out1 T: 17.7 H: 56 W: 0.0 R: 17.1
2006-05-12_23:53:28 out1 T: 17.7 H: 56 W: 0.0 R: 17.1
2006-05-12_23:56:00 out1 T: 17.6 H: 56 W: 0.0 R: 17.1
2006-05-13_00:01:05 out1 T: 17.6 H: 56 W: 0.0 R: 17.1
2006-05-13_00:03:38 out1 T: 17.6 H: 55 W: 0.0 R: 17.1
2006-05-13_00:06:10 out1 T: 17.6 H: 54 W: 0.0 R: 17.1
2006-05-13_00:08:43 out1 T: 17.6 H: 55 W: 0.0 R: 17.1
2006-05-13_00:11:15 out1 T: 17.5 H: 53 W: 0.0 R: 17.1
2006-05-13_00:13:48 out1 T: 17.5 H: 53 W: 0.0 R: 17.1
2006-05-13_00:16.50 out1 T: 17.4 H: 53 W: 0.0 R: 17.1
2006-05-13_00:18:53 out1 T: 17.4 H: 53 W: 0.0 R: 17.1
2006-05-13_00:21:25 out1 T: 17.3 H: 53 W: 0.0 R: 17.1
2006-05-13_00:23:58 out1 T: 17.2 H: 54 W: 0.0 R: 17.1
2006-05-13_00:26:30 out1 T: 17.2 H: 54 W: 0.0 R: 17.1
2006-05-13_00:29:03 out1 T: 17.2 H: 53 W: 0.0 R: 17.1
2006-05-13_00:34:08 out1 T: 17.3 H: 54 W: 0.0 R: 17.1
2006-05-13_00:36:40 out1 T: 17.3 H: 54 W: 0.0 R: 17.1
2006-05-13_00:41:45 out1 T: 17.4 H: 56 W: 0.0 R: 17.1
2006-05-13_00:44:18 out1 T: 17.4 H: 56 W: 0.0 R: 17.1
2006-05-13_00:46:50 out1 T: 17.4 H: 56 W: 0.0 R: 17.1
2006-05-13_00:49:23 out1 T: 17.5 H: 56 W: 0.0 R: 17.1
2006-05-13_00:51:55 out1 T: 17.4 H: 56 W: 0.0 R: 17.1
2006-05-13_00:54:28 out1 T: 17.4 H: 57 W: 0.0 R: 17.1
2006-05-13_00:57:00 out1 T: 17.3 H: 56 W: 0.0 R: 17.1
2006-05-13_00:59:33 out1 T: 17.3 H: 56 W: 0.0 R: 17.1
2006-05-13_01:02:05 out1 T: 17.3 H: 57 W: 0.0 R: 17.1
2006-05-13_01:04:38 out1 T: 17.2 H: 57 W: 0.0 R: 17.1
2006-05-13_01:07:10 out1 T: 17.2 H: 57 W: 0.0 R: 17.1
2006-05-13_01:09:43 out1 T: 17.1 H: 57 W: 0.0 R: 17.1
2006-05-13_01:12:15 out1 T: 17.0 H: 57 W: 0.0 R: 17.1
2006-05-13_01:14:48 out1 T: 16.9 H: 56 W: 0.0 R: 17.1
2006-05-13_01:17:20 out1 T: 16.8 H: 57 W: 0.0 R: 17.1
2006-05-13_01:22:25 out1 T: 16.5 H: 56 W: 0.0 R: 17.1
2006-05-13_01:24:58 out1 T: 16.4 H: 56 W: 0.0 R: 17.1
2006-05-13_01:27:30 out1 T: 16.4 H: 57 W: 0.0 R: 17.1
2006-05-13_01:30:03 out1 T: 16.4 H: 57 W: 0.0 R: 17.1
2006-05-13_01:32:35 out1 T: 16.4 H: 57 W: 0.0 R: 17.1
2006-05-13_01:35:08 out1 T: 16.4 H: 57 W: 0.0 R: 17.1
2006-05-13_01:37:40 out1 T: 16.4 H: 57 W: 0.0 R: 17.1
2006-05-13_01:40:13 out1 T: 16.4 H: 57 W: 0.0 R: 17.1
2006-05-13_01:42:45 out1 T: 16.5 H: 57 W: 0.0 R: 17.1
2006-05-13_01:45:18 out1 T: 16.5 H: 57 W: 0.0 R: 17.1
2006-05-13_01:47:50 out1 T: 16.5 H: 57 W: 0.0 R: 17.1
2006-05-13_01:50:23 out1 T: 16.6 H: 57 W: 0.0 R: 17.1
2006-05-13_01:52:55 out1 T: 16.6 H: 57 W: 0.0 R: 17.1
2006-05-13_01:55:28 out1 T: 16.6 H: 57 W: 0.0 R: 17.1
2006-05-13_01:58:00 out1 T: 16.6 H: 57 W: 0.0 R: 17.1
2006-05-13_02:03:06 out1 T: 16.6 H: 57 W: 0.0 R: 17.1
2006-05-13_02:05:38 out1 T: 16.7 H: 57 W: 0.0 R: 17.1
2006-05-13_02:08:11 out1 T: 16.7 H: 57 W: 0.0 R: 17.1
2006-05-13_02:10:43 out1 T: 16.7 H: 57 W: 0.0 R: 17.1
2006-05-13_02:13:16 out1 T: 16.7 H: 57 W: 0.0 R: 17.1
2006-05-13_02:15:48 out1 T: 16.7 H: 57 W: 1.1 R: 17.1
2006-05-13_02:18:21 out1 T: 16.8 H: 57 W: 0.5 R: 17.1
2006-05-13_02:20:53 out1 T: 16.8 H: 57 W: 0.5 R: 17.1
2006-05-13_02:23:26 out1 T: 16.8 H: 57 W: 0.2 R: 17.1
2006-05-13_02:25:58 out1 T: 16.8 H: 57 W: 0.8 R: 17.1
2006-05-13_02:28:31 out1 T: 16.9 H: 57 W: 0.0 R: 17.1
2006-05-13_02:31:03 out1 T: 16.9 H: 57 W: 0.5 R: 17.1
2006-05-13_02:33:36 out1 T: 16.9 H: 57 W: 0.0 R: 17.1
2006-05-13_02:38:41 out1 T: 17.0 H: 57 W: 2.2 R: 17.1
2006-05-13_02:43:46 out1 T: 17.0 H: 57 W: 1.6 R: 17.1
2006-05-13_02:46:18 out1 T: 17.0 H: 57 W: 1.3 R: 17.1
2006-05-13_02:48:51 out1 T: 17.0 H: 57 W: 0.2 R: 17.1
2006-05-13_02:53:56 out1 T: 17.0 H: 57 W: 0.5 R: 17.1
2006-05-13_03:01:33 out1 T: 16.9 H: 57 W: 0.0 R: 17.1
2006-05-13_03:04:06 out1 T: 16.9 H: 57 W: 1.3 R: 17.1
2006-05-13_03:06:38 out1 T: 16.9 H: 57 W: 2.5 R: 17.1
2006-05-13_03:09:11 out1 T: 16.9 H: 57 W: 8.0 R: 17.1
2006-05-13_03:11:43 out1 T: 16.9 H: 57 W: 1.9 R: 17.1
2006-05-13_03:14:16 out1 T: 16.9 H: 57 W: 1.6 R: 17.1
2006-05-13_03:16:48 out1 T: 16.9 H: 57 W: 1.6 R: 17.1
2006-05-13_03:19:21 out1 T: 16.9 H: 57 W: 1.3 R: 17.1
2006-05-13_03:24:26 out1 T: 16.9 H: 58 W: 4.7 R: 17.1
2006-05-13_03:26:58 out1 T: 16.9 H: 58 W: 1.6 R: 17.1
2006-05-13_03:29:31 out1 T: 16.8 H: 59 W: 4.4 R: 17.1
2006-05-13_03:32:03 out1 T: 16.6 H: 60 W: 14.4 R: 17.1
2006-05-13_03:34:36 out1 T: 16.4 H: 62 W: 2.7 R: 17.1
2006-05-13_03:37:08 out1 T: 16.1 H: 64 W: 3.8 R: 17.1
2006-05-13_03:39:41 out1 T: 16.5 H: 66 W: 1.6 R: 15.9
2006-05-13_03:42:13 out1 T: 15.5 H: 69 W: 2.5 R: 17.1
2006-05-13_03:44:46 out1 T: 15.2 H: 70 W: 1.3 R: 17.1
2006-05-13_03:47:18 out1 T: 15.0 H: 73 W: 0.0 R: 17.1
2006-05-13_03:49:51 out1 T: 14.9 H: 73 W: 0.5 R: 17.1
2006-05-13_03:52:23 out1 T: 14.7 H: 74 W: 0.5 R: 17.1
2006-05-13_03:54:56 out1 T: 14.6 H: 74 W: 0.0 R: 17.1
2006-05-13_03:57:28 out1 T: 14.5 H: 75 W: 0.0 R: 17.1
2006-05-13_04:00:03 out1 T: 14.4 H: 76 W: 0.0 R: 17.1
2006-05-13_04:05:06 out1 T: 14.3 H: 77 W: 0.0 R: 17.1
2006-05-13_04:07:38 out1 T: 14.4 H: 77 W: 0.0 R: 17.1
2006-05-13_04:10:11 out1 T: 14.3 H: 77 W: 0.0 R: 17.1
2006-05-13_04:12:43 out1 T: 14.4 H: 77 W: 0.0 R: 17.1
2006-05-13_04:15:16 out1 T: 14.4 H: 77 W: 0.0 R: 17.1
2006-05-13_04:17:48 out1 T: 14.4 H: 77 W: 0.0 R: 17.1
2006-05-13_04:20:21 out1 T: 14.4 H: 77 W: 0.0 R: 17.1
2006-05-13_04:22:53 out1 T: 14.3 H: 78 W: 0.0 R: 17.1
2006-05-13_04:27:58 out1 T: 14.2 H: 78 W: 0.0 R: 17.1
2006-05-13_04:30:31 out1 T: 14.1 H: 78 W: 0.0 R: 17.1
2006-05-13_04:33:03 out1 T: 14.0 H: 78 W: 0.5 R: 17.1
2006-05-13_04:38:08 out1 T: 14.0 H: 79 W: 0.2 R: 17.1
2006-05-13_04:40:41 out1 T: 14.0 H: 79 W: 0.2 R: 17.1
2006-05-13_04:45:46 out1 T: 13.9 H: 79 W: 0.5 R: 17.1
2006-05-13_04:48:18 out1 T: 13.9 H: 79 W: 0.0 R: 17.1
2006-05-13_04:50:51 out1 T: 13.8 H: 79 W: 0.0 R: 17.1
2006-05-13_04:53:23 out1 T: 13.9 H: 79 W: 0.0 R: 17.1
2006-05-13_04:55:56 out1 T: 13.9 H: 79 W: 0.0 R: 17.1
2006-05-13_04:58:28 out1 T: 13.9 H: 79 W: 0.0 R: 17.1
2006-05-13_05:01:01 out1 T: 13.9 H: 79 W: 0.0 R: 17.1
2006-05-13_05:03:33 out1 T: 13.9 H: 79 W: 0.0 R: 17.1
2006-05-13_05:06:06 out1 T: 13.9 H: 79 W: 0.0 R: 17.1
2006-05-13_05:08:38 out1 T: 14.0 H: 79 W: 0.0 R: 17.1
2006-05-13_05:11:11 out1 T: 14.0 H: 79 W: 0.0 R: 17.1
2006-05-13_05:13:44 out1 T: 13.9 H: 79 W: 0.0 R: 17.1
2006-05-13_05:16:16 out1 T: 13.9 H: 79 W: 0.0 R: 17.1
2006-05-13_05:18:49 out1 T: 13.9 H: 80 W: 0.0 R: 17.1
2006-05-13_05:21:21 out1 T: 13.9 H: 80 W: 0.0 R: 17.1
2006-05-13_05:26:26 out1 T: 13.8 H: 80 W: 0.8 R: 17.1
2006-05-13_05:28:59 out1 T: 13.8 H: 80 W: 0.0 R: 17.1
2006-05-13_05:31:31 out1 T: 13.8 H: 80 W: 0.0 R: 17.1
2006-05-13_05:34:04 out1 T: 13.8 H: 80 W: 0.2 R: 17.1
2006-05-13_05:36:36 out1 T: 13.8 H: 81 W: 0.0 R: 17.1
2006-05-13_05:39:09 out1 T: 13.7 H: 81 W: 0.2 R: 17.1
2006-05-13_05:41:41 out1 T: 13.8 H: 81 W: 0.0 R: 17.1
2006-05-13_05:44:14 out1 T: 13.8 H: 81 W: 0.2 R: 17.1
2006-05-13_05:46:46 out1 T: 13.7 H: 81 W: 0.2 R: 17.1
2006-05-13_05:49:19 out1 T: 13.8 H: 81 W: 0.0 R: 17.1
2006-05-13_05:51:51 out1 T: 13.7 H: 82 W: 0.0 R: 17.1
2006-05-13_05:54:24 out1 T: 13.7 H: 82 W: 0.0 R: 17.1
2006-05-13_05:56:56 out1 T: 13.6 H: 82 W: 0.0 R: 17.1
2006-05-13_05:59:29 out1 T: 13.6 H: 82 W: 0.0 R: 17.1
2006-05-13_06:02:01 out1 T: 13.7 H: 82 W: 0.0 R: 17.1
2006-05-13_06:07:06 out1 T: 13.6 H: 82 W: 0.0 R: 17.1
2006-05-13_06:09:39 out1 T: 13.6 H: 82 W: 0.0 R: 17.1
2006-05-13_06:12:11 out1 T: 13.6 H: 82 W: 0.0 R: 17.1
2006-05-13_06:14:44 out1 T: 13.6 H: 82 W: 0.0 R: 17.1
2006-05-13_06:17:16 out1 T: 13.6 H: 82 W: 0.0 R: 17.1
2006-05-13_06:19:49 out1 T: 13.6 H: 82 W: 0.8 R: 17.1
2006-05-13_06:22:21 out1 T: 13.6 H: 82 W: 0.5 R: 17.1
2006-05-13_06:24:54 out1 T: 13.5 H: 82 W: 0.2 R: 17.1
2006-05-13_06:27:26 out1 T: 13.5 H: 82 W: 0.0 R: 17.1
2006-05-13_06:29:59 out1 T: 13.5 H: 82 W: 0.0 R: 17.1
2006-05-13_06:32:31 out1 T: 13.5 H: 82 W: 0.2 R: 17.1
2006-05-13_06:35:04 out1 T: 13.5 H: 83 W: 0.0 R: 17.1
2006-05-13_06:37:36 out1 T: 13.5 H: 83 W: 0.0 R: 17.1
2006-05-13_06:40:09 out1 T: 13.4 H: 83 W: 0.0 R: 17.1
2006-05-13_06:47:46 out1 T: 13.4 H: 83 W: 0.5 R: 17.1
2006-05-13_06:50:19 out1 T: 13.4 H: 83 W: 0.0 R: 17.1
2006-05-13_06:52:51 out1 T: 13.4 H: 83 W: 0.2 R: 17.1
2006-05-13_06:55:24 out1 T: 13.4 H: 84 W: 0.2 R: 17.1
2006-05-13_06:57:56 out1 T: 13.4 H: 84 W: 0.2 R: 17.1
2006-05-13_07:00:29 out1 T: 13.3 H: 84 W: 0.5 R: 17.1
2006-05-13_07:03:01 out1 T: 13.3 H: 84 W: 0.0 R: 17.1
2006-05-13_07:05:34 out1 T: 13.4 H: 84 W: 0.2 R: 17.1
2006-05-13_07:08:06 out1 T: 13.4 H: 84 W: 0.0 R: 17.1
2006-05-13_07:10:39 out1 T: 13.4 H: 84 W: 0.0 R: 17.1
2006-05-13_07:13:11 out1 T: 13.4 H: 84 W: 0.0 R: 17.1
2006-05-13_07:15:44 out1 T: 13.4 H: 84 W: 0.0 R: 17.1
2006-05-13_07:18:16 out1 T: 13.4 H: 84 W: 0.0 R: 17.1
2006-05-13_07:20:49 out1 T: 13.4 H: 84 W: 0.8 R: 17.1
2006-05-13_07:23:21 out1 T: 13.4 H: 84 W: 0.2 R: 17.1
2006-05-13_07:28:26 out1 T: 13.4 H: 84 W: 0.0 R: 17.1
2006-05-13_07:30:59 out1 T: 13.5 H: 84 W: 0.0 R: 17.1
2006-05-13_07:33:31 out1 T: 13.5 H: 84 W: 0.0 R: 17.1
2006-05-13_07:36:04 out1 T: 13.5 H: 84 W: 0.0 R: 17.1
2006-05-13_07:38:36 out1 T: 13.6 H: 84 W: 0.0 R: 17.1
2006-05-13_07:41:09 out1 T: 13.7 H: 84 W: 0.0 R: 17.1
2006-05-13_07:43:41 out1 T: 13.6 H: 84 W: 0.0 R: 17.1
2006-05-13_07:46:14 out1 T: 13.7 H: 84 W: 0.0 R: 17.1
2006-05-13_07:48:46 out1 T: 13.6 H: 84 W: 0.0 R: 17.1
2006-05-13_07:51:19 out1 T: 13.6 H: 84 W: 0.2 R: 17.1
2006-05-13_07:53:51 out1 T: 13.6 H: 84 W: 0.5 R: 17.1
2006-05-13_07:56:24 out1 T: 13.6 H: 84 W: 0.0 R: 17.1
2006-05-13_07:58:56 out1 T: 13.6 H: 84 W: 0.0 R: 17.1
2006-05-13_08:01:29 out1 T: 13.6 H: 84 W: 0.0 R: 17.1
2006-05-13_08:04:01 out1 T: 13.6 H: 84 W: 0.5 R: 17.1
2006-05-13_08:11:39 out1 T: 13.4 H: 84 W: 2.2 R: 17.1
2006-05-13_08:14:11 out1 T: 13.5 H: 85 W: 0.0 R: 17.1
2006-05-13_08:16:44 out1 T: 13.5 H: 85 W: 0.0 R: 17.1
2006-05-13_08:19:16 out1 T: 13.6 H: 85 W: 0.5 R: 17.1
2006-05-13_08:21:49 out1 T: 13.6 H: 85 W: 0.0 R: 17.1
2006-05-13_08:26:54 out1 T: 13.6 H: 85 W: 2.7 R: 17.1
2006-05-13_08:34:31 out1 T: 13.6 H: 85 W: 1.9 R: 17.1
2006-05-13_08:49:47 out1 T: 13.8 H: 85 W: 1.1 R: 17.1
2006-05-13_08:52:19 out1 T: 13.8 H: 85 W: 1.3 R: 17.1
2006-05-13_08:57:24 out1 T: 13.9 H: 85 W: 1.6 R: 17.1
2006-05-13_08:59:57 out1 T: 14.0 H: 85 W: 1.3 R: 17.1
2006-05-13_09:02:29 out1 T: 14.0 H: 85 W: 1.9 R: 17.1
2006-05-13_09:07:34 out1 T: 14.2 H: 84 W: 1.1 R: 17.1
2006-05-13_09:10:07 out1 T: 14.3 H: 84 W: 0.5 R: 17.1
2006-05-13_09:12:39 out1 T: 14.4 H: 84 W: 0.2 R: 17.1
2006-05-13_09:17:44 out1 T: 14.2 H: 83 W: 2.7 R: 17.1
2006-05-13_09:20:17 out1 T: 14.1 H: 83 W: 1.6 R: 17.1
2006-05-13_09:22:49 out1 T: 14.0 H: 83 W: 3.6 R: 17.1
2006-05-13_09:25:22 out1 T: 14.0 H: 83 W: 3.6 R: 17.1
2006-05-13_09:30:27 out1 T: 13.9 H: 84 W: 2.7 R: 17.1
2006-05-13_09:32:59 out1 T: 14.0 H: 84 W: 1.3 R: 17.1
2006-05-13_09:35:32 out1 T: 14.0 H: 83 W: 3.0 R: 17.1
2006-05-13_09:38:04 out1 T: 14.0 H: 83 W: 0.8 R: 17.1
2006-05-13_09:40:37 out1 T: 14.0 H: 84 W: 1.3 R: 17.1
2006-05-13_09:43:09 out1 T: 14.0 H: 84 W: 2.2 R: 17.1
2006-05-13_09:45:42 out1 T: 14.0 H: 84 W: 0.8 R: 17.1
2006-05-13_09:48:14 out1 T: 14.0 H: 84 W: 3.0 R: 17.1
2006-05-13_09:55:52 out1 T: 13.8 H: 84 W: 1.3 R: 17.1
2006-05-13_09:58:24 out1 T: 13.8 H: 84 W: 1.1 R: 17.1
2006-05-13_10:00:57 out1 T: 13.8 H: 84 W: 1.9 R: 17.1
2006-05-13_10:03:29 out1 T: 13.8 H: 85 W: 1.9 R: 17.1
2006-05-13_10:06:02 out1 T: 13.8 H: 85 W: 1.3 R: 17.1
2006-05-13_10:11:07 out1 T: 13.9 H: 85 W: 0.8 R: 17.1
2006-05-13_10:16:12 out1 T: 14.0 H: 85 W: 0.2 R: 17.1
2006-05-13_10:18:44 out1 T: 14.0 H: 84 W: 0.0 R: 17.1
2006-05-13_10:21:17 out1 T: 14.1 H: 84 W: 0.0 R: 17.1
2006-05-13_10:23:49 out1 T: 14.1 H: 84 W: 0.2 R: 17.1
2006-05-13_10:26:22 out1 T: 14.1 H: 83 W: 0.0 R: 17.1
2006-05-13_10:31:27 out1 T: 14.2 H: 83 W: 1.1 R: 17.1
2006-05-13_10:33:59 out1 T: 14.3 H: 83 W: 0.0 R: 17.1
2006-05-13_10:36:32 out1 T: 14.3 H: 83 W: 0.2 R: 17.1
2006-05-13_10:41:37 out1 T: 14.4 H: 83 W: 0.0 R: 17.1
2006-05-13_10:44:09 out1 T: 14.4 H: 83 W: 0.0 R: 17.1
2006-05-13_10:46:42 out1 T: 14.5 H: 83 W: 0.0 R: 17.1
2006-05-13_10:51:47 out1 T: 14.6 H: 83 W: 0.5 R: 17.1
2006-05-13_10:54:19 out1 T: 14.6 H: 82 W: 0.5 R: 17.1
2006-05-13_10:56:52 out1 T: 14.6 H: 82 W: 0.0 R: 17.1
2006-05-13_11:01:57 out1 T: 14.6 H: 82 W: 0.2 R: 17.1
2006-05-13_11:04:29 out1 T: 14.7 H: 82 W: 0.2 R: 17.1

1003
fhem/test/wz-2006-13.log Normal file

File diff suppressed because it is too large Load Diff

116
fhem/test/wz-2006-14.log Normal file
View File

@ -0,0 +1,116 @@
2006-04-01_00:05:51 wz measured-temp: 22.6 (Celsius)
2006-04-01_00:05:51 wz measured-temp: 22.6 (Celsius)
2006-04-01_00:22:20 wz measured-temp: 22.6 (Celsius)
2006-04-01_00:22:21 wz measured-temp: 22.6 (Celsius)
2006-04-01_00:39:44 wz measured-temp: 22.5 (Celsius)
2006-04-01_00:39:45 wz measured-temp: 22.5 (Celsius)
2006-04-01_00:53:51 wz measured-temp: 22.5 (Celsius)
2006-04-01_00:53:51 wz measured-temp: 22.5 (Celsius)
2006-04-01_01:06:48 wz measured-temp: 22.5 (Celsius)
2006-04-01_01:06:49 wz measured-temp: 22.5 (Celsius)
2006-04-01_01:22:16 wz measured-temp: 22.4 (Celsius)
2006-04-01_01:22:17 wz measured-temp: 22.4 (Celsius)
2006-04-01_01:39:41 wz measured-temp: 22.3 (Celsius)
2006-04-01_01:39:41 wz measured-temp: 22.3 (Celsius)
2006-04-01_01:53:51 wz measured-temp: 22.2 (Celsius)
2006-04-01_01:53:51 wz measured-temp: 22.2 (Celsius)
2006-04-01_02:06:45 wz measured-temp: 22.1 (Celsius)
2006-04-01_02:06:45 wz measured-temp: 22.1 (Celsius)
2006-04-01_02:22:13 wz measured-temp: 22.1 (Celsius)
2006-04-01_02:22:13 wz measured-temp: 22.1 (Celsius)
2006-04-01_02:39:37 wz measured-temp: 22.0 (Celsius)
2006-04-01_02:39:37 wz measured-temp: 22.0 (Celsius)
2006-04-01_02:53:51 wz measured-temp: 22.0 (Celsius)
2006-04-01_02:53:51 wz measured-temp: 22.0 (Celsius)
2006-04-01_03:06:41 wz measured-temp: 21.9 (Celsius)
2006-04-01_03:06:41 wz measured-temp: 21.9 (Celsius)
2006-04-01_03:22:09 wz measured-temp: 21.9 (Celsius)
2006-04-01_03:22:09 wz measured-temp: 21.9 (Celsius)
2006-04-01_03:39:33 wz measured-temp: 21.8 (Celsius)
2006-04-01_03:39:33 wz measured-temp: 21.8 (Celsius)
2006-04-01_03:53:51 wz measured-temp: 21.7 (Celsius)
2006-04-01_03:53:52 wz measured-temp: 21.7 (Celsius)
2006-04-01_04:02:55 wz day-temp: 22.0 (Celsius)
2006-04-01_04:02:55 wz night-temp: 18.0 (Celsius)
2006-04-01_04:02:56 wz windowopen-temp: 12.0 (Celsius)
2006-04-01_04:02:57 wz desired-temp: 18.0 (Celsius)
2006-04-01_04:02:58 wz measured-temp: 21.7 (Celsius)
2006-04-01_04:02:58 wz measured-temp: 21.7 (Celsius)
2006-04-01_04:06:37 wz measured-temp: 21.7 (Celsius)
2006-04-01_04:06:37 wz measured-temp: 21.7 (Celsius)
2006-04-01_04:06:37 wz measured-temp: 21.7 (Celsius)
2006-04-01_04:22:05 wz measured-temp: 21.6 (Celsius)
2006-04-01_04:22:05 wz measured-temp: 21.6 (Celsius)
2006-04-01_04:39:29 wz measured-temp: 21.5 (Celsius)
2006-04-01_04:39:29 wz measured-temp: 21.5 (Celsius)
2006-04-01_04:53:51 wz measured-temp: 21.5 (Celsius)
2006-04-01_04:53:52 wz measured-temp: 21.5 (Celsius)
2006-04-01_05:06:33 wz measured-temp: 21.4 (Celsius)
2006-04-01_05:06:33 wz measured-temp: 21.4 (Celsius)
2006-04-01_05:22:01 wz measured-temp: 21.4 (Celsius)
2006-04-01_05:22:01 wz measured-temp: 21.4 (Celsius)
2006-04-01_05:39:25 wz measured-temp: 21.3 (Celsius)
2006-04-01_05:39:25 wz measured-temp: 21.3 (Celsius)
2006-04-01_05:53:51 wz measured-temp: 21.3 (Celsius)
2006-04-01_05:53:52 wz measured-temp: 21.3 (Celsius)
2006-04-01_06:02:51 wz desired-temp: 22.0 (Celsius)
2006-04-01_06:06:29 wz measured-temp: 21.3 (Celsius)
2006-04-01_06:06:29 wz measured-temp: 21.3 (Celsius)
2006-04-01_06:21:57 wz measured-temp: 21.2 (Celsius)
2006-04-01_06:21:57 wz measured-temp: 21.2 (Celsius)
2006-04-01_06:39:21 wz measured-temp: 21.4 (Celsius)
2006-04-01_06:39:21 wz measured-temp: 21.4 (Celsius)
2006-04-01_06:54:49 wz measured-temp: 21.9 (Celsius)
2006-04-01_06:54:49 wz measured-temp: 21.9 (Celsius)
2006-04-01_07:06:25 wz measured-temp: 22.1 (Celsius)
2006-04-01_07:06:25 wz measured-temp: 22.1 (Celsius)
2006-04-01_07:21:53 wz measured-temp: 22.3 (Celsius)
2006-04-01_07:21:53 wz measured-temp: 22.3 (Celsius)
2006-04-01_07:39:17 wz measured-temp: 22.4 (Celsius)
2006-04-01_07:39:17 wz measured-temp: 22.4 (Celsius)
2006-04-01_07:54:45 wz measured-temp: 22.3 (Celsius)
2006-04-01_07:54:45 wz measured-temp: 22.3 (Celsius)
2006-04-01_08:06:21 wz measured-temp: 22.2 (Celsius)
2006-04-01_08:06:21 wz measured-temp: 22.2 (Celsius)
2006-04-01_08:21:51 wz measured-temp: 22.2 (Celsius)
2006-04-01_08:21:52 wz measured-temp: 22.2 (Celsius)
2006-04-01_08:39:13 wz measured-temp: 22.0 (Celsius)
2006-04-01_08:39:13 wz measured-temp: 22.0 (Celsius)
2006-04-01_08:54:41 wz measured-temp: 22.0 (Celsius)
2006-04-01_08:54:41 wz measured-temp: 22.0 (Celsius)
2006-04-01_09:06:17 wz measured-temp: 21.9 (Celsius)
2006-04-01_09:06:17 wz measured-temp: 21.9 (Celsius)
2006-04-01_09:21:52 wz measured-temp: 21.9 (Celsius)
2006-04-01_09:21:52 wz measured-temp: 21.9 (Celsius)
2006-04-01_09:39:09 wz measured-temp: 21.9 (Celsius)
2006-04-01_09:39:09 wz measured-temp: 21.9 (Celsius)
2006-04-01_09:54:37 wz measured-temp: 21.9 (Celsius)
2006-04-01_09:54:37 wz measured-temp: 21.9 (Celsius)
2006-04-01_10:06:13 wz measured-temp: 21.9 (Celsius)
2006-04-01_10:06:13 wz measured-temp: 21.9 (Celsius)
2006-04-01_10:21:52 wz measured-temp: 21.9 (Celsius)
2006-04-01_10:21:52 wz measured-temp: 21.9 (Celsius)
2006-04-01_10:39:05 wz measured-temp: 22.0 (Celsius)
2006-04-01_10:39:05 wz measured-temp: 22.0 (Celsius)
2006-04-01_10:54:33 wz measured-temp: 22.0 (Celsius)
2006-04-01_10:54:33 wz measured-temp: 22.0 (Celsius)
2006-04-01_11:06:09 wz measured-temp: 22.0 (Celsius)
2006-04-01_11:06:09 wz measured-temp: 22.0 (Celsius)
2006-04-01_11:21:52 wz measured-temp: 22.0 (Celsius)
2006-04-01_11:21:52 wz measured-temp: 22.0 (Celsius)
2006-04-01_11:39:01 wz measured-temp: 22.1 (Celsius)
2006-04-01_11:39:01 wz measured-temp: 22.1 (Celsius)
2006-04-01_11:54:29 wz measured-temp: 22.1 (Celsius)
2006-04-01_11:54:29 wz measured-temp: 22.1 (Celsius)
2006-04-01_12:06:05 wz measured-temp: 22.1 (Celsius)
2006-04-01_12:06:05 wz measured-temp: 22.1 (Celsius)
2006-04-01_12:21:52 wz measured-temp: 22.1 (Celsius)
2006-04-01_12:21:52 wz measured-temp: 22.1 (Celsius)
2006-04-01_12:38:57 wz measured-temp: 22.1 (Celsius)
2006-04-01_12:38:57 wz measured-temp: 22.1 (Celsius)
2006-04-01_12:54:25 wz measured-temp: 22.1 (Celsius)
2006-04-01_12:54:25 wz measured-temp: 22.1 (Celsius)
2006-04-01_13:06:01 wz measured-temp: 22.1 (Celsius)
2006-04-01_13:06:01 wz measured-temp: 22.1 (Celsius)
2006-04-01_13:21:52 wz measured-temp: 22.1 (Celsius)
2006-04-01_13:21:52 wz measured-temp: 22.1 (Celsius)

View File

@ -0,0 +1,379 @@
<HTML>
<HEAD>
<TITLE>Home Facility Management</TITLE>
<STYLE>
BODY {
font-size:8pt;
font-family:Helvetica,Arial, Sans Serif;
padding-bottom:0px;
background-color:#E1E1E1;
}
TD {
font-size:8pt;
font-family:Helvetica,Arial, Sans Serif;
padding-bottom:0px;
vertical-align:top;
padding-right:15px;
padding-top:3px;
}
.odd {
background-color:#D5D6D7;
}
.even {
}
TABLE {
border-spacing:0px;
}
</STYLE>
</HEAD>
<SCRIPT>
var zebra = ["odd", "even"];
function loadXml(url, func) {
var request = null;
if (url.indexOf("?") >= 0)
url += "&foo=" + Math.random();
else
url += "?foo=" + Math.random();
if (window.XMLHttpRequest) {
request = new XMLHttpRequest();
} else if (window.ActiveXObject) {
try {
request = new ActiveXObject("Msxml2.XMLHTTP");
if (request.overrideMimeType) {
request.overrideMimeType('text/xml');
}
} catch (e) {
try {
request = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {}
}
}
if (!request) {
alert('Cannot create an XMLHTTP instance');
return false;
}
request.onreadystatechange = function() {func(request);};
request.open('GET', url, true);
request.send(null);
}
function getChildByAttributeValue(parentNode, attrName, attrValue) {
for (var child = parentNode.firstChild; child != null; child = child.nextSibling) {
if (child.nodeType != 1)
continue;
if (child.getAttribute(attrName) == attrValue)
return child;
}
return null;
}
function setFS20(name, cmd) {
loadXml("/cgi-bin/hfm_set.pl?action=setFS20&name=" + name + "&cmd=" + cmd,reloadDoc);
}
function setTemp(name, tempToSet) {
var select = document.getElementById(name);
var degreeToSet=null;
for (var option = select.firstChild; option != null; option = option.nextSibling){
if (option.selected) {
degreeToSet = option.value;
}
}
if (!degreeToSet)
return;
if (confirm("Set new temperature " + degreeToSet + "C\n for '"+name+ "'?")) {
loadXml(
"/cgi-bin/hfm_set.pl"
+ "?action=setFHT"
+ "&name=" + name
+ "&tempToSet=" + tempToSet
+ "&degreeToSet=" + degreeToSet,
reloadDoc);
}
}
var maxReloads = 24*60; // one day
var timeoutId = -1;
function reloadDoc(request) {
if(!request || request.readyState == 4 ) {
loadXml("/cgi-bin/hfm_get.pl",handleLoadFhzData);
if (maxReloads-- >0) {
clearTimeout(timeoutId);
timeoutId = setTimeout("reloadDoc()", 60*1000); // one minute
}
}
}
function createAnchor(deviceClass, id, onclickHandler, txt) {
var a = document.createElement("A");
a.appendChild(document.createTextNode(txt));
a.setAttribute("href", "javascript:;");
a.setAttribute("id", id);
a.setAttribute("href", "javascript:;");
a.onclick=onclickHandler;
return a;
}
function drawFs20Devices(devices, htmlElem) {
var rowCount=0;
var table = document.createElement("TABLE");
var tbody = document.createElement("TBODY");
var tr = document.createElement("TR");
var td;
var a;
tr.setAttribute("className", zebra[(rowCount++)%2]);
htmlElem.appendChild(table);
table.appendChild(tbody);
tbody.appendChild(tr);
td = document.createElement("TD");
tr.appendChild(td);
td.appendChild(document.createTextNode("Name"));
td = document.createElement("TD");
tr.appendChild(td);
td.appendChild(document.createTextNode("Status"));
td = document.createElement("TD");
tr.appendChild(td);
td.appendChild(document.createTextNode("Kommando"));
td.setAttribute("colSpan", "4");
for (var device=devices.firstChild; device != null; device=device.nextSibling) {
if (device.nodeType != 1)
continue;
tr = document.createElement("TR");
tbody.appendChild(tr);
tr.setAttribute("className", zebra[(rowCount++)%2]);
td = document.createElement("TD");
td.appendChild(document.createTextNode(device.getAttribute("name")));
tr.appendChild(td);
td = document.createElement("TD");
td.appendChild(document.createTextNode(device.getAttribute("state")));
tr.appendChild(td);
td = document.createElement("TD");
a = createAnchor(
"FS20",
device.getAttribute("name"),
function(){setFS20(this.id, "on");},
"on"
);
td.appendChild(a);
tr.appendChild(td);
td = document.createElement("TD");
a = createAnchor(
"FS20",
device.getAttribute("name"),
function(){setFS20(this.id, "off");},
"off"
);
td.appendChild(a);
tr.appendChild(td);
}
}
function getDegree(device, name) {
var stateChild = getChildByAttributeValue(device, "name", name);
if (stateChild) {
var degree = new Number(
stateChild.getAttribute("value").replace(/[^.0-9]*/g, "")
);
return degree;
}
return -1.0;
}
function drawFhtDevices(devices, htmlElem) {
var rowCount=0;
var table = document.createElement("TABLE");
var tbody = document.createElement("TBODY");
var tr = document.createElement("TR");
var td;
var a;
tr.setAttribute("className", zebra[(rowCount++)%2]);
htmlElem.appendChild(table);
table.appendChild(tbody);
tbody.appendChild(tr);
td = document.createElement("TD");
tr.appendChild(td);
td.innerHTML = "Name";
td = document.createElement("TD");
tr.appendChild(td);
td.innerHTML = "Mode";
td = document.createElement("TD");
tr.appendChild(td);
td.innerHTML = "Actuator";
td = document.createElement("TD");
tr.appendChild(td);
td.innerHTML = "desired<BR>temperture";
td = document.createElement("TD");
tr.appendChild(td);
td.innerHTML = "measured<BR>temperture";
td = document.createElement("TD");
tr.appendChild(td);
td.innerHTML = "day<BR>temperture";
td = document.createElement("TD");
tr.appendChild(td);
td.innerHTML = "night<BR>temperture";
td = document.createElement("TD");
tr.appendChild(td);
td.innerHTML = "window open<BR>temperture";
td = document.createElement("TD");
tr.appendChild(td);
td.appendChild(document.createTextNode("state"));
for (var device=devices.firstChild; device != null; device=device.nextSibling) {
if (device.nodeType != 1)
continue;
var deviceName = device.getAttribute("name");
tr = document.createElement("TR");
tbody.appendChild(tr);
tr.setAttribute("className", zebra[(rowCount++)%2]);
td = document.createElement("TD");
td.appendChild(document.createTextNode(deviceName));
tr.appendChild(td);
var desiredTemp = getDegree(device,"desired-temp");
var measuredTemp = getDegree(device,"measured-temp");
var nightTemp = getDegree(device,"night-temp");
var dayTemp = getDegree(device,"day-temp");
var windowOpenTemp = getDegree(device,"windowopen-temp");
var fhtStates = ["mode", "actuator", "desired-temp", "measured-temp", "day-temp", "night-temp", "windowopen-temp", "state"];
for (var i=0; i < fhtStates.length; i++) {
var stateChild = getChildByAttributeValue(device, "name", fhtStates[i]);
td = document.createElement("TD");
tr.appendChild(td);
if (stateChild) {
var value = stateChild.getAttribute("value");
value = value.replace(/ \(Celsius\)/,"&deg;");
value = value.replace(/,/,"<BR>");
if (fhtStates[i] == "desired-temp") {
var select = document.createElement("SELECT");
td.appendChild(select);
select.setAttribute("id", deviceName);
select.onchange = function() {
setTemp(this.id, "desired-temp");
};
for (var degree=8.0; degree <= 30.0; degree += 0.5) {
var option = document.createElement("OPTION");
option.setAttribute("value", "" + degree);
option.appendChild(document.createTextNode(""+degree));
if (degree==desiredTemp) {
option.setAttribute("selected", "true");
}
select.appendChild(option);
}
if (desiredTemp.valueOf()==dayTemp.valueOf()) {
td.appendChild(
document.createTextNode("day")
);
} else if (desiredTemp.valueOf()==nightTemp.valueOf()) {
td.appendChild(
document.createTextNode("night")
);
} else if (desiredTemp.valueOf()==windowOpenTemp.valueOf()) {
td.appendChild(
document.createTextNode("windowopen")
);
} else {
td.appendChild(
document.createTextNode("n/a")
);
}
} else {
td.innerHTML = value;
}
}
}
}
}
function handleLoadFhzData(request) {
if(request.readyState == 4 && request.status==200) {
var xmldoc = request.responseXML;
var root = xmldoc.documentElement;
for (var devices = root.firstChild; devices != null; devices = devices.nextSibling) {
if (devices.nodeType != 1)
continue;
var nodeName = devices.nodeName;
var htmlElem = document.getElementById(nodeName);
if (htmlElem != null) {
while (htmlElem.firstChild)
htmlElem.removeChild(htmlElem.firstChild);
if ("FS20_DEVICES" == nodeName) {
drawFs20Devices(devices, htmlElem);
} else if ("FHT_DEVICES" == nodeName) {
drawFhtDevices(devices, htmlElem);
}
}
}
}
}
function init() {
reloadDoc();
}
</SCRIPT>
<BODY onload="init();">
<TABLE><TBODY>
<TR><TD><BR><B>FS20 Devices</B><BR></TD></TR>
<TR><TD id="FS20_DEVICES"></TD></TR>
<TR><TD><BR><B>FHT Devices</B><BR></TD></TR>
<TR><TD id="FHT_DEVICES"></TD></TR>
</TBODY></TABLE>
</BODY>
</HTML>

View File

@ -0,0 +1,37 @@
#!/usr/bin/perl
use CGI;
use IO::Socket::INET;
use warnings;
$host="localhost:7072";
sub
getXmlList() {
my $server = IO::Socket::INET->new(PeerAddr => $host);
my $str = "";
if ($server) {
my $buf;
syswrite($server, "xmllist; quit\n");
while(sysread($server, $buf, 256) > 0) {
$str .= $buf
}
} else {
$str="<ERROR msg='Cannot connect to the server'/>\n";
}
return $str;
}
my $cgi = new CGI;
print $cgi->header( "-type" => "text/xml; charset=UTF-8",
"-Expires" => "0",
"-Cache-Control" => "no-chache",
"-Pragma" => "no-cache"
);
print "<?xml version='1.0'?>\n";
print getXmlList();

View File

@ -0,0 +1,72 @@
#!/usr/bin/perl
use CGI;
use IO::Socket;
use warnings;
$host="localhost:7072";
sub setFs20($){
my $cgi = shift;
my $name=$cgi->param("name");
my $cmd=$cgi->param("cmd");
return sendCommand("set $name $cmd");
}
sub setFht($){
my $cgi = shift;
my $name=$cgi->param("name");
my $tempToSet=$cgi->param("tempToSet");
my $degreeToSet=$cgi->param("degreeToSet");
return sendCommand("set $name $tempToSet $degreeToSet");
}
sub sendCommand($) {
my $cmd = shift;
my $server;
$server = IO::Socket::INET->new(PeerAddr => $host);
if ($server) {
syswrite($server, "$cmd; quit\n");
return "<OK/>\n";
} else {
return "<ERROR msg='Cannot connect to the server'/>\n";
}
}
my $cgi = new CGI;
my $str="<ERROR msg='Unknown command'/>\n";
my $action=$cgi->param("action");
if ($action eq "setFS20") {
$str = setFs20($cgi);
}
if ($action eq "setFHT") {
$str = setFht($cgi);
}
my $thinClient = $cgi->param("thinclient") || "false";
if ("true" eq $thinClient) {
# No ajax, send redirect
print $cgi->header( "-type" => "text/xml",
"-Expires" => "0",
"-Cache-Control" => "no-chache",
"-Pragma" => "no-cache",
"-Status" => "302 Moved Temporarily",
"-Location" => "/hfm/scripts/hfm_tc.pl"
);
} else {
print $cgi->header( "-type" => "text/xml",
"-Expires" => "0",
"-Cache-Control" => "no-chache",
"-Pragma" => "no-cache"
);
}
print "<?xml version='1.0'?>\n";
print $str;

View File

@ -0,0 +1,48 @@
#!/usr/bin/perl
use XML::XSLT;
use CGI;
use warnings;
use IO::Socket::INET;
my $host="localhost:7072";
my $xsl="/home/httpd/cgi-bin/xsl/hfm_tc.xsl";
sub
getXmlList() {
my $server = IO::Socket::INET->new(PeerAddr => $host);
my $str = "";
if ($server) {
my $buf;
syswrite($server, "xmllist; quit\n");
while(sysread($server, $buf, 256) > 0) {
$str .= $buf
}
} else {
$str="<ERROR msg='Cannot connect to the server'/>\n";
}
return $str;
}
my $cgi = new CGI;
print $cgi->header( "-type" => "text/html",
"-Expires" => "0",
"-Cache-Control" => "no-chache",
"-Pragma" => "no-cache"
);
my $xml=getXmlList();
my $xslt = XML::XSLT->new ($xsl, warnings => 1);
$xslt->transform ($xml);
print $xslt->toString;
$xslt->dispose();

View File

@ -0,0 +1,77 @@
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/FHZINFO">
<HTML>
<STYLE>
BODY {
font-size:8pt;
font-family:Helvetica,Arial, Sans Serif;
padding-bottom:0px;
background-color:#d5d6d8
}
TD {
font-size:8pt;
font-family:Helvetica,Arial, Sans Serif;
padding-bottom:0px;
background-color:#d5d6d8
}
TABLE{
border-spacing:0px
cellpadding:0
cellspacing:0
}
</STYLE>
<BODY>
FS20<BR/>
<xsl:apply-templates select="FS20_DEVICES/FS20"/>
FHT<BR/>
<xsl:apply-templates select="FHT_DEVICES/FHT"/>
</BODY>
</HTML>
</xsl:template>
<xsl:template match="FS20">
Name: <xsl:value-of select="@name"/><BR/>
State: <xsl:value-of select="@state"/><BR/>
<A>
<xsl:attribute name="href">/cgi-bin/hfm_set.pl?action=setFS20&amp;name=<xsl:value-of select="@name"/>&amp;cmd=on&amp;thinclient=true</xsl:attribute>
On
</A> |
<A>
<xsl:attribute name="href">/cgi-bin/hfm_set.pl?action=setFS20&amp;name=<xsl:value-of select="@name"/>&amp;cmd=off&amp;thinclient=true</xsl:attribute>
Off</A>
<BR/><BR/>
</xsl:template>
<xsl:template match="FHT">
<B>Name: <xsl:value-of select="@name"/></B><BR/>
<xsl:apply-templates/>
<BR/><BR/>
</xsl:template>
<xsl:template match="STATE">
<xsl:if test='@name="measured-temp"'>
<xsl:value-of select="@name"/>=<xsl:value-of select="@value"/><BR/>
</xsl:if>
<xsl:if test="@name='desired-temp'">
<xsl:value-of select="@name"/>=<xsl:value-of select="@value"/><BR/>
</xsl:if>
<xsl:if test="@name='actuator'">
<xsl:value-of select="@name"/>=<xsl:value-of select="@value"/><BR/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>

Binary file not shown.

After

Width:  |  Height:  |  Size: 609 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 B

View File

@ -0,0 +1,20 @@
See the main doc (fhem.html) for the first documentation and installation.
If you want to show anly a part of your devices on a single screen
(i.e divide them into separate rooms), then assign each device the
room attribute in the config file:
attr ks300 room garden
attr ks300-log room garden
The attribute of the FHZ device will be used as title on the first
screen, which shows the list of all rooms. Devices in the room
"hidden" will not be shown. Devices without a room attribute go
to the room "misc".
To configure the absicondir and relicondir correctly, look into the
httpd.conf file (probably /etc/httpd/conf/httpd.conf), and check the
line which looks like:
Alias /icons/ "/home/httpd/icons/"
relicondir will then be /icons, and absicondir /home/httpd/icons.

View File

@ -0,0 +1,142 @@
<?php
##################################################################################
#### pgm3 -- a PHP-webfrontend for fhz1000.pl
###### required settings
$fhz1000="localhost"; # on which machine is fhz1000 runnning??
# if it is not localhost then the fhz1000.cfg must
# run global: "port <nr> global"
$fhz1000port="7072"; # port of fhz1000.pl
$logpath="/var/tmp"; # where are your logs?
##################################################################################
###### nice to have
###### showgnuplot
# Gnuplot will automatically show the pictures.
# There is no reason any more to deactivate Gnuplot. Values: 0/1
$showgnuplot=1;
$gnuplot='/usr/bin/gnuplot'; # location of gnuplot
$pictype='png';
##### logrotate of hms, ks300, fht
# this is only possible, if the webserver (e.g.wwwrun) has the rights ro write the
# files from fh1000.pl. If you want that then run fhz1000.pl as wwwrun too.
# if 'yes' then only the needed lines are in the logfiles, the rest will be deleted.
$logrotate='no'; # yes/no default='no'
## Kioskmode. Only show but don't switch anything. Values: on/off
$kioskmode='off';
## HMS-Devices
$imgmaxxhms=620; #Size of the pictures. Default: 620 for faster systems else 380
$imgmaxyhms=52;
$logrotateHMSlines=1200; # automatic Logrotate; $logrotate must be 'yes'.
# Default:1200
# read docs/logrotate if you want adjust it manually!
# otherwise the system will slow down
# pgm3 (user www-data) needs the rights to write the logs
# from fhz1000.pl (user = ???)
## FHT-Devices
$imgmaxxfht=450; #Size of the pictures Default: 450 for faster systems else 380
$imgmaxyfht=52;
$logrotateFHTlines=4300; # automatic Logrotate; $logrotate must be 'yes'.
# Default:4300
# read docs/logrotate if you want adjust it manually!
# otherwise the system will slow down
# pgm3 (user www-data) needs the rights to write the logs
# from fhz1000.pl (user = ???)
## FS20-Device, adjust it if you have e.g. long titles
$imgmaxxfs20=85; #Size of the pictures, default=85
$imgmaxyfs20=85; # default=85
$fs20fontsizetitel=10; # default=10
$fs20maxiconperline=9; # default=9
#room. Write e.g. "attr rolowz room wzo"
#into your fhz1000.cfg and restart fhz1000.pl
# this will be marked on the FS20-Button.
$txtroom=""; # default=""; example: $txtroom="room: ";
# room hidden will not be shown
## ROOMS adjust it if you have e.g. long titles
$showroombuttons=1; #default 1 Values 0/1
$imgmaxxroom=$imgmaxxfs20; #Size of the pictures, default=$imgmaxxfs20
$imgmaxyroom=30; # default=30
$roomfontsizetitel=10; # default=9
$roommaxiconperline=$fs20maxiconperline; # default=$fs20maxiconperline
## KS300-Device
$imgmaxxks=620; #Size of the pictures Default: 620 for faster systems else 380
$imgmaxyks=52;
$showbft=1; # Display values additionaly in Beafort. Values: 0 /1 Default:1
$logrotateKS300lines=2000; # automatic Logrotate; $logrotate must be 'yes'.
# Default:1900
# read docs/logrotate if you want adjust it manually
# otherwise the system will slow down
# pgm3 (user www-data) needs the rights to write the logs
# from fhz1000.pl (user = ???)
## FHZ-DEVICES
$show_general=1; #field to type FHZ1000-orders 0/1 Default:1
$show_fs20pulldown=1; #Pull-Down for the FS20 Devices 0/1 Default:1
$show_fhtpulldown=1; #Pull-Down for the FHT-Devices 0/1 Default:1
## misc
$taillog=1; #make shure to have the correct rights. Values: 0/1
$taillogorder="/usr/bin/tail -20 $logpath/fhz1000.log";
## show Information at startup. Activate it by deleting the '#'
$showLOGS='no'; #show the LOGS at startup. Default: no Values: yes/no
$showAT='yes'; #show the AT_JOBS at startup. Default: yes Values: yes/no
$showNOTI='no'; #show the NOTIFICATIONS at startup. Default: no Values: yes/no
$showHIST='yes'; #show the HISTORY (if taillog=1) at startup. Default: yes Values: yes/no
$urlreload=60; # Automatic reloading page [sec]. Default fast: 60 slow:90
$titel="PHP-Webmachine for fhz1000.pl :-)"; #feel free to create an own title
$timeformat="Y-m-d H:i:s";
$bodybg="bgcolor='#F5F5F5'";
$bg1="bgcolor='#6E94B7'";
$bg2="bgcolor='#AFC6DB'";
$bg3="bgcolor='#F8F8F8'";
$bg4="bgcolor='#6394BD'";
$fontcolor1="color='#FFFFFF'";
$fontcolor3="color='143554'";
$fontcol_grap_R=20;
$fontcol_grap_G=53;
$fontcol_grap_B=84;
$fontttf="Vera";
$fontttfb="VeraBd"; ##copyright of the fonts: docs/copyright_font
## if there is now graphic try the following:
# $fontttf="Vera.ttf";
# $fontttfb="VeraBd.ttf";
# or absolut:
# $fontttf="/srv/www/htdocs/fhz/include/Vera.ttf";
# $fontttfb="/srv/www/htdocs/fhz/include/VeraBd.ttf";
############################### end of settings
putenv('GDFONTPATH=' . realpath('.'));
?>

View File

@ -0,0 +1,4 @@
All the Documentation of pgm3 is now only online
http://www.martin-haas.de/fhz
Enjoy it :-)

View File

@ -0,0 +1,124 @@
Bitstream Vera Fonts Copyright
The fonts have a generous copyright, allowing derivative works (as
long as "Bitstream" or "Vera" are not in the names), and full
redistribution (so long as they are not *sold* by themselves). They
can be be bundled, redistributed and sold with any software.
The fonts are distributed under the following copyright:
Copyright
=========
Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream
Vera is a trademark of Bitstream, Inc.
Permission is hereby granted, free of charge, to any person obtaining
a copy of the fonts accompanying this license ("Fonts") and associated
documentation files (the "Font Software"), to reproduce and distribute
the Font Software, including without limitation the rights to use,
copy, merge, publish, distribute, and/or sell copies of the Font
Software, and to permit persons to whom the Font Software is furnished
to do so, subject to the following conditions:
The above copyright and trademark notices and this permission notice
shall be included in all copies of one or more of the Font Software
typefaces.
The Font Software may be modified, altered, or added to, and in
particular the designs of glyphs or characters in the Fonts may be
modified and additional glyphs or characters may be added to the
Fonts, only if the fonts are renamed to names not containing either
the words "Bitstream" or the word "Vera".
This License becomes null and void to the extent applicable to Fonts
or Font Software that has been modified and is distributed under the
"Bitstream Vera" names.
The Font Software may be sold as part of a larger software package but
no copy of one or more of the Font Software typefaces may be sold by
itself.
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL,
OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT
SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
Except as contained in this notice, the names of Gnome, the Gnome
Foundation, and Bitstream Inc., shall not be used in advertising or
otherwise to promote the sale, use or other dealings in this Font
Software without prior written authorization from the Gnome Foundation
or Bitstream Inc., respectively. For further information, contact:
fonts at gnome dot org.
Copyright FAQ
=============
1. I don't understand the resale restriction... What gives?
Bitstream is giving away these fonts, but wishes to ensure its
competitors can't just drop the fonts as is into a font sale system
and sell them as is. It seems fair that if Bitstream can't make money
from the Bitstream Vera fonts, their competitors should not be able to
do so either. You can sell the fonts as part of any software package,
however.
2. I want to package these fonts separately for distribution and
sale as part of a larger software package or system. Can I do so?
Yes. A RPM or Debian package is a "larger software package" to begin
with, and you aren't selling them independently by themselves.
See 1. above.
3. Are derivative works allowed?
Yes!
4. Can I change or add to the font(s)?
Yes, but you must change the name(s) of the font(s).
5. Under what terms are derivative works allowed?
You must change the name(s) of the fonts. This is to ensure the
quality of the fonts, both to protect Bitstream and Gnome. We want to
ensure that if an application has opened a font specifically of these
names, it gets what it expects (though of course, using fontconfig,
substitutions could still could have occurred during font
opening). You must include the Bitstream copyright. Additional
copyrights can be added, as per copyright law. Happy Font Hacking!
6. If I have improvements for Bitstream Vera, is it possible they might get
adopted in future versions?
Yes. The contract between the Gnome Foundation and Bitstream has
provisions for working with Bitstream to ensure quality additions to
the Bitstream Vera font family. Please contact us if you have such
additions. Note, that in general, we will want such additions for the
entire family, not just a single font, and that you'll have to keep
both Gnome and Jim Lyles, Vera's designer, happy! To make sense to add
glyphs to the font, they must be stylistically in keeping with Vera's
design. Vera cannot become a "ransom note" font. Jim Lyles will be
providing a document describing the design elements used in Vera, as a
guide and aid for people interested in contributing to Vera.
7. I want to sell a software package that uses these fonts: Can I do so?
Sure. Bundle the fonts with your software and sell your software
with the fonts. That is the intent of the copyright.
8. If applications have built the names "Bitstream Vera" into them,
can I override this somehow to use fonts of my choosing?
This depends on exact details of the software. Most open source
systems and software (e.g., Gnome, KDE, etc.) are now converting to
use fontconfig (see www.fontconfig.org) to handle font configuration,
selection and substitution; it has provisions for overriding font
names and subsituting alternatives. An example is provided by the
supplied local.conf file, which chooses the family Bitstream Vera for
"sans", "serif" and "monospace". Other software (e.g., the XFree86
core server) has other mechanisms for font substitution.

View File

@ -0,0 +1,5 @@
Gnuplot is now automatically supported for HMS, KS300 and FHT.
If you really want to change the graphics then look at the include/gnuplot.php
######################################################################

View File

@ -0,0 +1,10 @@
If the files are too big the system will be slower than usual.
In the config.php it is now possible to automatic logrotate the HMS, FHT and KS300-Logs. But it is only possible if the user of the pgm3 (e.g. wwwrun) has the rights to write the logfiles from fhz1000.pl (user=???????)
If you want do that manually then read the enclosed examples for your crontab.
Every Linux-System normally has a logrotate-Daemon. Put the fhz1000.logrotate in your /etc/logrotate.d/ to lograte the fhz1000.cfg and edit it or use the builtin method: "logfile /tmp/fhz1000-%Y-%m.log"

View File

@ -0,0 +1,11 @@
/var/tmp/fhz1000.log {
rotate 6
size 2M
compress
missingok
notifempty
postrotate
[[ `ps -ef | grep fhz1000.pl | grep -v grep` ]] && \
/etc/init.d/fhz1000 restart
endscript
}

View File

@ -0,0 +1,24 @@
#!/bin/bash
# this script should be installed in e.g. /etc/crontab:
# 0 3 * * * root /usr/local/bin/logrotate.wz.sh > /dev/null 2>&1
# then there are only about 5 days in the logfile for the FHT-Device
logs="adi bao bau leo wz wzo"
for fht in $logs
do
newlogs="0"
# first time
[[ ! -f /var/tmp/$fht.log.main ]] && cp -p /var/tmp/$fht.log /var/tmp/$fht.log.main
cat /var/tmp/$fht.log | while read line;
do
[[ "$newlogs" = "1" ]] && echo $line | egrep -v 'measured-temp: [0-2]\.' >>/var/tmp/$fht.log.main
[[ "$line" = "NEWLOGS" ]] && newlogs="1"
done;
# 4500 for about 5 days
tail -4500 /var/tmp/$fht.log.main >/var/tmp/$fht.log
echo "NEWLOGS" >>/var/tmp/$fht.log
done;

View File

@ -0,0 +1,30 @@
#!/bin/bash
# this script should be installed in e.g. /etc/crontab:
# 0 3 * * * root /usr/local/bin/logrotate.hms100.ks300.sh > /dev/null 2>&1
# then there are only about 4 days in the logfile for the HMS/KS300-Device
logpath=/var/tmp
logs="heating laundry ks300"
for dev in $logs
do
newlogs="0"
# first time
if [ ! -f $logpath/$dev.log.main ]; then cp -p $logpath/$dev.log $logpath/$dev.log.main; fi;
cat $logpath/$dev.log | while read line;
do
if [ "$newlogs" = "1" ];
then echo $line >>$logpath/$dev.log.main; fi;
if [ "$line" = "NEWLOGS" ]; then newlogs="1"; fi;
done;
# 1900 for about 5 days
tail -1900 $logpath/$dev.log.main >$logpath/$dev.log
echo "NEWLOGS" >>$logpath/$dev.log
done;

View File

@ -0,0 +1,150 @@
##############################################
# Low Budget ALARM System
##############################################
# ATTENTION! This is more a toy than a professional alarm system!
# You must know what you do!
##############################################
#
# Concept:
# 1x Signal Light (FS20 allight) to show the status (activated/deactivated)
# 2x Sirene (in/out) (FS20 alsir1 alsir2 )
# 2x PIRI-2 (FS20 piriu pirio)
# 1x Sender (FS20 alsw) to activate/deactivate the system.
# Tip: use the KeyMatic CAC with pin code or
# optional a normal sender (FS20 alsw2)
#
# Add something like the following lines to the configuration file :
# notifyon alsw {MyAlsw()}
# notifyon alsw2 {MyAlswNoPin()}
# notifyon piriu {MyAlarm()}
# notifyon pirio {MyAlarm()}
# and put this file in the <modpath>/FHZ1000 directory.
#
# Martin Haas
##############################################
package main;
use strict;
use warnings;
sub
ALARM_Initialize($$)
{
my ($hash, $init) = @_;
$hash->{Type} = "none";
}
##############################################
# Switching Alarm System on or off
sub
MyAlsw()
{
my $ON="set allight on; setstate alsw on";
my $OFF="set allight off; set alsir1 off; set alsir2 off; setstate alsw off";
if ( -e "/var/tmp/alertsystem")
{
unlink "/var/tmp/alertsystem";
#Paranoia
for (my $i = 0; $i < 2; $i++ )
{
fhz "$OFF";
};
Log 2, "alarm system is OFF";
} else {
system "touch /var/tmp/alertsystem";
#Paranoia
for (my $i = 0; $i < 2; $i++ )
{
fhz "$ON"
}
Log 2, "alarm system is ON";
};
}
##############################################
# If you have no Keymatic then use this workaround:
# After 4x pushing a fs20-button within some seconds it will activate/deactivate the alarm system.
sub
MyAlswNoPin()
{
my $timedout=5;
## first time
if ( ! -e "/var/tmp/alontest1")
{
for (my $i = 1; $i < 4; $i++ )
{
system "touch -t 200601010101 /var/tmp/alontest$i";
}
}
## test 4 times
my $now= `date +%s`;
for (my $i = 1; $i < 4; $i++ )
{
my $tagx=`date -r /var/tmp/alontest$i +%s`;
my $testx=$now-$tagx;
if ( $testx > $timedout )
{
system "touch /var/tmp/alontest$i";
die "test$i: more than $timedout sec";
}
}
system "touch -t 200601010101 /var/tmp/alontest*";
Log 2, "ok, let's switch the alarm system...";
#if you only allow to activate (and not deactivate) with this script:
# if ( -e "/var/tmp/alertsystem") { die "deactivating alarm system not allowed"};
MyAlsw();
}
##############################################
# ALARM! Do what you want!
sub
MyAlarm()
{
#alarm-system activated??
if ( -e "/var/tmp/alertsystem")
{
my $timer=180; # time until the sirene will be quiet
my $ON1="set alsir1 on-for-timer $timer";
my $ON2="set alsir2 on-for-timer $timer";
#Paranoia
for (my $i = 0; $i < 2; $i++ )
{
fhz "$ON1";
fhz "$ON2";
}
Log 2, "ALARM! #################" ;
# have fun
my @lights=("stuwz1", "stuwz2", "nachto", "nachtu", "stoliba" ,"stlileo");
my @rollos=("rolu4", "rolu5", "roloadi", "rololeo", "roloco", "rolowz", "rolunik1", "rolunik2");
foreach my $light (@lights) {
fhz "set $light on"
}
foreach my $rollo (@rollos) {
fhz "set $rollo on"
}
}
}
1;

View File

@ -0,0 +1,80 @@
##############################################
# Switching the FHTs with e.g. a Button
##############################################
# This is only an example.
# After pressing e.g. a button it will change the values
# of desired-temp against the value of windowopen-temp
# With small changes it is possible to change e.g. all FHTs to
# 2 degrees less if you are leaving the house and activating
# the alarm system.
# Don't change the values very often within a time because the FHT seems
# to hang if there are too much values within a time.
#
# Add something like the following lines to the configuration file :
# notifyon NameOfButton {MyFHTswitch("NameOfFHT")}
# and put this file in the <modpath>/FHZ1000 directory.
# Martin Haas
##############################################
package main;
use strict;
use warnings;
sub
FHTswitch_Initialize($)
{
# my ($hash) = @_; ## for fhz1000 >3.0
# $hash->{Category} = "none"; ## for fhz1000 >3.0
my ($hash, $init) = @_; ## for fhz1000 <=3.0
$hash->{Type} = "none"; ## for fhz1000 <=3.0
}
###### ok, let's learn perl ;-)...
sub
MyFHTswitch($)
{
my $str;
my $fhtorder;
my @a = @_;
my $fht=$a[0];
my @windowopentemp;
my @desiredtemp;
no strict "refs";
$str = &{$devmods{$defs{$a[0]}{TYPE}}{ListFn}}($defs{$a[0]});
my @lines = split("\n", $str);
use strict "refs";
foreach my $l (@lines) {
my ($date, $time, $attr, $val) = split(" ", $l, 4);
if($attr eq "desired-temp")
{
Log 3, "old $attr of $a[0]: $val";
@desiredtemp = split(" ", $val);
}
if($attr eq "windowopen-temp")
{
Log 3, "old $attr of $a[0]: $val";
@windowopentemp = split(" ", $val);
}
}
$fhtorder="set $fht desired-temp $windowopentemp[0] ";
fhz "$fhtorder";
$fhtorder="set $fht windowopen-temp $desiredtemp[0] ";
fhz "$fhtorder";
fhz "set $fht refreshvalues";
}
1;

View File

@ -0,0 +1,4 @@
These are some Modules for the fhz1000.pl.
Read the docu from fhz1000 howto intall them.
They are intended as an example.

Binary file not shown.

After

Width:  |  Height:  |  Size: 609 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 B

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,173 @@
<?php
################# Creates graphics vor pgm3
################
include "../config.php";
include "functions.php";
setlocale (LC_ALL, 'de_DE.utf8');
$drawfht=$_GET['drawfht'];
$room=$_GET['room'];
$file="$logpath/$drawfht.log";
if (! file_exists($file)) show_error($file,$drawfht,$imgmaxxfht,$imgmaxyfht);
$_SESSION["arraydata"] = array();
$im = ImageCreateTrueColor($imgmaxxfht,$imgmaxyfht);
$black = ImageColorAllocate($im, 0, 0, 0);
$bg1p = ImageColorAllocate($im, 110,148,183);
$bg2p = ImageColorAllocate($im, 175,198,219);
$bg3p = ImageColorAllocate($im, $fontcol_grap_R,$fontcol_grap_G,$fontcol_grap_B);
$white = ImageColorAllocate($im, 255, 255, 255);
$gray= ImageColorAllocate($im, 133, 133, 133);
$red = ImageColorAllocate($im, 255, 0, 0);
$green = ImageColorAllocate($im, 0, 255, 0);
$yellow= ImageColorAllocate($im, 255, 255, 0);
$orange= ImageColorAllocate($im, 255, 230, 25);
ImageFill($im, 0, 0, $bg2p);
ImageRectangle($im, 0, 0, $imgmaxxfht-1, $imgmaxyfht-1, $white);
$array = file($file);
$oldmin=0; //only the data from every 10min
$oldhour=0; //only the data from every 10min
$actuator=0;
$actuator_date="unknown";
$counter=count($array);
#echo $counter; exit;
#Logrotate
if ((($logrotateFHTlines+200) < $counter) and ($logrotate == 'yes')) LogRotate($array,$file,$logrotateFHTlines);
for ($x = 0; $x < $counter; $x++)
{
$parts = explode(" ", $array[$x]);
$date=$parts[0];
$type=$parts[2];
$temp=$parts[3];
if ($type=="desired-temp:")
{$desired_temp=$temp;$desired_date=$date;}
if ($type=="actuator:")
{$actuator=rtrim($temp);$actuator_date=$date;}
if ((($array[$x][14] != $oldmin) or ($array[$x][12] != $oldhour)) and ($type=="measured-temp:"))
{
$oldmin=$array[$x][14];
$oldhour=$array[$x][12];
array_push( $_SESSION["arraydata"],array($date,$type,$temp));
}
}
$resultreverse = array_reverse($_SESSION["arraydata"]);
$xold=$imgmaxxfht;
if ( $imgmaxxfht > count ($resultreverse) )
{ $_SESSION["maxdata"] = count ($resultreverse); }
else
{ $_SESSION["maxdata"] = $imgmaxxfht+1; };
###################
### min/max
$mintemp=100;
$maxtemp=-100;
for ($x = 0; $x < $_SESSION["maxdata"]; $x++)
{
if ( $resultreverse[$x][2] > $maxtemp ) $maxtemp=$resultreverse[$x][2];
if ( ($resultreverse[$x][2] < $mintemp) and ($resultreverse[$x][2]>-100) ) $mintemp=$resultreverse[$x][2];
}
$tempdiff=$maxtemp-$mintemp;
if ($tempdiff==0) $tempdiff=1;
$fac=$imgmaxyfht/$tempdiff;
$yold=round($imgmaxyfht-(($resultreverse[0][1]-$mintemp)*$fac));
###################
for ($x = 0; $x < $_SESSION["maxdata"]; $x++)
{
$parts = explode("_", $resultreverse[$x][0]);
if ( ($parts[0] != $olddate) )
{
$olddate=$parts[0];
ImageLine($im, $imgmaxxfht-$x, 0,$imgmaxxfht-$x , $imgmaxyfht, $bg1p);
};
$y = round($imgmaxyfht-(($resultreverse[$x][2]-$mintemp)*$fac));
ImageLine($im, $imgmaxxfht-$x, $y, $xold, $yold, $red);
$xold=$imgmaxxfht-$x;
$yold=$y;
};
#print_r($resultreverse);
#exit;
ImageLine($im, $imgmaxxfht-$x, 0,$imgmaxxfht-$x , $imgmaxyfht, $yellow);
###ttf
$text="Temperature";
$fontsize=7;
$txtcolor=$bg3p;
ImageTTFText ($im, $fontsize, 0, 5, 12, $txtcolor, $fontttf, $text);
#setlocale (LC_ALL, 'de_DE.UTF-8');
$text=$resultreverse[0][2]." &#176;C";
ImageTTFText ($im, 9, 0, 90, 35, $txtcolor, $fontttfb, $text);
$text= $drawfht;
ImageTTFText ($im, 8, 0, 90, 18, $txtcolor, $fontttfb, $text);
$txtcolor=$bg3p;
$fontsize=7;
$text="min= $mintemp max= $maxtemp";
ImageTTFText ($im, $fontsize, 0, 67, 47, $txtcolor, $fontttf, $text);
$text=$txtroom.$room;
ImageTTFText ($im, $fontsize, 0, 5, $imgmaxyfht-7, $txtcolor, $fontttf, $text);
$text="desired-temp: $desired_temp";
ImageTTFText ($im, $fontsize, 0, $imgmaxxfht-230, 23, $txtcolor, $fontttf, $text);
$text=$desired_date;
ImageTTFText ($im, $fontsize, 0, $imgmaxxfht-127, 23, $txtcolor, $fontttf, $text);
$text="Actuator [%]: $actuator";
ImageTTFText ($im, $fontsize, 0, $imgmaxxfht-230, 33, $txtcolor, $fontttf, $text);
$text=$actuator_date;
ImageTTFText ($im, $fontsize, 0, $imgmaxxfht-127, 33, $txtcolor, $fontttf, $text);
$text=$resultreverse[0][0];
ImageTTFText ($im, $fontsize, 0, $imgmaxxfht-127, 13, $txtcolor, $fontttf, $text);
header("Content-type: image/png");
imagePng($im);
function show_error($file,$drawfht,$imgmaxxfht,$imgmaxyfht)
{
$im = ImageCreateTrueColor($imgmaxxfht,$imgmaxyfht);
$black = ImageColorAllocate($im, 0, 0, 0);
$bg2p = ImageColorAllocate($im, 175,198,219);
$white = ImageColorAllocate($im, 255, 255, 255);
$red = ImageColorAllocate($im, 255, 0, 0);
ImageFill($im, 0, 0, $bg2p);
ImageRectangle($im, 0, 0, $imgmaxxfht-1, $imgmaxyfht-1, $white);
imagestring($im, 3, 5, 5, "Error, there is no $file", $black);
imagestring($im, 1, 3, 25, "Please add the following to your fhz1000.cfg", $black);
$logname=$drawfht."log";
imagestring($im, 1, 3, 35, "define $logname FileLog $file $drawfht:.*(temp|actuator|desired).*", $black);
header("Content-type: image/png");
imagePng($im);
exit;
}
?>

View File

@ -0,0 +1,95 @@
<?php
##Pulldown for FS20-Devices
$orders=array("mon-from1","mon-to1","tue-from1","tue-to1","wed-from1","wed-to1","thu-from1",
"thu-to1","fri-from1","fri-to1","sat-from1","sat-to1","sun-from1","sun-to1",
"mon-from2","mon-to2","tue-from2","tue-to2","wed-from2","wed-to2","thu-from2",
"thu-to2","fri-from2","fri-to2","sat-from2","sat-to2","sun-from2","sun-to2",
"day-temp","night-temp","desired-temp","refeshvalues","windowopen-temp"
);
echo "
<tr>
<td colspan=3 align=right $bg2><font $fontcolor3>FHT: </font></td><td align=left $bg2><font $fontcolor3>
<form action=$forwardurl method='POST'>";
#<input type=hidden name=showfht value=$showfht>
#<input type=hidden name=showhms value=$showhms>
#<input type=hidden name=showmenu value=$showmenu>
echo"<input type=hidden name=Action value=exec3>
<select name=atorder size=1>
<option></option>;
<option>at</option></select>
<select name=attime size=1>
<option></option>;";
for ($m=0; $m < 24; $m++)
{
if ( $m < 10) $m = '0'.$m;
for ($k=0; $k < 60; $k=$k+2)
{
if ( $k < 10) $k = '0'.$k;
echo "<option>$m:$k:00</option>";
}
}
echo"</select>";
echo"
set
<select name=fhtdev size=1>
<option></option>";
for ($m=0; $m < count($fhtdevs); $m++)
{
echo $fhtdev;
if ($fhtdev==$fhtdevs[$m])
{
echo "<option selected>$fhtdevs[$m]</option>";
} else {
echo "<option>$fhtdevs[$m]</option>";
}
};
echo "
</select><select name=orderpulldown size=1>
<option></option>";
for ($m=0; $m < count($orders); $m++)
{
if ($orderpulldown==$orders[$m])
{
echo "<option selected>$orders[$m]</option>";
} else {
echo "<option>$orders[$m]</option>";
}
};
echo "</select>
<select name=valuetime size=1>
<option></option>";
for ($m=0; $m < 24; $m++)
{
if ( $m < 10) $m = '0'.$m;
for ($k=0; $k < 60; $k=$k+5)
{
if ( $k < 10) $k = '0'.$k;
echo "<option>$m:$k:00</option>";
}
}
echo "<option>*********</option>";
for ($m=10; $m < 30; $m++)
{
echo "<option>$m.0</option>";
echo "<option>$m.5</option>";
}
echo"</select>";
#$order="$atorder $attime set $fhtdev $orderpulldown $valuetime";
echo "<input type=submit value='go!'></form></td></tr>";
?>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,91 @@
<?php
################# Creates graphics for pgm3
################
include "../config.php";
$drawfs20=$_GET['drawfs20'];
$statefs20=$_GET['statefs20'];
$datefs20=$_GET['datefs20'];
$room=$_GET['room'];
$im = ImageCreateTrueColor($imgmaxxfs20,$imgmaxyfs20);
$black = ImageColorAllocate($im, 0, 0, 0);
$bg1p = ImageColorAllocate($im, 110,148,183);
$bg2p = ImageColorAllocate($im, 175,198,219);
$bg3p = ImageColorAllocate($im, $fontcol_grap_R,$fontcol_grap_G,$fontcol_grap_B);
$white = ImageColorAllocate($im, 255, 255, 255);
$gray= ImageColorAllocate($im, 133, 133, 133);
$red = ImageColorAllocate($im, 255, 0, 0);
$green = ImageColorAllocate($im, 0, 255, 0);
$yellow= ImageColorAllocate($im, 255, 255, 0);
$orange= ImageColorAllocate($im, 255, 230, 25);
ImageFill($im, 0, 0, $bg2p);
ImageRectangle($im, 0, 0, $imgmaxxfs20-1, $imgmaxyfs20-1, $white);
if ((rtrim($statefs20)=="on" ) or (rtrim($statefs20)=="dimup") or (rtrim($statefs20)=="thermo-on"))
{
$im2 = ImageCreateFromGIF("FS20.on.gif");
}
else
{
$im2 = ImageCreateFromGIF("FS20.off.gif");
};
$w = imagesx($im2);
$h = imagesy($im2);
$datefs20sep=explode(" ",$datefs20);
if ((substr($statefs20,0,12)=="on-for-timer" )
or
($statefs20=="toggle"))
{
$im2 = ImageCreateFromGIF("FS20.on.gif");
$im3 = ImageCreateFromGIF("FS20.off.gif");
Imagecopy($im,$im3,($imgmaxxfs20/2)-12,($imgmaxyfs20/2)-14,0,0,$w,$h);
Imagecopy($im,$im2,($imgmaxxfs20/2)-2,($imgmaxyfs20/2)-14,0,0,$w,$h);
}
else
{
Imagecopy($im,$im2,($imgmaxxfs20/2)-8,($imgmaxyfs20/2)-14,0,0,$w,$h);
};
###ttf
$txtcolor=$bg3p;
$text=$statefs20;
$fontsize=7;
$box = @imageTTFBbox($fontsize,0, $fontttfb,$text);
$textwidth = abs($box[4] - $box[0]);
$textheight = abs($box[5] - $box[1]);
$xcord = ($imgmaxxfs20/2)-($textwidth/2)-2;
$ycord = ($imgmaxyfs20/2)+20;
ImageTTFText ($im, $fontsize, 0, $xcord, $ycord, $txtcolor, $fontttfb, $text);
$text=$datefs20sep[0];
$box = @imageTTFBbox($fontsize,0, $fontttf,$text);
$textwidth = abs($box[4] - $box[0]);
$textheight = abs($box[5] - $box[1]);
$xcord = ($imgmaxxfs20/2)-($textwidth/2)-2;
$ycord = ($imgmaxyfs20/2)+30;
ImageTTFText ($im, $fontsize, 0, $xcord, $ycord, $txtcolor, $fontttf, $text);
$text=$datefs20sep[1];
$box = @imageTTFBbox($fontsize,0, $fontttf,$text);
$textwidth = abs($box[4] - $box[0]);
$textheight = abs($box[5] - $box[1]);
$xcord = ($imgmaxxfs20/2)-($textwidth/2)-2;
$ycord = ($imgmaxyfs20/2)+40;
ImageTTFText ($im, $fontsize, 0, $xcord, $ycord, $txtcolor, $fontttf, $text);
$txtcolor=$bg3p;
ImageTTFText ($im, $fs20fontsizetitel, 0, 5, 15, $txtcolor, $fontttfb, $drawfs20);
if ($room != '') {ImageTTFText ($im, 7, 0, 5, 26, $txtcolor, $fontttf, $txtroom.$room);};
header("Content-type: image/png");
imagePng($im);
?>

View File

@ -0,0 +1,80 @@
<?php
##Pulldown for FS20-Devices
$orders=array("on","off","dimup","dimdown","on-for-timer","off-for-timer","dim06%","dim12%",
"dim19%","dim25%","dim31%","dim37%","dim43%","dim50%","dim56%","dim62%","dim68%",
"dim75%","dim81%","dim93%","dim100%","dimupdown","on-old-for-timer","reset",
"sendstate","timer","toggle");
echo "
<tr>
<td colspan=3 align=right $bg2><font $fontcolor3>FS20: </font></td><td align=left $bg2><font $fontcolor3>
<form action=$forwardurl method='POST'>
<input type=hidden name=showfht value=$showfht>
<input type=hidden name=showhms value=$showhms>
<input type=hidden name=showmenu value=$showmenu>
<input type=hidden name=Action value=exec2>
<select name=atorder size=1>
<option></option>;
<option>at</option></select>
<select name=attime size=1>
<option></option>;";
for ($m=0; $m < 24; $m++)
{
if ( $m < 10) $m = '0'.$m;
for ($k=0; $k < 60; $k=$k+2)
{
if ( $k < 10) $k = '0'.$k;
echo "<option>$m:$k:00</option>";
}
}
echo"</select>";
echo"
set
<select name=fs20dev size=1>
<option></option>";
for ($m=0; $m < count($fs20devs); $m++)
{
echo $fs20dev;
if ($fs20dev==$fs20devs[$m])
{
echo "<option selected>$fs20devs[$m]</option>";
} else {
echo "<option>$fs20devs[$m]</option>";
}
};
echo "
</select><select name=orderpulldown size=1>
<option></option>";
for ($m=0; $m < count($orders); $m++)
{
if ($orderpulldown==$orders[$m])
{
echo "<option selected>$orders[$m]</option>";
} else {
echo "<option>$orders[$m]</option>";
}
};
echo "</select>
<select name=valuetime size=1>
<option></option>";
for ($m=0; $m < 6000; $m++)
{if ( $m > 20) $m = $m+4;
if ( $m > 60) $m = $m+55;
echo "<option>$m</option>";}
echo"</select>
<input type=submit value='go!'></form></td></tr>";
?>

View File

@ -0,0 +1,41 @@
<?php
##Functions for pgm3
function LogRotate($array,$file,$logrotatelines)
{
$counter=count($array);
$filename=$file;
if (!$handle = fopen($filename, "w")) {
print "Logrotate: cannot open $filename -- correct rights??";
exit;
}
for ($x = $counter-$logrotatelines; $x < $counter; $x++)
{fwrite($handle, $array[$x]);};
fclose($handle);
}
function bft($windspeed) # wind speed in Beaufort
{
if($windspeed>= 118.5) { $bft= 12; }
elseif($windspeed>= 103.7) { $bft= 11; }
elseif($windspeed>= 88.9) { $bft= 10; }
elseif($windspeed>= 75.9) { $bft= 9; }
elseif($windspeed>= 63.0) { $bft= 8; }
elseif($windspeed>= 51.9) { $bft= 7; }
elseif($windspeed>= 40.7) { $bft= 6; }
elseif($windspeed>= 29.6) { $bft= 5; }
elseif($windspeed>= 20.4) { $bft= 4; }
elseif($windspeed>= 13.0) { $bft= 3; }
elseif($windspeed>= 7.4) { $bft= 2; }
elseif($windspeed>= 1.9) { $bft= 1; }
else $bft= 0;
return($bft);
}
?>

View File

@ -0,0 +1,109 @@
<?php
################# Creates automatically gnuplot-graphics for pgm3
# Thanks to Rudi for his inspiration to automate gnuplot
# (look at his fhzweb.pl in pgm2)
################
function drawgnuplot($gnudraw,$gnutyp,$gnuplot,$pictype,$logpath)
{
$IN="$gnudraw ($gnutyp)";
$logfile=$logpath."/".$gnudraw.".log";
$gnudraw1=$gnudraw.'1';
$OUT1="set output 'tmp/$gnudraw.$pictype'";
$OUT2="set output 'tmp/$gnudraw1.$pictype'";
$gplothdr="
set terminal $pictype
set xdata time
set timefmt '%Y-%m-%d_%H:%M:%S'
set xlabel ' '
set ytics nomirror
set y2tics
set title '$IN'
set grid
";
$datumtomorrow= mktime (0,0,0,date("m") ,date("d")+1,date("Y"));
$xrange1= date ("Y-m-d",$datumtomorrow);
$datumyesterday= mktime (0,0,0,date("m") ,date("d")-1,date("Y"));
$xrange2= date ("Y-m-d",$datumyesterday);
$xrange="set xrange ['$xrange2':'$xrange1']
";
switch ($gnutyp):
Case KS300_t1: ############################################
$gplotmain="
set ylabel 'Temperature (Celsius)'
set y2label 'Humidity (%)'
plot '$logfile' using 1:4 axes x1y1 title 'Temperature' with lines lw 3,\
'$logfile' using 1:6 axes x1y2 title 'Rel. Humidity (%)' with lines
";
break;
Case KS300_t2: ############################################
$gplotmain=<<<EOD
set ylabel "Wind (Km/h)"
set y2label "Rain (l/m2)"
plot "< grep -v avg $logfile" using 1:8 axes x1y1 title 'Wind' with lines, \
"< grep -v avg $logfile" using 1:10 axes x1y2 title 'Rain' with lines
EOD;
break;
Case FHT: ############################################
$gplotmain="
set ylabel 'Temperature (Celsius)'
set yrange [16:31]
set grid ytics
set y2label 'Actuator (%)'
set y2range [0:70]
";
$gplotmaintmp = <<<EOD
plot "< awk '/measured/{print $1, $4}' $logfile"\
using 1:2 axes x1y1 title 'Measured temperature' with lines lw 3,\
"< awk '/actuator/{print $1, $4+0}' $logfile"\
using 1:2 axes x1y2 title 'Actuator (%)' with steps lw 1,\
"< awk '/desired/{print $1, $4}' $logfile"\
using 1:2 axes x1y1 title 'Desired temperature' with steps
EOD;
$gplotmain=$gplotmain.$gplotmaintmp;
break;
Case HMS100T: ############################################
$gplotmain="
set ylabel 'Temperature (Celsius)'
plot '$logfile' using 1:4 axes x1y1 title 'Temperature' with lines lw 3
";
break;
Case HMS100TF: ############################################
$gplotmain="
set ylabel 'Temperature (Celsius)'
set y2label 'Humidity (%)'
plot '$logfile' using 1:4 axes x1y1 title 'Temperature' with lines lw 2,\
'$logfile' using 1:6 axes x1y2 title 'Rel. Humidity (%)' with lines
";
break;
default:
endswitch;
$message=$OUT1.$gplothdr.$gplotmain;
$f1=fopen("tmp/gnu1","w");
fputs($f1,$message);
fclose($f1);
exec("$gnuplot tmp/gnu1",$output);
$message=$OUT2.$gplothdr.$xrange.$gplotmain;
$f2=fopen("tmp/gnu2","w");
fputs($f2,$message);
fclose($f2);
exec("$gnuplot tmp/gnu2",$output);
};
?>

View File

@ -0,0 +1,366 @@
<?php
################# Creates graphics vor pgm3
################
include "../config.php";
include "functions.php";
$drawhms=$_GET['drawhms'];
$room=$_GET['room'];
$type=$_GET['type'];
$supported_HMS= array('HMS100T','HMS100TF','HMS100WD','HMS100MG','HMS100TFK','HMS100W','RM100-2');
$file="$logpath/$drawhms.log";
if (! in_array($type,$supported_HMS)) show_error_type($imgmaxxhms,$imgmaxyhms,$type);
if (! file_exists($file)) show_error($file,$drawhms,$imgmaxxhms,$imgmaxyhms,$type);
$_SESSION["arraydata"] = array();
$im = ImageCreateTrueColor($imgmaxxhms,$imgmaxyhms);
$black = ImageColorAllocate($im, 0, 0, 0);
$bg1p = ImageColorAllocate($im, 110,148,183);
$bg2p = ImageColorAllocate($im, 175,198,219);
$bg3p = ImageColorAllocate($im, $fontcol_grap_R,$fontcol_grap_G,$fontcol_grap_B);
$white = ImageColorAllocate($im, 255, 255, 255);
$gray= ImageColorAllocate($im, 133, 133, 133);
$red = ImageColorAllocate($im, 255, 0, 0);
$green = ImageColorAllocate($im, 0, 255, 0);
$yellow= ImageColorAllocate($im, 255, 255, 0);
$orange= ImageColorAllocate($im, 255, 230, 25);
ImageFill($im, 0, 0, $bg2p);
ImageRectangle($im, 0, 0, $imgmaxxhms-1, $imgmaxyhms-1, $white);
$array = file($file);
$oldmin=0; //only the data from every 10min
$oldhour=0; //only the data from every 10min
$mintemp=100;
$maxtemp=-100;
$counter=count($array);
#Logrotate
if ((($logrotateHMSlines+100) < $counter) and ($logrotate == 'yes')) LogRotate($array,$file,$logrotateHMSlines);
#print_r($array[1]);
#print_r($array[1][12]); exit;
###########################################################################
if ( $type == "HMS100T" or $type == "HMS100TF" ) ## hms100t-Device.
{
for ($x = 0; $x < $counter; $x++)
{
list ($date,$hms,$t,$temp,$h,$hum) = preg_split("/[\s,]+/", $array[$x]);
if ((($array[$x][14] != $oldmin) or ($array[$x][12] != $oldhour) or ($x==$counter-1))
and ( $date !="NEWLOGS"))
{
$oldmin=$array[$x][14];
$oldhour=$array[$x][12];
array_push( $_SESSION["arraydata"],array($date,$temp,$hum));
}
}
$resultreverse = array_reverse($_SESSION["arraydata"]);
$xold=$imgmaxxhms;
if ( $imgmaxxhms > count ($resultreverse) )
{ $_SESSION["maxdata"] = count ($resultreverse); }
else
{ $_SESSION["maxdata"] = $imgmaxxhms; };
###################
### min/max
$mintemp=100;
$maxtemp=-100;
for ($x = 0; $x <= $_SESSION["maxdata"]; $x++)
{
if ( $resultreverse[$x][1] > $maxtemp ) $maxtemp=$resultreverse[$x][1];
if ( ($resultreverse[$x][1] < $mintemp) and ($resultreverse[$x][1]>-100) ) $mintemp=$resultreverse[$x][1];
}
$tempdiff=$maxtemp-$mintemp;
if ($tempdiff==0) $tempdiff=1;
$fac=$imgmaxyhms/$tempdiff;
$yold=round($imgmaxyhms-(($resultreverse[0][1]-$mintemp)*$fac));
###################
for ($x = 0; $x <= $_SESSION["maxdata"]; $x++)
{
$parts = explode("_", $resultreverse[$x][0]);
if ( ($parts[0] != $olddate) )
{
$olddate=$parts[0];
ImageLine($im, $imgmaxxhms-$x, 0,$imgmaxxhms-$x , $imgmaxyhms, $bg1p);
}
$y = round($imgmaxyhms-(($resultreverse[$x][1]-$mintemp)*$fac));
ImageLine($im, $imgmaxxhms-$x, $y, $xold, $yold, $red);
$xold=$imgmaxxhms-$x;
$yold=$y;
};
ImageLine($im, $imgmaxxhms-$x, 0,$imgmaxxhms-$x , $imgmaxyhms, $yellow);
$tempTEMP=$temp;
}; #HMS100T
if ( $type == "HMS100TF") ## hms100tf-Device.
{
#Humidity...
#$oldmin=0; //only the data from every 10min
$min=100;
$max=-100;
for ($x = 0; $x <= $_SESSION["maxdata"]; $x++)
{
$temp=$resultreverse[$x][2];
if ( $temp > $max ) $max=$temp;
if ( $temp < $min ) $min=$temp;
}
$temp=$resultreverse[0][2];
$tempdiff=$max-$min;
$fac=$imgmaxyhms/$tempdiff;
$xold=$imgmaxxhms;
$yold=round($imgmaxyhms-(($resultreverse[0][2]-$min)*$fac));
for ($x = 0; $x < count($resultreverse); $x++)
{
$y = round($imgmaxyhms-(($resultreverse[$x][2]-$min)*$fac));
ImageLine($im, $imgmaxxhms-$x, $y, $xold, $yold, $white);
$xold=$imgmaxxhms-$x;
$yold=$y;
};
$text="Humidity";
$fontsize=7;
$txtcolor=$white;
ImageTTFText ($im, $fontsize, 0, 5, 23, $txtcolor, $fontttf, $text);
$txtcolor=$white;
$fontsize=9;
$text=$temp." %";
$hvalue=$temp;
ImageTTFText ($im, $fontsize, 0, 210, 35, $txtcolor, $fontttfb, $text);
$txtcolor=$white;
$fontsize=7;
$text="min= $min max= $max";
ImageTTFText ($im, $fontsize, 0, 182, 47, $txtcolor, $fontttf, $text);
# Taupunkt
# $tp = Taupunkt($tvalue,$hvalue);
# $fontsize=9;
# $text=$tp." °C";
# ImageTTFText ($im, $fontsize, 0, 350, 35, $bg1p, $fontttfb, $text);
# $txtcolor=$orange;
# $fontsize=7;
# $text="Taupunkt";
# ImageTTFText ($im, $fontsize, 0, 350, 47, $bg1p, $fontttf, $text);
};
#############################################################################
if ( $type == "HMS100T" or $type == "HMS100TF" )
{
$text="Temperature";
$fontsize=7;
$txtcolor=$bg3p;
ImageTTFText ($im, $fontsize, 0, 5, 12, $txtcolor, $fontttf, $text);
$txtcolor=$bg3p;
$fontsize=9;
$text=$tempTEMP." &#176;C";
$tvalue=$tempTEMP;
ImageTTFText ($im, $fontsize, 0, 80, 35, $txtcolor, $fontttfb, $text);
$txtcolor=$bg3p;
$fontsize=7;
$text="min= $mintemp max= $maxtemp";
ImageTTFText ($im, $fontsize, 0, 62, 47, $txtcolor, $fontttf, $text);
$text=$resultreverse[0][0];
ImageTTFText ($im, $fontsize, 0, $imgmaxxhms-127, 13, $txtcolor, $fontttf, $text);
};
#############################################################################
## general
$txtcolor=$bg3p;
$fontsize=9;
$text= $drawhms;
ImageTTFText ($im, 8, 0, 80, 18, $txtcolor, $fontttfb, $text);
$fontsize=7;
$text=$txtroom.$room;
ImageTTFText ($im, $fontsize, 0, 5, $imgmaxyhms-7, $txtcolor, $fontttf, $text);
$text=$type;
ImageTTFText ($im, $fontsize, 0, 5, $imgmaxyhms-17, $txtcolor, $fontttf, $text);
#############################################################################
if ( $type == "HMS100WD" or $type == "HMS100MG" or $type == "HMS100W"
or $type == "HMS100TFK" or $type=="RM100-2")
{
for ($x = 0; $x < $counter; $x++)
{
if ( $type=="RM100-2" )
{list ($date,$hms,$detect,$onoff) = preg_split("/[\s,]+/", $array[$x]);}
else
{list ($date,$hms,$kind,$detect,$onoff) = preg_split("/[\s,]+/", $array[$x]);};
if ($x!=$counter-1 and $date !="NEWLOGS")
{
array_push( $_SESSION["arraydata"],array($date,$onoff));
}
}
$resultreverse = array_reverse($_SESSION["arraydata"]);
$xold=$imgmaxxhms;
if ( $imgmaxxhms > count ($resultreverse) )
{ $_SESSION["maxdata"] = count ($resultreverse); }
else
{ $_SESSION["maxdata"] = $imgmaxxhms; };
for ($x = 0; $x < $_SESSION["maxdata"]-1; $x++)
{
$parts = explode("_", $resultreverse[$x][0]);
if ( ($parts[0] != $olddate) )
{
$olddate=$parts[0];
ImageLine($im, $imgmaxxhms-$x, 0,$imgmaxxhms-$x , $imgmaxyhms, $bg1p);
}
$y = round($imgmaxyhms/2);
$isonoff=rtrim($resultreverse[$x][1]);
if ( $isonoff == "off" )
{ ImageLine($im, $imgmaxxhms-$x, $y, $imgmaxxhms-$x,$y, $white);}
else
{ ImageLine($im, $imgmaxxhms-$x, $y-1, $imgmaxxhms-$x,$y+1, $red);
};
$xold=$imgmaxxhms-$x;
$yold=$y;
};
ImageLine($im, $imgmaxxhms-$x, 0,$imgmaxxhms-$x , $imgmaxyhms, $yellow);
if ($type=='HMS100WD' or $type=='HMS100W'){$text="Water detected:";}
elseif ($type=='HMS100MG'){$text="Gas detected:";}
elseif ($type=='RM100-2'){$text="Smoke detected:";}
else {$text="Switch open:";}
$fontsize=7;
$txtcolor=$bg3p;
ImageTTFText ($im, $fontsize, 0, 180, 18, $txtcolor, $fontttf, $text);
if ($isonoff == "off" )
{ImageTTFText ($im, 9, 0, 265, 18, $white, $fontttf,'no');}
else
{ImageTTFText ($im, 9, 0, 265, 18, $red, $fontttfb,'YES');}
$txtcolor=$bg3p;
$fontsize=7;
$text=$resultreverse[0][0];
ImageTTFText ($im, $fontsize, 0, $imgmaxxhms-127, 13, $txtcolor, $fontttf, $text);
};
#ok. let's draw
header("Content-type: image/png");
imagePng($im);
###############################################################
## first start: shows the required logfiles
function show_error($file,$drawhms,$imgmaxx,$imgmaxy,$type)
{
$im = ImageCreateTrueColor($imgmaxx,$imgmaxy);
$black = ImageColorAllocate($im, 0, 0, 0);
$bg2p = ImageColorAllocate($im, 175,198,219);
$white = ImageColorAllocate($im, 255, 255, 255);
$red = ImageColorAllocate($im, 255, 0, 0);
ImageFill($im, 0, 0, $bg2p);
ImageRectangle($im, 0, 0, $imgmaxx-1, $imgmaxy-1, $white);
include "../config.php";
$bg3p = ImageColorAllocate($im, $fontcol_grap_R,$fontcol_grap_G,$fontcol_grap_B);
$text="There is a new supported $type-Device but no Logfile $file";
$fontsize=9;
$txtcolor=$bg3p;
ImageTTFText ($im, $fontsize, 0, 5, 17, $txtcolor, $fontttf, $text);
$text="Please add the following to your fhz1000.cfg and restart fhz1000.pl:";
$fontsize=7;
ImageTTFText ($im, $fontsize, 0, 5, 30, $txtcolor, $fontttf, $text);
$logname=$drawhms."log";
$fontsize=9;
if ($type=='HMS100WD')
{
$text="define $logname FileLog $file $drawhms:.*Water.*";
}
elseif ($type=='RM100-2')
{
$text="define $logname FileLog $file $drawhms:.*smoke*";
}
elseif ($type=='HMS100W')
{
$text="define $logname FileLog $file $drawhms:.*Water.*";
}
elseif ($type=='HMS100MG')
{
$text="define $logname FileLog $file $drawhms:.*Gas.*";
}
elseif ($type=='HMS100TFK')
{
$text="define $logname FileLog $file $drawhms:.*Switch.*";
}
else
{
$text="define $logname FileLog $file $drawhms:.*T:.*";
}
ImageTTFText ($im, $fontsize, 0, 5, 45, $txtcolor, $fontttf, $text);
header("Content-type: image/png");
imagePng($im);
exit;
}
###############################################################
## supported HMS??
function show_error_type($imgmaxx,$imgmaxy,$type)
{
$im = ImageCreateTrueColor($imgmaxx,$imgmaxy);
$black = ImageColorAllocate($im, 0, 0, 0);
$bg2p = ImageColorAllocate($im, 175,198,219);
$white = ImageColorAllocate($im, 255, 255, 255);
$red = ImageColorAllocate($im, 255, 0, 0);
ImageFill($im, 0, 0, $bg2p);
ImageRectangle($im, 0, 0, $imgmaxx-1, $imgmaxy-1, $white);
include "../config.php";
$bg3p = ImageColorAllocate($im, $fontcol_grap_R,$fontcol_grap_G,$fontcol_grap_B);
$text="HMS-Device $type is not supported";
$fontsize=7;
$txtcolor=$bg3p;
ImageTTFText ($im, $fontsize, 0, 5, 12, $txtcolor, $fontttf, $text);
ImageFill($im, 0, 0, $bg2p);
ImageRectangle($im, 0, 0, $imgmaxx-1, $imgmaxy-1, $white);
header("Content-type: image/png");
imagePng($im);
exit;
}
?>

Some files were not shown because too many files have changed in this diff Show More