2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-01-31 06:39:11 +00:00

add IPWE support

git-svn-id: https://svn.fhem.de/fhem/trunk@196 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
tdressler 2008-05-18 12:06:02 +00:00
parent 500f4a9fff
commit 5e07c2e6b2
5 changed files with 220 additions and 3 deletions

View File

@ -404,3 +404,4 @@
- feature: fhem.pl check modules for compiletime errors and do not initialize
them
- feature: M232 add windows support (thomas 12.05.08)
- feature: add simple ELV IPWE1 support (thomas 12.05.08)

150
fhem/FHEM/88_IPWE.pm Normal file
View File

@ -0,0 +1,150 @@
package main;
##############################################
# 88_IPWE.pm
# Modul for FHEM
#
# contributed by thomas dressler 2008
# $Id: 88_IPWE.pm,v 1.1 2008-05-18 12:05:24 tdressler Exp $
use strict;
use warnings;
use IO::Socket::INET;
use vars qw {%attr $init_done}; #make komodo happy
sub Log($$);
#####################################
sub
IPWE_Initialize($)
{
my ($hash) = @_;
# Consumer
$hash->{DefFn} = "IPWE_Define";
$hash->{GetFn} = "IPWE_Get";
$hash->{AttrList}= "model:ipwe delay loglevel:0,1,2,3,4,5,6";
}
#####################################
sub
IPWE_Define($$)
{
my ($hash, $def) = @_;
my $name=$hash->{NAME};
my @a = split("[ \t][ \t]*", $def);
Log 5, "IPWE Define: $a[0] $a[1] $a[2] $a[3]";
return "Define the host as a parameter i.e. ipwe" if(@a < 3);
my $host = $a[2];
my $delay=$a[3];
$attr{$name}{delay}=$delay if $delay;
Log 1, "ipwe device is none, commands will be echoed only" if($host eq "none");
my $socket = IO::Socket::INET->new(PeerAddr=>$host,
PeerPort=>80, #http
timeout=>2,
blocking=>1
);
if (!$socket) {
$hash->{STATE} = "error opening device";
Log 1,"$name: Error opening Connection to $host";
return "Can't Connect to $host -> $@ ( $!)\n";
}
$socket->close;
$hash->{Host} = $host;
$hash->{STATE} = "Initialized";
InternalTimer(gettimeofday()+$delay, "IPWE_GetStatus", $hash, 0);
return undef;
}
sub IPWE_Get($@)
{
my ($hash, @a) = @_;
return "argument is missing" if(int(@a) != 2);
my $msg;
$hash->{LOCAL} = 1;
my $v = IPWE_GetStatus($hash);
delete $hash->{LOCAL};
my @data=split (/\n/, $v);
if($a[1] eq "status") {
$msg= "$a[0] $a[1] =>".$/."$v";
}else {
my ($l)= grep {/$a[1]/}@data;
chop($l);
$msg="$a[0] $a[1] =>$l";
}
$msg="$a[0]: Unknown get command $a[1]" if (!$msg);
return $msg;
}
#####################################
sub
IPWE_GetStatus($)
{
my ($hash) = @_;
my $buf;
Log 5, "IPWE_GetStatus";
my $name = $hash->{NAME};
my $host = $hash->{Host};
my $text='';
my $alldata='';
my $delay=$attr{$name}{delay}||300;
InternalTimer(gettimeofday()+$delay, "IPWE_GetStatus", $hash, 0);
my $socket = IO::Socket::INET->new(PeerAddr=>$host,
PeerPort=>80, #http
timeout=>2,
blocking=>1
);
if (!$socket) {
$hash->{STATE} = "error opening device";
Log 1,"$name: Error opening Connection to $host";
return "Can't Connect to $host -> $@ ( $!)\n";
}
Log 5, "$name: Connected to $host";
$socket->autoflush(1);
$socket->write("GET /ipwe.cgi HTTP/1.0\r\n");
my @lines=$socket->getlines();
close $socket;
Log 5,"$name: Data received";
my $allines=join('',@lines);
my (@tables)= ($allines=~m#<tbody>(?:(?!<tbody>).)*</tbody>#sgi);
my ($datatable)=grep{/Sensortyp/} @tables;
my (@rows)=($datatable=~m#<tr>(?:(?!<tr>).)*</tr>#sgi);
foreach my $l(@rows) {
next if ($l=~/Sensortyp/); #headline
my ($typ,$id,$sensor,$temp,$hum,$wind,$rain)=($l=~m#<td.*?>(.*?)<br></td>#sgi);
next if ($typ=~/^\s+$/);
$text= "Typ: $typ, ID: $id, Name $sensor, T: $temp H: $hum";
if ($id == 8) {
$text.= ",W: $wind, R: $rain";
}
Log 5,"$name: $text";
if (!$hash->{local}){
$hash->{CHANGED}[0] = $text;
$hash->{READINGS}{$sensor}{TIME} = TimeNow();
$hash->{READINGS}{$sensor}{VAL} = $text;;
DoTrigger($name, undef) if($init_done);
}
$alldata.="$text\n";
}
return $alldata;
}
1;

View File

@ -278,3 +278,6 @@
-tdressler Mo May 12 19:00:00 MEST 2008
- feature : add windows support to M232
-tdressler So May 18 13:30:00 MEST 2008
- feature : add ELV IPWE1 support

View File

@ -427,6 +427,7 @@ make editing of multiline commands transparent.<br><br>
<li>WS300: ws300pc</li>
<li>EM1010: em1010pc</li>
<li>WS2000: ws2000</li>
<li>IPWE: ipwe</li>
</ul>
</li><br>
@ -926,6 +927,41 @@ make editing of multiline commands transparent.<br><br>
<br>
</ul>
<a name="IPWE"></a>
<h4>Type IPWE</h4>
<ul>
<code>define &lt;name&gt; IPWE &lt;hostname&gt; [&lt;delay&gt;]</code>
<br><br>
Define a IPWE network attached weather data receiver device sold by ELV. Details see <a
href="http://www.elv.de/output/controller.aspx?cid=74&detail=10&detail2=21508">here</a>.
It's intended to receive the same sensors as WS300 (8 T/H-Sensors and one kombi sensor),
but can be accessed via http and telnet.
<br>
For unknown reason, my try to use the telnet interface was not working neither with raw sockets
nor with Net::Telnet module. Therefore i choosed here the "easy" way
to simple readout the http page and extract all data from the offered table. For this reason this module doesnt
contain any option to configure this device.
<br><br><b>Note:</b> You should give your sensors a name within the web interface, once they a received the first time.
<br>To extract a single sensor simply match for this name or sensor id<br>
<br>
Attributes:
<ul>
<li><code>delay</code>: seconds between read accesses(default 300s)</li>
</ul>
<br>
Example:
<ul>
<code>define ipwe IPWE ipwe1 120</code><br>
</ul>
<ul>
<code>attr ipwe delay 600</code> : 10min between readouts<br>
</ul>
<br>
</ul>
<a name="FileLog"></a>
<h4>Type FileLog</h4>
<ul>
@ -1334,7 +1370,33 @@ make editing of multiline commands transparent.<br><br>
<code>list</code> statement for the device).
<br><br>
</ul>
<h4>Type WS2000:</h4>
<ul>
<code>get &lt;name&gt; list</code>
<br>
Gets the last reading of all received sensord
<br><br>
<code>get &lt;name&gt; [TH0..TH7, T0..T7, I0..I7, R0..R7, W0..W7, L0..L7, P0..P7,LAST,RAW]</code><br>
get the last reading for the name sensor, <br>
<code>LAST</code>: Last received Sensor
<br><br>
<code>RAW</code>: original Data from interface
<br><br>
</ul>
<h4>Type IPWE</h4>
<ul>
<code>get &lt;name&gt; status</code>
<br><br>
Gets actual data from device for sensors with data
<br><br>
<code>get &lt;name&gt; &lt; sensorname&gt; </code>
<br><br>
will grep output from device for this sensorname
<br><br>
</ul>
</ul>

View File

@ -15,7 +15,7 @@ Formerly known as fhz1000.pl
<h2>News (as of =DATE=, Version =VERS=)</h2>
<ul>
<li>feature: added ELV IPWE-Support via 88_IPWE.pm (thomas 18.05.08)</li>
<li>feature: added windows COM-Port support to FHZ, EM,WS2000,WS300 (thomas 12.05.08)</li>
<li>feature: added ReadyFn to have an alternate methode to check if data available(thomas 11.05.08)</li>
<li>feature: added ws2000 support via 87_WS2000.pm(thomas 10.05.08)</li>
@ -78,7 +78,8 @@ Currently implemented features:<br>
<li>reading attached SCIVT devices</li>
<li>reading attached M232 devices</li>
<li>reading attached WS2000/WS25000 devices, also via raw network converters(xport)</li>
<li>logging events to files or databases
<li>extract sensor data from IPWE networked weather data receiver</li>
<li>logging events to files or databases</li>
<li>logging events to files or databases, with regexp filters</li>
<li>notifying external programs or internal modules when receiving certain
events</li>