In Muenchen war Frost...

git-svn-id: https://svn.fhem.de/fhem/trunk@494 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig
2009-12-04 12:38:18 +00:00
parent 1357ce4a45
commit db8c80920b
3 changed files with 293 additions and 263 deletions

View File

@@ -550,3 +550,4 @@
- bugfix: changed the fhem prompt from FHZ> to fhem> - bugfix: changed the fhem prompt from FHZ> to fhem>
- bugfix: CUL_RFR fixes (chaining RFR's should work) - bugfix: CUL_RFR fixes (chaining RFR's should work)
- bugfix: Path in the examples fixed (got corrupted) - bugfix: Path in the examples fixed (got corrupted)
- bugfix: PachLog fixes from Axel

View File

@@ -1,265 +1,285 @@
####################################################################### #######################################################################
# #
# 95_PachLog.pm # 95_PachLog.pm
# #
# Logging to www.pachube.com # Logging to www.pachube.com
# Autor: a[PUNKT]r[BEI]oo2p[PUNKT]net # Autor: a[PUNKT]r[BEI]oo2p[PUNKT]net
# Stand: 09.09.2009 # Stand: 09.09.2009
# Version: 0.9 # Version: 0.9
####################################################################### #######################################################################
# Vorausetzung: Account bei www.pachube.com mit API-Key # Vorausetzung: Account bei www.pachube.com mit API-Key
####################################################################### #######################################################################
# #
# FHEM: Neues Pachube-Device erstelle: define <NAME> PachLog API-Key # FHEM: Neues Pachube-Device erstelle: define <NAME> PachLog API-Key
# "define PACH001 PachLog 1234kliceee77hgtzuippkk99" # "define PACH001 PachLog 1234kliceee77hgtzuippkk99"
# #
# PACHUBE: FEED erstellen -> FEED-NR: DATASTREAM-ID:TAGS # PACHUBE: FEED erstellen -> FEED-NR: DATASTREAM-ID:TAGS
# Beispiel: HMS_TF (Temperatur und Feuchte Sensor) # Beispiel: HMS_TF (Temperatur und Feuchte Sensor)
# FEED-NR: 1234 # FEED-NR: 1234
# ID 0 => Temperatur (temperature) # ID 0 => Temperatur (temperature)
# ID 1 => rel. Luftfeuchte (humidity) # ID 1 => rel. Luftfeuchte (humidity)
# #
# FHEM: PachLog-Devices: PACH01 # FHEM: PachLog-Devices: PACH01
# HMS_DEVICE: HMS_TF01 # HMS_DEVICE: HMS_TF01
# FEED-NR: 1234 # FEED-NR: 1234
# ID 0 => Temperatur (temperature) # ID 0 => Temperatur (temperature)
# ID 1 => rel. Luftfeuchte (humidity) # ID 1 => rel. Luftfeuchte (humidity)
# "set PACH01 ADD HMS_TF01 1234:0:temperature:1:humidity" # "set PACH01 ADD HMS_TF01 1234:0:temperature:1:humidity"
# #
# Hinweise: # Hinweise:
# Ein FEED kann nur komplett upgedated werden: # Ein FEED kann nur komplett upgedated werden:
# FEED 3456 -> ID 0 -> DEVICE A # FEED 3456 -> ID 0 -> DEVICE A
# FEED 3456 -> ID 1 -> DEVICE B # FEED 3456 -> ID 1 -> DEVICE B
# => geht nicht # => geht nicht
# #
# Es werden nur READINGS mit einfach Werten und Zahlen unterst<EFBFBD>tzt. # Es werden nur READINGS mit einfach Werten und Zahlen unterst?tzt.
# Beispiele: NICHT unterst<EFBFBD>tze READINGS # Beispiele: NICHT unterst?tze READINGS
# cum_month => CUM_MONTH: 37.173 CUM: 108.090 COST: 0.00 # cum_month => CUM_MONTH: 37.173 CUM: 108.090 COST: 0.00
# cum_day => 2009-09-09 00:03:19 T: 1511725.6 H: 4409616 W: 609.4 R: 150.4 # cum_day => 2009-09-09 00:03:19 T: 1511725.6 H: 4409616 W: 609.4 R: 150.4
# israining no => (yes/no) # israining no => (yes/no)
####################################################################### #######################################################################
package main; package main;
use strict; use strict;
use warnings; use warnings;
use POSIX; use POSIX;
use Data::Dumper; use Data::Dumper;
use LWP; use LWP;
use LWP::UserAgent; use LWP::UserAgent;
use HTTP::Request::Common; use HTTP::Request::Common;
####################################################################### #######################################################################
sub sub
PachLog_Initialize($) PachLog_Initialize($)
{ {
my ($hash) = @_; my ($hash) = @_;
$hash->{DefFn} = "PachLog_Define"; $hash->{DefFn} = "PachLog_Define";
$hash->{SetFn} = "PachLog_Set"; $hash->{SetFn} = "PachLog_Set";
$hash->{GetFn} = "PachLog_Get"; $hash->{GetFn} = "PachLog_Get";
$hash->{NotifyFn} = "PachLog_Notify"; $hash->{NotifyFn} = "PachLog_Notify";
} $hash->{AttrList} = "do_not_notify:0,1 loglevel:0,5 disable:0,1";
####################################################################### }
sub PachLog_Define($@) #######################################################################
{ sub PachLog_Define($@)
# define <NAME> PachLog Pachube-X-API-Key {
my ($hash, @a) = @_; # define <NAME> PachLog Pachube-X-API-Key
# X-API-Key steht im DEF %defs{<NAME>}{DEF} my ($hash, @a) = @_;
# Alternativ nach $defs{<NAME>}{XAPIKEY} # X-API-Key steht im DEF %defs{<NAME>}{DEF}
my($package, $filename, $line, $subroutine) = caller(3); # Alternativ nach $defs{<NAME>}{XAPIKEY}
Log 0 , "PachLog_Define => $package: $filename LINE: $line SUB: $subroutine \n"; my($package, $filename, $line, $subroutine) = caller(3);
Log 5, Dumper(@_) . "\n"; Log 0 , "PachLog_Define => $package: $filename LINE: $line SUB: $subroutine \n";
return "Unknown argument count " . int(@a) . " , usage set <name> dataset value or set <name> delete dataset" if(int(@a) != 1); Log 5, Dumper(@_) . "\n";
return undef; return "Unknown argument count " . int(@a) . " , usage set <name> dataset value or set <name> delete dataset" if(int(@a) != 1);
return undef;
}
####################################################################### }
sub PachLog_Set($@) #######################################################################
{ sub PachLog_Set($@)
# set <NAME> ADD/DEL <DEVICENAME> FEED:STREAM:VALUE:STREAM:VALUE&FEED-2:STEAM,VALUE {
my ($hash, @a) = @_ ; # set <NAME> ADD/DEL <DEVICENAME> FEED:STREAM:VALUE:STREAM:VALUE&FEED-2:STEAM,VALUE
# FHEMWEB Frage....Auswahliste my ($hash, @a) = @_ ;
return "Unknown argument $a[1], choose one of ". join(" ",sort keys %{$hash->{READINGS}}) if($a[1] eq "?"); # FHEMWEB Frage....Auswahliste
# Pruefen Uebergabeparameter return "Unknown argument $a[1], choose one of ". join(" ",sort keys %{$hash->{READINGS}}) if($a[1] eq "?");
# @a => a[0]:<NAME>; a[1]=ADD oder DEL; a[2]= DeviceName; # Pruefen Uebergabeparameter
# a[3]=FEED:STREAM:VALUE:STREAM:VALUE&FEED-2:STREAM,VALUE # @a => a[0]:<NAME>; a[1]=ADD oder DEL; a[2]= DeviceName;
# READINGS setzten oder l<>schen # a[3]=FEED:STREAM:VALUE:STREAM:VALUE&FEED-2:STREAM,VALUE
if($a[1] eq "DEL") # READINGS setzten oder l?schen
{ if($a[1] eq "DEL")
GetLogLevel($a[0],2),"PACHLOG -> DELETE: A0= ". $a[0] . " A1= " . $a[1] . " A2=" . $a[2]; {
if(defined($hash->{READINGS}{$a[2]})) GetLogLevel($a[0],2),"PACHLOG -> DELETE: A0= ". $a[0] . " A1= " . $a[1] . " A2=" . $a[2];
{ if(defined($hash->{READINGS}{$a[2]}))
delete($hash->{READINGS}{$a[2]}) {
} delete($hash->{READINGS}{$a[2]})
} }
if($a[1] eq "ADD") }
{ if($a[1] eq "ADD")
if(!defined($defs{$a[2]})) {return "PACHLOG[". $a[2] . "] => Unkown Device";} {
# Mindestens 3 Parameter if(!defined($defs{$a[2]})) {return "PACHLOG[". $a[2] . "] => Unkown Device";}
my @b = split(/:/, $a[3]); # Mindestens 3 Parameter
return "PACHLOG[". $a[2] . "] => Argumenete: " . $a[3] . " nicht eindeutig => mind. 3 => FEED-NR:DATASTREAM:READING" if(int(@b) < 3); my @b = split(/:/, $a[3]);
my $feednr = shift(@b); return "PACHLOG[". $a[2] . "] => Argumenete: " . $a[3] . " nicht eindeutig => mind. 3 => FEED-NR:DATASTREAM:READING" if(int(@b) < 3);
#FEED-Nr darf nur Zahlen enthalten my $feednr = shift(@b);
if($feednr !~ /^\d+$/) {return "PACHLOG[". $a[2] . "] => FEED-Nr >" . $feednr . "< ist ungueltig";} #FEED-Nr darf nur Zahlen enthalten
# ??? Pruefen ob READING vorhanden ??? if($feednr !~ /^\d+$/) {return "PACHLOG[". $a[2] . "] => FEED-Nr >" . $feednr . "< ist ungueltig";}
my ($i,$j); # ??? Pruefen ob READING vorhanden ???
for ($i=0;$i<@b;$i++) my ($i,$j);
{ for ($i=0;$i<@b;$i++)
#Stream nur Zahlen {
if($b[$i] !~ /^\d+$/) {return "PACHLOG => FEED-Nr[" . $feednr ."] Stream-ID >" . $b[$i] . "< ungueltig";} #Stream nur Zahlen
# Reading existiert if($b[$i] !~ /^\d+$/) {return "PACHLOG => FEED-Nr[" . $feednr ."] Stream-ID >" . $b[$i] . "< ungueltig";}
$j = $i + 1; # Reading existiert
if(!defined($defs{$a[2]}{READINGS}{$b[$j]})) {return "PACHLOG[". $a[2] . "] => Unkown READING >" . $b[$j] . "<";} $j = $i + 1;
# READING-Value validieren if(!defined($defs{$a[2]}{READINGS}{$b[$j]})) {return "PACHLOG[". $a[2] . "] => Unkown READING >" . $b[$j] . "<";}
my $r = $defs{$a[2]}{READINGS}{$b[$j]}{VAL}; # READING-Value validieren
my $rn = &ReadingToNumber($r); my $r = $defs{$a[2]}{READINGS}{$b[$j]}{VAL};
if(!defined($rn)) {return "PACHLOG[". $a[$i] . "] => READING not supported >" . $b[$j] . "<";} my $rn = &ReadingToNumber($r);
$i = $j; if(!defined($rn)) {return "PACHLOG[". $a[$i] . "] => READING not supported >" . $b[$j] . "<";}
} $i = $j;
$hash->{READINGS}{$a[2]}{TIME} = TimeNow(); }
$hash->{READINGS}{$a[2]}{VAL} = $a[3]; $hash->{READINGS}{$a[2]}{TIME} = TimeNow();
} $hash->{READINGS}{$a[2]}{VAL} = $a[3];
$hash->{CHANGED}[0] = $a[1]; }
$hash->{STATE} = $a[1]; $hash->{CHANGED}[0] = $a[1];
return undef; $hash->{STATE} = $a[1];
return "Unknown argument count " . int(@a) . " , usage set <name> ADD/DEL <DEVICE-NAME> FEED:STREAM:VALUE:STREAM:VALUE&FEED-2:STREAM,VALUE" if(int(@a) != 4); return undef;
return "Unknown argument count " . int(@a) . " , usage set <name> ADD/DEL <DEVICE-NAME> FEED:STREAM:VALUE:STREAM:VALUE&FEED-2:STREAM,VALUE" if(int(@a) != 4);
}
####################################################################### }
sub PachLog_Get() #######################################################################
{ sub PachLog_Get()
# OHNE FUNKTION .... {
my ($name, $x_key) = @_; # OHNE FUNKTION ....
my($package, $filename, $line, $subroutine) = caller(3); my ($name, $x_key) = @_;
Log 5, "PachLog_Get => $package: $filename LINE: $line SUB: $subroutine \n"; my($package, $filename, $line, $subroutine) = caller(3);
Log 5, Dumper(@_) . "\n"; Log 5, "PachLog_Get => $package: $filename LINE: $line SUB: $subroutine \n";
} Log 5, Dumper(@_) . "\n";
####################################################################### }
sub PachLog_Notify ($$) #######################################################################
{ sub PachLog_Notify ($$)
my ($me, $trigger) = @_; {
my $d = $me->{NAME}; my ($me, $trigger) = @_;
my $t = $trigger->{NAME}; my $d = $me->{NAME};
# Eintrag fuer Trigger-Device vorhanden return "" if($attr{$d} && $attr{$d}{disable});
if(!defined($defs{$d}{READINGS}{$t})) my $t = $trigger->{NAME};
{ #LogLevel
Log 5, ("PACHLOG[INFO] => " . $t . " => Nicht definiert"); my $ll;
return undef;} if(defined($attr{$d}{'loglevel'})){$ll = $attr{$d}{'loglevel'};}
else {$ll = 5;}
# Umwandeln 1234:0:temperature:1:humidity => %feed # Eintrag fuer Trigger-Device vorhanden
# Struktur: if(!defined($defs{$d}{READINGS}{$t}))
# %feed{FEED-NR}{READING}{VAL} {
# %feed{FEED-NR}{READING}{DATASTREAM} Log $ll, ("PACHLOG[INFO] => " . $t . " => Nicht definiert");
my ($dat,@a,$feednr,$i,$j); return undef;}
my %feed = ();
$dat = $defs{$d}{READINGS}{$t}{VAL}; # Umwandeln 1234:0:temperature:1:humidity => %feed
@a = split(/:/, $dat); # Struktur:
$feednr = shift(@a); # %feed{FEED-NR}{READING}{VAL}
for ($i=0;$i<@a;$i++) # %feed{FEED-NR}{READING}{DATASTREAM}
{ my ($dat,@a,$feednr,$i,$j);
$j = $i + 1; my %feed = ();
$feed{$feednr}{$a[$j]}{STREAM} = $a[$i]; $dat = $defs{$d}{READINGS}{$t}{VAL};
$i = $j; @a = split(/:/, $dat);
} $feednr = shift(@a);
# Werte aus Trigger-Device for ($i=0;$i<@a;$i++)
foreach my $r (keys %{$feed{$feednr}}) {
{ $j = $i + 1;
$i = $defs{$t}{READINGS}{$r}{VAL}; $feed{$feednr}{$a[$j]}{STREAM} = $a[$i];
# Werte Normalisieren $i = $j;
# Einheit -> 21,1 (celsius) -> 21,1 }
# FS20: VAL = on => 1 && VAL = off => 0 # Werte aus Trigger-Device
# @a = split(' ', $i); foreach my $r (keys %{$feed{$feednr}})
{
$i = $defs{$t}{READINGS}{$r}{VAL};
# Werte Normalisieren
# Einheit -> 21,1 (celsius) -> 21,1
# FS20: VAL = on => 1 && VAL = off => 0
# @a = split(' ', $i);
# $feed{$feednr}{$r}{VAL} = &ReadingToNumber($a[0]) ; # $feed{$feednr}{$r}{VAL} = &ReadingToNumber($a[0]) ;
$feed{$feednr}{$r}{VAL} = &ReadingToNumber($i) ; $feed{$feednr}{$r}{VAL} = &ReadingToNumber($i,$ll) ;
} }
Log 5, "PACHLOG => dumper(FEED) => " .Dumper(%feed); # Log $ll, "PACHLOG => dumper(FEED) => " .Dumper(%feed);
# CVS-Data # CVS-Data
# my @cvs = (); my @cvs = ();
# foreach my $r (keys %{$feed{$feednr}}) foreach my $r (keys %{$feed{$feednr}}) {
# { $cvs[$feed{$feednr}{$r}{STREAM}] = $feed{$feednr}{$r}{VAL};
# $cvs[$feed{$feednr}{$r}{STREAM}] = $feed{$feednr}{$r}{VAL}; }
# } my $cvs_data = join(',',@cvs);
# my $cvs_data = join(',',@cvs); Log $ll, "PACHLOG[CVSDATA] => $cvs_data";
# Log 5, "PACHLOG[CVSDATA] => $cvs_data";
# Aufbereiten %feed als EEML-Data
# Aufbereiten %feed als EEML-Data my $eeml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
my $eeml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; $eeml .= "<eeml xmlns=\"http://www.eeml.org/xsd/005\">\n";
$eeml .= "<eeml xmlns=\"http://www.eeml.org/xsd/005\">\n"; $eeml .= "<environment>\n";
$eeml .= "<environment>\n"; foreach my $r (keys %{$feed{$feednr}})
foreach my $r (keys %{$feed{$feednr}}) {
{ $eeml .= "<data id=\"" . $feed{$feednr}{$r}{STREAM} . "\">\n";
$eeml .= "<data id=\"" . $feed{$feednr}{$r}{STREAM} . "\">\n"; $eeml .= "<value>" . $feed{$feednr}{$r}{VAL} . "</value>\n";
$eeml .= "<value>" . $feed{$feednr}{$r}{VAL} . "</value>\n"; # Unit fuer EEML: <unit symbol="C" type="derivedSI">Celsius</unit>
# Unit fuer EEML: <unit symbol="C" type="derivedSI">Celsius</unit> my ($u_name,$u_symbol,$u_type,$u_tag) = split(',',&PachLog_ReadingToUnit($r,$ll));
my ($u_name,$u_symbol,$u_type,$u_tag) = split(',',&PachLog_ReadingToUnit($r)); if(defined($u_name)) {
if(defined($u_name)) { $eeml .= "<tag>". $u_tag . "</tag>\n";
$eeml .= "<tag>". $u_tag . "</tag>\n"; $eeml .= "<unit symbol=\"" . $u_symbol. "\" type=\"" . $u_type. "\">" . $u_name . "<\/unit>\n";
$eeml .= "<unit symbol=\"" . $u_symbol. "\" type=\"" . $u_type. "\">" . $u_name . "<\/unit>\n"; }
} $eeml .= "</data>\n";
$eeml .= "</data>\n"; }
} $eeml .= "</environment>\n";
$eeml .= "</environment>\n"; $eeml .= "</eeml>\n";
$eeml .= "</eeml>\n"; Log $ll, "PACHLOG -> " . $t . " EEML => " . $eeml;
Log 5, "PACHLOG -> " . $t . " EEML => " . $eeml; # Pachube-Update per EEML -> XML
# Pachube-Update per EEML -> XML my ($res,$ret,$ua,$apiKey,$url);
my ($res,$ret,$ua,$apiKey,$url); $apiKey = $defs{$d}{DEF};
$apiKey = $defs{$d}{DEF}; $url = "http://www.pachube.com/api/feeds/" . $feednr . ".xml";
$url = "http://www.pachube.com/api/feeds/" . $feednr . ".xml"; $ua = new LWP::UserAgent;
$ua = new LWP::UserAgent; $ua->default_header('X-PachubeApiKey' => $apiKey);
$ua->default_header('X-PachubeApiKey' => $apiKey); #Timeout 3 sec ... default 180sec
$res = $ua->request(PUT $url,'Content' => $eeml); $ua->timeout(3);
# Ueberpruefen wir, ob alles okay war: $res = $ua->request(PUT $url,'Content' => $eeml);
if ($res->is_success()) # Ueberpruefen wir, ob alles okay war:
{ if ($res->is_success())
Log 0,("PACHLOG => Update[" . $t ."] => SUCCESS\n"); {
# Time setzten Log 0,("PACHLOG => Update[" . $t ."]: " . $cvs_data . " >> SUCCESS\n");
$defs{$d}{READINGS}{$t}{TIME} = TimeNow(); # Time setzten
} $defs{$d}{READINGS}{$t}{TIME} = TimeNow();
else {Log 0,("PACHLOG => Update[" . $t ."] ERROR: " . ($res->as_string) . "\n");} }
} else {Log 0,("PACHLOG => Update[" . $t ."] ERROR: " . ($res->as_string) . "\n");}
sub PachLog_ReadingToUnit($) }
{ ################################################################################
# Unit fuer EEML: <unit symbol="C" type="derivedSI">Celsius</unit> sub PachLog_ReadingToUnit($$)
# Input: READING z.B. temperature {
# Unit fuer EEML: <unit symbol="C" type="derivedSI">Celsius</unit>
# Input: READING z.B. temperature
# Output: Name,symbol,Type,Tag z.B. Celsius,C,derivedSI # Output: Name,symbol,Type,Tag z.B. Celsius,C,derivedSI
# weiters => www.eeml.org # weiters => www.eeml.org
# No Match = undef # No Match = undef
my $in = shift; my ($in,$ll) = @_;
my %unit = (); my %unit = ();
%unit = ( %unit = (
'temperature' => "Celsius,C,derivedSI,Temperature", 'temperature' => "Celsius,C,derivedSI,Temperature",
'current' => "Power,kW,derivedSI,EnergyConsumption", 'current' => "Power,kW,derivedSI,EnergyConsumption",
'humidity' => "Humidity,rel%,contextDependentUnits,Humidity", 'humidity' => "Humidity,rel%,contextDependentUnits,Humidity",
'rain' => "Rain,l/m2,contextDependentUnits,Rain", 'rain' => "Rain,l/m2,contextDependentUnits,Rain",
'wind' => "Wind,m/s,contextDependentUnits,Wind", 'rain_now' => "Rain,l/m2,contextDependentUnits,Rain",
); 'wind' => "Wind,m/s,contextDependentUnits,Wind",
if(defined($unit{$in})) {return $unit{$in};} );
else {return undef;} if(defined($unit{$in})) {
} Log $ll ,("PACHLOG[ReadingToUnit] " . $in . " >> " . $unit{$in} );
sub ReadingToNumber($) return $unit{$in};}
{ else {return undef;}
# Input: reading z.B. 21.1 (Celsius) oder dim10%, on-for-oldtimer etc. }
# Output: 21.1 oder 10 ################################################################################
# ERROR = undef sub ReadingToNumber($$)
# Alles au<61>er Nummern loeschen $t =~ s/[^0123456789.]//g; {
my $in = shift; # Input: reading z.B. 21.1 (Celsius) oder dim10%, on-for-oldtimer etc.
Log 5, "PACHLOG[ReadingToNumber] => in => $in"; # Output: 21.1 oder 10
# Bekannte READINGS FS20 Devices oder FHT # ERROR = undef
if($in =~ /^on|Switch.*on/i) {$in = 1;} # Alles au?er Nummern loeschen $t =~ s/[^0123456789.-]//g;
if($in =~ /^off|Switch.*off|lime-protection/i) {$in = 0;} my ($in,$ll) = @_;
# Keine Zahl vorhanden Log $ll, "PACHLOG[ReadingToNumber] => in => $in";
if($in !~ /\d{1}/) {return undef;} # Bekannte READINGS FS20 Devices oder FHT
# Mehrfachwerte in READING z.B. CUM_DAY: 5.040 CUM: 334.420 COST: 0.00 if($in =~ /^on|Switch.*on/i) {$in = 1;}
my @b = split(' ', $in); if($in =~ /^off|Switch.*off|lime-protection/i) {$in = 0;}
if(int(@b) gt 2) {return undef;} # Keine Zahl vorhanden
# Nurnoch Zahlen z.B. dim10% = 10 oder 21.1 (Celsius) = 21.1 if($in !~ /\d{1}/) {
$in =~ s/[^0123456789.]//g; Log $ll, "PACHLOG[ReadingToNumber] No Number: $in";
Log 5, "PACHLOG[ReadingToNumber] => out => $in"; return undef;}
return $in # Mehrfachwerte in READING z.B. CUM_DAY: 5.040 CUM: 334.420 COST: 0.00
} my @b = split(' ', $in);
if(int(@b) gt 2) {
Log $ll, "PACHLOG[ReadingToNumber] Not Supportet Reading: $in";
return undef;}
# Nur noch Zahlen z.B. dim10% = 10 oder 21.1 (Celsius) = 21.1
if (int(@b) eq 2){
Log $ll, "PACHLOG[ReadingToNumber] Split:WhiteSpace-0- $b[0]";
$in = $b[0];
}
$in =~ s/[^0123456789.-]//g;
Log $ll, "PACHLOG[ReadingToNumber] => out => $in";
return $in
}
1; 1;

View File

@@ -4260,8 +4260,8 @@ isday</pre>
<a name="PachLog"></a> <a name="PachLog"></a>
<h3>PachLog</h3> <h3>PachLog</h3>
<ul> <ul>
The PachLog module logs sensor data like temperature and humidity to <a The PachLog-Module Logs SensorData like (temperature and humidity) to <a href=http://www.pachube.com>www.pachube.com</a>.
href=http://www.pachube.com>www.pachube.com</a>.<br> <br>
<br> <br>
<a name="PachLogdefine"></a> <a name="PachLogdefine"></a>
<b>Define</b> <b>Define</b>
@@ -4269,9 +4269,10 @@ isday</pre>
<br><code>define &lt;name&gt; PachLog &lt;Pachube-API-Key&gt;</code> <br> <br><code>define &lt;name&gt; PachLog &lt;Pachube-API-Key&gt;</code> <br>
<br> <br>
&lt;Pachube-API-Key&gt;:<br> &lt;Pachube-API-Key&gt;:<br>
You need the Pachube-API-Key to authenticate your application to the The Pachube-API-Key however is what you need in your code to authenticate your application's access the Pachube service.<br>
Pachube service.<br> Don't share this with anyone: it's just like any other password.<br>
Don't share this with anyone: it's just like a password.<br> <a href=http://www.pachube.com>www.pachube.com</a><br>
</ul> </ul>
<br> <br>
@@ -4279,13 +4280,12 @@ isday</pre>
<b>Set</b> <b>Set</b>
<ul> <ul>
<br> <br>
Add a new device for logging to www.pachube.com<br><br> Add a new Device for Logging to www.pachube.com<br><br>
<code>set &lt;NAME&gt; ADD &lt;FHEM-DEVICENAME&gt; FEED-NR:ID:READING:ID:READING</code><br><br> <code>set &lt;NAME&gt; ADD &lt;FHEM-DEVICENAME&gt; FEED-NR:ID:READING:ID:READING</code><br><br>
Example: KS300 weather data<br><br> Example: KS300-Weather-Data<br><br>
READING: temperature humidity wind rain<br><br> READINGS: temperature humidity wind rain<br><br>
1. Generate input feed on www.pachube.com => You get your 1. Generate Input-Feed on www.pachube.com => Yout get your FEED-NR: 1234<br>
FEED-NR: 1234<br> 2. Add Datastreams to the Feed:<br>
2. Add datastreams to the feed:<br>
<ul> <ul>
<table> <table>
<tr><td>ID</td><td>0</td><td>temperature</td></tr> <tr><td>ID</td><td>0</td><td>temperature</td></tr>
@@ -4293,18 +4293,27 @@ isday</pre>
<tr><td>ID</td><td>2</td><td>wind</td></tr> <tr><td>ID</td><td>2</td><td>wind</td></tr>
<tr><td>ID</td><td>3</td><td>rain</td></tr></table><br> <tr><td>ID</td><td>3</td><td>rain</td></tr></table><br>
</ul> </ul>
3. Add the KS300 to your PachLog device<br><br> 3. Add the KS300 to your PachLog-Device<br><br>
<code>set &lt;NAME&gt; ADD &lt;My-KS300&gt; 1234:0temperature:1:humidity:2:wind:3:rain</code><br><br> <code>set &lt;NAME&gt; ADD &lt;My-KS300&gt; 1234:0temperature:1:humidity:2:wind:3:rain</code><br><br>
Delete a device form logging to www.pachube.com<br><br> Delete a Device form Logging to www.pachube.com<br><br>
<code>set &lt;NAME&gt; DEL &lt;FHEM-DEVICENAME&gt;</code><br><br> <code>set &lt;NAME&gt; DEL &lt;FHEM-DEVICENAME&gt;</code><br><br>
</ul> </ul>
<br> <br>
<b>Get</b> <ul>N/A</ul><br> <b>Get</b> <ul>N/A</ul><br>
<b>Attributes</b> <ul>N/A</ul><br> <b>Attributes</b>
</ul> <ul>
<li><a href="#do_not_notify">do_not_notify</a></li><br>
<li><a href="#loglevel">loglevel</a></li><br>
<a name="disable"></a>
<li>disable<br>
Disables PachLog.
Nor more Logging to www.pachube.com
</ul><br>
</ul>
<a name="dumpdef"></a> <a name="dumpdef"></a>
<h3>dumpdef</h3> <h3>dumpdef</h3>
<ul> <ul>