Compare commits

...

No commits in common. "4.2" and "travis" have entirely different histories.
4.2 ... travis

154 changed files with 637 additions and 21873 deletions

11
.github/dependabot.yml vendored Normal file
View File

@ -0,0 +1,11 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "github-actions" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "daily"

104
.github/workflows/cache.yml vendored Normal file
View File

@ -0,0 +1,104 @@
name: Update cache from SVN
on:
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
#schedule:
#- cron: '59 */3 * * *' # every third hour to keep cache up to date
jobs:
# This workflow contains a single job called "build"
mirror:
# The type of runner that the job will run on
runs-on: ubuntu-latest
continue-on-error: true
steps:
- name: install git-svn package
run: |
sudo apt-get remove git git-man
sudo apt-get update
sudo apt-get install git-svn --no-install-recommends
- name: checkout authors
uses: actions/checkout@v4.1.5
with:
ref: travis
path: ./authors
- name: Get current date
id: get-date
run: |
echo "::set-output name=timestamp::$(/bin/date -u "+%Y%m%d%H" )"
shell: bash
- name: Cache runners svn-2-git-fhem mirror directory
# Some room for improvement because we create a new cache on every run where a new ref is fetched, this isn't very nice, normaly we need only the last one and it takes 7 days until they are deleted
id: cache-fhem
uses: actions/cache@v4.0.2
with:
path: |
./src/fhem-mirror/.git
key: ${{ runner.os }}-fhemsvndir-${{ steps.get-date.outputs.timestamp }}
restore-keys: |
${{ runner.os }}-fhemsvndir-
#- name: remove gitconfig
# run: |
# rm ./src/fhem-mirror/.git/config
- name: checkout main branch
uses: actions/checkout@v4.1.5
with:
path: ./src/fhem-mirror
clean: false
- name: generate merged authors file
run: |
cd /tmp
svn log https://svn.fhem.de/fhem --xml --quiet | grep author | sort -u | perl -pe 's/.*>(.*?)<.*/$1 = $1 <>/' > ${GITHUB_WORKSPACE}/authors/authors_svn.txt;
cat ${GITHUB_WORKSPACE}/authors/authors.txt ${GITHUB_WORKSPACE}/authors/authors_svn.txt | sort -u -k1,1 > ${GITHUB_WORKSPACE}/authors/authors_merged.txt;
ls -la ${GITHUB_WORKSPACE}/authors/authors_merged.txt;
- name: fetch from svn
id: fetchsvn
timeout-minutes: 120
working-directory: ./src/fhem-mirror
run: |
echo "::group::git svn init"
git svn init --trunk=trunk --tags=tags --prefix=svn/ https://svn.fhem.de/fhem;
git config --replace-all svn.authorsfile "${GITHUB_WORKSPACE}/authors/authors_merged.txt"
git config --replace-all svn-remote.svn.preserve-empty-dirs "true" ;
git config --replace-all svn-remote.svn.placeholder-filename ".gitkeep" ;
echo "Current .git/config file content:";
cat ${GITHUB_WORKSPACE}/src/fhem-mirror/.git/config;
echo "::endgroup::"
echo "::set-output name=SVN_FETCH_STATUS::incomplete"
# Run fetches after init, go pick up some base refs for the cache on first run only!
RET=124
c=1
while [ $RET -eq 124 ]; do
echo "::group::Fetch ${c}/5"
timeout 1200 git svn --log-window-size=200 -q fetch && RET=$? || true
if [ "$RET" -ne 0 ] && [ "$RET" -ne 124 ]; then
echo "::set-output name=SVN_FETCH_STATUS::error"
fi
((c++)) && ((c==6)) && break
echo "::endgroup::"
done
if [ "$RET" -eq 0 ]; then
echo "::set-output name=SVN_FETCH_STATUS::complete"
fi
# - name: Copy Workflow Files to target
# if: ${{ steps.fetchsvn.outputs.SVN_FETCH_STATUS == 'complete' }}
# run: |
# cp -R ${GITHUB_WORKSPACE}/main/.github ./src/fhem-mirror
- name: Verify no fetch error state
if: ${{ steps.fetchsvn.outputs.SVN_FETCH_STATUS == 'error' }}
run: |
echo "A permanent error occured"
exit 1

143
.github/workflows/mirror.yml vendored Normal file
View File

@ -0,0 +1,143 @@
name: Mirror from SVN
on:
push:
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
schedule:
- cron: '10 */10 * * *' # every hour to keep cache up to date
jobs:
# This workflow contains a single job called "build"
mirror:
# The type of runner that the job will run on
runs-on: ubuntu-latest
continue-on-error: true
steps:
- name: install git-svn package
run: |
sudo apt-get remove git git-man
sudo apt-get update
sudo apt-get install git-svn --no-install-recommends
- name: checkout mirror config branch
uses: actions/checkout@v4.1.5
- name: Get current date as seconds
id: get-date
run: |
echo "timestamp=$(/bin/date -u "+%Y%m%d%H" )" >> $GITHUB_OUTPUT
shell: bash
- name: generate merged authors file
run: |
ls -RLa ${GITHUB_WORKSPACE}
cd /tmp
mkdir -p ${GITHUB_WORKSPACE}/authors
svn log https://svn.fhem.de/fhem --xml --quiet | grep author | sort -u | perl -pe 's/.*>(.*?)<.*/$1 = $1 <>/' > ${GITHUB_WORKSPACE}/authors_svn.txt;
cat ${GITHUB_WORKSPACE}/authors.txt ${GITHUB_WORKSPACE}/authors_svn.txt | sort -u -k1,1 > ${GITHUB_WORKSPACE}/authors/authors_merged.txt;
ls -la ${GITHUB_WORKSPACE}/authors/authors_merged.txt;
- name: create tmpfs for svn repo
run: |
mkdir -p ./src/fhem-mirror
sudo mount -t tmpfs -o size=3G tmpfs ./src/fhem-mirror
- name: Cache runners svn-2-git-fhem mirror directory
# Some room for improvement because we create a new cache on every run where a new ref is fetched, this isn't very nice, normaly weneed only the last one and it takes 7 days until they are deleted
id: cache-fhem
uses: actions/cache@v4.0.2
with:
path: ./src/fhem-mirror/.git
key: ${{ runner.os }}-fhemsvndir-${{ steps.get-date.outputs.timestamp }}
restore-keys: |
${{ runner.os }}-fhemsvndir-
- name: list filesystem
run: |
df -h ./src/fhem-mirror
- name: clean cache
env:
Clean_Cache: ${{ secrets.CLEANCACHE }}
if: "${{ env.Clean_Cache == 'true' }}"
run: |
rm -r ./src/fhem-mirror/.git
#- name: 'Tar files'
# run: tar -cvf ${GITHUB_WORKSPACE}/svnMirror.tar ./src/fhem-mirror/
#- uses: actions/upload-artifact@v2
# with:
# name: mirror-artifact
# path: ./svnMirror.tar
- name: init mirror repository if it is not already a mirror
timeout-minutes: 1800
run: |
if [[ ! -d "${GITHUB_WORKSPACE}/src/fhem-mirror/.git" ]]; then
git init "${GITHUB_WORKSPACE}/src/fhem-mirror" ;
cd "${GITHUB_WORKSPACE}/src/fhem-mirror";
git svn init --trunk=trunk --tags=tags --prefix=svn/ https://svn.fhem.de/fhem;
git config --replace-all svn-remote.svn.preserve-empty-dirs "true" ;
git config --replace-all svn-remote.svn.placeholder-filename ".gitkeep" ;
git config --replace-all svn.authorsfile "${GITHUB_WORKSPACE}/authors/authors_merged.txt" ;
# Run extra fetches after init, go pick up some base refs for the cache on first run only!
timeout 900 git svn -q fetch || timeout 900 git svn -q fetch || timeout 900 git svn -q fetch || true
else
echo "Current .git/config file content:";
cat ${GITHUB_WORKSPACE}/src/fhem-mirror/.git/config;
fi
- name: fetch svn to git master branch
id: fetchsvn
timeout-minutes: 1800
run: |
echo "SVN_FETCH_STATUS=incomplete" >> $GITHUB_OUTPUT
cd "${GITHUB_WORKSPACE}/src/fhem-mirror";
RET=0
timeout 1800 git svn -q --log-window-size=5000 fetch || timeout 1500 git svn -q --log-window-size=5000 fetch || RET=$?;
if [[ $RET == 0 ]]; then
git switch master
git config --global user.email "actions@gitbhub.com"
git config --global user.name "Github Actions"
git reset --hard "remotes/svn/trunk"
echo "SVN_FETCH_STATUS=complete" >> $GITHUB_OUTPUT
elif [[ $RET != 124 ]]; then
echo "SVN_FETCH_STATUS=error" >> $GITHUB_OUTPUT
fi
- name: Verify no fetch error state
if: ${{ steps.fetchsvn.outputs.SVN_FETCH_STATUS == 'error' }}
run: |
echo "A permanent error occured"
exit 1
- name: Recreate tags from svn
if: ${{ steps.fetchsvn.outputs.SVN_FETCH_STATUS == 'complete' }}
working-directory: ./src/fhem-mirror
run: |
git for-each-ref --format="%(refname:lstrip=-1) %(objectname)" refs/remotes/svn/tags/FHEM_*_? \
| while read BRANCH REF
do
TAG_NAME=${BRANCH#FHEM_}
TAG_NAME=$(echo $TAG_NAME | sed 's/_/./g')
BODY="$(git log -1 --format=format:%B $REF)"
echo "branch=$BRANCH ref=$REF parent=$(git rev-parse $REF^) tagname=$TAG_NAME body=$BODY" >&2
git tag -a -f -m "$BODY" $TAG_NAME $REF^
# git branch -r -d origin/tags/$BRANCH
done
- name: push tags and commits into master branch (force)
if: ${{ steps.fetchsvn.outputs.SVN_FETCH_STATUS == 'complete' }}
working-directory: ./src/fhem-mirror
run: |
git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }} || git remote add origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
git fetch --unshallow || true
git push origin master --force --tags

View File

@ -1,13 +0,0 @@
# The "checkoutlist" file is used to support additional version controlled
# administrative files in $CVSROOT/CVSROOT, such as template files.
#
# The first entry on a line is a filename which will be checked out from
# the corresponding RCS file in the $CVSROOT/CVSROOT directory.
# The remainder of the line is an error message to use if the file cannot
# be checked out.
#
# File format:
#
# [<whitespace>]<filename><whitespace><error message><end-of-line>
#
# comment lines begin with '#'

View File

@ -1,15 +0,0 @@
# The "commitinfo" file is used to control pre-commit checks.
# The filter on the right is invoked with the repository and a list
# of files to check. A non-zero exit of the filter program will
# cause the commit to be aborted.
#
# The first entry on a line is a regular expression which is tested
# against the directory that the change is being committed to, relative
# to the $CVSROOT. For the first match that is found, then the remainder
# of the line is the name of the filter to run.
#
# If the repository name does not match any of the regular expressions in this
# file, the "DEFAULT" line is used, if it is specified.
#
# If the name "ALL" appears as a regular expression it is always used
# in addition to the first matching regex or "DEFAULT".

View File

@ -1,21 +0,0 @@
# Set this to "no" if pserver shouldn't check system users/passwords
#SystemAuth=no
# Put CVS lock files in this directory rather than directly in the repository.
#LockDir=/var/lock/cvs
# Set `TopLevelAdmin' to `yes' to create a CVS directory at the top
# level of the new working directory when using the `cvs checkout'
# command.
#TopLevelAdmin=no
# Set `LogHistory' to `all' or `TOFEWGCMAR' to log all transactions to the
# history file, or a subset as needed (ie `TMAR' logs all write operations)
#LogHistory=TOFEWGCMAR
# Set `RereadLogAfterVerify' to `always' (the default) to allow the verifymsg
# script to change the log message. Set it to `stat' to force CVS to verify# that the file has changed before reading it (this can take up to an extra
# second per directory being committed, so it is not recommended for large
# repositories. Set it to `never' (the previous CVS behavior) to prevent
# verifymsg scripts from changing the log message.
#RereadLogAfterVerify=always

View File

@ -1,19 +0,0 @@
# This file affects handling of files based on their names.
#
# The -m option specifies whether CVS attempts to merge files.
#
# The -k option specifies keyword expansion (e.g. -kb for binary).
#
# Format of wrapper file ($CVSROOT/CVSROOT/cvswrappers or .cvswrappers)
#
# wildcard [option value][option value]...
#
# where option is one of
# -f from cvs filter value: path to filter
# -t to cvs filter value: path to filter
# -m update methodology value: MERGE or COPY
# -k expansion mode value: b, o, kkv, &c
#
# and value is a single-quote delimited value.
# For example:
#*.gif -k 'b'

View File

@ -1,21 +0,0 @@
# The "editinfo" file is used to allow verification of logging
# information. It works best when a template (as specified in the
# rcsinfo file) is provided for the logging procedure. Given a
# template with locations for, a bug-id number, a list of people who
# reviewed the code before it can be checked in, and an external
# process to catalog the differences that were code reviewed, the
# following test can be applied to the code:
#
# Making sure that the entered bug-id number is correct.
# Validating that the code that was reviewed is indeed the code being
# checked in (using the bug-id number or a seperate review
# number to identify this particular code set.).
#
# If any of the above test failed, then the commit would be aborted.
#
# Actions such as mailing a copy of the report to each reviewer are
# better handled by an entry in the loginfo file.
#
# One thing that should be noted is the the ALL keyword is not
# supported. There can be only one entry that matches a given
# repository.

View File

@ -1,26 +0,0 @@
# The "loginfo" file controls where "cvs commit" log information
# is sent. The first entry on a line is a regular expression which must match
# the directory that the change is being made to, relative to the
# $CVSROOT. If a match is found, then the remainder of the line is a filter
# program that should expect log information on its standard input.
#
# If the repository name does not match any of the regular expressions in this
# file, the "DEFAULT" line is used, if it is specified.
#
# If the name ALL appears as a regular expression it is always used
# in addition to the first matching regex or DEFAULT.
#
# You may specify a format string as part of the
# filter. The string is composed of a `%' followed
# by a single format character, or followed by a set of format
# characters surrounded by `{' and `}' as separators. The format
# characters are:
#
# s = file name
# V = old version number (pre-checkin)
# v = new version number (post-checkin)
#
# For example:
#DEFAULT (echo ""; id; echo %s; date; cat) >> $CVSROOT/CVSROOT/commitlog
# or
#DEFAULT (echo ""; id; echo %{sVv}; date; cat) >> $CVSROOT/CVSROOT/commitlog

View File

@ -1,26 +0,0 @@
# Three different line formats are valid:
# key -a aliases...
# key [options] directory
# key [options] directory files...
#
# Where "options" are composed of:
# -i prog Run "prog" on "cvs commit" from top-level of module.
# -o prog Run "prog" on "cvs checkout" of module.
# -e prog Run "prog" on "cvs export" of module.
# -t prog Run "prog" on "cvs rtag" of module.
# -u prog Run "prog" on "cvs update" of module.
# -d dir Place module in directory "dir" instead of module name.
# -l Top-level directory only -- do not recurse.
#
# NOTE: If you change any of the "Run" options above, you'll have to
# release and re-checkout any working directories of these modules.
#
# And "directory" is a path to a directory relative to $CVSROOT.
#
# The "-a" option specifies an alias. An alias is interpreted as if
# everything on the right of the "-a" had been typed on the command line.
#
# You can encode a module within a module by using the special '&'
# character to interpose another module into the current module. This
# can be useful for creating a module that consists of many directories
# spread out over the entire source repository.

View File

@ -1,12 +0,0 @@
# The "notify" file controls where notifications from watches set by
# "cvs watch add" or "cvs edit" are sent. The first entry on a line is
# a regular expression which is tested against the directory that the
# change is being made to, relative to the $CVSROOT. If it matches,
# then the remainder of the line is a filter program that should contain
# one occurrence of %s for the user to notify, and information on its
# standard input.
#
# "ALL" or "DEFAULT" can be used in place of the regular expression.
#
# For example:
#ALL mail -s "CVS notification" %s

View File

@ -1,13 +0,0 @@
# The "rcsinfo" file is used to control templates with which the editor
# is invoked on commit and import.
#
# The first entry on a line is a regular expression which is tested
# against the directory that the change is being made to, relative to the
# $CVSROOT. For the first match that is found, then the remainder of the
# line is the name of the file that contains the template.
#
# If the repository name does not match any of the regular expressions in this
# file, the "DEFAULT" line is used, if it is specified.
#
# If the name "ALL" appears as a regular expression it is always used
# in addition to the first matching regex or "DEFAULT".

View File

@ -1,20 +0,0 @@
# The "taginfo" file is used to control pre-tag checks.
# The filter on the right is invoked with the following arguments:
#
# $1 -- tagname
# $2 -- operation "add" for tag, "mov" for tag -F, and "del" for tag -d
# $3 -- repository
# $4-> file revision [file revision ...]
#
# A non-zero exit of the filter program will cause the tag to be aborted.
#
# The first entry on a line is a regular expression which is tested
# against the directory that the change is being committed to, relative
# to the $CVSROOT. For the first match that is found, then the remainder
# of the line is the name of the filter to run.
#
# If the repository name does not match any of the regular expressions in this
# file, the "DEFAULT" line is used, if it is specified.
#
# If the name "ALL" appears as a regular expression it is always used
# in addition to the first matching regex or "DEFAULT".

View File

@ -1,21 +0,0 @@
# The "verifymsg" file is used to allow verification of logging
# information. It works best when a template (as specified in the
# rcsinfo file) is provided for the logging procedure. Given a
# template with locations for, a bug-id number, a list of people who
# reviewed the code before it can be checked in, and an external
# process to catalog the differences that were code reviewed, the
# following test can be applied to the code:
#
# Making sure that the entered bug-id number is correct.
# Validating that the code that was reviewed is indeed the code being
# checked in (using the bug-id number or a seperate review
# number to identify this particular code set.).
#
# If any of the above test failed, then the commit would be aborted.
#
# Actions such as mailing a copy of the report to each reviewer are
# better handled by an entry in the loginfo file.
#
# One thing that should be noted is the the ALL keyword is not
# supported. There can be only one entry that matches a given
# repository.

339
LICENSE Normal file
View File

@ -0,0 +1,339 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is 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.
This program 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.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

23
README.md Normal file
View File

@ -0,0 +1,23 @@
# fhem-mirror
READ-ONLY mirror of the [main Subversion repository](http://svn.fhem.de/fhem/trunk), updated multiple times every day.
## Branches
1. The [`master`](https://github.com/fhem/fhem-mirror/tree/master) branch hosts the current source code from [FHEM SVN Trunk](http://svn.fhem.de/fhem/trunk).
2. The [`travis`](https://github.com/fhem/fhem-mirror/tree/travis) branch is controlling the mirroring process, running on [Github Actions](https://github.com/fhem/fhem-mirror/actions/workflows/mirror.yml).
3. Under [`tags`](https://github.com/fhem/fhem-mirror/tags) FHEM Releases are mirrored also.
## Pull requests
Pull requests to any other branch besides [`travis`](https://github.com/fhem/fhem-mirror/tree/travis) will be rejected.
Instead, a module may have its own repository here on [Github.com/fhem](https://www.github.com/fhem) and will accept your patch using a [pull request](https://help.github.com/en/articles/about-pull-requests).
If you can't find a repository for the module you would like to contribute, visit the official [FHEM support forum](https://forum.fhem.de/) to post your patch. However, it might not be very welcome as it easily mixes up with user support requests and makes version control extremely difficult to handle. For that particular reason, please consider contacting the maintainer using the forum direct message function and send a link to where s/he can find your changed version or patch file.
## Author matching
Authors from the Subversion repository will be referred here without any email relation.
Those that also have an Github.com account might have a different username here.
The [`authors.txt`](https://github.com/fhem/fhem-mirror/blob/travis/authors.txt) file will ensure to re-write authors from the Subversion repository to their Github.com username and email address.
Should an author want to be re-matched for any _future_ commits, s/he may modify [`authors.txt`](https://github.com/fhem/fhem-mirror/blob/travis/authors.txt) file and send a [Git pull request](https://help.github.com/articles/creating-a-pull-request-from-a-fork/).
For that purpose, remember to fork the correct branch [`travis`](https://github.com/fhem/fhem-mirror/tree/travis), _not_ the [`master`](https://github.com/fhem/fhem-mirror/tree/master) branch.

17
authors.txt Normal file
View File

@ -0,0 +1,17 @@
(no author) = unknown <>
root = unknown <>
fhemupdate = svc8083 <svc8083@users.noreply.github.com>
loredo = jpawlowski <jpawlowski@users.noreply.github.com>
justme1968 = justme-1968 <justme-1968@users.noreply.github.com>
CoolTux = LeonGaultier <LeonGaultier@users.noreply.github.com>
neubert = borisneubert <borisneubert@users.noreply.github.com>
Sidey = sidey79 <sidey79@users.noreply.github.com>
yoda_gh = gernot-h <gernot-h@users.noreply.github.com>
DeeSPe = deespe <DeeSPe@users.noreply.github.com>
igami = igami <igami@users.noreply.github.com>
KernSani = KernSani <KernSani@users.noreply.github.com>
hexenmeister = hexenmeister <hexenmeister@users.noreply.github.com>
eisler = eisler <eisler@users.noreply.github.com>
marvin78 = marvin78 <marvin78@users.noreply.github.com>
dominik = dominikkarall <dominikkarall@users.noreply.github.com>
DS_Starter = nasseeder1 <nasseeder1@users.noreply.github.com>

View File

@ -1,366 +0,0 @@
- 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)
- 2007-04-14 (4.0)
- bugfix: deny at +{3}... (only +*{3} allowed), reported by Bernd, 25.01
- bugfix: allow numbers greater then 9 in at +{<number>}
- feature: new 50_WS300.pm from Martin (bugfix + rain statistics, 26.01)
- feature: renamed fhz1000 to fhem
- feature: added HISTORY and README.DEV
- doc: Added description of attribute "model".
- bugfix: delete the pidfile when terminating. (reported by Martin and Peter)
- feature: attribute showtime in web-pgm2 (show time instead of state)
- feature: defattr (default attribute for following defines)
- feature: added em1010.pl to the contrib directory
- doc: added linux.html (multiple devices, udev-links)
- REORGANIZATION:
- at/notify "renamed" to "define <name> at/notify"
- logfile/modpath/pidfile/port/verbose "renamed" to "attr global xxx"
- savefile renamed to "attr global statefile"
- save command added, it writes the configfile and the statefile
- delattr added
- list/xmllist format changed
- disable attribute for at/notify/filelog
See HISTORY for details and reasoning
- added rename command
- webpgm2 adapted to the new syntax, added device specific attribute
and "set" support, gnuplot files are configurable, links to the
documentation added.
- bugfix: more thorough serial line initialization
- 2007-08-05 (4.1)
- doc: linux.html (private udev-rules, not 50-..., ATTRS)
- bugfix: setting devices with "-" in their name did not work
- doc: fhem.pl and commandref.html (notifyon -> notify, correction
of examples)
- feature: modify command added
- feature: The "-" in the name is not allowed any more
- bugfix: disabled notify causes "uninitialized value" (STefan, 1.5)
- bugfix: deleted FS20 items are still logging (zombie) (Gerhard, 16.5)
- bugfix: added FS20S8, removed stty_parmrk (Martin, 24.5)
- feature: added archivedir/archivecmd to the FileLog
- feature: added EM1010PC/EM1000WZ/EM1000EM support
- bugfix: undefined messages for unknown HMS devs (Peter, 8.6)
- bugfix: em1010 and %oldvalue bugs (Peter, 9.6)
- bugfix: SCIVT solar controller (peterp, 1.7)
- bugfix: WS300 loglevel change (from 2 to 5 or device specific loglevel)
- feature: First steps for a Fritz!Box port. See the fritzbox.html
- 2007-12-02 (4.2)
- feature: added archivedir/archivecmd to the the main logfile
- feature: 99_Sunrise_EL.pm (does not need any Date modules)
- bugfix: seldom xmllist error resulting in corrupt xml (Martin/Peter, 4.9)
- bugfix: FHT mode holiday_short added (9.9, Dirk)
- bugfix: Modifying a device from its own trigger crashes (Klaus, 10.9)
- feature: webpgm2 output reformatted
- feature: webpgm2 displaying multiple plots
- feature: FHT lime-protection code discovered by Dirk (7.10)
- feature: softwarebuffer for FHT devices (Dirk 17.10)
- feature: FHT low temperatur warning and offset (Dirk 17.10)
- change: change FHT state into warnings (Dirk 17.10)
NOTE: you'll get an undefined type state &
undefined type unknown_85 after upgrade.
- feature: Softwarebuffer code simplified (Rudi 22.11)
- bugfix: bug #12327 doppeltes my
- bugfix: set STATE from trigger
- bugfix: readings state vs STATE problem (xmllist/trigger)
- change: SUNRISE doc changed (99_SUNRISE.pm -> 99_SUNRISE_EL.pm)
- feature: support for the M232 ELV device (Boris, 25.11)
- feature: alternativ Quad-based numbers for the FS20 (Matthias, 24.11)
- feature: dummy type added (contrib/99_dummy.pm)
- TODO
emem -2.5kW / getDevData for emwz -1

View File

@ -1,581 +0,0 @@
##############################################
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 $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" => 1,
"activefor"=> 1,
"raw" => 2,
);
my %codes = (
"^8501..\$" => "fhtbuf",
);
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) = @_;
# 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->{ParseFn} = "FHZ_Parse";
$hash->{AttrList}= "do_not_notify:1,0 dummy:1,0 filtertimeout repeater:1,0 " .
"showtime:1,0 model:fhz1000,fhz1300 loglevel:0,1,2,3,4,5,6 ".
"fhtsoftbuffer:1,0";
}
#####################################
sub
FHZ_Set($@)
{
my ($hash, @a) = @_;
return "Need one to three parameter" if(@a < 2);
return "Unknown argument $a[1], choose one of " . join(" ", sort keys %sets)
if(!defined($sets{$a[1]}));
return "Need one to three parameter" if(@a > 4);
return "Wrong number of parameters for $a[1], need " . ($setnrparam{$a[1]}+2)
if(@a != ($setnrparam{$a[1]} + 2));
my ($fn, $arg) = split(" ", $sets{$a[1]});
my $v = join(" ", @a);
my $name = $hash->{NAME};
Log GetLogLevel($name,2), "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($modules{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);
return "Unknown argument $a[1], choose one of " . join(",", sort keys %gets)
if(!defined($gets{$a[1]}));
my ($fn, $arg) = split(" ", $gets{$a[1]});
my $v = join(" ", @a);
my $name = $hash->{NAME};
Log GetLogLevel($name,2), "FHZ get $name $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);
}
$hash->{READINGS}{$a[1]}{VAL} = $v;
$hash->{READINGS}{$a[1]}{TIME} = TimeNow();
return "$a[0] $a[1] => $v";
}
#####################################
sub
FHZ_SetState($$$$)
{
my ($hash, $tim, $vt, $val) = @_;
return "Undefined value $vt" if(!defined($gets{$vt}));
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, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
$hash->{STATE} = "Initialized";
delete $hash->{PortObj};
delete $hash->{FD};
my $name = $a[0];
my $dev = $a[2];
$attr{$name}{savefirst} = 1;
$attr{$name}{fhtsoftbuffer} = 0;
if($dev eq "none") {
Log 1, "FHZ device is none, commands will be echoed only";
$attr{$name}{dummy} = 1;
return undef;
}
Log 3, "FHZ opening FHZ device $dev";
my $po = new Device::SerialPort ($dev);
return "Can't open $dev: $!\n" if(!$po);
Log 3, "FHZ opened FHZ device $dev";
$po->reset_error();
$po->baudrate(9600);
$po->databits(8);
$po->parity('none');
$po->stopbits(1);
$po->handshake('none');
# This part is for some Linux kernel versions whih has strange default
# settings. Device::SerialPort is nice: if the flag is not defined for your
# OS then it will be ignored.
$po->stty_icanon(0);
#$po->stty_parmrk(0); # The debian standard install does not have it
$po->stty_icrnl(0);
$po->stty_echoe(0);
$po->stty_echok(0);
$po->stty_echoctl(0);
$hash->{PortObj} = $po;
$hash->{FD} = $po->FILENO;
$hash->{DeviceName} = $dev;
$hash->{PARTIAL} = "";
DoInit($name);
return undef;
}
#####################################
sub
FHZ_Undef($$)
{
my ($hash, $arg) = @_;
my $name = $hash->{NAME};
foreach my $d (sort keys %defs) {
if(defined($defs{$d}) &&
defined($defs{$d}{IODev}) &&
$defs{$d}{IODev} == $hash)
{
Log GetLogLevel($name,2), "deleting port for $d";
delete $defs{$d}{IODev};
}
}
$hash->{PortObj}->close() if($hash->{PortObj});
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 = "";
my $name = $hash->{NAME};
foreach my $c (keys %codes) {
if($msg =~ m/$c/) {
$type = $codes{$c};
last;
}
}
if(!$type) {
Log 4, "FHZ $name unknown: $omsg";
$def->{CHANGED}[0] = "$msg";
return $hash->{NAME};
}
if($type eq "fhtbuf") {
$msg = substr($msg, 4, 2);
}
Log 4, "FHZ $name $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); # 3 seconds timeout
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 4, "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, 1);
} 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, 1);
}
}
#####################################
sub
FHZ_Read($)
{
my ($hash) = @_;
my $buf = $hash->{PortObj}->input();
my $iohash = $modules{$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;
}
}
}
my $fhzdata = $hash->{PARTIAL};
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;
my $last_module;
foreach my $m (sort { $modules{$a}{ORDER} cmp $modules{$b}{ORDER} }
keys %modules) {
next if($iohash->{Clients} !~ m/:$m:/);
next if($dmsg !~ m/$modules{$m}{Match}/i);
no strict "refs";
@found = &{$modules{$m}{ParseFn}}($hash,$dmsg);
use strict "refs";
$last_module = $m;
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} = $last_module;
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);
}
}
$hash->{PARTIAL} = $fhzdata;
}
1;

View File

@ -1,393 +0,0 @@
##############################################
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 %follow;
my $fs20_simple ="off off-for-timer on on-for-timer on-till reset timer toggle";
my %models = (
fs20hgs => 'sender',
fs20hgs => 'sender',
fs20pira => 'sender',
fs20piri => 'sender',
fs20s20 => 'sender',
fs20s4 => 'sender',
fs20s4a => 'sender',
fs20s4m => 'sender',
fs20s4u => 'sender',
fs20s4ub => 'sender',
fs20sd => 'sender',
fs20sn => 'sender',
fs20sr => 'sender',
fs20ss => 'sender',
fs20str => 'sender',
fs20tfk => 'sender',
fs20tfk => 'sender',
fs20tk => 'sender',
fs20uts => 'sender',
fs20ze => 'sender',
fs20ms2 => 'sender',
fs20as1 => 'simple',
fs20as4 => 'simple',
fs20di => 'dimmer',
fs20du => 'dimmer',
fs20rst => 'simple',
fs20sa => 'simple',
fs20sig => 'simple',
fs20st => 'simple',
fs20sv => 'simple',
fs20sv => 'simple',
fs20usr => 'simple',
);
sub
FS20_Initialize($)
{
my ($hash) = @_;
foreach my $k (keys %codes) {
$fs20_c2b{$codes{$k}} = $k;
}
$fs20_c2b{"on-till"} = 99;
$hash->{Match} = "^81..(04|0c)..0101a001";
$hash->{SetFn} = "FS20_Set";
$hash->{StateFn} = "FS20_SetState";
$hash->{DefFn} = "FS20_Define";
$hash->{UndefFn} = "FS20_Undef";
$hash->{ParseFn} = "FS20_Parse";
$hash->{AttrList} = "follow-on-for-timer:1,0 do_not_notify:1,0 dummy:1,0 showtime:1,0 model;fs20hgs,fs20hgs,fs20pira,fs20piri,fs20s20,fs20s8,fs20s4,fs20s4a,fs20s4m,fs20s4u,fs20s4ub,fs20sd,fs20sn,fs20sr,fs20ss,fs20str,fs20tfk,fs20tfk,fs20tk,fs20uts,fs20ze,fs20as1,fs20as4,fs20di,fs20du,fs20ms2,fs20rst,fs20sa,fs20sig,fs20st,fs20sv,fs20sv,fs20usr loglevel:0,1,2,3,4,5,6";
}
#####################################
sub
FS20_SetState($$$$)
{
my ($hash, $tim, $vt, $val) = @_;
$val = $1 if($val =~ m/^(.*) \d+$/);
return "Undefined value $val" if(!defined($fs20_c2b{$val}));
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);
CommandDefine(undef, $hash->{NAME} . "_till at $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)) {
# Model specific set arguments
if(defined($attr{$a[0]}) && defined($attr{$a[0]}{"model"})) {
my $mt = $models{$attr{$a[0]}{"model"}};
return "Unknown argument $a[1], choose one of "
if($mt && $mt eq "sender");
return "Unknown argument $a[1], choose one of $fs20_simple"
if($mt && $mt eq "simple");
}
return "Unknown argument $a[1], choose one of " .
join(" ", 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],2), "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],2), $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";
CommandDefine(undef, $a[0] . "_timer at +$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} }) {
my $lh = $defptr{$code}{$n};
$lh->{CHANGED}[0] = $v;
$lh->{STATE} = $v;
$lh->{READINGS}{state}{TIME} = $tn;
$lh->{READINGS}{state}{VAL} = $v;
}
return $ret;
}
#############################
sub
FS20_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
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 ".
"or an 8 digit quad value"
if( ($a[2] !~ m/^[a-f0-9]{4}$/i) && ($a[2] !~ m/^[1-4]{8}$/i) );
return "Define $a[0]: wrong btn format: specify a 2 digit hex value " .
"or a 4 digit quad value"
if( ($a[3] !~ m/^[a-f0-9]{2}$/i) && ($a[3] !~ m/^[1-4]{4}$/i) );
my $housecode = $a[2];
$housecode = four2hex($housecode,4) if (length($housecode) == 8);
my $btncode = $a[3];
$btncode = four2hex($btncode,2) if (length($btncode) == 4);
$hash->{XMIT} = lc($housecode);
$hash->{BTN} = lc($btncode);
my $code = "$housecode $btncode";
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 for $name, see the doc" if( ($a[$i+1] !~ m/^f[a-f0-9]$/) && ($a[$i+1] !~ m/^44[1-4][1-4]$/));
} elsif($a[$i] eq "lm") {
return "Bad lm address for $name, see the doc" if( ($a[$i+1] !~ m/^[a-f0-9]f$/) && ($a[$i+1] !~ m/^[1-4][1-4]44$/));
} elsif($a[$i] eq "gm") {
return "Bad gm address for $name, must be ff" if( ($a[$i+1] ne "ff") && ($a[$i+1] ne "4444"));
} else {
return $u;
}
my $grpcode = $a[$i+1];
if (length($grpcode) == 4) {
$grpcode = four2hex($grpcode,2);
}
$code = "$housecode $grpcode";
$hash->{CODE}{$ncode++} = $code;
$defptr{$code}{$name} = $hash;
}
AssignIoPort($hash);
}
#############################
sub
FS20_Undef($$)
{
my ($hash, $name) = @_;
foreach my $c (keys %{ $hash->{CODE} } ) {
$c = $hash->{CODE}{$c};
delete($defptr{$c}{$name}) if($defptr{$c});
}
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 $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);
my $def = $defptr{"$dev $btn"};
if($def) {
my @list;
foreach my $n (keys %{ $def }) {
my $lh = $def->{$n};
$lh->{CHANGED}[0] = $v;
$lh->{STATE} = $v;
$lh->{READINGS}{state}{TIME} = TimeNow();
$lh->{READINGS}{state}{VAL} = $v;
Log GetLogLevel($n,2), "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");
my $dev_four = hex2four($dev);
my $btn_four = hex2four($btn);
Log 3, "FS20 Unknown device $dev ($dev_four), Button $btn ($btn_four) Code $cde ($v), " .
"please define it";
return "UNDEFINED FS20 $dev/$btn/$cde";
}
}
#############################
sub
hex2four($)
{
my $v = shift;
my $r = "";
foreach my $x (split("", $v)) {
$r .= sprintf("%d%d", (hex($x)/4)+1, (hex($x)%4)+1);
}
return $r;
}
#############################
sub
four2hex($$)
{
my ($v,$len) = @_;
my $r = 0;
foreach my $x (split("", $v)) {
$r = $r*4+($x-1);
}
return sprintf("%0*x", $len,$r);
}
1;

View File

@ -1,532 +0,0 @@
##############################################
package main;
use strict;
use warnings;
sub doSoftBuffer($);
sub softBufferTimer($);
sub sendCommand($$$$);
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" => "warnings",
"450069" => "manu-temp", # Manuelle Temperatur keine ahnung was das bewirkt
"600069" => "year",
"610069" => "month",
"620069" => "day",
"630069" => "hour",
"640069" => "minute",
"650069" => "init",
"820069" => "day-temp",
"840069" => "night-temp",
"850069" => "lowtemp-offset", # Alarm-Temp.-Differenz
"8a0069" => "windowopen-temp",
"00002a" => "lime-protection",
"0000aa" => "code_0000aa",
"0000ba" => "code_0000ba",
"430079" => "code_430079",
"440079" => "code_440079",
"4b0067" => "code_4b0067",
"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,
"warnings" => 1,
"init" => 1,
"lime-protection"=>1,
"code_0000aa" => 1,
"code_0000ba" => 1,
"code_430079" => 1,
"code_440079" => 1,
"code_4b0067" => 1,
"code_4b0077" => 1,
"code_7e0067" => 1,
);
my %nosetarg = (
"refreshvalues" => 1,
);
my %priority = (
"desired-temp"=> 1,
"mode" => 2,
"refreshvalues"=> 3,
"holiday1" => 4,
"holiday2" => 5,
"day-temp" => 6,
"night-temp" => 7,
);
my %c2m = (0 => "auto", 1 => "manual", 2 => "holiday", 3 => "holiday_short");
my %m2c; # Reverse c2m
my %c2b; # command->button hash (reverse of codes)
my %c2bset; # Setteable values
my %defptr;
my $minFhzHardwareBuffer = 10; # min fhtbuf free bytes before sending commands
my $retryafter = 240; # in seconds, only when softbuffer is active
my $cmdcount = 0;
#####################################
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}));
}
foreach my $k (keys %c2m) {
$m2c{$c2m{$k}} = $k;
}
$c2bset{refreshvalues} = "65ff66ff";
# 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->{StateFn} = "FHT_SetState";
$hash->{DefFn} = "FHT_Define";
$hash->{UndefFn} = "FHT_Undef";
$hash->{ParseFn} = "FHT_Parse";
$hash->{AttrList} = "do_not_notify:0,1 model;fht80b dummy:0,1 " .
"showtime:0,1 loglevel:0,1,2,3,4,5,6 retrycount";
}
sub
FHT_Set($@)
{
my ($hash, @a) = @_;
my $ret = undef;
return "\"set $a[0]\" needs two parameters" if(@a < 2);
my $name = $a[0];
my $cmd = $a[1];
return "Unknown argument $cmd, choose one of " .
join(" ", sort {$c2bset{$a} cmp $c2bset{$b} } keys %c2bset)
if(!defined($c2bset{$cmd}));
return "\"set $a[0]\" needs two parameters"
if(@a != 3 && !(@a == 2 && $nosetarg{$cmd}));
my $val = $a[2];
my $arg = "020183" . $hash->{CODE} . $c2bset{$cmd};
if ($cmd =~ m/-temp/) {
return "Invalid temperature, use NN.N" if($val !~ m/^\d*\.?\d+$/);
return "Invalid temperature, must between 5.5 and 30.5"
if($val < 5.5 || $val > 30.5);
my $a = int($val*2);
$arg .= sprintf("%02x", $a);
$ret = sprintf("Rounded temperature to %.1f", $a/2) if($a/2 != $val);
$val = sprintf("%.1f", $a/2);
} elsif($cmd =~ m/-from/ || $cmd =~ m/-to/) {
return "Invalid timeformat, use HH:MM" if($val !~ 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 $val);
$val = $nt;
} elsif($cmd eq "mode") {
return "Invalid mode, use one of " . join(" ", sort keys %m2c)
if(!defined($m2c{$val}));
$arg .= sprintf("%02x", $m2c{$val});
} elsif ($cmd eq "lowtemp-offset") {
return "Invalid lowtemperature-offset, must between 1 and 5"
if($val !~ m/^[1-5]$/);
$arg .= sprintf("%02x", $val);
$val = "$val.0";
} else { # Holiday1, Holiday2
$arg .= sprintf("%02x", $val) if(defined($val));
}
$val = "" if (!defined($val));
my $ioname = "";
$ioname = $hash->{IODev}->{NAME} if($hash->{IODev});
if($attr{$ioname} && $attr{$ioname}{fhtsoftbuffer}) {
my $io = $hash->{IODev};
my %h = (HASH => $hash, CMD => $cmd, VAL => $val, ARG => $arg);
my $prio = $priority{$cmd};
$prio = "9" if(!$prio);
my $key = $prio . ":" . gettimeofday() . ":" . $cmdcount++;
$io->{SOFTBUFFER}{$key} = \%h;
doSoftBuffer($io);
} else {
sendCommand($hash, $cmd, $val, $arg);
}
return $ret;
}
#####################################
sub
FHT_SetState($$$$)
{
my ($hash, $tim, $vt, $val) = @_;
return "Undefined type $vt" if(!defined($c2b{$vt}));
return undef;
}
#####################################
sub
FHT_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
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];
$hash->{CODE} = $a[2];
$defptr{$a[2]} = $hash;
$attr{$a[0]}{retrycount} = 3;
AssignIoPort($hash);
Log GetLogLevel($a[0],2),"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);
my $confirm = 0;
if(!defined($defptr{$dev})) {
Log 3, "FHT Unknown device $dev, please define it";
return "UNDEFINED FHT $dev";
}
my $def = $defptr{$dev};
my $name = $def->{NAME};
# Unknown, but don't want report it. Should come with c409c401
return "" if($cde eq "00");
if(length($cde) < 6) {
Log GetLogLevel($name,2), "FHT Unknown code from $name : $cde";
$def->{CHANGED}[0] = "unknown code $cde";
return $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 $name confirmation: $cde";
$val = substr($cde, 2, 2);
$cde = substr($cde, 0, 2) . "0069";
$confirm = 1;
}
my $type;
foreach my $c (keys %codes) {
if($cde =~ m/$c/) {
$type = $codes{$c};
last;
}
}
$val = hex($val);
if(!$type) {
Log 4, "FHT $name (Unknown: $cde => $val)";
$def->{CHANGED}[0] = "unknown $cde: $val";
return $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($type eq "lime-protection") {
$val = sprintf("(actuator: %02d%%)", int(100*$val/255 + 0.5));
} elsif($cde ge "140069" && $cde le "2f0069") { # Time specs
Log 5, "FHT $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") {
$def->{READINGS}{$type}{TIME} = $tn;
$def->{READINGS}{$type}{VAL} = $val;
return "";
} elsif($type eq "measured-high") {
$def->{READINGS}{$type}{TIME} = $tn;
$def->{READINGS}{$type}{VAL} = $val;
if(defined($def->{READINGS}{"measured-low"}{VAL})) {
$val = $val*256 + $def->{READINGS}{"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 "warnings") {
my $nVal;
if($val & 1) { $nVal = "Battery low"; }
if($val & 2) { $nVal .= "; " if($nVal); $nVal .= "Temperature too low"; }
if($val &32) { $nVal .= "; " if($nVal); $nVal .= "Window open"; }
if($val &16) { $nVal .= "; " if($nVal); $nVal .= "Fault on window sensor"; }
$val = $nVal? $nVal : "none";
} elsif($type eq "lowtemp-offset") {
$val = sprintf("%d.0 (Celsius)", $val)
}
$def->{READINGS}{$type}{TIME} = $tn;
$def->{READINGS}{$type}{VAL} = $val;
$def->{CHANGED}[0] = "$type: $val";
$def->{STATE} = "$type: $val" if($type eq "measured-temp");
Log 4, "FHT $name $type: $val";
################################
# Softbuffer: deleted confirmed commands
if($confirm) {
my $found;
my $io = $def->{IODev};
foreach my $key (sort keys %{$io->{SOFTBUFFER}}) {
my $h = $io->{SOFTBUFFER}{$key};
my $hcmd = $h->{CMD};
$hcmd = "init" if($hcmd eq "refreshvalues");
Log 5, "FHT check $h->{HASH}->{NAME} eq $name && $hcmd eq $type";
if($h->{HASH}->{NAME} eq $name && $hcmd eq $type) {
$found = $key;
last;
}
}
delete($io->{SOFTBUFFER}{$found}) if($found);
}
return $name;
}
# Check the softwarebuffer and send/resend commands
sub
doSoftBuffer($)
{
my ($io) = @_;
my $now = gettimeofday();
my $count = 0;
my $fhzbuflen = -999;
foreach my $key (keys %{ $io->{SOFTBUFFER} }) {
$count++;
my $h = $io->{SOFTBUFFER}{$key};
my $name = $h->{HASH}->{NAME};
if($h->{NSENT}) {
next if($now-$h->{SENDTIME} < $retryafter);
my $retry = $attr{$name}{retrycount};
if($h->{NSENT} > $retry) {
Log GetLogLevel($name,2), "$name set $h->{CMD} $h->{VAL}: ".
"no confirmation after $h->{NSENT} tries, giving up";
delete($io->{SOFTBUFFER}{$key});
next;
}
}
$fhzbuflen = getFhzBuffer($io) if($fhzbuflen == -999);
next if($fhzbuflen < $minFhzHardwareBuffer);
sendCommand($h->{HASH}, $h->{CMD}, $h->{VAL}, $h->{ARG});
$fhzbuflen -= ($h->{CMD} eq "refreshvalues" ? 7 : 5);
$h->{SENDTIME} = $now;
$h->{NSENT}++;
}
if($count && !$io->{SOFTBUFFERTIMER}) {
$io->{SOFTBUFFERTIMER} = 1;
InternalTimer(gettimeofday()+30, "softBufferTimer", $io, 0);
}
}
#####################################
# Wrapper for the InternalTimer
sub
softBufferTimer($)
{
my ($io) = @_;
delete($io->{SOFTBUFFERTIMER});
doSoftBuffer($io);
}
#####################################
# get the FHZ hardwarebuffer without logentry as decimal value
sub
getFhzBuffer($)
{
my ($io) = @_;
my $count = 0;
return $minFhzHardwareBuffer if(IsDummy($io->{NAME}));
for(;;) {
FHZ_Write($io, "04", "c90185");
my $msg = FHZ_ReadAnswer($io, "fhtbuf");
Log 5, "getFhzBuffer: $count $msg";
return hex(substr($msg, 16, 2)) if($msg && $msg =~ m/^[0-9A-F]+$/i);
return 0 if($count++ > 5);
}
}
#####################################
# Send FHZ command
sub
sendCommand($$$$)
{
my ($hash, $cmd, $val, $arg) = @_;
my $name = $hash->{NAME};
if($cmd eq "refreshvalues") {
# This is special. Without the sleep the next FHT won't send its data
if(!IsDummy($name)) {
my $havefhz = ($hash->{IODev} && defined($hash->{IODev}->{FD}));
IOWrite($hash, "04", $arg);
sleep(1) if($havefhz);
}
} else {
IOWrite($hash, "04", $arg) if(!IsDummy($name));
}
Log GetLogLevel($name,2), "FHT set $name $cmd $val";
}
1;

View File

@ -1,206 +0,0 @@
##############################################
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 %defptr;
#####################################
sub
HMS_Initialize($)
{
my ($hash) = @_;
# 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->{DefFn} = "HMS_Define";
$hash->{UndefFn} = "HMS_Undef";
$hash->{ParseFn} = "HMS_Parse";
$hash->{AttrList} = "do_not_notify:0,1 showtime:0,1 model;hms100-t,hms100-tf,hms100-wd,hms100-mg,hms100-tfk,rm100-2 loglevel:0,1,2,3,4,5,6";
}
#####################################
sub
HMS_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
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 GetLogLevel($def->{NAME},4), "HMS Device $dev ($type: $val)";
my $max = int(@txt);
for( my $i = 0; $i < $max; $i++) {
$def->{READINGS}{$txt[$i]}{TIME} = $now;
my $v = "$v[$i] $sfx[$i]";
$def->{READINGS}{$txt[$i]}{VAL} = $v;
$def->{CHANGED}[$i] = "$txt[$i]: $v";
}
$def->{READINGS}{type}{TIME} = $now;
$def->{READINGS}{type}{VAL} = $type;
$def->{STATE} = $val;
$def->{CHANGED}[$max] = $val;
return $def->{NAME};
}
1;

View File

@ -1,253 +0,0 @@
##############################################
package main;
use strict;
use warnings;
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->{Match} = "^810.04..402.a001";
$hash->{DefFn} = "KS300_Define";
$hash->{UndefFn} = "KS300_Undef";
$hash->{ParseFn} = "KS300_Parse";
$hash->{AttrList} = "do_not_notify:0,1 showtime:0,1 model:ks300 loglevel:0,1";
}
#####################################
sub
KS300_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
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
$def->{READINGS}{$txt[0]}{VAL} = 0 if(!$def->{READINGS});
my $r = $def->{READINGS};
$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 GetLogLevel($def->{NAME},4), "KS300 $dev: $msg";
my $max = int(@v);
for(my $i = 0; $i < $max; $i++) {
$r->{$txt[$i]}{TIME} = $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}{TIME});
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}{TIME} = $r->{avg_month}{TIME} = $tm;
}
}
$r->{cum_day}{TIME} = $r->{avg_day}{TIME} = $tm;
# AVG computing
###################################
return $def->{NAME};
} else {
Log 4, "KS300 detected: $msg";
}
return "";
}
1;

View File

@ -1,660 +0,0 @@
################################################################
#
# 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 %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) = @_;
# 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->{DefFn} = "WS300_Define";
$hash->{UndefFn} = "WS300_Undef";
$hash->{ParseFn} = "WS300_Parse";
$hash->{ReadFn} = "WS300_Read";
$hash->{AttrList} = "do_not_notify:0,1 showtime:0,1 model:ws300 loglevel:0,1,2,3,4,5,6";
}
###################################
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_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
if($a[0] eq "WS300Device")
{
$defptr{10} = $hash;
return "wrong syntax: define WS300Device WS300 <DeviceName>" if(int(@a) < 3);
$DeviceName = $a[2];
$hash->{STATE} = "Initializing";
$hash->{SENSOR} = 10;
$hash->{READINGS}{WS300Device}{VAL} = "Initializing";
$hash->{READINGS}{WS300Device}{TIME} = TimeNow;
my $po = new Device::SerialPort ($a[2]);
if(!$po)
{
$hash->{STATE} = "error opening device";
$hash->{READINGS}{WS300Device}{VAL} = "error opening device";
$hash->{READINGS}{WS300Device}{TIME} = 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";
$hash->{READINGS}{WS300Device}{VAL} = "opened";
$hash->{READINGS}{WS300Device}{TIME} = TimeNow;
CommandDefine(undef,"WS300Device_timer at +*00:00:05 get WS300Device data");
Log 1,"WS300 Device $a[2] opened";
$attr{$a[0]}{savefirst} = 1;
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 "");
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 ($hash, $msg) = @_;
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
{
$def = $defptr{$s};
$def->{READINGS}{$txt[0]}{VAL} = 0 if(!$def->{READINGS});
$ref = $def->{READINGS};
$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]}{TIME} = $tm;
$value = "$t $sfx[0]";
$ref->{$txt[0]}{VAL} = $value;
$def->{CHANGED}[1] = "$txt[0]: $value";
$def->{CHANGETIME}[1] = $tm;
# humidity
$ref->{$txt[1]}{TIME} = $tm;
$value = "$h $sfx[1]";
$ref->{$txt[1]}{VAL} = $value;
$def->{CHANGED}[2] = "$txt[1]: $value";
$def->{CHANGETIME}[2] = $tm;
# battery
$ref->{$txt[5]}{TIME} = $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]}{TIME} = $tm;
$value = "$l $sfx[6]";
$ref->{$txt[6]}{VAL} = $value;
$def->{CHANGED}[4] = "$txt[6]: $value";
$def->{CHANGETIME}[4] = $tm;
Log $ll,"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]}{TIME} = $tm;
$value = "$t $sfx[0]";
$ref->{$txt[0]}{VAL} = $value;
$def->{CHANGED}[1] = "$txt[0]: $value";
$def->{CHANGETIME}[1] = $tm;
# humidity
$ref->{$txt[1]}{TIME} = $tm;
$value = "$h $sfx[1]";
$ref->{$txt[1]}{VAL} = $value;
$def->{CHANGED}[2] = "$txt[1]: $value";
$def->{CHANGETIME}[2] = $tm;
# wind
$ref->{$txt[2]}{TIME} = $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]}{TIME} = $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]}{TIME} = $tm;
$value = "$ir $sfx[4]";
$ref->{$txt[4]}{VAL} = $value;
$def->{CHANGED}[5] = "$txt[4]: $value";
$def->{CHANGETIME}[5] = $tm;
# battery
$ref->{$txt[5]}{TIME} = $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]}{TIME} = $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]}{TIME} = $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}{TIME} = $tm;
$ref->{acthour}{VAL} = "$acthour";
$ref->{$txt[9]}{TIME} = $tm;
$ref->{$txt[9]}{VAL} = $rain_hour;
$def->{CHANGED}[9] = "$txt[9]: $rain_hour $sfx[9]";
$def->{CHANGETIME}[9] = $tm;
$ref->{$txt[10]}{TIME} = $tm;
$ref->{$txt[10]}{VAL} = $rain_day;
$def->{CHANGED}[10] = "$txt[10]: $rain_day $sfx[10]";
$def->{CHANGETIME}[10] = $tm;
$ref->{$txt[11]}{TIME} = $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}{TIME} = $tm;
$ref->{actday}{VAL} = "$actday";
$rain_day=0;
}
if($actmonth != $lt[4]+1)
{
$actmonth = $lt[4]+1;
$ref->{actmonth}{TIME} = $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}{TIME} = $tm;
$ref->{acthour}{VAL} = "$acthour";
$ref->{$txt[9]}{TIME} = $tm;
$ref->{$txt[9]}{VAL} = $rain_hour;
$def->{CHANGED}[9] = "$txt[9]: $rain_hour $sfx[9]";
$def->{CHANGETIME}[9] = $tm;
$ref->{$txt[10]}{TIME} = $tm;
$ref->{$txt[10]}{VAL} = $rain_day;
$def->{CHANGED}[10] = "$txt[10]: $rain_day $sfx[10]";
$def->{CHANGETIME}[10] = $tm;
$ref->{$txt[11]}{TIME} = $tm;
$ref->{$txt[11]}{VAL} = $rain_month;
$def->{CHANGED}[11] = "$txt[11]: $rain_month $sfx[11]";
$def->{CHANGETIME}[11] = $tm;
}
Log $ll,"WS300 $def->{NAME}: $val";
DoTrigger($def->{NAME},undef);
}
}
}
}
if(!defined($defptr{9}))
{
Log(3,"WS300 9: undefined");
}
else
{
$def = $defptr{9};
$def->{READINGS}{$txt[0]}{VAL} = 0 if(!$def->{READINGS});
$ref = $def->{READINGS};
$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]}{TIME} = $tm;
$value = "$t $sfx[0]";
$ref->{$txt[0]}{VAL} = $value;
$def->{CHANGED}[1] = "$txt[0]: $value";
$def->{CHANGETIME}[1] = $tm;
# humidity
$ref->{$txt[1]}{TIME} = $tm;
$value = "$h $sfx[1]";
$ref->{$txt[1]}{VAL} = $value;
$def->{CHANGED}[2] = "$txt[1]: $value";
$def->{CHANGETIME}[2] = $tm;
# pressure
$ref->{$txt[7]}{TIME} = $tm;
$value = "$press $sfx[7]";
$ref->{$txt[7]}{VAL} = $value;
$def->{CHANGED}[3] = "$txt[7]: $value";
$def->{CHANGETIME}[3] = $tm;
# willi
$ref->{willi}{TIME} = $tm;
$value = "$willi";
$ref->{willi}{VAL} = $value;
$def->{CHANGED}[4] = "willi: $value";
$def->{CHANGETIME}[4] = $tm;
Log $ll,"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";
$hash->{READINGS}{WS300Device}{VAL} = "disconnected";
$hash->{READINGS}{WS300Device}{TIME} = 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";
$hash->{READINGS}{WS300Device}{VAL} = "opened";
$hash->{READINGS}{WS300Device}{TIME} = 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";
$hash->{READINGS}{WS300Device}{VAL} = "timeout";
$hash->{READINGS}{WS300Device}{TIME} = 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";
$hash->{READINGS}{WS300Device}{VAL} = "connected";
$hash->{READINGS}{WS300Device}{TIME} = 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($hash, $inbuf);
goto NEXTPOLL;
}
else
{
$cmd=0x33;
goto NEXTPOLL;
}
}
if($ic == 0x33)
{
WS300_Parse($hash, $inbuf) if($rcount == 39);
$cmd=0x32;
}
$polling=0;
}
1;

View File

@ -1,372 +0,0 @@
##############################################
package main;
use strict;
use warnings;
use Device::SerialPort;
sub EM_Write($$);
sub EmCrc($$);
sub EmCrcCheck($$);
sub EmEsc($);
sub EmGetData($$);
sub EmMakeMsg($);
#####################################
sub
EM_Initialize($)
{
my ($hash) = @_;
# Provider
$hash->{WriteFn} = "EM_Write";
$hash->{Clients} = ":EMWZ:EMEM:";
# Consumer
$hash->{DefFn} = "EM_Define";
$hash->{UndefFn} = "EM_Undef";
$hash->{GetFn} = "EM_Get";
$hash->{SetFn} = "EM_Set";
$hash->{AttrList}= "model:em1010pc dummy:1,0 loglevel:0,1,2,3,4,5,6";
}
#####################################
sub
EM_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
$hash->{STATE} = "Initialized";
delete $hash->{PortObj};
delete $hash->{FD};
my $name = $a[0];
my $dev = $a[2];
$attr{$name}{savefirst} = 1;
if($dev eq "none") {
Log 1, "EM device is none, commands will be echoed only";
$attr{$name}{dummy} = 1;
return undef;
}
Log 3, "EM opening device $dev";
my $po = new Device::SerialPort ($dev);
return "Can't open $dev: $!" if(!$po);
Log 3, "EM opened device $dev";
$po->close();
$hash->{DeviceName} = $dev;
return undef;
}
#####################################
sub
EM_Undef($$)
{
my ($hash, $arg) = @_;
my $name = $hash->{NAME};
foreach my $d (sort keys %defs) {
if(defined($defs{$d}) &&
defined($defs{$d}{IODev}) &&
$defs{$d}{IODev} == $hash)
{
Log GetLogLevel($name,2), "deleting port for $d";
delete $defs{$d}{IODev};
}
}
return undef;
}
#####################################
sub
EM_Set($@)
{
my ($hash, @a) = @_;
my $u1 = "Usage: set <name> reset\n" .
" set <name> time [YYYY-MM-DD HH:MM:SS]";
return $u1 if(int(@a) < 2);
my $msg;
if($a[1] eq "time") {
if (int(@a) == 2) {
my @lt = localtime;
$a[2] = sprintf ("%04d-%02d-%02d", $lt[5]+1900, $lt[4]+1, $lt[3]);
$a[3] = sprintf ("%02d:%02d:%02d", $lt[2], $lt[1], $lt[0]);
} elsif (int(@a) != 4) {
return $u1;
}
my @d = split("-", $a[2]);
my @t = split(":", $a[3]);
$msg = sprintf("73%02x%02x%02x00%02x%02x%02x",
$d[2],$d[1],$d[0]-2000+0xd0, $t[0],$t[1],$t[2]);
} elsif($a[1] eq "reset") {
$msg = "4545";
} else {
return "Unknown argument $a[1], choose one of reset,time"
}
my $d = EmGetData($hash->{DeviceName}, $msg);
return "Read error" if(!defined($d));
return b($d,0);
}
#########################
sub
b($$)
{
my ($t,$p) = @_;
return -1 if(!defined($t) || length($t) < $p);
return ord(substr($t,$p,1));
}
sub
w($$)
{
my ($t,$p) = @_;
return b($t,$p+1)*256 + b($t,$p);
}
sub
dw($$)
{
my ($t,$p) = @_;
return w($t,$p+2)*65536 + w($t,$p);
}
#####################################
sub
EM_Get($@)
{
my ($hash, @a) = @_;
return "\"get EM\" needs only one parameter" if(@a != 2);
my $v;
if($a[1] eq "time") {
my $d = EmGetData($hash->{DeviceName}, "74");
return "Read error" if(!defined($d));
$v = sprintf "%4d-%02d-%02d %02d:%02d:%02d",
b($d,5)+2006, b($d,4), b($d,3),
b($d,0), b($d,1), b($d,2);
} elsif($a[1] eq "version") {
my $d = EmGetData($hash->{DeviceName},"76");
return "Read error" if(!defined($d));
$v = sprintf "%d.%d", b($d,0), b($d,1);
} else {
return "Unknown argument $a[1], choose one of time,version";
}
$hash->{READINGS}{$a[1]}{VAL} = $v;
$hash->{READINGS}{$a[1]}{TIME} = TimeNow();
return "$a[0] $a[1] => $v";
}
#####################################
sub
EM_Write($$)
{
my ($hash,$msg) = @_;
return EmGetData($hash->{DeviceName}, $msg);
}
#####################################
sub
EmCrc($$)
{
my ($in, $val) = @_;
my ($crc, $bits) = (0, 8);
my $k = (($in >> 8) ^ $val) << 8;
while($bits--) {
if(($crc ^ $k) & 0x8000) {
$crc = ($crc << 1) ^ 0x8005;
} else {
$crc <<= 1;
}
$k <<= 1;
}
return (($in << 8) ^ $crc) & 0xffff;
}
#########################
sub
EmEsc($)
{
my ($b) = @_;
my $out = "";
$out .= chr(0x10) if($b==0x02 || $b==0x03 || $b==0x10);
$out .= chr($b);
}
#####################################
sub
EmCrcCheck($$)
{
my ($otxt, $len) = @_;
my $crc = 0x8c27;
for(my $l = 2; $l < $len+4; $l++) {
my $b = ord(substr($otxt,$l,1));
$crc = EmCrc($crc, 0x10) if($b==0x02 || $b==0x03 || $b==0x10);
$crc = EmCrc($crc, $b);
}
return ($crc == w($otxt, $len+4));
}
#########################
sub
EmMakeMsg($)
{
my ($data) = @_;
my $len = length($data);
$data = chr($len&0xff) . chr(int($len/256)) . $data;
my $out = pack('H*', "0200");
my $crc = 0x8c27;
for(my $l = 0; $l < $len+2; $l++) {
my $b = ord(substr($data,$l,1));
$crc = EmCrc($crc, 0x10) if($b==0x02 || $b==0x03 || $b==0x10);
$crc = EmCrc($crc, $b);
$out .= EmEsc($b);
}
$out .= EmEsc($crc&0xff);
$out .= EmEsc($crc/256);
$out .= chr(0x03);
return $out;
}
#####################################
# This is the only
sub
EmGetData($$)
{
my ($dev, $d) = @_;
$d = EmMakeMsg(pack('H*', $d));
return undef if(!$dev);
my $serport = new Device::SerialPort ($dev);
if(!$serport) {
Log 1, "EM: Can't open $dev: $!";
return undef;
}
$serport->reset_error();
$serport->baudrate(38400);
$serport->databits(8);
$serport->parity('none');
$serport->stopbits(1);
$serport->handshake('none');
Log 4, "EM: Sending " . unpack('H*', $d) . "\n";
my $rm = "EM timeout reading the answer";
for(my $rep = 0; $rep < 3; $rep++) {
$serport->write($d);
my $retval = "";
my $esc = 0;
my $started = 0;
my $complete = 0;
for(;;) {
my ($rout, $rin) = ('', '');
vec($rin, $serport->FILENO, 1) = 1;
my $nfound = select($rout=$rin, undef, undef, 1.0);
if($nfound < 0) {
$rm = "EM Select error $nfound / $!";
goto DONE;
}
last if($nfound == 0);
my $buf = $serport->input();
if(!defined($buf) || length($buf) == 0) {
$rm = "EM EOF on $dev";
goto DONE;
}
for(my $i = 0; $i < length($buf); $i++) {
my $b = ord(substr($buf,$i,1));
if(!$started && $b != 0x02) { next; }
$started = 1;
if($esc) { $retval .= chr($b); $esc = 0; next; }
if($b == 0x10) { $esc = 1; next; }
$retval .= chr($b);
if($b == 0x03) { $complete = 1; last; }
}
if($complete) {
my $l = length($retval);
if($l < 8) { $rm = "EM Msg too short"; goto DONE; }
if(b($retval,1) != 0) { $rm = "EM Bad second byte"; goto DONE; }
if(w($retval,2) != $l-7) { $rm = "EM Length mismatch"; goto DONE; }
if(!EmCrcCheck($retval,$l-7)) { $rm = "EM Bad CRC"; goto DONE; }
$serport->close();
return substr($retval, 4, $l-7);
}
}
}
DONE:
$serport->close();
return undef;
}
#########################
# Interpretation is left for the "user";
sub
EmGetDevData($)
{
my ($hash) = @_;
my $dnr = $hash->{DEVNR};
my $d = IOWrite($hash, sprintf("7a%02x", $dnr-1));
return("ERROR: No device no. $dnr present")
if($d eq ((pack('H*',"00") x 45) . pack('H*',"FF") x 6));
my $nrreadings = w($d,2);
return("ERROR: No data to read (yet?)")
if($nrreadings == 0);
my $step = b($d,6);
my $start = b($d,18)+13;
my $end = $start + int(($nrreadings-1)/64)*$step;
my @ret;
for(my $p = $start; $p <= $end; $p += $step) { # blockwise
$d = IOWrite($hash, sprintf("52%02x%02x00000801", $p%256, int($p/256)));
my $max = (($p == $end) ? ($nrreadings%64)*4+4 : 260);
my $step = b($d, 6);
for(my $off = 8; $off <= $max; $off += 4) { # Samples in each block
push(@ret, sprintf("%04x%04x\n", w($d,$off), w($d,$off+2)));
}
}
return @ret;
}
1;

View File

@ -1,182 +0,0 @@
##############################################
package main;
use strict;
use warnings;
use Time::HiRes qw(gettimeofday);
sub EMWZ_Get($@);
sub EMWZ_Set($@);
sub EMWZ_Define($$);
sub EMWZ_GetStatus($);
###################################
sub
EMWZ_Initialize($)
{
my ($hash) = @_;
$hash->{GetFn} = "EMWZ_Get";
$hash->{SetFn} = "EMWZ_Set";
$hash->{DefFn} = "EMWZ_Define";
$hash->{AttrList} = "dummy:1,0 model;EM1000WZ loglevel:0,1,2,3,4,5,6";
}
###################################
sub
EMWZ_GetStatus($)
{
my ($hash) = @_;
if(!$hash->{LOCAL}) {
InternalTimer(gettimeofday()+300, "EMWZ_GetStatus", $hash, 0);
}
my $dnr = $hash->{DEVNR};
my $name = $hash->{NAME};
return "Empty status: dummy IO device" if(IsIoDummy($name));
my $d = IOWrite($hash, sprintf("7a%02x", $dnr-1));
if(!defined($d)) {
my $msg = "EMWZ $name read error (GetStatus 1)";
Log GetLogLevel($name,2), $msg;
return $msg;
}
if($d eq ((pack('H*',"00") x 45) . pack('H*',"FF") x 6)) {
my $msg = "EMWZ no device no. $dnr present";
Log GetLogLevel($name,2), $msg;
return $msg;
}
my $pulses=w($d,13);
my $ec=w($d,49) / 10;
if($ec <= 0) {
my $msg = "EMWZ read error (GetStatus 2)";
Log GetLogLevel($name,2), $msg;
return $msg;
}
my $cur_energy = $pulses / $ec; # ec = U/kWh
my $cur_power = $cur_energy / 5 * 60; # 5minute interval scaled to 1h
if($cur_power > 30) { # 20Amp x 3 Phase
my $msg = "EMWZ Bogus reading: curr. power is reported to be $cur_power";
Log GetLogLevel($name,2), $msg;
return $msg;
}
my %vals;
$vals{"5min_pulses"} = $pulses;
$vals{"energy"} = sprintf("%0.3f", $cur_energy);
$vals{"power"} = sprintf("%.3f", $cur_power);
$vals{"alarm_PA"} = w($d,45) . " Watt";
$vals{"price_CF"} = sprintf("%.3f", w($d,47)/10000);
$vals{"RperKW_EC"} = $ec;
my $tn = TimeNow();
my $idx = 0;
foreach my $k (keys %vals) {
my $v = $vals{$k};
$hash->{CHANGED}[$idx++] = "$k: $v";
$hash->{READINGS}{$k}{TIME} = $tn;
$hash->{READINGS}{$k}{VAL} = $v
}
if(!$hash->{LOCAL}) {
DoTrigger($name, undef) if($init_done);
}
$hash->{STATE} = "$cur_power kW";
Log GetLogLevel($name,4), "EMWZ $name: $cur_power kW / $vals{energy}";
return $hash->{STATE};
}
###################################
sub
EMWZ_Get($@)
{
my ($hash, @a) = @_;
return "argument is missing" if(int(@a) != 2);
my $d = $hash->{DEVNR};
my $msg;
if($a[1] ne "status") {
return "unknown get value, valid is status";
}
$hash->{LOCAL} = 1;
my $v = EMWZ_GetStatus($hash);
delete $hash->{LOCAL};
return "$a[0] $a[1] => $v";
}
sub
EMWZ_Set($@)
{
my ($hash, @a) = @_;
my $u = "Usage: set <name> <type> <value>, " .
"<type> is one of price,alarm,rperkw";
return $u if(int(@a) != 3);
my $name = $hash->{NAME};
return "" if(IsIoDummy($name));
my $v = $a[2];
my $d = $hash->{DEVNR};
my $msg;
if($a[1] eq "price") {
$v *= 10000; # Make display and input the same
$msg = sprintf("79%02x2f02%02x%02x", $d-1, $v%256, int($v/256));
} elsif($a[1] eq "alarm") {
$msg = sprintf("79%02x2d02%02x%02x", $d-1, $v%256, int($v/256));
} elsif($a[1] eq "rperkw") {
$v *= 10; # Make display and input the same
$msg = sprintf("79%02x3102%02x%02x", $d-1, $v%256, int($v/256));
} else {
return $u;
}
my $ret = IOWrite($hash, $msg);
if(!defined($ret)) {
my $msg = "EMWZ $name read error (Set)";
Log GetLogLevel($name,2), $msg;
return $msg;
}
if(ord(substr($ret,0,1)) != 6) {
$ret = "EMWZ Error occured: " . unpack('H*', $ret);
Log GetLogLevel($name,2), $ret;
return $ret;
}
return undef;
}
#############################
sub
EMWZ_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
return "syntax: define <name> EMWZ devicenumber"
if(@a != 3 || $a[2] !~ m,^[1-4]$,);
$hash->{DEVNR} = $a[2];
AssignIoPort($hash);
EMWZ_GetStatus($hash);
return undef;
}
1;

View File

@ -1,130 +0,0 @@
##############################################
package main;
use strict;
use warnings;
use Time::HiRes qw(gettimeofday);
sub EMEM_Get($@);
sub EMEM_Define($$);
sub EMEM_GetStatus($);
###################################
sub
EMEM_Initialize($)
{
my ($hash) = @_;
$hash->{GetFn} = "EMEM_Get";
$hash->{DefFn} = "EMEM_Define";
$hash->{AttrList} = "dummy:1,0 model;EM1000EM loglevel:0,1,2,3,4,5,6";
}
###################################
sub
EMEM_GetStatus($)
{
my ($hash) = @_;
if(!$hash->{LOCAL}) {
InternalTimer(gettimeofday()+300, "EMEM_GetStatus", $hash, 0);
}
my $dnr = $hash->{DEVNR};
my $name = $hash->{NAME};
return "Empty status: dummy IO device" if(IsIoDummy($name));
my $d = IOWrite($hash, sprintf("7a%02x", $dnr-1));
if(!defined($d)) {
my $msg = "EMEM $name read error (GetStatus 1)";
Log GetLogLevel($name,2), $msg;
return $msg;
}
if($d eq ((pack('H*',"00") x 45) . pack('H*',"FF") x 6)) {
my $msg = "EMEM no device no. $dnr present";
Log GetLogLevel($name,2), $msg;
return $msg;
}
my $pulses=w($d,13);
my $iec = 1000;
my $cur_power = $pulses / 100;
if($cur_power > 30) { # 20Amp x 3 Phase
my $msg = "EMEM Bogus reading: curr. power is reported to be $cur_power setting to -1";
Log GetLogLevel($name,2), $msg;
#return $msg;
$cur_power = -1.0;
}
my %vals;
$vals{"5min_pulses"} = $pulses;
$vals{"energy_kWh_h"} = sprintf("%0.3f", dw($d,33) / $iec);
$vals{"energy_today_kWh_d"} = sprintf("%0.3f", dw($d,37) / $iec);
$vals{"energy_total_kWh"} = sprintf("%0.3f", dw($d,41) / $iec);
$vals{"power_kW"} = sprintf("%.3f", $cur_power);
$vals{"alarm_PA_W"} = w($d,45);
$vals{"price_CF"} = sprintf("%.3f", w($d,47)/10000);
my $tn = TimeNow();
my $idx = 0;
foreach my $k (keys %vals) {
my $v = $vals{$k};
$hash->{CHANGED}[$idx++] = "$k: $v";
$hash->{READINGS}{$k}{TIME} = $tn;
$hash->{READINGS}{$k}{VAL} = $v
}
if(!$hash->{LOCAL}) {
DoTrigger($name, undef) if($init_done);
}
$hash->{STATE} = "$cur_power kW";
Log GetLogLevel($name,4), "EMEM $name: $cur_power kW / $vals{energy_kWh_h} kWh/h";
return $hash->{STATE};
}
###################################
sub
EMEM_Get($@)
{
my ($hash, @a) = @_;
return "argument is missing" if(int(@a) != 2);
my $d = $hash->{DEVNR};
my $msg;
if($a[1] ne "status") {
return "unknown get value, valid is status";
}
$hash->{LOCAL} = 1;
my $v = EMEM_GetStatus($hash);
delete $hash->{LOCAL};
return "$a[0] $a[1] => $v";
}
#############################
sub
EMEM_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
return "syntax: define <name> EMEM devicenumber"
if(@a != 3 || $a[2] !~ m,^[5-8]$,);
$hash->{DEVNR} = $a[2];
AssignIoPort($hash);
EMEM_GetStatus($hash);
return undef;
}
1;

View File

@ -1,190 +0,0 @@
##############################################
package main;
use strict;
use warnings;
use Device::SerialPort;
#####################################
sub
SCIVT_Initialize($)
{
my ($hash) = @_;
# Consumer
$hash->{DefFn} = "SCIVT_Define";
$hash->{GetFn} = "SCIVT_Get";
$hash->{AttrList}= "model:SCD loglevel:0,1,2,3,4,5,6";
}
#####################################
sub
SCIVT_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
return "Define the serial device as a parameter, use none for a fake device"
if(@a != 3);
$hash->{STATE} = "Initialized";
my $dev = $a[2];
Log 1, "SCIVT device is none, commands will be echoed only"
if($dev eq "none");
if($dev ne "none") {
Log 2, "SCIVT opening device $dev";
my $po = new Device::SerialPort ($dev);
return "Can't open $dev: $!" if(!$po);
Log 2, "SCIVT opened device $dev";
$po->close();
}
$hash->{DeviceName} = $dev;
SCIVT_GetStatus($hash);
return undef;
}
#####################################
sub
SCIVT_Get($@)
{
my ($hash, @a) = @_;
return "get for an SCIVT device needs exactly one parameter" if(@a != 2);
my $v;
if($a[1] eq "data") {
$v = SCIVT_GetLine($hash->{DeviceName});
$v =~ s/[\r\n]//g; # Delete the NewLine
} else {
return "Unknown argument $a[1], must be data";
}
$hash->{READINGS}{$a[1]}{VAL} = $v;
$hash->{READINGS}{$a[1]}{TIME} = TimeNow();
return "$a[0] $a[1] => $v";
}
#####################################
sub
SCIVT_GetStatus($)
{
my ($hash) = @_;
# Call us in 5 minutes again.
InternalTimer(gettimeofday()+300, "SCIVT_GetStatus", $hash, 0);
my $dnr = $hash->{DEVNR};
my $name = $hash->{NAME};
my %vals;
my $result = SCIVT_GetLine($hash->{DeviceName});
if(!defined($result))
{
Log GetLogLevel($name,2), "SCIVT read error, retry";
$result = SCIVT_GetLine($hash->{DeviceName});
}
if(!defined($result))
{
Log GetLogLevel($name,2), "SCIVT read error, abort";
$hash->{STATE} = "timeout";
return $hash->{STATE};
}
if (length($result) < 10)
{
Log GetLogLevel($name,2), "SCIVT incomplete line ($result)";
$hash->{STATE} = "incomplete";
}
else
{
$result =~ s/^.*R://;
$result =~ s/[\r\n ]//g;
Log GetLogLevel($name,2), "SCIVT $result (raw)";
$result=~ s/,/./g;
my @data = split(";", $result);
my @names = ("Vs", "Is", "Temp", "minV", "maxV", "minI", "maxI");
my $tn = TimeNow();
for(my $i = 0; $i < int(@names); $i++) {
$hash->{CHANGED}[$i] = "$names[$i]: $data[$i]";
$hash->{READINGS}{$names[$i]}{TIME} = $tn;
$hash->{READINGS}{$names[$i]}{VAL} = $data[$i];
}
DoTrigger($name, undef) if($init_done);
$result =~ s/;/ /g;
$hash->{STATE} = "$result";
}
return $hash->{STATE};
}
#####################################
sub
SCIVT_GetLine($)
{
my $retry = 0;
my ($dev) = @_;
return "R:13,66; 0,0;30;13,62;15,09;- 0,2; 2,8;\n"
if($dev eq "none"); # Fake-mode
my $serport = new Device::SerialPort ($dev);
if(!$serport) {
Log 1, "SCIVT: Can't open $dev: $!";
return undef;
}
$serport->reset_error();
$serport->baudrate(1200);
$serport->databits(8);
$serport->parity('none');
$serport->stopbits(1);
$serport->handshake('none');
my $rm = "SCIVT timeout reading the answer";
my $data="";
$serport->write('F');
sleep(1);
for(;;)
{
my ($rout, $rin) = ('', '');
vec($rin, $serport->FILENO, 1) = 1;
my $nfound = select($rout=$rin, undef, undef, 3.0);
if($nfound < 0) {
$rm = "SCIVT Select error $nfound / $!";
goto DONE;
}
last if($nfound == 0);
my $buf = $serport->input();
if(!defined($buf) || length($buf) == 0) {
$rm = "SCIVT EOF on $dev";
goto DONE;
}
$data .= $buf;
if($data =~ m/[\r\n]/) { # Newline received
$serport->close();
return $data;
}
}
DONE:
$serport->close();
Log 3, "SCIVT $rm";
return undef;
}
1;

View File

@ -1,296 +0,0 @@
#
#
# 80_M232.pm
# written by Dr. Boris Neubert 2007-11-26
# e-mail: omega at online dot de
#
##############################################
package main;
use strict;
use warnings;
use Device::SerialPort;
sub M232Write($$);
sub M232GetData($$);
#####################################
sub
M232_Initialize($)
{
my ($hash) = @_;
# Provider
$hash->{WriteFn} = "M232_Write";
$hash->{Clients} = ":M232Counter:";
# Consumer
$hash->{DefFn} = "M232_Define";
$hash->{UndefFn} = "M232_Undef";
$hash->{GetFn} = "M232_Get";
$hash->{SetFn} = "M232_Set";
$hash->{AttrList}= "model:m232 loglevel:0,1,2,3,4,5";
}
#####################################
sub
M232_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
$hash->{STATE} = "Initialized";
delete $hash->{PortObj};
delete $hash->{FD};
my $dev = $a[2];
$attr{$a[0]}{savefirst} = 1;
if($dev eq "none") {
Log 1, "M232 device is none, commands will be echoed only";
return undef;
}
Log 3, "M232 opening device $dev";
my $po = new Device::SerialPort ($dev);
return "Can't open $dev: $!" if(!$po);
Log 3, "M232 opened device $dev";
$po->close();
$hash->{DeviceName} = $dev;
return undef;
}
#####################################
sub
M232_Undef($$)
{
my ($hash, $arg) = @_;
my $name = $hash->{NAME};
foreach my $d (sort keys %defs) {
if(defined($defs{$d}) &&
defined($defs{$d}{IODev}) &&
$defs{$d}{IODev} == $hash)
{
Log GetLogLevel($name,2), "deleting port for $d";
delete $defs{$d}{IODev};
}
}
return undef;
}
#####################################
sub
M232_Set($@)
{
my ($hash, @a) = @_;
my $u1 = "Usage: set <name> auto <value>\n" .
"set <name> stop\n" .
"set <name> start\n" .
"set <name> octet <value>\n" .
"set <name> [io0..io7] 0|1\n";
return $u1 if(int(@a) < 2);
my $msg;
my $reading= $a[1];
if($reading eq "auto") {
return $u1 if(int(@a) !=3);
my $value= $a[2];
my @legal= (0..5,"none");
if(!grep($value eq $_, @legal)) {
return "Illegal value $value, possible values: @legal";
}
if($value eq "none") { $value= 0; } else { $value+=1; }
$msg= "M" . $value;
}
elsif($reading eq "start") {
return $u1 if(int(@a) !=2);
$msg= "Z1";
}
elsif($reading eq "stop") {
return $u1 if(int(@a) !=2);
$msg= "Z0";
}
elsif($reading eq "octet") {
return $u1 if(int(@a) !=3);
my $value= $a[2];
my @legal= (0..255);
if(!grep($value eq $_, @legal)) {
return "Illegal value $value, possible values: 0..255";
}
$msg= sprintf("W%02X", $value);
}
elsif($reading =~ /^io[0-7]$/) {
return $u1 if(int(@a) !=3);
my $value= $a[2];
return $u1 unless($value eq "0" || $value eq "1");
$msg= "D" . substr($reading,2,1) . $value;
}
else { return $u1; }
my $d = M232GetData($hash->{DeviceName}, $msg);
return "Read error" if(!defined($d));
return $d;
}
#####################################
sub
M232_Get($@)
{
my ($hash, @a) = @_;
my $u1 = "Usage: get <name> [an0..an5]\n" .
"get <name> [io0..io7]\n" .
"get <name> octet\n" .
"get <name> counter";
return $u1 if(int(@a) != 2);
my $name= $a[0];
my $reading= $a[1];
my $msg;
my $retval;
if($reading eq "counter") {
$msg= "z";
my $d = M232GetData($hash->{DeviceName}, $msg);
return "Read error" if(!defined($d));
my $count= hex $d;
$retval= $count;
}
elsif($reading =~ /^an[0-5]$/) {
$msg= "a" . substr($reading,2,1);
my $d = M232GetData($hash->{DeviceName}, $msg);
return "Read error" if(!defined($d));
my $voltage= (hex substr($d,0,3))*5.00/1024.0;
my $iscurrent= substr($d,3,1);
$retval= $voltage; # . " " . $iscurrent;
}
elsif($reading =~ /^io[0-7]$/) {
$msg= "d" . substr($reading,2,1);
my $d = M232GetData($hash->{DeviceName}, $msg);
return "Read error" if(!defined($d));
my $state= hex $d;
$retval= $state;
}
elsif($reading eq "octet") {
$msg= "w";
my $d = M232GetData($hash->{DeviceName}, $msg);
return "Read error" if(!defined($d));
my $state= hex $d;
$retval= $state;
}
else { return $u1; }
$hash->{READINGS}{$reading}{VAL}= $retval;
$hash->{READINGS}{$reading}{TIME}= TimeNow();
return "$name $reading => $retval";
}
#####################################
sub
M232_Write($$)
{
my ($hash,$msg) = @_;
return M232GetData($hash->{DeviceName}, $msg);
}
#####################################
sub
M232GetData($$)
{
my ($dev, $d) = @_;
my $MSGSTART= chr 1;
my $MSGEND= chr 13;
my $MSGACK= chr 6;
my $MSGNACK= chr 21;
$d = $MSGSTART . $d . $MSGEND;
my $serport = new Device::SerialPort ($dev);
if(!$serport) {
Log 3, "M232: Can't open $dev: $!";
return undef;
}
$serport->reset_error();
$serport->baudrate(2400);
$serport->databits(8);
$serport->parity('none');
$serport->stopbits(1);
$serport->handshake('none');
Log 4, "M232: Sending $d";
my $rm = "M232: ?";
$serport->lookclear;
$serport->write($d);
my $retval = "";
my $status = "";
for(;;) {
my ($rout, $rin) = ('', '');
vec($rin, $serport->FILENO, 1) = 1;
my $nfound = select($rout=$rin, undef, undef, 1.0);
if($nfound < 0) {
$rm = "M232: Select error $nfound / $!";
goto DONE;
}
last if($nfound == 0);
my $out = $serport->read(1);
if(!defined($out) || length($out) == 0) {
$rm = "M232 EOF on $dev";
goto DONE;
}
if($out eq $MSGACK) {
$rm= "M232: acknowledged";
Log 4, "M232: return value \'" . $retval . "\'";
$status= "ACK";
} elsif($out eq $MSGNACK) {
$rm= "M232: not acknowledged";
$status= "NACK";
$retval= undef;
} else {
$retval .= $out;
}
if($status) {
$serport->close();
Log 4, $rm;
return $retval;
}
}
DONE:
$serport->close();
Log 4, $rm;
return undef;
}
1;

View File

@ -1,176 +0,0 @@
#
#
# 81_M232Counter.pm
# written by Dr. Boris Neubert 2007-11-26
# e-mail: omega at online dot de
#
##############################################
package main;
use strict;
use warnings;
use Time::HiRes qw(gettimeofday);
sub M232Counter_Get($@);
sub M232Counter_Set($@);
sub M232Counter_SetBasis($@);
sub M232Counter_Define($$);
sub M232Counter_GetStatus($);
###################################
sub
M232Counter_Initialize($)
{
my ($hash) = @_;
$hash->{GetFn} = "M232Counter_Get";
$hash->{SetFn} = "M232Counter_Set";
$hash->{DefFn} = "M232Counter_Define";
$hash->{AttrList} = "dummy:1,0 model;M232Counter loglevel:0,1,2,3,4,5";
}
###################################
sub
M232Counter_GetStatus($)
{
my ($hash) = @_;
if(!$hash->{LOCAL}) {
InternalTimer(gettimeofday()+60, "M232Counter_GetStatus", $hash, 1);
}
my $name = $hash->{NAME};
my $d = IOWrite($hash, "z");
if(!defined($d)) {
my $msg = "M232Counter $name read error";
Log GetLogLevel($name,2), $msg;
return $msg;
}
my $tn = TimeNow();
if(!defined($hash->{READINGS}{basis})) {
$hash->{READINGS}{basis}{VAL}= 0;
$hash->{READINGS}{basis}{TIME}= $tn;
}
if(!defined($hash->{READINGS}{count})) {
$hash->{READINGS}{count}{VAL}= 0;
$hash->{READINGS}{count}{TIME}= $tn;
}
my $count= hex $d;
if($count< $hash->{READINGS}{count}{VAL}) {
$hash->{READINGS}{basis}{VAL}+= 65536;
$hash->{READINGS}{basis}{TIME}= $tn;
}
my $value= ($hash->{READINGS}{basis}{VAL}+$count) * $hash->{FACTOR};
$hash->{READINGS}{count}{TIME} = $tn;
$hash->{READINGS}{count}{VAL} = $count;
$hash->{READINGS}{value}{TIME} = $tn;
$hash->{READINGS}{value}{VAL} = $value;
$hash->{CHANGED}[0]= "value: $value";
if(!$hash->{LOCAL}) {
DoTrigger($name, undef) if($init_done);
}
$hash->{STATE} = $value;
Log GetLogLevel($name,4), "M232Counter $name: $value $hash->{UNIT}";
return $hash->{STATE};
}
###################################
sub
M232Counter_Get($@)
{
my ($hash, @a) = @_;
return "argument is missing" if(int(@a) != 2);
my $msg;
if($a[1] ne "status") {
return "unknown get value, valid is status";
}
$hash->{LOCAL} = 1;
my $v = M232Counter_GetStatus($hash);
delete $hash->{LOCAL};
return "$a[0] $a[1] => $v";
}
#############################
sub
M232Counter_Calibrate($@)
{
my ($hash, $value) = @_;
my $rm= undef;
my $name = $hash->{NAME};
# adjust basis
my $tn = TimeNow();
$hash->{READINGS}{basis}{VAL}= $value / $hash->{FACTOR};
$hash->{READINGS}{basis}{TIME}= $tn;
$hash->{READINGS}{count}{VAL}= 0;
$hash->{READINGS}{count}{TIME}= $tn;
# recalculate value
$hash->{READINGS}{value}{VAL} = $value;
$hash->{READINGS}{value}{TIME} = $tn;
# reset counter
my $ret = IOWrite($hash, "Z1");
if(!defined($ret)) {
my $rm = "M232Counter $name read error";
Log GetLogLevel($name,2), $rm;
}
return $rm;
}
#############################
sub
M232Counter_Set($@)
{
my ($hash, @a) = @_;
my $u = "Usage: set <name> value <value>";
return $u if(int(@a) != 3);
my $reading= $a[1];
my $value = $a[2];
return $u unless($reading eq "value");
my $rm= M232Counter_Calibrate($hash, $value);
return undef;
}
#############################
sub
M232Counter_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
return "syntax: define <name> M232Counter [unit] [multiplicator]"
if(int(@a) < 2 && int(@a) > 4);
my $unit= ((int(@a) > 2) ? $a[2] : "ticks");
my $factor= ((int(@a) > 3) ? $a[3] : 1.0);
$hash->{UNIT}= $unit;
$hash->{FACTOR}= $factor;
AssignIoPort($hash);
if(!$hash->{LOCAL}) {
InternalTimer(gettimeofday()+60, "M232Counter_GetStatus", $hash, 0);
}
return undef;
}
1;

View File

@ -1,119 +0,0 @@
##############################################
package main;
use strict;
use warnings;
#####################################
sub
at_Initialize($)
{
my ($hash) = @_;
$hash->{DefFn} = "at_Define";
$hash->{TimeFn} = "at_Exec";
$hash->{AttrFn} = "at_Attr";
$hash->{AttrList} = "disable:0,1 skip_next:0,1";
}
#####################################
sub
at_Define($$)
{
my ($hash, $def) = @_;
my ($name, undef, $tm, $command) = split("[ \t]+", $def, 4);
if(!$command) {
if($hash->{CMD}) {
$command = $hash->{CMD}; # Called from modify
$hash->{DEF} = "$tm $command";
} else {
return "Usage: define <name> at <timespec> <command>";
}
}
return "Wrong timespec, use \"[+][*[{count}]]<time or func>\""
if($tm !~ m/^(\+)?(\*({\d+})?)?(.*)$/);
my ($rel, $rep, $cnt, $tspec) = ($1, $2, $3, $4);
my ($err, $hr, $min, $sec, $fn) = GetTimeSpec($tspec);
return $err if($err);
$rel = "" if(!defined($rel));
$rep = "" if(!defined($rep));
$cnt = "" if(!defined($cnt));
my $ot = time;
my @lt = localtime($ot);
my $nt = $ot;
$nt -= ($lt[2]*3600+$lt[1]*60+$lt[0]) # Midnight for absolute time
if($rel ne "+");
$nt += ($hr*3600+$min*60+$sec); # Plus relative time
$nt += 86400 if($ot >= $nt);# Do it tomorrow...
@lt = localtime($nt);
my $ntm = sprintf("%02d:%02d:%02d", $lt[2], $lt[1], $lt[0]);
if($rep) { # Setting the number of repetitions
$cnt =~ s/[{}]//g;
return undef if($cnt eq "0");
$cnt = 0 if(!$cnt);
$cnt--;
$hash->{REP} = $cnt;
} else {
$hash->{VOLATILE} = 1; # Write these entries to the statefile
}
$hash->{NTM} = $ntm if($rel eq "+" || $fn);
$hash->{TRIGGERTIME} = $nt;
$hash->{CMD} = SemicolonEscape($command);
$nextat = $nt if(!$nextat || $nextat > $nt);
$hash->{STATE} = "Next: " . FmtTime($nt);
return undef;
}
sub
at_Exec($)
{
my ($name) = @_;
my ($skip, $disable);
if(defined($attr{$name})) {
$skip = 1 if(defined($attr{$name}{skip_next}));
$disable = 1 if(defined($attr{$name}{disable}));
}
delete $attr{$name}{skip_next} if($skip);
AnalyzeCommandChain(undef, $defs{$name}{CMD}) if(!$skip && !$disable);
my $count = $defs{$name}{REP};
my $def = $defs{$name}{DEF};
delete $defs{$name};
if($count) {
$def =~ s/{\d+}/{$count}/ if($def =~ m/^\+?\*{/); # Replace the count }
CommandDefine(undef, "$name at $def"); # Recompute the next TRIGGERTIME
}
}
sub
at_Attr(@)
{
my @a = @_;
my $do = 0;
if($a[0] eq "set" && $a[2] eq "disable") {
$do = (!defined($a[3]) || $a[3]) ? 1 : 2;
}
$do = 2 if($a[0] eq "del" && (!$a[2] || $a[2] eq "disable"));
return if(!$do);
$defs{$a[1]}{STATE} = ($do == 1 ?
"disabled" :
"Next: " . FmtTime($defs{$a[1]}{TRIGGERTIME}));
return undef;
}
1;

View File

@ -1,95 +0,0 @@
##############################################
package main;
use strict;
use warnings;
#####################################
sub
notify_Initialize($)
{
my ($hash) = @_;
$hash->{DefFn} = "notify_Define";
$hash->{NotifyFn} = "notify_Exec";
$hash->{AttrFn} = "notify_Attr";
$hash->{AttrList} = "disable:0,1";
}
#####################################
sub
notify_Define($$)
{
my ($hash, $def) = @_;
my ($type, $name, $re, $command) = split("[ \t]+", $def, 4);
if(!$command) {
if($hash->{CMD}) {
$command = $hash->{CMD}; # Called from modify
$hash->{DEF} = "$re $command";
} else {
return "Usage: define <name> notify <regexp> <command>";
}
}
# Checking for misleading regexps
eval { "Hallo" =~ m/^$re$/ };
return "Bad regexp: $@" if($@);
$hash->{CMD} = SemicolonEscape($command);
$hash->{REGEXP} = $re;
$hash->{STATE} = "active";
return undef;
}
#####################################
sub
notify_Exec($$)
{
my ($log, $dev) = @_;
my $ln = $log->{NAME};
return "" if($attr{$ln} && $attr{$ln}{disable});
my $n = $dev->{NAME};
my $re = $log->{REGEXP};
my $max = int(@{$dev->{CHANGED}});
my $ret = "";
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 $exec = $log->{CMD};
$exec =~ s/%%/____/g;
$exec =~ s/%/$s/g;
$exec =~ s/____/%/g;
$exec =~ s/@@/____/g;
$exec =~ s/@/$n/g;
$exec =~ s/____/@/g;
my $r = AnalyzeCommandChain(undef, $exec);
$ret .= " $r" if($r);
}
}
return $ret;
}
sub
notify_Attr(@)
{
my @a = @_;
my $do = 0;
if($a[0] eq "set" && $a[2] eq "disable") {
$do = (!defined($a[3]) || $a[3]) ? 1 : 2;
}
$do = 2 if($a[0] eq "del" && (!$a[2] || $a[2] eq "disable"));
return if(!$do);
$defs{$a[1]}{STATE} = ($do == 1 ? "disabled" : "active");
return undef;
}
1;

View File

@ -1,120 +0,0 @@
##############################################
package main;
use strict;
use warnings;
use IO::File;
#####################################
sub
FileLog_Initialize($)
{
my ($hash) = @_;
$hash->{DefFn} = "FileLog_Define";
$hash->{UndefFn} = "FileLog_Undef";
$hash->{NotifyFn} = "FileLog_Log";
$hash->{AttrFn} = "FileLog_Attr";
# logtype is used by the frontend
$hash->{AttrList} = "disable:0,1 logtype nrarchive archivedir archivecmd";
}
#####################################
sub
FileLog_Define($@)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
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->{logfile} = $a[2];
$hash->{currentlogfile} = $f;
$hash->{STATE} = "active";
return undef;
}
#####################################
sub
FileLog_Undef($$)
{
my ($hash, $name) = @_;
close($hash->{FH});
return undef;
}
#####################################
sub
FileLog_Log($$)
{
# Log is my entry, Dev is the entry of the changed device
my ($log, $dev) = @_;
my $ln = $log->{NAME};
return if($attr{$ln} && $attr{$ln}{disable});
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/ /_/; # Makes it easier to parse with gnuplot
my $fh = $log->{FH};
my @t = localtime;
my $cn = ResolveDateWildcards($log->{logfile}, @t);
if($cn ne $log->{currentlogfile}) { # New logfile
$fh->close();
HandleArchiving($log);
$fh = new IO::File ">>$cn";
if(!defined($fh)) {
Log(0, "Can't open $cn");
return;
}
$log->{currentlogfile} = $cn;
$log->{FH} = $fh;
}
print $fh "$t $n $s\n";
$fh->flush;
$fh->sync;
}
}
return "";
}
sub
FileLog_Attr(@)
{
my @a = @_;
my $do = 0;
if($a[0] eq "set" && $a[2] eq "disable") {
$do = (!defined($a[3]) || $a[3]) ? 1 : 2;
}
$do = 2 if($a[0] eq "del" && (!$a[2] || $a[2] eq "disable"));
return if(!$do);
$defs{$a[1]}{STATE} = ($do == 1 ? "disabled" : "active");
return undef;
}
1;

View File

@ -1,41 +0,0 @@
##############################################
package main;
use strict;
use warnings;
sub
dummy_Initialize($)
{
my ($hash) = @_;
$hash->{SetFn} = "dummy_Set";
$hash->{DefFn} = "dummy_Define";
}
###################################
sub
dummy_Set($@)
{
my ($hash, @a) = @_;
return "no set value specified" if(int(@a) != 2);
my $v = $a[1];
$hash->{CHANGED}[0] = $v;
$hash->{STATE} = $v;
$hash->{READINGS}{state}{TIME} = TimeNow();
$hash->{READINGS}{state}{VAL} = $v;
return undef;
}
sub
dummy_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
return "Wrong syntax: use define <name> dummy" if(int(@a) != 2);
return undef;
}
1;

View File

@ -1,333 +0,0 @@
##############################################
# - 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
#
# This code is derived from DateTime::Event::Sunrise, version 0.0501.
# Simplified and removed further package # dependency (DateTime,
# Params::Validate, etc). For comments see the original code.
#
package main;
use strict;
use warnings;
use Math::Trig;
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 = ""; # will be overwritten
my $altit = "-6"; # Civil twilight
my $RADEG = ( 180 / pi );
my $DEGRAD = ( pi / 180 );
my $INV360 = ( 1.0 / 360.0 );
sub
SUNRISE_EL_Initialize($)
{
my ($hash) = @_;
}
##########################
# 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 $needrise = ($rise || $daycheck) ? 1 : 0;
my $needset = (!$rise || $daycheck) ? 1 : 0;
my $nt = time;
my @lt = localtime($nt);
my $gmtoff = _calctz($nt,@lt); # in hour
my ($rt,$st) = _sr($needrise,$needset, $lt[5]+1900,$lt[4]+1,$lt[3], $gmtoff);
my $nh = $lt[2] + $lt[1]/60 + $lt[0]/3600;
if($daycheck) {
return 0 if($nh < $rt || $nh > $st);
return 1;
}
$seconds = 0 if(!$seconds);
my $sst = ($rise ? $rt : $st);
if(!$isrel) {
$sst += ($seconds/3600);
return h2hms_fmt($sst);
}
$sst += ($seconds/3600);
my $diff = 0;
if($nh > $sst) {
$nt += 86400; # Tommorow
$diff = 24;
@lt = localtime($nt);
$gmtoff = _calctz($nt,@lt); # in hour
($rt,$st) = _sr($needrise,$needset, $lt[5]+1900,$lt[4]+1,$lt[3], $gmtoff);
$sst = ($rise ? $rt : $st);
$sst += ($seconds/3600);
}
$diff = $diff + $sst - $nh;
return h2hms_fmt($diff);
}
sub
_sr($$$$$$)
{
my ($needrise, $needset, $y, $m, $dy, $offset) = @_;
my $d = _days_since_2000_Jan_0($y,$m,$dy) + 0.5 - $long / 360.0;
my ( $tmp_rise_1, $tmp_set_1 ) =
_sunrise_sunset( $d, $long, $lat, $altit, 15.04107 );
my ($tmp_rise_2, $tmp_rise_3) = (0,0);
if($needrise) {
$tmp_rise_2 = 9; $tmp_rise_3 = 0;
until ( _equal( $tmp_rise_2, $tmp_rise_3, 8 ) ) {
my $d_sunrise_1 = $d + $tmp_rise_1 / 24.0;
( $tmp_rise_2, undef ) =
_sunrise_sunset( $d_sunrise_1, $long,
$lat, $altit, 15.04107 );
$tmp_rise_1 = $tmp_rise_3;
my $d_sunrise_2 = $d + $tmp_rise_2 / 24.0;
( $tmp_rise_3, undef ) =
_sunrise_sunset( $d_sunrise_2, $long,
$lat, $altit, 15.04107 );
}
}
my ($tmp_set_2, $tmp_set_3) = (0,0);
if($needset) {
$tmp_set_2 = 9; $tmp_set_3 = 0;
until ( _equal( $tmp_set_2, $tmp_set_3, 8 ) ) {
my $d_sunset_1 = $d + $tmp_set_1 / 24.0;
( undef, $tmp_set_2 ) =
_sunrise_sunset( $d_sunset_1, $long,
$lat, $altit, 15.04107 );
$tmp_set_1 = $tmp_set_3;
my $d_sunset_2 = $d + $tmp_set_2 / 24.0;
( undef, $tmp_set_3 ) =
_sunrise_sunset( $d_sunset_2, $long,
$lat, $altit, 15.04107 );
}
}
return $tmp_rise_3+$offset, $tmp_set_3+$offset;
}
sub
_sunrise_sunset($$$$$)
{
my ( $d, $lon, $lat, $altit, $h ) = @_;
my $sidtime = _revolution( _GMST0($d) + 180.0 + $lon );
my ( $sRA, $sdec ) = _sun_RA_dec($d);
my $tsouth = 12.0 - _rev180( $sidtime - $sRA ) / $h;
my $sradius = 0.2666 / $sRA;
$altit -= $sradius;
# Compute the diurnal arc that the Sun traverses to reach
# the specified altitude altit:
my $cost =
( sind($altit) - sind($lat) * sind($sdec) ) /
( cosd($lat) * cosd($sdec) );
my $t;
if ( $cost >= 1.0 ) {
$t = 0.0; # Sun always below altit
}
elsif ( $cost <= -1.0 ) {
$t = 12.0; # Sun always above altit
}
else {
$t = acosd($cost) / 15.0; # The diurnal arc, hours
}
# Store rise and set times - in hours UT
my $hour_rise_ut = $tsouth - $t;
my $hour_set_ut = $tsouth + $t;
return ( $hour_rise_ut, $hour_set_ut );
}
sub
_GMST0($)
{
my ($d) = @_;
my $sidtim0 =
_revolution( ( 180.0 + 356.0470 + 282.9404 ) +
( 0.9856002585 + 4.70935E-5 ) * $d );
return $sidtim0;
}
sub
_sunpos($)
{
my ($d) = @_;
my $Mean_anomaly_of_sun = _revolution( 356.0470 + 0.9856002585 * $d );
my $Mean_longitude_of_perihelion = 282.9404 + 4.70935E-5 * $d;
my $Eccentricity_of_Earth_orbit = 0.016709 - 1.151E-9 * $d;
# Compute true longitude and radius vector
my $Eccentric_anomaly =
$Mean_anomaly_of_sun + $Eccentricity_of_Earth_orbit * $RADEG *
sind($Mean_anomaly_of_sun) *
( 1.0 + $Eccentricity_of_Earth_orbit * cosd($Mean_anomaly_of_sun) );
my $x = cosd($Eccentric_anomaly) - $Eccentricity_of_Earth_orbit;
my $y =
sqrt( 1.0 - $Eccentricity_of_Earth_orbit * $Eccentricity_of_Earth_orbit )
* sind($Eccentric_anomaly);
my $Solar_distance = sqrt( $x * $x + $y * $y ); # Solar distance
my $True_anomaly = atan2d( $y, $x ); # True anomaly
my $True_solar_longitude =
$True_anomaly + $Mean_longitude_of_perihelion; # True solar longitude
if ( $True_solar_longitude >= 360.0 ) {
$True_solar_longitude -= 360.0; # Make it 0..360 degrees
}
return ( $Solar_distance, $True_solar_longitude );
}
sub
_sun_RA_dec($)
{
my ($d) = @_;
my ( $r, $lon ) = _sunpos($d);
my $x = $r * cosd($lon);
my $y = $r * sind($lon);
my $obl_ecl = 23.4393 - 3.563E-7 * $d;
my $z = $y * sind($obl_ecl);
$y = $y * cosd($obl_ecl);
my $RA = atan2d( $y, $x );
my $dec = atan2d( $z, sqrt( $x * $x + $y * $y ) );
return ( $RA, $dec );
}
sub
_days_since_2000_Jan_0($$$)
{
my ($y, $m, $d) = @_;
my @mn = (31,28,31,30,31,30,31,31,30,31,30,31);
my $ms = 0;
for(my $i = 0; $i < $m-1; $i++) {
$ms += $mn[$i];
}
my $x = ($y-2000)*365.25 + $ms + $d;
$x++ if($m > 2 && ($y%4) == 0);
return int($x);
}
sub sind($) { sin( ( $_[0] ) * $DEGRAD ); }
sub cosd($) { cos( ( $_[0] ) * $DEGRAD ); }
sub tand($) { tan( ( $_[0] ) * $DEGRAD ); }
sub atand($) { ( $RADEG * atan( $_[0] ) ); }
sub asind($) { ( $RADEG * asin( $_[0] ) ); }
sub acosd($) { ( $RADEG * acos( $_[0] ) ); }
sub atan2d($) { ( $RADEG * atan2( $_[0], $_[1] ) ); }
sub
_revolution($)
{
my $x = $_[0];
return ( $x - 360.0 * int( $x * $INV360 ) );
}
sub
_rev180($)
{
my ($x) = @_;
return ( $x - 360.0 * int( $x * $INV360 + 0.5 ) );
}
sub
_equal($$$)
{
my ( $A, $B, $dp ) = @_;
return sprintf( "%.${dp}g", $A ) eq sprintf( "%.${dp}g", $B );
}
sub
_calctz($@)
{
my ($nt,@lt) = @_;
my $off = $lt[2]*3600+$lt[1]*60+$lt[0];
$off = 12*3600-$off;
$nt += $off; # This is noon, localtime
my @gt = gmtime($nt);
return (12-$gt[2]);
}
sub
h2hms($)
{
my ($in) = @_;
my ($h,$m,$s);
$h = int($in);
$m = int(60*($in-$h));
$s = int(3600*($in-$h)-60*$m);
return ($h, $m, $s);
}
sub
h2hms_fmt($)
{
my ($in) = @_;
my ($h,$m,$s) = h2hms($in);
return sprintf("%02d:%02d:%02d", $h, $m, $s);
}
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;

View File

@ -1,20 +0,0 @@
package main;
use strict;
use warnings;
use POSIX;
sub
Utils_Initialize($$)
{
my ($hash) = @_;
}
sub
time_str2num($)
{
my ($str) = @_;
my @a = split("[- :]", $str);
return mktime($a[5],$a[4],$a[3],$a[2],$a[1]-1,$a[0]-1900,0,0,-1);
}
1;

View File

@ -1,159 +0,0 @@
- Rudi, Thu Feb 1 13:27:15 MET 2007
Created the file HISTORY and the file README.DEV
- Pest, Thu Feb 1 20:45 MET 2007
Added description for attribute "model" in commandref.html
- Rudi, Sun Feb 11 18:56:05 MET 2007
- showtime added for pgm2 (useful for FS20 piri display)
- defattr command added, it makes easier to assign room, type, etc for a group
of devices.
- em1010.pl added to the contrib directory. It seems that we are able
to read out the EM1010PC. Not verified with multiple devices.
- Pest, Thu Feb 11 23:35 MET 2007
- Added doc/linux.html (multiple USDB devices, udev links)
- Linked fhem.html and commandref.html to linux.html
- Martin Haas, Fri Feb 23 10:18 MET 2007
- ARM-Section (NSLU2) added to doc/linux.html
- Pest, Sat Feb 24 18:30 MET 2007
- doc/linux.html: Module build re-written.
- Rudi, Sun Mar 4 11:18:10 MET 2007
Reorganization. Goal: making attribute adding/deleting more uniform
("at/notify" and other device differences), and making web-configuration
possible (i.e. saving the configfile, list of possible devices etc).
Internal changes:
- %logmods,%devmods moved to %modules. Makes things more uniform
- %logs merged into %defs
- local state info (%readings) changed to global ($defs{$d}{READINGS})
-> No need for the listfn function in each module
-> User written scripts can more easily analyze device states
User visible changes:
- at/notify "renamed" to "define <name> at/notify", both moved to external
modules. Now it is possible
- to have a further "at" or "notify" modules
(notify & filelog use the same interface)
- to have more than one notify for the same event
- to delete at commands without strange escapes.
The delete syntax changed (no more def/at/ntfy needed)
- at/notify can have attributes
Drawback: each at and notify must have a name, which is strange first.
- logfile/modpath/pidfile/port/verbose "renamed" to "attr global xxx"
Dumping and extending these attributes is easier, no special handling
required in the web-frontend.
- savefile renamed to "attr global statefile"
- configfile global attribute added.
- save command added, it writes the statefile and then the configfile.
- delattr added to delete single attributes
- list/xmllist format changed, they contain more information.
- "define/set/get/attr name ?" returns a list of possible arguments
in the same format. This data is contained in the xmllist.
- disable attribute for at/notify/filelog
- rename added
- Rudi, Tue Mar 27 20:43:15 MEST 2007
fhemweb.pl (webpgm2) changes:
- adopted to the new syntax
- better commandline support (return <pre> formatted)
- FileLog attribute logtype added, and 4 logtypes (== gnuplot files)
defined: fs20, fht, ks300_1, ks300_2
- links in the commandref.html file added
- device dependent attribute and set support
- Pest, Sun Apr 08 17:55:15 MEST 2007
em1010.pl:
- Make difference between sensors 1..4 and 5..
- Checked values for sensor 5 (cur.energy + cur.power) - ok
- Checked values for sensor 5 cur.energy is ok, cur.power still off.
Correction factor needs to be determined.
- setTime: Without argument, now the current time of the PC is used.
- setRperKW: Factor of 10 required, 75 U/kWh -> 750.
- Pest, Tue Apr 10 20:31:22 MEST 2007
em1010.pl:
- Introduced new double-word function (dw)
- getDevStatus: energy values kWh/h, kWh/d, total.
- Rudi Sat Apr 14 10:34:36 MEST 2007
final documentations, release 4.0. Tagged as FHEM_4_0
- Pest, Sat Apr 14 14:21:00 MEST 2007
- doc: linux.html (private udev-rules, not 50-..., ATTRS)
- Pest, Sun Apr 15 14:54:30 MEST 2007
- doc: fhem.pl and commandref.html (notifyon -> notify, correction of examples)
- Rudi, Tue Apr 24 08:10:43 MEST 2007
- feature: modify command added. It helps change e.g. only the time component
for an at command, without deleting and creating it again and then
reapplying all the attributes.
- feature: the "-" character is disallowed in defined names. Use dot (.) or _
instead. The - is used to separate ranges in the set command.
- Rudi, Sun May 27 12:51:52 MEST 2007
- Archiving FileLogs. Added fhemweb.pl (pgm2) code, to show logs from the
archive directory. See the attributes archivedir/archivecmd.
- Added EM1010PC suppoort (right now only with EM1000WZ). Support added
for displaying logs in the fhemweb.pl (webfrontends/pgm2)
- Pest, Mon May 28 19:39:22 MEST 2007
- Added 62_EMEM.pm to support EM1000-EM devices.
- doc: Update of commandref.htm (typos and EMEM).
- Pest, Mon May 29 00:07:00 MEST 2007
- check-in changes of 60_EM.pm to make EMEM work.
- Mon Jun 4 08:23:43 MEST 2007
- Small changes for EM logging
- Pest Jun 10, 23:16:23 MEST 2007
- Set wrong values in 62_EMEM to -1
- Pest Jun 12, 21:33:00 MEST 2007
- in 62_EMEM.pm: added energy_today and energy_total
- Pest Jun 18, 20:06:23 MEST 2007
- in 62_EMEM.pm: Power units removed from value content added to name.
- Rudi Sun Aug 5 10:59:51 MEST 2007
- WS300 Loglevel changed for KS300 device (from 2 to GetLogLevel or 5)
- First version of the FritzBox port:
- Perl binary/ftdi_sio module
- EM: added setTime, reset
- docs/fritzbox.html. Note: The fb_fhem_0.1.tar.gz won't be part of CVS
as it contains largee binaries (swapfile, perl mipsel executable, etc).
- Rudi Mon Aug 6 20:15:00 MEST 2007
- archiving added to the main logs.
NOTE: The FileLog filename (INT attribute) is now also called logfile.
- Rudi Wed Aug 29 08:28:34 MEST 2007
- archive attributes clarified in the doc
- Rudi Mon Sep 3 15:47:59 MEST 2007
- 99_Sunrise_EL.pm checked in. Replaces 99_Sunrise.pm, and does not need
any Date module.
- Rudi Sun Sep 9 08:43:03 MEST 2007
- mode holiday_short added + documentation. Not tested.
any Date module.
- Rudi Wed Oct 3 18:21:36 MEST 2007
- weblinks added. Used by webpgm2 to display more than one plot at once
- webpgm2 output reformatted. Using CSS to divide the screen area in 3
parts: command line, room-list and rest
- Dirk Wed Oct 7 12:45:09 MEST 2007
- FHT lime-protection code discovered
- Dirk Wed Oct 18 23:28:00 MEST 2007
- Softwarebuffer for FHT devices with queuing unsent commands and
repeating commands by transmission failure
- FHT low temperatur warning and setting for lowtemp-offset
- Change naming for state into warnings
Tagged as dirkh_20071019_0

View File

@ -1,27 +0,0 @@
BINDIR=/usr/local/bin
MODDIR=/usr/local/lib
VERS=4.2
DATE=2007-12-02
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)

View File

@ -1,65 +0,0 @@
The source of this project is hosted on Berlios, if you wish you can get
the latest version with the following commands:
cvs -d:pserver:anonymous@cvs.fhem.berlios.de:/cvsroot/fhem login
cvs -z3 -d:pserver:anonymous@cvs.fhem.berlios.de:/cvsroot/fhem co fhem
If you wish to contribute to the project, then
- create a berlios account
- send an email to the project manager to add you as developer to the project
(right know this is r dot koenig at koeniglich dot de)
- check out the source with
% cvs -z3 -d<berlios-uid>@cvs.berlios.de:/cvsroot/fhem co fhem
- if it is already checked out, it makes sense to do an update before
implementing your changes:
% cvs update
- make your changes
- test if it is working (Really !!!)
- make an entry in the CHANGED file, giving your changes a "title".
- describe your changes in the file HISTORY, and dont forget to mention your
name and the date of change
- it makes sense to do a "cvs diff" before checking in the stuff with
cvs commit
- if you do complex/nontrivial changes affecting more than one file, then
please tag the whole software before and after the change with:
- before: % cvs tag <berlios-uid>_<date_as_YYYYMMDD>_0
- after: % cvs tag <berlios-uid>_<date_as_YYYYMMDD>_1
You can increase the counter for bugfixing. Dont forget to mention the
tagname in the HISTORY file. Tagging helps to remove more complex changes or
to merge them in other releases/branches.
Some useful CVS commands/flags for the beginner:
# Get the newest stuff from the server and merge it into your changes.
# Watch out for lines beginning with C (collisions), edit them immediately
# after check out, and look for ====
# Without -d new directories won't be checked out
cvs update -d .
# Before checking in, make sure you changed only what you intended:
cvs diff filename
# Add new file. "-kb" adds binary files. Forgetting -kb will cause
# problems if somebody is checking out on a different OS (windows)
# Note: it is complicated to rename files in CVS, so think twice about
# filenames before adding them. e.g. do not use version names in them.
cvs add [-kb] filename
# Look at the change history
cvs log <filename>
# Commit changes. Set the EDITOR environment variable to use your editor.
cvs commit .
# Check which files were changed. Type ^C when it asks you to really release it.
# (is there a more elegant way?)
cvs release .
# We recommend to set some options in our ~/.cvsrc file:
cvs -q
update -d
# The 'cvs -q' option will suppress some output e.g. during update
# only the updated and unknown files etc. are displayed (not every
# folder etc.).
# The 'update -d' will automatically create folders as required.

View File

@ -1,97 +0,0 @@
##############################################
# 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) = @_;
# 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;

View File

@ -1,149 +0,0 @@
#############################################
# 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) = @_;
}
##############################################
# 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++ )
{
fhem "$OFF";
};
Log 2, "alarm system is OFF";
} else {
system "touch /var/tmp/alertsystem";
#Paranoia
for (my $i = 0; $i < 2; $i++ )
{
fhem "$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++ )
{
fhem "$ON1";
fhem "$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) {
fhem "set $light on"
}
foreach my $rollo (@rollos) {
fhem "set $rollo on"
}
}
}
1;

View File

@ -1,50 +0,0 @@
##############################################
# Example perl functions. Put this file into the FHEM directory.
#
# # Activate 2 rollades at once with one button, open them to
# # a different degree.
# define ntfy_1 notifyon btn3 {MyFunc("@", "%")}
#
# # Swith the heater off if all FHT actuators are closed,
# # and on if at least one is open
# define at_1 at +*00:05 { fhem "set heater " . (sumactuator()?"on":"off") };
package main;
use strict;
use warnings;
sub
PRIV_Initialize($$)
{
my ($hash, $init) = @_;
}
sub
sumactuator()
{
my $sum = 0;
foreach my $d (keys %defs) {
next if($defs{$d}{TYPE} ne "FHT");
my ($act, undef) = split(" ", $defs{$d}{READINGS}{"actuator"}{VAL});
$act =~ s/%//;
$sum += $act;
}
return $sum;
}
sub
MyFunc($$)
{
my ($a1, $a2) = @_;
Log 2, "Device $a1 was set to $a2 (type: $defs{$a1}{TYPE})";
if($a2 eq "on") {
fhem "set roll1 on-for-timer 10";
fhem "set roll2 on-for-timer 16";
} else {
fhem "set roll1 off";
fhem "set roll2 off";
}
}
1;

View File

@ -1,88 +0,0 @@
##############################################
# - 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) = @_;
}
##########################
# 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;

View File

@ -1,43 +0,0 @@
- 70_SCIVT.pm
Support for an SCD series solar controler device. Details see
http://english.ivt-hirschau.de/content.php?parent_id=CAT_64&doc_id=DOC_118
- 80_M232.pm/81_M232Counter.pm
Support for the M232 device from ELV by Boris.
- 91_DbLog.pm
Example to log data in a (DBI supported) database (MySQL, Oracle, etc)
- 99_SUNRISE.pm
The original Sunrise/Sunset support. Uses DateTime::Event::Sunrise. Uses the
99_SUNRISE_EL.pm module instead.
- 99_SUNRISE_EL.pm
Support foor computins sunrise/sunset times.
- 99_Utils.pm
skeleton for self-written perl funtions.
- 99_ALARM.pm
Example for a Low Budget ALARM System by Martin
- 99_dummy.pm
Used for programming
- 99_weblink.pm
Used by fhemweb2.pl
- checkmsg.pl
Check header/function/crc of an FS20 hex message
- crc.pl
Computing CRC16 in perl
- em1010.pl
Standalone EM1010PC reader program
- init-scripts
RC scripts 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
- serial.pm
Serial line analyzer

View File

@ -1,26 +0,0 @@
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 $rl (should be $l)\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);

View File

@ -1,33 +0,0 @@
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);
}

View File

@ -1,466 +0,0 @@
#!/usr/bin/perl
use strict;
use warnings;
use Device::SerialPort;
sub b($$);
sub w($$);
sub docrc($$);
sub checkcrc($$);
sub getData($);
sub makemsg($);
sub maketime($);
my %cmd = (
"getVersion" => 1,
"getTime" => 1,
"getDevStatus" => 1,
"getDevPage" => 1,
"getDevData" => 1,
"setPrice" => 1,
"setAlarm" => 1,
"setRperKW" => 1,
"get62" => 1,
"setTime" => 1,
"reset" => 1,
);
if(@ARGV < 2) {
printf("Usage: perl em1010.pl serial-device command args\n");
exit(1);
}
my $ser = $ARGV[0];
my $fd;
#####################
# Open serial port
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 $cmd = $ARGV[1];
if(!defined($cmd{$cmd})) {
printf("Unknown command $cmd, use one of " . join(" ",sort keys %cmd) . "\n");
exit(0);
}
###########################
no strict "refs";
&{$cmd }();
use strict "refs";
exit(0);
#########################
sub
maketime($)
{
my @l = localtime(shift);
return sprintf("%04d-%02d-%02d_%02d:%02d:00",
1900+$l[5],$l[4]+1,$l[3],$l[2],$l[1]-$l[1]%5);
}
#########################
sub
b($$)
{
my ($t,$p) = @_;
return ord(substr($t,$p,1));
}
#########################
sub
w($$)
{
my ($t,$p) = @_;
return b($t,$p+1)*256 + b($t,$p);
}
#########################
sub
dw($$)
{
my ($t,$p) = @_;
return w($t,$p+2)*65536 + w($t,$p);
}
#########################
sub
docrc($$)
{
my ($in, $val) = @_;
my ($crc, $bits) = (0, 8);
my $k = (($in >> 8) ^ $val) << 8;
while($bits--) {
if(($crc ^ $k) & 0x8000) {
$crc = ($crc << 1) ^ 0x8005;
} else {
$crc <<= 1;
}
$k <<= 1;
}
return (($in << 8) ^ $crc) & 0xffff;
}
#########################
sub
checkcrc($$)
{
my ($otxt, $len) = @_;
my $crc = 0x8c27;
for(my $l = 2; $l < $len+4; $l++) {
my $b = ord(substr($otxt,$l,1));
$crc = docrc($crc, 0x10) if($b==0x02 || $b==0x03 || $b==0x10);
$crc = docrc($crc, $b);
}
return ($crc == w($otxt, $len+4));
}
#########################
sub
esc($)
{
my ($b) = @_;
my $out = "";
$out .= chr(0x10) if($b==0x02 || $b==0x03 || $b==0x10);
$out .= chr($b);
}
#########################
sub
makemsg($)
{
my ($data) = @_;
my $len = length($data);
$data = chr($len&0xff) . chr(int($len/256)) . $data;
my $out = pack('H*', "0200");
my $crc = 0x8c27;
for(my $l = 0; $l < $len+2; $l++) {
my $b = ord(substr($data,$l,1));
$crc = docrc($crc, 0x10) if($b==0x02 || $b==0x03 || $b==0x10);
$crc = docrc($crc, $b);
$out .= esc($b);
}
$out .= esc($crc&0xff);
$out .= esc($crc/256);
$out .= chr(0x03);
return $out;
}
#########################
sub
getData($)
{
my ($d) = @_;
$d = makemsg(pack('H*', $d));
#print "Sending: " . unpack('H*', $d) . "\n";
for(my $rep = 0; $rep < 3; $rep++) {
#printf "write (try nr $rep)\n";
$serport->write($d);
my $retval = "";
my $esc = 0;
my $started = 0;
my $complete = 0;
for(;;) {
my ($rout, $rin) = ('', '');
vec($rin, $serport->FILENO, 1) = 1;
my $nfound = select($rout=$rin, undef, undef, 1.0);
die("Select error $nfound / $!\n") if($nfound < 0);
last if($nfound == 0);
my $buf = $serport->input();
die "EOF on $ser\n" if(!defined($buf) || length($buf) == 0);
for(my $i = 0; $i < length($buf); $i++) {
my $b = ord(substr($buf,$i,1));
if(!$started && $b != 0x02) { next; }
$started = 1;
if($esc) { $retval .= chr($b); $esc = 0; next; }
if($b == 0x10) { $esc = 1; next; }
$retval .= chr($b);
if($b == 0x03) { $complete = 1; last; }
}
if($complete) {
my $l = length($retval);
if($l < 8) { printf("Msg too short\n"); last; }
if(b($retval,1) != 0) { printf("Bad second byte\n"); last; }
if(w($retval,2) != $l-7) { printf("Length mismatch\n"); last; }
if(!checkcrc($retval,$l-7)) { printf("Bad CRC\n"); last; }
return substr($retval, 4, $l-7);
}
}
}
printf "Timeout reading the answer\n";
exit(1);
}
#########################
sub
hexdump($)
{
my ($d) = @_;
for(my $i = 0; $i < length($d); $i += 16) {
my $h = unpack("H*", substr($d, $i, 16));
$h =~ s/(....)/$1 /g;
printf "RAW %-40s\n", $h;
}
}
#########################
sub
getVersion()
{
my $d = getData("76");
printf "%d.%d\n", b($d,0), b($d,1);
}
#########################
sub
getTime()
{
my $d = getData("74");
printf("%4d-%02d-%02d %02d:%02d:%02d\n",
b($d,5)+2006, b($d,4), b($d,3),
b($d,0), b($d,1), b($d,2));
}
#########################
sub
getDevStatus()
{
die "Usage: getDevStatus devicenumber (1-12)\n" if(@ARGV != 3);
my $d = getData(sprintf("7a%02x",$ARGV[2]-1));
if($d eq ((pack('H*',"00") x 45) . pack('H*',"FF") x 6)) {
printf(" No device no. $ARGV[2] present\n");
return;
}
my $pulses=w($d,13);
my $ec=w($d,49) / 10;
my $cur_energy=0;
my $cur_power=0;
my $sum_h_energy=0;
my $sum_d_energy=0;
my $total_energy=0;
my $iec=0;
printf(" Readings (off 02): %d\n", w($d,2));
printf(" Nr devs (off 05): %d\n", b($d,6));
printf(" puls/5min (off 13): %d\n", $pulses);
printf(" Startblk (off 18): %d\n", b($d,18)+13);
#for (my $lauf = 19; $lauf < 45; $lauf += 2) {
# printf(" t wert (off $lauf): %d\n", w($d,$lauf));
#}
# The data must interpreted depending on the sensor type.
# Currently we use the EC value to quess the sensor type.
if ($ec eq 0) {
# Sensor 5..
$iec = 1000;
$cur_power = $pulses / 100;
} else {
# Sensor 1..4
$iec = $ec;
$cur_energy = $pulses / $ec; # ec = U/kWh
$cur_power = $cur_energy / 5 * 60; # 5minute interval scaled to 1h
printf(" cur.energy(off ): %.3f kWh\n", $cur_energy);
}
$sum_h_energy= dw($d,33) / $iec; # 33= pulses this our
$sum_d_energy= dw($d,37) / $iec; # 37= pulses today
$total_energy= dw($d,41) / $iec; # 41= pulses total
printf(" cur.power (off ): %.3f kW avr.\n", $cur_power);
printf(" energy(off 33): %.3f kWh/h\n", $sum_h_energy);
printf(" energy(off 37): %.3f kWh/d\n", $sum_d_energy);
printf(" ttl energy(off 41): %.3f kWh (total)\n", $total_energy);
printf(" Alarm PA (off 45): %d W\n", w($d,45));
printf(" Price CF (off 47): %0.2f (EUR/KWH)\n", w($d,47)/10000);
printf(" R/KW EC (off 49): %d\n", $ec);
hexdump($d);
}
#########################
sub
getDevPage()
{
die "Usage: getDevPage pagenumber [length] (default length is 264)\n"
if(@ARGV < 3);
my $l = (@ARGV > 3 ? $ARGV[3] : 264);
my $d = getData(sprintf("52%02x%02x0000%02x%02x",
$ARGV[2]%256, int($ARGV[2]/256), $l%256, int($l/256)));
hexdump($d);
}
#########################
sub
getDevData()
{
my $smooth = 1; # Set this to 0 to get the "real" values
die "Usage: getDevData devicenumber (1-12)\n" if(@ARGV != 3);
my $d = getData(sprintf("7a%02x",$ARGV[2]-1));
if($d eq ((pack('H*',"00") x 45) . pack('H*',"FF") x 6)) {
printf(" No device no. $ARGV[2] present\n");
return;
}
my $nrreadings = w($d,2);
if($nrreadings == 0) {
printf("No data to read (yet?)\n");
exit(0);
}
my $step = b($d,6);
my $start = b($d,18)+13;
my $end = $start + int(($nrreadings-1)/64)*$step;
my $div = w($d,49)/10;
if ($div eq 0) {
$div = 1;
}
#printf("Total $nrreadings, $start - $end, Nr $step\n");
my $tm = time()-(($nrreadings-1)*300);
my $backlog = 0;
for(my $p = $start; $p <= $end; $p += $step) {
#printf("Get page $p\n");
$d = getData(sprintf("52%02x%02x00000801", $p%256, int($p/256)));
#hexdump($d);
my $max = (($p == $end) ? ($nrreadings%64)*4+4 : 260);
my $step = b($d, 6);
for(my $off = 8; $off <= $max; $off += 4) {
$backlog++;
if($smooth && (w($d,$off+2) == 0xffff)) { # "smoothing"
next;
} else {
my $v = w($d,$off)*12/$div/$backlog;
my $f1 = b($d,$off+2);
my $f2 = b($d,$off+3);
my $f3 = w($d,$off+2);
while($backlog--) {
printf("%s %0.3f kWh (%d %d %d)\n", maketime($tm), $v,
($backlog?-1:$f1), ($backlog?-1:$f2), ($backlog?-1:$f3));
$tm += 300;
}
$backlog = 0;
}
}
}
}
sub
setPrice()
{
die "Usage: setPrice device value_in_cent\n"
if(@ARGV != 4);
my $d = $ARGV[2];
my $v = $ARGV[3];
$d = getData(sprintf("79%02x2f02%02x%02x", $d-1, $v%256, int($v/256)));
if(b($d,0) == 6) {
print("OK");
} else {
print("Error occured");
hexdump($d);
}
}
sub
setAlarm()
{
die "Usage: setAlarm device value_in_kWh\n"
if(@ARGV != 4);
my $d = $ARGV[2];
my $v = $ARGV[3];
$d = getData(sprintf("79%02x2d02%02x%02x", $d-1, $v%256, int($v/256)));
if(b($d,0) == 6) {
print("OK");
} else {
print("Error occured");
hexdump($d);
}
}
sub
setRperKW()
{
die "Usage: setRperKW device rotations_per_KW\n"
if(@ARGV != 4);
my $d = $ARGV[2];
my $v = $ARGV[3];
$v = $v * 10;
$d = getData(sprintf("79%02x3102%02x%02x", $d-1, $v%256, int($v/256)));
if(b($d,0) == 6) {
print("OK");
} else {
print("Error occured");
hexdump($d);
}
}
sub
reset()
{
my $d = getData("4545");
hexdump($d);
}
sub
get62()
{
my $d = getData("62");
hexdump($d);
}
sub
setTime()
{
my $a2 = '';
my $a3 = '';
if (@ARGV == 2) {
my @lt = localtime;
$a2 = sprintf ("%04d-%02d-%02d", $lt[5]+1900, $lt[4]+1, $lt[3]);
$a3 = sprintf ("%02d:%02d:%02d", $lt[2], $lt[1], $lt[0]);
} else {
die "Usage: setTime [time] (as YYYY-MM-DD HH:MM:SS, localtime if empty)\n"
if(@ARGV != 4);
$a2 = $ARGV[2];
$a3 = $ARGV[3];
}
my @d = split("-", $a2);
my @t = split(":", $a3);
my $s = sprintf("73%02x%02x%02x00%02x%02x%02x",
$d[2],$d[1],$d[0]-2000+0xd0,
$t[0],$t[1],$t[2]);
print("-> $s\n");
my $d = getData($s);
if(b($d,0) == 6) {
print("OK");
} else {
print("Error occured");
hexdump($d);
}
}

View File

@ -1,33 +0,0 @@
############################
# 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 'fht.ps'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set ylabel "Temperature (Celsius)"
set y2label "Actuator (%)"
set ytics nomirror
set y2tics
set y2label "Actuator (%)"
set title 'FHT log'
plot \
"< awk '/measured/{print $1, $4}' fht.log"\
using 1:2 axes x1y1 title 'Measured temperature' with lines,\
"< awk '/actuator/{print $1, $4+0}' fht.log"\
using 1:2 axes x1y2 title 'Actuator (%)' with lines\
pause 100000

View File

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

View File

@ -1,23 +0,0 @@
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)

Binary file not shown.

View File

@ -1,94 +0,0 @@
/*
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);
}

View File

@ -1,94 +0,0 @@
#!/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"

View File

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

View File

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

View File

@ -1,25 +0,0 @@
#!/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

View File

@ -1,77 +0,0 @@
#!/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);

View File

@ -1,15 +0,0 @@
#!/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:
# define rolzwo_not_off notify rolwzo /usr/local/bin/rolwzo_not_off.sh
FHZ="/usr/local/bin/fhem.pl 7072"
order="delete rolwzo_off"
DATESTRING=`date +"%H"`
[[ $DATESTRING > 16 ]] && $FHZ "$order"

View File

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

View File

@ -1,52 +0,0 @@
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'
],

View File

@ -1,89 +0,0 @@
#!/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";
}

View File

@ -1,6 +0,0 @@
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.

File diff suppressed because it is too large Load Diff

View File

@ -1,277 +0,0 @@
<!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>
<a href="#faq1">1. I am using fhem.pl with an fhz1000.pl config file and fhem.pl
won't start</a><br><br>
<a href="#faq2">2. I get "undefined" messages in the log after upgrading
fhem.pl</a><br><br>
<a href="#faq3">3. I switched on a FS20 device directly (without the remote),
but the fhem.pl did not noticed it. Is it a bug?</a><br><br>
<a href="#faq4">4. I have some FS20/FHT/HMS devices. How do I know their
housecode?</a><br><br>
<a href="#faq5">5. I have the code for my devices in the ELV notation, which
contains 1,2,3 and 4, but you require a hex code. How should I convert
it?</a><br><br>
<a href="#faq6">6. I replaced my FHZ1X00PC, now the FHT80b's does not work
anymore. Help me!</a><br><br>
<a href="#faq7">7. I can specify an optional ml/raincounter for a KS300. Why
do you think that 255 should be the default?</a><br><br>
<a href="#faq8">8. The time specification of the builtin at command is not very
flexible. Please add day/month/weekday to it.</a><br><br>
<a href="#faq9">9. I defined my FS20STR as an FHT device, but I do not get
any data from it.</a><br><br>
<a href="#faq10">10. How to convert the FHT8b code seen in its display to the
hex code needed by fhem.pl?</a><br><br>
<a href="#faq11">11. I'd like to use this sunrise/sunset stuff, can you help
me?</a><br><br>
<a href="#faq12">12. I'd like to switch on the ventilator if the FHT tells me its too hot. How to tell fhem to do that?</a><br><br>
<br>
<br>
<br>
<br>
<a name="faq1"></a>
<b>1. I am using fhem.pl with an fhz1000.pl config file and fhem.pl won't
start</b>
<ul>
The syntax changed, you have to modify you config file:
<ul>
<li>logfile/modpath/pidfile/port/verbose "renamed" to "attr global xx</li>
<ul>
<li>change logfile <xxx> to attr global logfile <xxx></li>
<li>change modpath <xxx> to attr global modpath <xxx></li>
<li>change pidfile <xxx> to attr global pidfilename <xxx></li>
<li>change port <xxx> to attr global port <xxx></li>
<li>change verbose <xxx> to attr global verbose <xxx></li>
</ul>
<li>savefile renamed to "attr global statefile" (<b>not</b> savefile)</li>
<li>at/notify "renamed" to "define at/notify"<br>
This means you have to give a name to each of your at's or
notify commands. E.g.:
<ul>
<li><code>at *07:00 set lamp on</code><br>
&nbsp;&nbsp;becomes<br>
<code>define wake_me at *07:00 set lamp on</code></li>
<li><code>notify fire:on "send_sms"</code><br>
&nbsp;&nbsp;becomes<br>
<code>define fire_alarm notify fire:on "send_sms"</code><br>
</ul>
This seems to be tedious at the beginning but you get easy
deletion and attribute specification for these commands.
</ul>
</ul>
<a name="faq2"></a>
<b>2. 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>
<a name="faq3"></a>
<b>3. 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>
<a name="faq4"></a>
<b>4. 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
device (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>
<a name="faq5"></a>
<b>5. I have the code for my devices in the ELV notation, which contains 1,2,3
and 4, but you require a hex code.<br> How should I convert it?</b>
<ul>
The code used by ELV is in the "quaternal" (?) system plus one added to each
digit, so you can even use the 4 button remote for programming. To convert,
you have two choices: the program four2hex in the contrib directory, or the
good old unix program bc.
<ul>
<li>From quaternal (ELV Remote) to hex (fhem.pl):<br>
<pre>
% bc
obase=16
ibase=4
&lt;elv number&gt;</pre>
where &lt;elv number&gt; is the number used on the remote, but 1
substracted from every digit (so each digit is between 0 and 3).</li>
<li>From hex (fhem.pl) to quaternal (ELV Remote):<br>
<pre>
% bc
ibase=16
obase=4
&lt;hex number&gt;</pre>
Now add 1 to each digit of the result, and prepend it with 1's if
it has less than 4 digits.</li> </ul>
</ul>
<a name="faq6"></a>
<b>6. I replaced my FHZ1X00PC, now the FHT80b's does not work anymore.<br>
Help me!</b>
<ul>
The FHT80b's are talking to a single FHZ1XXX device, which has a unique
"FHTcode". You have two choices: if you know the old FHTcode, then you can
set it, or you can tell the FHT80b to forget the old FHZ, and start talking
with the new one.
<ul>
<li>Set the FHTcode: The problem with this method is that I don't know how
to read out the value, we just can change it with<br>
<code>set FHZ FHTcode &lt;hex-code&gt;</code></li>
<li>Resync the FHT80b: Press PROG until "Sond" appears, then select "CEnt"
with the wheel, press PROG again, Select "nA" with the wheel, press PROG
again.</li>
</ul>
</ul>
<a name="faq7"></a>
<b>7. 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>
<a name="faq8"></a>
<b>8. 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>
<a name="faq9"></a>
<b>9. 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-for-timer events sent.
</ul>
<a name="faq10"></a>
<b>10. 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
obase=16
&lt;first two digits&gt;
&lt;last two digits&gt;</pre>
E.g The FHT8b code 1121 is 0b15 for the fhem.pl
</ul>
<a name="faq11"></a>
<b>11. I'd like to use this sunrise/sunset stuff, can you help me?</b>
<ul>
Copy contrib/99_SUNRISE_EL.pm into your FHEM directory.
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 lastinclude file with the command:
<pre>{sunrise_coord("<latitude>", "<longitude>", "") }</pre>
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.<br><br>
99_SUNRISE_EL.pm is the ExtraLight version of the original 99_SUNRISE.pm,
which needs the DateTime::Event::Sunrise perl module, which in turn is
usually difficult to install. If you still want to use the original module,
then the initialization string will be slightly different:
<pre>{sunrise_coord("<latitude>", "<longitude>", "Europe/Berlin") }</pre>
</ul>
<a name="faq12"></a>
<b>12. I'd like to switch on the ventilator if the FHT tells me its too hot. How to tell fhem to do that?</b>
<ul>
To get used to the methods, we do it step by step. Telnet to fhem, and type
the following:
<pre>
# Check simply the value. It is the same as seen in "list"
FHZ> {$value{myfht}}
measured-temp: 23.8 (Celsius)
# Get the second word, so we can compare it.
FHZ> { my @a = split(" ", $value{myfht});; $a[1] }
23.8
# Set the ventilator on now, if its too hot.
FHZ> { my @a = split(" ", $value{myfht});; fhem("set ventilator on") if($a[1] > 25.0) }
# Now do this regularly
FHZ> define chilldown at +*00:30:00 { my @a = split(" ", $value{myfht});; fhem("set ventilator on") if($a[1] > 25.0) }
# An alternative:
FHZ> define chilldown at +*00:30:00 { fhem("set ventilator on") if($value{myfht} gt "measured-temp: 25.0") }
</pre>
</ul>
</body>
</html>

View File

@ -1,267 +0,0 @@
<!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</h1>
GPL'd server to access devices like FHZ1000/FHZ1300,EM1010PC,WS300,SCIVT.
Formerly known as fhz1000.pl
<h2>News (as of =DATE=, Version =VERS=)</h2>
<ul>
<li>feature: added archivedir/archivecmd to the the main logfile
<li>feature: 99_Sunrise_EL.pm (does not need any Date modules)
<li>bugfix: seldom xmllist error resulting in corrupt xml (Martin/Peter, 4.9)
<li>bugfix: FHT mode holiday_short added (9.9, Dirk)
<li>bugfix: Modifying a device from its own trigger crashes (Klaus, 10.9)
<li>feature: webpgm2 output reformatted
<li>feature: webpgm2 displaying multiple plots
<li>feature: FHT lime-protection code discovered by Dirk (7.10)
<li>feature: softwarebuffer for FHT devices (Dirk 17.10)
<li>feature: FHT low temperatur warning and offset (Dirk 17.10)
<li>change: change FHT state into warnings (Dirk 17.10)<br>
NOTE: you'll get an undefined type state &amp; undefined type
unknown_85 message after upgrade, this will disappear at the
second start.</li>
<li>feature: Softwarebuffer code simplified (Rudi 22.11)
<li>bugfix: bug #12327 doppeltes my
<li>bugfix: set STATE from trigger
<li>bugfix: readings state vs STATE problem (xmllist/trigger)
<li>change: SUNRISE doc changed (99_SUNRISE.pm -> 99_SUNRISE_EL.pm)
<li>feature: support for the M232 ELV device (Boris, 25.11)
<li>feature: alternativ Quad-based numbers for the FS20 (Matthias, 24.11)
<li>feature: dummy type added (contrib/99_dummy.pm)
</ul>
</ul>
<h2>Description</h2>
<ul>
This program makes the FHZ1000/FHZ1300/WS300 and other 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>Via the FHZ module (with access to one or more FHZ1000/FHZ1300 device):
<ul>
<li>reading and sending FS20 events (on/off/dimming, timer commands)<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.<br>
Internal software buffer to prevent lost commands.<br>
</li>
<li>reading HMS data (HMS100-T,-TF,-WD,-MG,-TFK and RM100-2)</li>
<li>reading KS300 data</li>
</ul>
<b>Note:</b>The FHZ1350 WLAN is probably not working due to a prorietary
encryption.
</li>
<li>reading WS300 data, and up to 9 attached devices</li>
<li>reading EM1000WZ/EM1000EM data via an attached EM1010PC</li>
<li>reading attached SCIVT devices</li>
<li>reading attached M232 devices</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>
FAQ: <a href="http://www.koeniglich.de/fhem/faq.html">
http://www.koeniglich.de/fhem/faq.html</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 (webpgm3): <a href="http://www.martin-haas.de/fhz">
http://www.martin-haas.de/fhz</a><br>
CVS@berlios: <a href="http://developer.berlios.de/projects/fhem">
http://developer.berlios.de/projects/fhem</a><br>
LinViex (home automation frontend):
<a href="http://sourceforge.net/projects/linviex">
http://sourceforge.net/projects/linviex</a><br><br>
Device/OS Specific installation guides:<br>
<ul>
Linux driver installation:
<a href="http://www.koeniglich.de/fhem/linux.html">
http://www.koeniglich.de/fhem/linux.html</a><br>
Instructions for Nas/Routers (NSLU2):
<a href="http://www.martin-haas.de/fhz/nslu2fhz">
http://www.martin-haas.de/fhz/nslu2fhz</a><br>
Instructions for the Fritz!Box:
<a href="fritzbox.html">
http://www.koeniglich.de/fhem/fritzbox.html</a><br>
Instructions for the Allnet all6250:
<a href="http://wiki.dungeon.de/all6250_opennas_mit_fhem">
http://wiki.dungeon.de/all6250_opennas_mit_fhem</a><br>
</ul>
</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>
See <a href="http://www.koeniglich.de/fhem/linux.html">
http://www.koeniglich.de/fhem/linux.html</a><br>
For kernels older then 2.6.x apply the patch from the doc directory to your
kernel, recompile it 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>Copy additional modules from the contrib directory
(like 99_SUNRISE_EL.pm)</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), change at least the modpath
(<code>/usr/local/lib</code>) and define FHZ FHZ (<code>/dev/tts/USB0</code>)
parameters.</li>
<li>Start the server with <code>fhem.pl &lt;configfile&gt;</code></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)</h3>
<ul>
This frontend is CGI/CSS based. It has support for rooms, and FHT/KS300 logs.<br>
Screenshots: <a href="pgm2-1.png">one</a>, <a href="pgm2-2.png">two</a>.
<br><br>
<ul>
<li>Copy the file fhemweb.pl and *.gplot to your cgi-bin directory
(/home/httpd/cgi-bin), the icons (*.gif) to your httpd icons
(/home/httpd/icons), and commandref.html to the html directory
(/home/httpd/html).<br>
Note: The program looks for icons in the following order:
&lt;device-name&gt;.&lt;state&gt;, &lt;device-name&gt;,
&lt;device-type&gt;.&lt;state&gt;, &lt;device-type&gt;<br>
</li>
<li>If you want to have access to plotted logs, then make sure that
gnuplot is installed and set the logtype for the FileLog device
(see commandref.html and example/04_log). Copy the file
contrib/99_weblink.pm to the installed FHEM directory.
</li>
<li>Call &lt;your-site&gt;/cgi-bin/fhemweb.pl
</ul>
For special features like assigning devices to rooms see the README file.
</ul>
<h3>Web frontend 3 (webfrontend/pgm3)</h3>
<ul>
This frontend is PHP based and was contributed by Martin Haas.
Look at the webfrontends/pgm3/docs for more documentation or at
<a href="pgm3-0.5.1.png">this screenshot</a>. A lot more details can be
found on Martins page: <a href="http://www.martin-haas.de/fhz">
http://www.martin-haas.de/fhz</a>
<br><br>
<ul>
<li>Install PHP and enable it by commenting in the "LoadModule
phpX_module ..." directive in httpd.conf (perhaps it is already
done by your distro). Restart/reload httpd.</li>
<li>Create a directory (e.g.: /home/httpd/html/pgm3) and copy all the
files from the webfrontend/pgm3 to this directory.<br>Make sure that this
directory is writeable by the webserver!</li>
<li>Edit index.php (/home/httpd/html/pgm3/index.php), and check the
required settings section</li>
<li>If you want to have access to the FHT temperature logs, then:
<ul>
<li>Make sure gnuplot is installed</li>
<li>check the showgnuplot section in index.php</li>
<li>For each FHT device copy the file docs/gnuplot/gnuplot.wz to
gnuplot.fhtdevicename (to the /home/httpd/html/pgm3 directory) and
replace fht.log in this file with the absolute name of the current
logfile.</li>
</ul>
<li>Call &lt;your-site&gt;/pgm3/index.php</li>
</ul>
</ul>
<h3>Web frontend 4 (webfrontend/pgm4, the template)</h3>
<ul>
This frontend is PHP based and was contributed by Stefan Mayer. It won't work
for you without modification, it is meant as a template or as an example. See
the <a href="pgm4.gif">screenshot</a>. To install:
<ul>
<li>Copy the directory webfrontend/pgm4 to your html directory.</li>
<li>Install/enable PHP (see the description for frontend3)</li>
<li>Call the program with http://webserver/pgm4/fs20.php</li>
</ul>
Now you can go on, and modify it to suit your needs :-)
</ul>
</ul>
<h2>License:</h2>
<ul>
Copyright:<br>
<ul>
<li>Rudolf Koenig (r dot koenig at koeniglich dot de)</li>
<li>Raoul Matthiessen (webfrontends/pgm1)</li>
<li>Martin Haas (webfrontends/pgm3)</li>
</ul>
License: GPL (v2)
</ul>
</ul>
<h2>Misc:</h2>
<ul>
Thanks for Tosti for inspiration and numerous other people for help. <br>
</ul>
</body>
</html>

View File

@ -1,109 +0,0 @@
<!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><a href="fhem.html">FHEM</a> on the Fritz!Box</h1>
<h2>Description</h2>
<ul>
This document describes how to install <a href="fhem.html">FHEM</a> on the
fritzbox. The document and the port itself is in a very beginning stage.<br>
<br>
What works:<br>
<ul>
<li>The basic fhem.pl server with at commands, notify, logging (tested)</li>
<li>FHZ1000 and FHZ1300 (both tested)</li>
<li>FS20, FHT and KS300-2 (tested)</li>
<li>HMS (untested, but should work)</li>
<li>SunSet/SunRise.</li>
</ul>
<br>
What does not work right now:<br>
<ul>
<li>Automatic startup after reboot of the fritzbox</li>
<li>HTML Frontend. Planning a webfrontend/pgm2 "fhem" module, as do not
know how to start CGI programs from the builtin web browser.
<li>Gnuplot. No idea how to replace it, perhaps we compile a fritzbox
version</li>
<li>EM1010PC. I tried it without batteries, and I think the USB interface
cannot power an USB hub, an FHZ1300 and an EM1010PC together. The fritzbox
resets when trying to initialize the devices. More experiments needed.</li>
<li>WS300PC. Untested, don't have one.</li>
</ul>
</ul>
<h2>Howto</h2>
<ul>
Tested on the fritzbox 7170, with Firmware 29.04.33.<br>
<b>Note:</b>The kernel modules are for kernel 2.16.13.1, and perl is compiled
for uCLibc 0.9.28.<br><br>
Prerequisites:<br>
<ul>
<li>you need a fritzbox with an USB host port. Check your kernel version.
If it won't match the version above, see the "Compile tips" in this
document.</li>
<li>an USB hub (a small passive one is enough).</li>
<li>an FHZ1000 or FHZ1300</li>
<li>an USB stick, at least 64MB. As the fritzbox is USB 1.1 only,
the slowest is fast enough.</li>
<li>telnet access for the fritzbox. See the links on how to enable it.
<li>the complete fhem package from the links section.</li>
</ul>
<br>
Installation:<br>
<ul>
<li>Connect the USB stick to a PC, and unpack the content of the
fb_fhem_x.y.tar.gz in the root directory of the USB stick. You'll
get a perl 5.6.2 installation with just those modules wich are needed
by fhem, an empty 32MB swapfile with a swapon/swapoff command,
the fhem server with an empty configuration file, and an rc.fhem
script which should start everything.</li>
<li>Connect the USB stick and the FHZ1x00 via the USB hub to the
fritzbox.</li>
<li>Log in via telnet to the fritzbox.</li>
<li>Change into the directory /var/media/ftp/*Partition*/usr/fhem .</li>
<li>Execute the command rc.fhem.</li>
<li>Now you can login from your PC to this fhem server via:<br>
<ul>
telnet fritz.box 7072<br>
</ul>
and configure it.</li>
</ul>
</ul>
<h2>Compile tips</h2>
<ul>
<b>Note:</b> You don't need to compile anything if you have the correct
kernel and uclibc version.<br><br>
I compiled the ftdi_sio module with the help of the ds26-15.1 packages, see
the links.<br>
The ftdi_sio module had to be modified, as 2.16.13 does not contain the USB
ID's of the ELV devices.<br>
Compiling a working perl for the fritzbox was a nightmare. After compiling
5.8.8 I dicovered it has a strange bug: Appending numbers to strings won't
work on the fritzbox. This is why I compiled an "old" (5.6.2) one, which
seems to work perfectly. </ul>
<h2>Links</h2>
<ul>
<li>Complete fhem package for the fritzbox: <a href="fb_fhem_0.1.tar.gz">
fb_fhem_0.1.tar.gz</a></li>
<li>Telnet on the fritzbox:
<a href="http://www.ip-phone-forum.de/showthread.php?t=69245">
ip-phone-thread</a></li>
<li>Compiler for the fritzbox:
<a href="http://www.ip-phone-forum.de/showthread.php?t=142389">
ds26-15.1</a></li>
</body>
</html>

View File

@ -1,44 +0,0 @@
*** 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

View File

@ -1,142 +0,0 @@
<!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.pl - Hints for GNU/Linux</title>
</head>
<body style="background-color: white;">
<h2>fhem.pl - Hints for GNU/Linux</h2>
<p><b><a name="onedevice">One device</a></b><br>
If you connect one USB device (FHZ1000PC, FHZ1300PC, EM1010PC, WS300, ...)
to your GNU/Linux server you can use the regular <i>ftdi_sio</i> kernel module.
However, it may not recognize our device. Therefore you need to get the
<i>vendor</i> and <i>product</i> codes:
<code><br>
# lsusb<br>
...<br>
Bus 002 Device 002: ID <b>0403</b>:<b>e0e8</b> Future Technology Devices International, Ltd <br>
...<br>
</code><br>
Now you need to edit your <code>/etc/modprobe.conf</code> or
<code>/etc/modprobe.conf.local</code> file (depending on your distribution).
Add the following line to it:<br>
<code><br>
options ftdi_sio vendor=0x<b>0403</b> product=0x<b>e0e8</b><br>
</code><br>
Replace the vendor and product code with the output of the <i>lsusb</i> command.
The you load the module using:<br>
<code><br>
# modprobe ftdi_sio<br>
</code><br>
<p><b><a name="multipledevices">Multiple devices</a></b><br>
If you're using multiple USB devices (FHZ1000PC, FHZ1300PC, EM1010PC, WS300, ...)
you cannot use the methode above. You need to modify the ftdi_sio kernel module
to make it work. The following example was done with openSuSE 10.1:<br>
You need to have the kernel-source-<i>version</i> RPM of your
current kernel (see output of <code>uname -r</code>) installed.<br>
<code><br>
# cd /usr/src/linux<br>
# make cloneconfig<br>
# make modules_prepare<br>
# cp /boot/symvers-2.6.*-default.gz /usr/src/linux<br>
# mv symvers-2.6.*-default.gz Module.symvers.gz<br>
# gunzip /usr/src/linux/Module.symvers.gz<br>
# make modules_prepare<br>
# cd drivers/usb/serial<br>
</code>
For the EM1010PC you (may) need to add the following line:
<code><br>
# vi ftdi_sio.h<br>
...<br>
#define FTDI_ELV_WS500_PID 0xE0E9 /* PC-Wetterstation (WS 500) */<br>
<b>#define FTDI_ELV_EM1010PC_PID 0xE0EF /* EM 1010 PC */</b><br>
</code><br>
Now we need to uncomment some lines to enable all of our devices.
<code><br>
# vi ftdi_sio.c<br>
...<br>
{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS300PC_PID) }, <br>
{ USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) },<br>
{ USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_PID) }, <br>
{ USB_DEVICE(FTDI_VID, FTDI_ELV_EM1010PC_PID) },<br>
...<br>
</code><br>
Remove the <b>/*</b> and <b>*/</b> of your devices and save the file.
<br>
<code>
# cd /usr/src/linux<br>
</code>
Now you have 3 choices:<br>
<table border=1>
<tr><td>
<code>
# mv Module.symvers Module.symvers.notneeded<br>
# make M=drivers/usb/serial</code>
<td>
... to build the modules for all of <i>usb serial</i>.<br>
If you have a less powerfull machine like the ARM-Based NSLU2 then it is sufficient to only build the required module.
</td></tr>
<td><code>
# make modules</code>
</td><td>
... to build all modules (takes a long time).
</td></tr>
<tr><td>
<code>
# make driver/usb/serial/ftdi_sio.ko
</code>
</td><td>
... to build just the <i>ftdi_sio.ko</i> module. However, this does not seem to be working always.
</td></tr>
</table>
Once you have the module:<br>
<code><br>
# cd /lib/modules/<i>yourKernelVerion</i>/kernel/drivers/usb/serial<br>
# cp ftdi_sio.ko ftdi_sio.ko_backup<br>
# cp /usr/src/linux/drivers/usb/serial/ftdi_sio.ko .<br>
</code><br>
To make it become active you may need to stop applications (like fhem) who
are using the /dev/ttyUSB device and unload the module and load it again.<br>
<code><br>
# rmmod ftdi_so<br>
# modprobe ftdi_so<br>
</code><br>
You should now see multiple ttyUSB devices:
<code><br>
# ls -l /dev/ttyUSB*<br>
crw-rw---- 1 root uucp 188, 0 2007-02-11 23:00 /dev/ttyUSB0<br>
crw-rw---- 1 root uucp 188, 1 2007-02-11 23:00 /dev/ttyUSB1<br>
</code><br>
<p><b><a name="devicelinks">Device links</a></b><br>
If you're using multiple USB devices (FHZ, EM, WS...) it might occur that the
enumeration of the /dev/ttyUSB<i>n</i> numbers get mixed up if one of the
device is missing or after a reboot.<br>
Starting with kernel 2.6 the UDEV implements means for using virtual names
instead of the bare numbers.<br>
Edit the file <code>/etc/udev/rules.d/10-udev.rules</code> (create if necessary)
and insert the following lines:
<br>
If you use udev prior to version 103:<br>
<code>
KERNEL=="ttyUSB*", SYSFS{product}=="ELV FHZ 1300 PC", SYMLINK+="elv_fhz1300pc"<br>
KERNEL=="ttyUSB*", SYSFS{product}=="ELV EM 1010 PC", SYMLINK+="elv_em1010pc"<br>
</code><br>
Starting with udev 103 the SYSFS will be replaced by ATTRS:
<br>
<code>
KERNEL=="ttyUSB*", ATTRS{product}=="ELV FHZ 1300 PC", SYMLINK+="elv_fhz1300pc"<br>
KERNEL=="ttyUSB*", ATTRS{product}=="ELV EM 1010 PC", SYMLINK+="elv_em1010pc"<br>
</code><br>
Now you need to reload (rmmod/modprobe) the ftdio_sio kernel module to
use the device paths <code><b>/dev/elv_fhz1300pc</b></code> or
<code><b>/dev/elv_em1010pc</b></code> in your FHEM configuration file.
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

View File

@ -1,22 +0,0 @@
On the telnet prompt do:
{FS20_Parse(undef, "<code>");}
e.g.
{FS20_Parse(undef, "81xx04xx0101a0011234030011")}
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
81xx04xx0101a0011234030011 FS20 dev: 1234 button: 03 on (11)
To send it:
set FHZ raw 04 0101a0011234030011

View File

@ -1,28 +0,0 @@
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

View File

@ -1,74 +0,0 @@
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
=================================

View File

@ -1,102 +0,0 @@
// 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

View File

@ -1,60 +0,0 @@
// 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)

View File

@ -1,39 +0,0 @@
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

View File

@ -1,60 +0,0 @@
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

View File

@ -1,127 +0,0 @@
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.

View File

@ -1,14 +0,0 @@
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

View File

@ -1,17 +0,0 @@
=========================================
#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>
=========================================

View File

@ -1,18 +0,0 @@
#
# 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
attr global logfile /tmp/fhem-%Y-%m.log
attr global statefile /tmp/fhem.save # where to save the state of the devices
attr global verbose 3 # "normal" verbosity (min 1, max 5)
attr global port 7072 # our TCP/IP port (localhost only)
attr global modpath /usr/local/lib # 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

View File

@ -1,71 +0,0 @@
#
# 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
attr global logfile /tmp/fhem-%Y-%m.log
attr global statefile /tmp/fhem.save # where to save the state of the devices
attr global verbose 3 # "normal" verbosity
attr global port 7072 # our TCP/IP port (localhost only)
attr global modpath /usr/local/lib # 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 { fhem "set roll1,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") {\
fhem "set roll1 on-for-timer 10";;\
fhem "set roll2 on-for-timer 16";;\
} else { \
fhem "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
# $fhem 7072 "set roll1 on; at +00:00:21 set roll1 on"
# instead.
#
fhem=/usr/local/bin/fhem.pl
if test $1 = "on"; then
$fhem 7072 "set roll1 on-for-timer 10
$fhem 7072 "set roll2 on-for-timer 16
else
$fhem 7072 "set roll1,roll2 off"
fi

View File

@ -1,30 +0,0 @@
#
# 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
#
attr global logfile /tmp/fhem-%Y-%m.log
attr global statefile /tmp/fhem.save # where to save the state of the devices
attr global verbose 3 # "normal" verbosity
attr global port 7072 # our TCP/IP port (localhost only)
attr global modpath /usr/local/lib # 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.
define fhz_timer 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.
define wz_refresh at *04:00:00 set wz refreshvalues

View File

@ -1,53 +0,0 @@
#
# fhem.pl configfile
# Logging FS20/KS300 data
# See the file fht.gnuplot for displaying the logged data (or webfrontend/pgm2)
#
attr global logfile /tmp/fhem-%Y-%m.log
attr global statefile /tmp/fhem.save # where to save the state of the devices
attr global verbose 3 # "normal" verbosity
attr global port 7072 # our TCP/IP port (localhost only)
attr global modpath /usr/local/lib # 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).*
# Make it accessible from fhemweb.pl (webpgm2)
attr wzlog logtype fht:Temp
# ks300 log
define kslog FileLog /var/log/wz-%Y-%U.log ks1:.*H:.*
define avglog FileLog /var/log/avg.log ks1:.*avg.*
attr kslog logtype ks300_1:Temp/Hum,ks300_2:Rain/Wind
##############################
# 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.
define tmplog 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

View File

@ -1,25 +0,0 @@
#
# 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
# if there is no definition for it. Check the commandref.html define, Type HMS
# section for details
attr global logfile /tmp/fhem-%Y-%m.log
attr global statefile /tmp/fhem.save # where to save the state of the devices
attr global verbose 3 # "normal" verbosity (min 1, max 5)
attr global port 7072 # our TCP/IP port (localhost only)
attr global modpath /usr/local/lib # 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:.*
define smokealarm notify rm100:smoke.*on "wall "FIRE: @ %""
# Test the log/notify
# fhem.pl 7072 'trigger rm100 smoke on'

View File

@ -1,39 +0,0 @@
# These are only examples for the at and notify command
##################################
# absolute ones:
define a1 at 17:00:00 set lamp on # fhem command
define a2 at 17:00:00 { Log 1, "Teetime" } # Perl command
define a3 at 17:00:00 "/bin/echo "Teetime" > /dev/console" # shell command
define a4 at *17:00:00 set lamp on # repeat every day
##################################
# relative ones
define a5 at +00:00:10 set lamp on # switch the lamp on in 10 seconds
define a6 at +00:00:02 set lamp on-for-timer 1 # Blink once in 2 seconds
define a7 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_EL.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", "") }
define a8 at +*{sunset_rel()} set lamp on
define a9 at *23:00:00 set lamp off
##################################
# A more elegant solution, which even works if sunset is after 23:00
define a10 at +*{sunset_rel()} set lamp on-till 23:00
##################################
# Only do this on weekend. For the preset perl variables see commandref.html
define a11 at +*{sunset_rel()} { fhem("set lamp on-till 23:00") if($we) }
##################################
# Switch lamp1 and lamp2 on from 7:00 till 10 minutes after sunrise
define a12 at *07:00 set lamp1,lamp2 on-till {sunrise_abs(+600)}
##################################
# Blink 3 times if the piri sends a command
define n1 notify piri:on.* define a13 at +*{3}00:00:02 set lamp on-for-timer 1

View File

@ -1,112 +0,0 @@
###########################################################################
# Beispiel: Steuerung nach Sonnenzyklus mit Zeitfenster
#
# Aufgabenstellung: Ein Rolladen soll eine Stunde nach Sonnenuntergang
# schliessen, aber fruehestens um 20:00 und spaetestens um 22:00
#
# Loesungsansatz: Es werden zwei at-Jobs zu festen Zeiten eingeplant, um
# 20:00 und um 22:00, zusaetzlich existiert ein at-Job, der mit der
# variablen Zeit "sunset_rel(3600)" eingeplant ist. Die einzelnen Jobs
# verwenden ein benutzerdefiniertes Attribut "freigabe", um untereinander
# Informationen auszutauschen.
#
# Funktionsweise: Der erste ablaufende Job prueft den Zustand des Attributs
# "freigabe". Wenn es existiert, wird der Rolladen geschlossen und das
# Attribut geloescht. Wenn nicht, wird das Attribut gesetzt, der Rolladen
# aber nicht geschlossen. Der naechste Job findet dann ein gesetztes Attribut
# vor, schliesst den Rolladen und loescht das Atribut. Der 22:00-Job, der
# das Ende des Zeitfensters darstellt, loescht das Attribut und schliesst
# den Rolladen, falls noch nicht geschehen.
#
# Sonnenuntergang um 18:30:
# um 19:30 laeuft der variable Job und setzt das Attribut
# um 20:00 laeuft der fixe Job 1 und schliesst den Rolladen
# um 22:00 laeuft der fixe Job 2 (und veraendert nichts)
# Sonnenuntergang um 20:30:
# um 20:00 laeuft der fixe Job 1 und setzt das Attribut
# um 21:30 laeuft der variable Job und schliesst den Rolladen
# um 22:00 laeuft der fixe Job 2 (und veraendert nichts)
# Sonnenuntergang um 22:30:
# um 20:00 laeuft der fixe Job 1 und setzt das Attribut
# um 22:00 laeuft der fixe Job 2 und schliesst den Rolladen
# um 23:30 laeuft der variable Job (und veraendert nichts)
###########################################################################
# example: sunset-dependent action within fixed-time boundaries
#
# task: A shutter is to be closed one hour past sunset, but not before
# 20:00 and at 22:00 at the latest.
#
# solution: Two fixed-time jobs at 20:00 and 22:00, respectively, mark the
# desired "window of opportunity". A time-variable job is scheduled for one
# hour past sunset ("sunset_rel(3600)"). The jobs use a user defined attribute
# named "freigabe" ("permission" in german) to exchange information.
# How it works: The first job checks the status of the attribute. If it's set,
# the shutter is closed and the attribute is deleted. If the attribute doesn't
# exist, it is set but the shutter will not be closed. The next job running
# then finds the attribute set and therefore closes the shutter and deletes
# the attribute. The job running at 22:00 unconditionally deletes the attribute
# and closes the shutter, if it's still open.
#
# sunset at 18:30:
# at 19:30 the time-variable job runs and sets the attribute
# at 20:00 fixed job 1 runs and closes the shutter
# at 22:00 fixed job 2 runs (and changes nothing)
# sunset at 20:30:
# at 20:00 fixed job 1 runs and sets the attribute
# at 21:30 the time-variable job runs and closes the shutter
# at 22:00 fixed job 2 runs (and changes nothing)
# sunset at 22:30:
# at 20:00 fixed job 1 runs and sets the attribute
# at 22:00 fixed job 2 runs and closes the shutter
# at 23:30 the time-variable job runs (and changes nothing)
###########################################################################
# Globale Einstellungen
# global settings
attr global logfile /var/log/fhem/fhem.log
attr global statefile /var/cache/fhem/fhem.save
attr global pidfilename /var/run/fhem.pid
attr global verbose 3
attr global port 7072
attr global modpath /usr/local/lib
# Die Definition des Attributs "freigabe"
# definition of attribute "freigabe"
attr global userattr freigabe
define FHZ FHZ /dev/ttyUSB0
{ sunrise_coord("10.000", "53.550", "") }
# devices
define roll_eg_wz1 FS20 fb02 0c fg f2 lm 8f
##########################################################################
# Timing-Funktionen
# timed jobs
##########################################################################
define roll_wz1_off1 at *20:00:00 { if( $value{roll_eg_wz1} ne "off" ) { \
if( $attr{roll_eg_wz1}{freigabe} ) { \
fhem("set roll_eg_wz1 off");; \
fhem("delattr roll_eg_wz1 freigabe") \
} else { \
fhem("attr roll_eg_wz1 freigabe") \
} \
} }
define roll_wz1_off2 at +*{sunset_rel(+3600)} { if( $value{roll_eg_wz1} ne "off" ) { \
if( $attr{roll_eg_wz1}{freigabe} ) { \
fhem("set roll_eg_wz1 off");; \
fhem("delattr roll_eg_wz1 freigabe") \
} else { \
fhem("attr roll_eg_wz1 freigabe") \
} \
} }
define roll_wz1_off3 at *22:00:00 { fhem("set roll_eg_wz1 off") if($value{roll_eg_wz1} ne "off");; \
fhem("delattr roll_eg_wz1 freigabe") }

File diff suppressed because it is too large Load Diff

View File

@ -1,22 +0,0 @@
#Sun Jun 24 13:03:37 2007
attr global logfile -
attr global modpath .
attr global port 7072 global
attr global statefile test/fhem.save
attr global verbose 3
define FHZ FHZ none
defattr
define btn4 FS20 1234 03
define cellar FS20 1234 13
define fl FHT 1236
define floor.lamp FS20 1234 00
define marqee FS20 1234 07
define n_btn4 notify btn4 /usr/local/bin/shared/setroll "%"
define tf1 HMS 1237
define window.lamp FS20 1234 02
define wz FHT 1235
define x SCIVT none
defattr

View File

@ -1,12 +0,0 @@
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

View File

@ -1,79 +0,0 @@
#Tue Oct 2 21:47:26 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 2007-05-17 16:58:46 state on
setstate cellar on
setstate cellar 2007-09-13 09:10:33 state on
setstate fl measured-temp: 21.6 (Celsius)
setstate fl 2006-03-29 23:02:30 actuator 00%
setstate fl 2006-03-26 08:50:54 day-temp 21.5 (Celsius)
setstate fl 2006-03-29 23:01:06 desired-temp 18.0 (Celsius)
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:48:48 init 255
setstate fl 2006-03-29 23:04:27 measured-temp 21.6 (Celsius)
setstate fl 2006-03-26 08:50:57 mode auto
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:54 night-temp 18.0 (Celsius)
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-29 23:04:28 state Bat: ok, Window: closed
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:47 thu-from1 06:00
setstate fl 2006-03-26 08:50:48 thu-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:55 unknown_85 4
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:55 windowopen-temp 12.0 (Celsius)
setstate floor.lamp off
setstate floor.lamp 2007-09-28 22:12:07 state off
setstate global <no definition>
setstate marqee on
setstate marqee 2006-04-01 12:46:02 state on
setstate n_btn4 disabled
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 humidity 31.3 (%)
setstate tf1 2006-04-11 09:48:48 temperature 20.3 (Celsius)
setstate tf1 2006-04-11 09:48:48 type HMS100TF
setstate window.lamp ???
setstate wz measured-temp: 22.4 (Celsius)
setstate wz 2006-03-29 23:04:17 actuator 00%
setstate wz 2006-03-26 08:52:30 day-temp 22.0 (Celsius)
setstate wz 2006-03-29 23:02:48 desired-temp 18.0 (Celsius)
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:48:38 init 255
setstate wz 2006-03-29 22:54:38 measured-temp 22.4 (Celsius)
setstate wz 2006-03-26 08:52:33 mode auto
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:52:31 night-temp 18.0 (Celsius)
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-29 22:54:38 state Bat: ok, Window: closed
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: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:34 tue-from1 06:00
setstate wz 2006-03-26 08:50:35 tue-to1 23:00
setstate wz 2006-03-26 08:52:31 unknown_85 4
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:52:31 windowopen-temp 12.0 (Celsius)
setstate x 13.66 0.0 30 13.62 15.09 -0.2 2.8
setstate x 2007-10-02 21:46:41 Is 0.0
setstate x 2007-10-02 21:46:41 Temp 30
setstate x 2007-10-02 21:46:41 Vs 13.66
setstate x 2007-10-02 21:46:41 maxI 2.8
setstate x 2007-10-02 21:46:41 maxV 15.09
setstate x 2007-10-02 21:46:41 minI -0.2
setstate x 2007-10-02 21:46:41 minV 13.62

View File

@ -1,21 +0,0 @@
attr global logfile -
attr global port 7072
attr global verbose 3
attr global statefile test/fhem_small.save
attr global modpath .
attr global pidfilename test/fhz.pid
define FHZ FHZ none
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).*
define n_btn4 notify btn4 /usr/local/bin/shared/setroll "%"

View File

@ -1,39 +0,0 @@
#Sat Apr 14 10:33:04 2007
setstate FHZ Initialized
setstate btn4 off
setstate btn4 2006-04-15 11:46:39 state off
setstate cellar.lamp on
setstate cellar.lamp 2006-03-29 12:05:34 state on
setstate floor.lamp on
setstate floor.lamp 2007-01-26 10:40:17 state on
setstate global <no definition>
setstate n_btn4 active
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 state on
setstate wz measured-temp: 22.4 (Celsius)
setstate wz 2006-03-29 23:04:17 actuator 00%
setstate wz 2006-03-26 08:52:30 day-temp 22.0 (Celsius)
setstate wz 2006-03-29 23:02:48 desired-temp 18.0 (Celsius)
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:48:38 init 255
setstate wz 2006-03-29 22:54:38 measured-temp 22.4 (Celsius)
setstate wz 2006-03-26 08:52:33 mode auto
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:52:31 night-temp 18.0 (Celsius)
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-29 22:54:38 state Bat: ok, Window: closed
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: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:34 tue-from1 06:00
setstate wz 2006-03-26 08:50:35 tue-to1 23:00
setstate wz 2006-03-26 08:52:31 unknown_85 4
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:52:31 windowopen-temp 12.0 (Celsius)

View File

@ -1 +0,0 @@
21698

View File

@ -1,423 +0,0 @@
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%

View File

@ -1,160 +0,0 @@
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%

View File

@ -1,916 +0,0 @@
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

View File

@ -1,526 +0,0 @@
2007-03-12_19:06:11 ks300 T: 5.6 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_19:11:13 ks300 T: 5.3 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_19:16:00 ks300 T: 5.6 H: 59 W: 1.6 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_19:21:01 ks300 T: 5.8 H: 59 W: 0.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_19:26:02 ks300 T: 5.6 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_19:31:13 ks300 T: 5.7 H: 59 W: 1.1 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_19:36:10 ks300 T: 5.7 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-12_19:41:01 ks300 T: 5.4 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_19:46:05 ks300 T: 5.3 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_19:51:05 ks300 T: 5.1 H: 62 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_19:56:05 ks300 T: 4.7 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_20:01:05 ks300 T: 4.7 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 2
2007-03-12_20:06:11 ks300 T: 4.7 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 4
2007-03-12_20:11:11 ks300 T: 4.7 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_20:16:11 ks300 T: 4.6 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_20:21:28 ks300 T: 4.4 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_20:26:13 ks300 T: 4.4 H: 65 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-12_20:31:13 ks300 T: 4.3 H: 65 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_20:36:13 ks300 T: 4.5 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_20:41:13 ks300 T: 4.5 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-12_20:46:13 ks300 T: 4.4 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_20:51:13 ks300 T: 4.5 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_20:56:13 ks300 T: 4.6 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_21:01:13 ks300 T: 4.6 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_21:41:09 ks300 T: 4.5 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_21:46:09 ks300 T: 4.5 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_21:51:09 ks300 T: 4.3 H: 65 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_21:56:09 ks300 T: 4.3 H: 65 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_22:11:08 ks300 T: 4.3 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_22:16:08 ks300 T: 4.4 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_22:21:08 ks300 T: 4.4 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_22:26:08 ks300 T: 4.4 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_22:31:08 ks300 T: 4.5 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_22:36:08 ks300 T: 4.6 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_22:41:08 ks300 T: 4.9 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_22:46:08 ks300 T: 4.9 H: 62 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_22:51:08 ks300 T: 5.1 H: 62 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_22:56:08 ks300 T: 5.1 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_23:01:08 ks300 T: 4.9 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_23:06:08 ks300 T: 4.9 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_23:11:08 ks300 T: 5.1 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_23:16:08 ks300 T: 4.9 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_23:21:08 ks300 T: 4.8 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_23:26:08 ks300 T: 4.7 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_23:31:08 ks300 T: 4.6 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_23:36:08 ks300 T: 4.4 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_23:41:08 ks300 T: 4.3 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_23:46:08 ks300 T: 4.2 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_23:51:08 ks300 T: 4.5 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-12_23:56:08 ks300 T: 4.6 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_00:01:08 ks300 T: 4.4 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_00:06:08 ks300 T: 4.5 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_00:11:08 ks300 T: 4.7 H: 58 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_00:16:08 ks300 T: 4.4 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_00:21:08 ks300 T: 4.3 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_00:26:08 ks300 T: 4.1 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_00:31:08 ks300 T: 4.2 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_00:36:08 ks300 T: 4.2 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_00:41:08 ks300 T: 4.3 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_00:46:08 ks300 T: 4.4 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_00:51:08 ks300 T: 4.4 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_00:56:08 ks300 T: 4.3 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_01:01:08 ks300 T: 4.1 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_01:06:08 ks300 T: 4.2 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_01:11:08 ks300 T: 4.1 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_01:16:08 ks300 T: 4.2 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_01:21:08 ks300 T: 4 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_01:26:08 ks300 T: 4 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_01:31:08 ks300 T: 4.2 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_01:36:08 ks300 T: 4.6 H: 57 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_01:41:08 ks300 T: 4.4 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_01:46:08 ks300 T: 4.2 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_01:51:08 ks300 T: 4.3 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_01:56:08 ks300 T: 4.1 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_02:01:08 ks300 T: 3.7 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_02:06:08 ks300 T: 4 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_02:11:08 ks300 T: 3.9 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_02:16:08 ks300 T: 3.6 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_02:21:08 ks300 T: 3.6 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_02:26:08 ks300 T: 3.8 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_02:31:08 ks300 T: 3.9 H: 62 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_02:36:08 ks300 T: 3.8 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_02:41:08 ks300 T: 3.8 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_02:46:08 ks300 T: 3.8 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_02:51:08 ks300 T: 4 H: 62 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_02:56:08 ks300 T: 4.5 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_03:01:08 ks300 T: 4.5 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_03:06:08 ks300 T: 4.3 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_03:11:08 ks300 T: 4.4 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_03:16:08 ks300 T: 4.2 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_03:21:08 ks300 T: 3.9 H: 62 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_03:26:08 ks300 T: 3.8 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_03:31:08 ks300 T: 4.2 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_03:36:08 ks300 T: 4.4 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_03:41:08 ks300 T: 4.6 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_03:46:08 ks300 T: 4.6 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_03:51:08 ks300 T: 4.4 H: 62 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_03:56:08 ks300 T: 4 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_04:01:08 ks300 T: 3.6 H: 65 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_04:06:08 ks300 T: 3.3 H: 66 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_04:11:08 ks300 T: 3.5 H: 66 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_04:16:08 ks300 T: 3.6 H: 65 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_04:21:08 ks300 T: 3.9 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_04:26:08 ks300 T: 3.5 H: 65 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_04:31:08 ks300 T: 3.3 H: 66 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_04:35:59 ks300 T: 3.2 H: 66 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_04:40:59 ks300 T: 3.2 H: 65 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_04:45:59 ks300 T: 3.5 H: 65 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_04:50:59 ks300 T: 3.3 H: 65 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_04:55:59 ks300 T: 3.7 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_05:00:59 ks300 T: 3.7 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_05:05:59 ks300 T: 3.6 H: 62 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_05:10:59 ks300 T: 3.7 H: 62 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_05:15:59 ks300 T: 3.6 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_05:20:59 ks300 T: 3.4 H: 62 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_05:25:59 ks300 T: 3.8 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_05:30:59 ks300 T: 3.6 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_05:35:59 ks300 T: 3.7 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_05:40:59 ks300 T: 3.9 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_05:45:59 ks300 T: 3.7 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_05:50:59 ks300 T: 3.5 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_05:55:59 ks300 T: 3.4 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_06:00:59 ks300 T: 3.3 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_06:05:59 ks300 T: 3.5 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_06:10:59 ks300 T: 3.5 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_06:15:59 ks300 T: 3.9 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_06:20:59 ks300 T: 3.9 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_06:25:59 ks300 T: 3.5 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_06:30:59 ks300 T: 3.1 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_06:40:59 ks300 T: 2.7 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_06:45:59 ks300 T: 2.7 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_06:50:59 ks300 T: 2.6 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_06:55:59 ks300 T: 2.7 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_07:00:59 ks300 T: 3.1 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_07:05:59 ks300 T: 3.2 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_07:10:59 ks300 T: 3.2 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_07:15:59 ks300 T: 3.3 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_07:20:59 ks300 T: 3.3 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_07:25:59 ks300 T: 3.3 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_07:30:59 ks300 T: 3.5 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_07:35:59 ks300 T: 4.4 H: 62 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_07:40:59 ks300 T: 5.9 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_07:45:59 ks300 T: 6.3 H: 58 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_07:50:59 ks300 T: 6.2 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_07:55:59 ks300 T: 6 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_08:00:59 ks300 T: 6 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_08:05:59 ks300 T: 6.1 H: 58 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_08:10:59 ks300 T: 6.3 H: 57 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_08:15:59 ks300 T: 8.8 H: 54 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_08:20:59 ks300 T: 9.8 H: 50 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_08:25:59 ks300 T: 10.8 H: 50 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_08:30:59 ks300 T: 12.2 H: 46 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_08:35:59 ks300 T: 13.1 H: 42 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_08:40:59 ks300 T: 13.5 H: 39 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_08:45:59 ks300 T: 14 H: 38 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_08:50:59 ks300 T: 12.3 H: 38 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_08:55:59 ks300 T: 11.2 H: 40 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_09:00:59 ks300 T: 11 H: 41 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_09:05:59 ks300 T: 10.6 H: 43 W: 0.2 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_09:10:59 ks300 T: 11 H: 42 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_09:15:59 ks300 T: 11.3 H: 42 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_09:20:59 ks300 T: 11.5 H: 42 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_09:25:59 ks300 T: 11.6 H: 42 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_09:30:59 ks300 T: 11.4 H: 43 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_09:35:59 ks300 T: 12.3 H: 42 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_09:40:59 ks300 T: 11.9 H: 41 W: 0.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_09:46:05 ks300 T: 11.3 H: 43 W: 0.8 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_09:51:05 ks300 T: 11.2 H: 41 W: 0.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_09:56:05 ks300 T: 11.9 H: 41 W: 0.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_10:01:05 ks300 T: 11.6 H: 44 W: 0.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_10:06:05 ks300 T: 11.5 H: 43 W: 1.3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_10:11:05 ks300 T: 11.5 H: 42 W: 1.1 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_10:16:05 ks300 T: 11.5 H: 42 W: 6.1 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_10:21:05 ks300 T: 11.5 H: 42 W: 14.1 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_10:26:05 ks300 T: 11.4 H: 42 W: 3.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_10:31:05 ks300 T: 11.4 H: 44 W: 2.7 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_10:36:05 ks300 T: 11.6 H: 45 W: 3.3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_10:41:05 ks300 T: 11.4 H: 46 W: 5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_10:46:05 ks300 T: 11.6 H: 47 W: 3.3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_10:51:05 ks300 T: 12.2 H: 46 W: 0.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_10:56:05 ks300 T: 12.4 H: 47 W: 3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_11:01:05 ks300 T: 11.8 H: 46 W: 2.2 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_11:06:05 ks300 T: 11.6 H: 47 W: 4.1 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_11:11:05 ks300 T: 11.6 H: 47 W: 3.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_11:16:05 ks300 T: 11.4 H: 47 W: 4.7 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_11:21:05 ks300 T: 11.4 H: 45 W: 4.7 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_11:26:05 ks300 T: 11.8 H: 48 W: 3.3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_11:31:05 ks300 T: 11.9 H: 47 W: 3.6 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_11:36:05 ks300 T: 11.6 H: 49 W: 4.4 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_11:41:05 ks300 T: 11.4 H: 48 W: 4.7 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_11:46:05 ks300 T: 11.6 H: 49 W: 4.7 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_11:51:05 ks300 T: 11.6 H: 48 W: 4.1 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_11:56:05 ks300 T: 11.5 H: 47 W: 3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_12:01:05 ks300 T: 11.7 H: 46 W: 2.2 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_12:06:05 ks300 T: 11.8 H: 44 W: 16.6 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_12:11:05 ks300 T: 11.7 H: 46 W: 3.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_12:16:05 ks300 T: 11.4 H: 45 W: 5.2 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_12:21:05 ks300 T: 12.3 H: 44 W: 2.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_12:26:05 ks300 T: 12.2 H: 42 W: 3.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_12:31:05 ks300 T: 12.3 H: 41 W: 3.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_12:36:05 ks300 T: 12.3 H: 42 W: 3.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_12:41:05 ks300 T: 12.5 H: 41 W: 4.1 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_12:46:05 ks300 T: 12.2 H: 41 W: 17.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_12:51:05 ks300 T: 12.6 H: 41 W: 3.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_12:56:05 ks300 T: 12.4 H: 42 W: 4.7 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_13:01:05 ks300 T: 12.4 H: 44 W: 4.4 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_13:06:05 ks300 T: 12.6 H: 44 W: 4.7 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_13:11:05 ks300 T: 12.7 H: 43 W: 3.3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_13:16:05 ks300 T: 12.7 H: 44 W: 4.7 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_13:21:05 ks300 T: 12.5 H: 42 W: 5 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_13:26:05 ks300 T: 13.6 H: 43 W: 0.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_13:31:05 ks300 T: 13.4 H: 43 W: 2.2 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_13:36:05 ks300 T: 13.7 H: 43 W: 1.3 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_13:41:05 ks300 T: 14.2 H: 41 W: 1.1 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_13:46:05 ks300 T: 13.6 H: 42 W: 3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_13:51:05 ks300 T: 12.6 H: 46 W: 5.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_13:56:05 ks300 T: 12.2 H: 45 W: 6.6 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_14:01:05 ks300 T: 12.4 H: 45 W: 6.1 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_14:06:05 ks300 T: 12.4 H: 46 W: 5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_14:11:05 ks300 T: 12.8 H: 45 W: 4.1 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_14:16:05 ks300 T: 13 H: 44 W: 2.7 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_14:21:05 ks300 T: 12.9 H: 42 W: 3.6 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_14:26:05 ks300 T: 13 H: 43 W: 3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_14:31:05 ks300 T: 13.2 H: 42 W: 1.9 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_14:36:05 ks300 T: 13.3 H: 41 W: 8.3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_14:41:05 ks300 T: 13.4 H: 41 W: 2.7 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_14:46:05 ks300 T: 13.6 H: 41 W: 1.3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_14:51:05 ks300 T: 13.7 H: 42 W: 1.6 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_14:56:05 ks300 T: 13.2 H: 41 W: 3.6 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_15:01:05 ks300 T: 13.3 H: 40 W: 4.4 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_15:06:05 ks300 T: 13.2 H: 42 W: 2.7 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_15:11:05 ks300 T: 13.3 H: 40 W: 3.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_15:16:05 ks300 T: 13.3 H: 40 W: 3.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_15:21:05 ks300 T: 13.5 H: 41 W: 2.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_15:26:05 ks300 T: 14.2 H: 41 W: 0.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_15:31:05 ks300 T: 13.6 H: 39 W: 3.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_15:36:05 ks300 T: 13.5 H: 39 W: 2.2 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_15:41:05 ks300 T: 13.4 H: 39 W: 2.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_15:46:05 ks300 T: 13.5 H: 38 W: 3.3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_15:51:05 ks300 T: 13.7 H: 38 W: 2.7 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_15:56:05 ks300 T: 13.7 H: 37 W: 3.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_16:01:05 ks300 T: 13.5 H: 38 W: 3.6 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_16:06:05 ks300 T: 13.5 H: 40 W: 3.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_16:11:05 ks300 T: 14.1 H: 39 W: 0.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_16:16:05 ks300 T: 14.2 H: 38 W: 1.1 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_16:21:05 ks300 T: 13.8 H: 37 W: 4.1 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_16:30:56 ks300 T: 14 H: 36 W: 1.3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_16:35:56 ks300 T: 13.7 H: 39 W: 1.9 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_16:40:56 ks300 T: 13.9 H: 37 W: 0.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_16:45:56 ks300 T: 13.4 H: 38 W: 3.3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_16:50:56 ks300 T: 13.6 H: 36 W: 2.2 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_16:55:56 ks300 T: 13.9 H: 34 W: 0.2 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_17:00:56 ks300 T: 13.9 H: 32 W: 0.8 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_17:05:56 ks300 T: 14 H: 32 W: 0.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_17:10:56 ks300 T: 14.1 H: 31 W: 0.2 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_17:15:56 ks300 T: 13.7 H: 32 W: 0.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_17:20:56 ks300 T: 13.6 H: 34 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_17:25:56 ks300 T: 13.2 H: 34 W: 0.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_17:30:56 ks300 T: 13.2 H: 34 W: 0.2 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_17:35:56 ks300 T: 12.7 H: 38 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_17:40:56 ks300 T: 12.4 H: 40 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_17:45:56 ks300 T: 11.2 H: 44 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_17:50:56 ks300 T: 11.2 H: 46 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_17:55:56 ks300 T: 11.2 H: 47 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_18:00:56 ks300 T: 11.6 H: 46 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_18:05:56 ks300 T: 12 H: 45 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_18:10:56 ks300 T: 11.7 H: 46 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_18:15:56 ks300 T: 11.6 H: 46 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_18:21:02 ks300 T: 11.6 H: 46 W: 0 R: 28.9 IR: no Bat: Ok LR: 3
2007-03-13_18:26:02 ks300 T: 10.5 H: 49 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_18:31:02 ks300 T: 9.9 H: 50 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_18:36:02 ks300 T: 9.5 H: 52 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_18:41:02 ks300 T: 9.2 H: 52 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_18:46:02 ks300 T: 8.8 H: 54 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_18:51:02 ks300 T: 8.8 H: 54 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_18:56:02 ks300 T: 8.6 H: 55 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_19:01:02 ks300 T: 8.5 H: 56 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_19:06:02 ks300 T: 8.2 H: 57 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_19:11:02 ks300 T: 8 H: 57 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_19:16:02 ks300 T: 7.8 H: 58 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_19:21:02 ks300 T: 7.7 H: 58 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_19:26:02 ks300 T: 7.5 H: 58 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_19:31:02 ks300 T: 7.4 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_19:36:02 ks300 T: 7.3 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_19:41:02 ks300 T: 7.3 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_19:46:02 ks300 T: 7.3 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_19:51:02 ks300 T: 7.4 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_19:56:02 ks300 T: 7.4 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_20:01:02 ks300 T: 7.4 H: 58 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_20:06:02 ks300 T: 7.5 H: 56 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_20:11:02 ks300 T: 7.6 H: 56 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_20:16:02 ks300 T: 7.6 H: 55 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_20:21:02 ks300 T: 7.9 H: 54 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_20:26:02 ks300 T: 7.8 H: 54 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_20:31:02 ks300 T: 7.6 H: 55 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_20:36:02 ks300 T: 7.4 H: 55 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_20:41:02 ks300 T: 7.5 H: 55 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_20:46:02 ks300 T: 7.3 H: 56 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_20:51:02 ks300 T: 7.6 H: 55 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_20:56:02 ks300 T: 7.7 H: 55 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_21:01:02 ks300 T: 7.6 H: 55 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_21:06:02 ks300 T: 7.5 H: 56 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_21:11:02 ks300 T: 7.5 H: 56 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_21:16:02 ks300 T: 7.4 H: 57 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_21:21:02 ks300 T: 7.4 H: 57 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_21:26:02 ks300 T: 7.5 H: 57 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_21:31:02 ks300 T: 7.4 H: 58 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_21:36:02 ks300 T: 7.2 H: 58 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_21:41:02 ks300 T: 7.4 H: 58 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_21:46:02 ks300 T: 7.4 H: 58 W: 0 R: 28.9 IR: no Bat: Ok LR: 2
2007-03-13_21:51:02 ks300 T: 7.5 H: 57 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_21:56:02 ks300 T: 7.3 H: 57 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_22:01:02 ks300 T: 7.4 H: 57 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_22:06:02 ks300 T: 7.2 H: 58 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_22:11:02 ks300 T: 7.1 H: 58 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_22:16:02 ks300 T: 6.8 H: 58 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_22:21:02 ks300 T: 6.6 H: 58 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_22:26:02 ks300 T: 6.5 H: 58 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_22:31:02 ks300 T: 6.3 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_22:36:02 ks300 T: 6.4 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_22:41:02 ks300 T: 6.3 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_22:46:02 ks300 T: 6 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_22:51:02 ks300 T: 6 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_22:56:02 ks300 T: 6.4 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_23:01:02 ks300 T: 6.6 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_23:06:02 ks300 T: 6.5 H: 60 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_23:11:02 ks300 T: 6.1 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_23:16:02 ks300 T: 5.9 H: 62 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_23:21:02 ks300 T: 5.7 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_23:26:02 ks300 T: 5.6 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_23:31:02 ks300 T: 5.6 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_23:36:02 ks300 T: 5.8 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_23:41:02 ks300 T: 5.9 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_23:46:02 ks300 T: 6 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-13_23:51:02 ks300 T: 6 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-13_23:56:02 ks300 T: 6 H: 62 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_00:01:02 ks300 T: 6 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_00:06:02 ks300 T: 6 H: 62 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_00:11:02 ks300 T: 6.2 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_00:16:02 ks300 T: 6.3 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_00:21:02 ks300 T: 6.4 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_00:26:02 ks300 T: 6.2 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_00:31:02 ks300 T: 6 H: 62 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_00:36:02 ks300 T: 5.8 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_00:41:02 ks300 T: 5.6 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_00:46:02 ks300 T: 5.5 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_00:51:02 ks300 T: 5.4 H: 65 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_00:56:02 ks300 T: 5.5 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_01:01:02 ks300 T: 5.6 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_01:06:02 ks300 T: 5.6 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_01:11:02 ks300 T: 5.4 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_01:16:02 ks300 T: 5.2 H: 65 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_01:21:02 ks300 T: 4.8 H: 67 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_01:26:02 ks300 T: 4.6 H: 68 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_01:31:02 ks300 T: 4.6 H: 68 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_01:36:02 ks300 T: 4.6 H: 69 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_01:41:02 ks300 T: 4.5 H: 69 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_01:46:02 ks300 T: 4.4 H: 69 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_01:51:02 ks300 T: 4.4 H: 70 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_01:56:02 ks300 T: 4.4 H: 69 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_02:01:02 ks300 T: 4.3 H: 70 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_02:06:02 ks300 T: 4.4 H: 69 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_02:10:53 ks300 T: 4.3 H: 69 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_02:15:53 ks300 T: 4.1 H: 70 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_02:20:53 ks300 T: 3.9 H: 70 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_02:25:53 ks300 T: 3.8 H: 70 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_02:30:53 ks300 T: 3.7 H: 71 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_02:35:53 ks300 T: 3.7 H: 71 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_02:40:53 ks300 T: 3.9 H: 70 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_02:45:53 ks300 T: 4 H: 70 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_02:50:53 ks300 T: 4.3 H: 69 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_02:55:53 ks300 T: 4.2 H: 67 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_03:00:53 ks300 T: 4.1 H: 66 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_03:05:53 ks300 T: 4 H: 66 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_03:10:53 ks300 T: 4 H: 66 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_03:15:53 ks300 T: 3.8 H: 66 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_03:20:53 ks300 T: 3.9 H: 66 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_03:25:53 ks300 T: 3.9 H: 66 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_03:30:53 ks300 T: 3.9 H: 66 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_03:35:53 ks300 T: 3.8 H: 66 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_03:40:53 ks300 T: 3.9 H: 66 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_03:45:53 ks300 T: 3.9 H: 66 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_03:50:53 ks300 T: 4 H: 66 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_03:55:53 ks300 T: 4.3 H: 65 W: 0.2 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_04:00:53 ks300 T: 4.5 H: 64 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_04:05:53 ks300 T: 4.6 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_04:10:53 ks300 T: 5.6 H: 60 W: 1.1 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_04:15:53 ks300 T: 6 H: 58 W: 3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_04:20:53 ks300 T: 6.1 H: 57 W: 2.7 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_04:25:53 ks300 T: 6.1 H: 57 W: 1.3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_04:30:53 ks300 T: 6.1 H: 57 W: 0.5 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_04:35:53 ks300 T: 6 H: 57 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_04:40:53 ks300 T: 5.8 H: 57 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_04:45:53 ks300 T: 5.9 H: 57 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_04:50:53 ks300 T: 6.4 H: 56 W: 1.6 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_04:55:53 ks300 T: 6.4 H: 56 W: 0.2 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_05:00:53 ks300 T: 6.3 H: 56 W: 0.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_05:05:53 ks300 T: 6.3 H: 56 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_05:10:53 ks300 T: 5.9 H: 57 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_05:15:53 ks300 T: 5.8 H: 57 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_05:20:53 ks300 T: 6 H: 57 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_05:25:53 ks300 T: 5.6 H: 58 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_05:30:53 ks300 T: 4.8 H: 60 W: 0.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_05:35:53 ks300 T: 4.5 H: 61 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_05:40:53 ks300 T: 4.1 H: 62 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_05:45:53 ks300 T: 3.6 H: 63 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_05:50:53 ks300 T: 3.3 H: 65 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_05:55:53 ks300 T: 3.1 H: 67 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_06:00:53 ks300 T: 2.9 H: 67 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_06:05:53 ks300 T: 3.1 H: 67 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_06:10:53 ks300 T: 3.1 H: 67 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_06:15:53 ks300 T: 3 H: 67 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_06:20:53 ks300 T: 2.9 H: 67 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_06:25:53 ks300 T: 3 H: 66 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_06:30:53 ks300 T: 3.3 H: 65 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_06:40:53 ks300 T: 4.7 H: 59 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_06:45:53 ks300 T: 4.9 H: 58 W: 0.2 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_06:50:53 ks300 T: 5.5 H: 57 W: 0.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_06:55:53 ks300 T: 5.6 H: 56 W: 0.2 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_07:00:53 ks300 T: 5.7 H: 56 W: 0.2 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_07:05:53 ks300 T: 5.6 H: 56 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_07:10:53 ks300 T: 5.7 H: 56 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_07:15:53 ks300 T: 5.9 H: 56 W: 0.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_07:20:53 ks300 T: 6 H: 55 W: 0.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_07:25:53 ks300 T: 6 H: 55 W: 0.5 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_07:30:53 ks300 T: 6.3 H: 55 W: 1.3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_07:35:53 ks300 T: 6.4 H: 54 W: 2.2 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_07:40:53 ks300 T: 7.2 H: 53 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_07:45:53 ks300 T: 7.3 H: 52 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_07:50:53 ks300 T: 7.3 H: 52 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_07:55:53 ks300 T: 7.2 H: 53 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_08:00:53 ks300 T: 6.9 H: 54 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_08:05:53 ks300 T: 6.9 H: 54 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_08:10:53 ks300 T: 7.2 H: 55 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_08:15:53 ks300 T: 7.6 H: 56 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_08:20:53 ks300 T: 7.7 H: 56 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_08:25:53 ks300 T: 7.9 H: 57 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_08:30:53 ks300 T: 8.1 H: 58 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_08:35:53 ks300 T: 8.8 H: 57 W: 0 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_08:40:53 ks300 T: 9.4 H: 54 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_08:45:53 ks300 T: 9.6 H: 51 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_08:50:53 ks300 T: 9.5 H: 49 W: 1.3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_08:55:59 ks300 T: 9.4 H: 47 W: 1.1 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_09:00:59 ks300 T: 9.2 H: 46 W: 2.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_09:05:59 ks300 T: 9.6 H: 46 W: 0 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_09:10:59 ks300 T: 9.6 H: 44 W: 3.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_09:15:59 ks300 T: 9.8 H: 45 W: 1.9 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_09:20:59 ks300 T: 10.6 H: 43 W: 1.1 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_09:25:59 ks300 T: 10 H: 43 W: 3.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_09:30:59 ks300 T: 10.7 H: 43 W: 1.3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_09:35:59 ks300 T: 11 H: 43 W: 1.6 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_09:40:59 ks300 T: 10.8 H: 43 W: 4.1 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_09:45:59 ks300 T: 10.9 H: 42 W: 3.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_09:50:59 ks300 T: 10.6 H: 42 W: 2.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_09:55:59 ks300 T: 11 H: 42 W: 1.6 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_10:00:59 ks300 T: 11.3 H: 41 W: 2.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_10:05:59 ks300 T: 11.2 H: 41 W: 3.3 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_10:10:59 ks300 T: 11.1 H: 41 W: 3 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_10:15:59 ks300 T: 11.1 H: 39 W: 3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_10:20:59 ks300 T: 11.4 H: 39 W: 0.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_10:25:59 ks300 T: 12 H: 39 W: 0.2 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_10:30:59 ks300 T: 11.8 H: 38 W: 1.9 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_10:35:59 ks300 T: 11.6 H: 37 W: 3.3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_10:40:59 ks300 T: 11.9 H: 38 W: 2.2 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_10:45:50 ks300 T: 11.9 H: 38 W: 2.2 R: 28.9 IR: no Bat: Ok LR: 2
2007-03-14_10:50:50 ks300 T: 13.2 H: 37 W: 1.1 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_10:55:50 ks300 T: 12.4 H: 37 W: 2.7 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_11:00:50 ks300 T: 13 H: 39 W: 0.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_11:05:50 ks300 T: 12.6 H: 41 W: 3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_11:10:50 ks300 T: 13.1 H: 42 W: 1.3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_11:15:50 ks300 T: 12.9 H: 39 W: 1.9 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_11:20:50 ks300 T: 12.8 H: 42 W: 3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_11:25:50 ks300 T: 13.3 H: 40 W: 1.9 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_11:30:50 ks300 T: 13.3 H: 40 W: 0.5 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_11:35:50 ks300 T: 13.9 H: 39 W: 1.9 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_11:40:50 ks300 T: 13.2 H: 42 W: 3.3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_11:45:50 ks300 T: 13.2 H: 42 W: 3.3 R: 28.9 IR: no Bat: Ok LR: 2
2007-03-14_11:50:50 ks300 T: 13.2 H: 43 W: 1.9 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_11:55:50 ks300 T: 13.6 H: 44 W: 0.2 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_12:00:50 ks300 T: 13.6 H: 44 W: 0.2 R: 28.9 IR: no Bat: Ok LR: 3
2007-03-14_12:05:50 ks300 T: 13.4 H: 43 W: 1.1 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_12:10:50 ks300 T: 13.2 H: 43 W: 2.7 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_12:15:50 ks300 T: 12.4 H: 45 W: 4.1 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_12:20:50 ks300 T: 12.4 H: 45 W: 4.1 R: 28.9 IR: no Bat: Ok LR: 2
2007-03-14_12:25:50 ks300 T: 13.3 H: 45 W: 1.3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_12:30:50 ks300 T: 13.3 H: 45 W: 1.3 R: 28.9 IR: no Bat: Ok LR: 2
2007-03-14_12:35:50 ks300 T: 13.2 H: 41 W: 4.7 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_12:40:50 ks300 T: 13.2 H: 41 W: 4.7 R: 28.9 IR: no Bat: Ok LR: 2
2007-03-14_12:45:50 ks300 T: 13.2 H: 41 W: 4.7 R: 28.9 IR: no Bat: Ok LR: 4
2007-03-14_12:50:50 ks300 T: 13.9 H: 44 W: 0.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_12:55:50 ks300 T: 13.9 H: 44 W: 0.5 R: 28.9 IR: no Bat: Ok LR: 2
2007-03-14_13:00:50 ks300 T: 13.8 H: 42 W: 1.1 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_13:05:50 ks300 T: 13.8 H: 42 W: 1.1 R: 28.9 IR: no Bat: Ok LR: 3
2007-03-14_13:10:50 ks300 T: 12.3 H: 48 W: 7.2 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_13:15:50 ks300 T: 12.3 H: 48 W: 7.2 R: 28.9 IR: no Bat: Ok LR: 2
2007-03-14_13:20:50 ks300 T: 12.4 H: 48 W: 6.3 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_13:25:56 ks300 T: 11.7 H: 53 W: 10.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_13:30:56 ks300 T: 11.7 H: 53 W: 10.8 R: 28.9 IR: no Bat: Ok LR: 2
2007-03-14_13:35:56 ks300 T: 11.7 H: 53 W: 10.8 R: 28.9 IR: no Bat: Ok LR: 4
2007-03-14_13:41:02 ks300 T: 12.1 H: 51 W: 8.8 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_13:45:53 ks300 T: 12.1 H: 51 W: 8.8 R: 28.9 IR: no Bat: Ok LR: 3
2007-03-14_13:50:53 ks300 T: 12.3 H: 53 W: 7.5 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_13:55:53 ks300 T: 12.3 H: 53 W: 7.5 R: 28.9 IR: no Bat: Ok LR: 3
2007-03-14_14:00:53 ks300 T: 12.3 H: 53 W: 7.5 R: 28.9 IR: no Bat: Ok LR: 5
2007-03-14_14:05:53 ks300 T: 12.2 H: 52 W: 47.5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_14:10:53 ks300 T: 12.2 H: 52 W: 47.5 R: 28.9 IR: no Bat: Ok LR: 2
2007-03-14_14:15:53 ks300 T: 13 H: 51 W: 5 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_14:20:53 ks300 T: 12.4 H: 53 W: 10.2 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_14:25:53 ks300 T: 12.4 H: 53 W: 10.2 R: 28.9 IR: no Bat: Ok LR: 3
2007-03-14_14:30:53 ks300 T: 12.4 H: 53 W: 10.2 R: 28.9 IR: no Bat: Ok LR: 5
2007-03-14_14:35:53 ks300 T: 13 H: 50 W: 4.4 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_14:40:53 ks300 T: 13 H: 50 W: 4.4 R: 28.9 IR: no Bat: Ok LR: 3
2007-03-14_14:45:53 ks300 T: 13 H: 50 W: 4.4 R: 28.9 IR: no Bat: Ok LR: 5
2007-03-14_14:50:53 ks300 T: 13 H: 50 W: 4.4 R: 28.9 IR: no Bat: Ok LR: 7
2007-03-14_14:55:53 ks300 T: 13 H: 50 W: 4.4 R: 28.9 IR: no Bat: Ok LR: 9
2007-03-14_15:00:53 ks300 T: 12.5 H: 52 W: 10 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_15:05:53 ks300 T: 13 H: 49 W: 3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_15:10:53 ks300 T: 13 H: 49 W: 3 R: 28.9 IR: no Bat: Ok LR: 2
2007-03-14_15:15:53 ks300 T: 14.1 H: 46 W: 0.2 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_15:20:53 ks300 T: 13.8 H: 49 W: 3.8 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_15:25:53 ks300 T: 13.3 H: 48 W: 3 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_15:30:53 ks300 T: 13 H: 49 W: 6.1 R: 28.9 IR: no Bat: Ok LR: 1
2007-03-14_15:35:53 ks300 T: 13 H: 49 W: 6.1 R: 28.9 IR: no Bat: Ok LR: 3
2007-03-14_15:40:53 ks300 T: 13 H: 49 W: 6.1 R: 28.9 IR: no Bat: Ok LR: 5
2007-03-14_15:45:53 ks300 T: 12.8 H: 50 W: 5.2 R: 28.9 IR: no Bat: Ok LR: 0
2007-03-14_15:50:53 ks300 T: 13.1 H: 52 W: 2.2 R: 28.9 IR: no Bat: Ok LR: 0

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