Initial version
git-svn-id: https://svn.fhem.de/fhem/trunk@3 2b470e98-0d58-463d-a4d8-8e2adae1ed80
301
fhem/CHANGED
Normal 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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
|
6
fhem/contrib/four2hex/Makefile
Normal file
@ -0,0 +1,6 @@
|
||||
CC=gcc
|
||||
|
||||
four2hex : four2hex.c
|
||||
|
||||
install : four2hex
|
||||
install -m 0755 four2hex /usr/local/bin/four2hex
|
23
fhem/contrib/four2hex/README
Normal 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
94
fhem/contrib/four2hex/four2hex.c
Normal 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
@ -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
@ -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;
|
||||
}
|
46
fhem/contrib/init-scripts/fhem.1
Executable 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
|
25
fhem/contrib/init-scripts/fhem.2
Executable 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
@ -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
@ -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"
|
76
fhem/contrib/rrd/98_RRD.pm
Normal 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;
|
52
fhem/contrib/rrd/fhz1000-rrd-howto.txt
Normal 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
@ -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
@ -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
163
fhem/docs/faq.html
Normal 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
|
||||
<elv number></pre>
|
||||
where <elv number> 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
|
||||
<hex number></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 <hex-code></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
|
||||
<first two digits>
|
||||
<last two digits></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
@ -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 <configfile></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:
|
||||
<device-name>.<state>, <device-name>,
|
||||
<device-type>.<state>, <device-type><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 <your-site>/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 <your-site>/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>
|
44
fhem/docs/ftdi_sio.fhz1000.patch
Normal 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
After Width: | Height: | Size: 32 KiB |
BIN
fhem/docs/pgm1-2.gif
Normal file
After Width: | Height: | Size: 8.9 KiB |
BIN
fhem/docs/pgm2-1.gif
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
fhem/docs/pgm2-2.png
Normal file
After Width: | Height: | Size: 6.5 KiB |
BIN
fhem/docs/pgm3-0.5.1.png
Normal file
After Width: | Height: | Size: 93 KiB |
BIN
fhem/docs/pgm4.gif
Normal file
After Width: | Height: | Size: 28 KiB |
16
fhem/docs/raw-codes
Normal 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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
26
fhem/test/fhem.cfg
Normal 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
@ -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
@ -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
@ -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
@ -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
@ -0,0 +1 @@
|
||||
21698
|
423
fhem/test/fl-2006-13.log
Normal 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
@ -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
@ -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
116
fhem/test/wz-2006-14.log
Normal 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)
|
379
fhem/webfrontend/pgm1/htdocs/index.html
Executable 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
|
||||
+ "°reeToSet=" + 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\)/,"°");
|
||||
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>
|
37
fhem/webfrontend/pgm1/scripts/hfm_get.pl
Executable 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();
|
||||
|
72
fhem/webfrontend/pgm1/scripts/hfm_set.pl
Executable 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;
|
||||
|
48
fhem/webfrontend/pgm1/scripts/hfm_tc.pl
Executable 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();
|
||||
|
||||
|
||||
|
||||
|
77
fhem/webfrontend/pgm1/scripts/xsl/hfm_tc.xsl
Executable 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&name=<xsl:value-of select="@name"/>&cmd=on&thinclient=true</xsl:attribute>
|
||||
On
|
||||
</A> |
|
||||
<A>
|
||||
<xsl:attribute name="href">/cgi-bin/hfm_set.pl?action=setFS20&name=<xsl:value-of select="@name"/>&cmd=off&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>
|
BIN
fhem/webfrontend/pgm2/FS20.off.gif
Normal file
After Width: | Height: | Size: 609 B |
BIN
fhem/webfrontend/pgm2/FS20.on.gif
Normal file
After Width: | Height: | Size: 377 B |
20
fhem/webfrontend/pgm2/README
Normal 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.
|
||||
|
142
fhem/webfrontend/pgm3/config.php
Normal 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('.'));
|
||||
|
||||
?>
|
4
fhem/webfrontend/pgm3/docs/README
Normal file
@ -0,0 +1,4 @@
|
||||
All the Documentation of pgm3 is now only online
|
||||
http://www.martin-haas.de/fhz
|
||||
|
||||
Enjoy it :-)
|
124
fhem/webfrontend/pgm3/docs/copyright_fonts.txt
Normal 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.
|
||||
|
5
fhem/webfrontend/pgm3/docs/gnuplot/README
Normal 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
|
||||
|
||||
######################################################################
|
10
fhem/webfrontend/pgm3/docs/logrotate/README
Normal 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"
|
||||
|
||||
|
||||
|
11
fhem/webfrontend/pgm3/docs/logrotate/fhz1000.logrotate
Normal 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
|
||||
}
|
24
fhem/webfrontend/pgm3/docs/logrotate/logrotate.fht.sh
Executable 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;
|
30
fhem/webfrontend/pgm3/docs/logrotate/logrotate.hms100.ks300.sh
Executable 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;
|
150
fhem/webfrontend/pgm3/docs/misc/99_ALARM.pm
Executable 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;
|
80
fhem/webfrontend/pgm3/docs/misc/99_FHTswitch.pm
Normal 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;
|
4
fhem/webfrontend/pgm3/docs/misc/README
Normal 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.
|
BIN
fhem/webfrontend/pgm3/include/FS20.off.gif
Normal file
After Width: | Height: | Size: 609 B |
BIN
fhem/webfrontend/pgm3/include/FS20.on.gif
Normal file
After Width: | Height: | Size: 377 B |
BIN
fhem/webfrontend/pgm3/include/Vera.ttf
Normal file
BIN
fhem/webfrontend/pgm3/include/VeraBd.ttf
Normal file
173
fhem/webfrontend/pgm3/include/fht.php
Executable 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]." °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;
|
||||
}
|
||||
|
||||
?>
|
95
fhem/webfrontend/pgm3/include/fhtpulldown.php
Normal 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>";
|
||||
|
||||
?>
|
BIN
fhem/webfrontend/pgm3/include/fs20.ico
Normal file
After Width: | Height: | Size: 1.4 KiB |
91
fhem/webfrontend/pgm3/include/fs20.php
Executable 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);
|
||||
?>
|
80
fhem/webfrontend/pgm3/include/fs20pulldown.php
Normal 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>";
|
||||
|
||||
?>
|
41
fhem/webfrontend/pgm3/include/functions.php
Normal 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);
|
||||
}
|
||||
|
||||
|
||||
?>
|
109
fhem/webfrontend/pgm3/include/gnuplot.php
Normal 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);
|
||||
|
||||
|
||||
};
|
||||
|
||||
?>
|
366
fhem/webfrontend/pgm3/include/hms100.php
Executable 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." °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;
|
||||
}
|
||||
|
||||
?>
|