In Muenchen war Frost...
git-svn-id: https://svn.fhem.de/fhem/trunk@494 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -32,8 +32,8 @@
|
|||||||
# 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)
|
||||||
@@ -60,6 +60,7 @@ PachLog_Initialize($)
|
|||||||
$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($@)
|
||||||
@@ -86,7 +87,7 @@ sub PachLog_Set($@)
|
|||||||
# Pruefen Uebergabeparameter
|
# Pruefen Uebergabeparameter
|
||||||
# @a => a[0]:<NAME>; a[1]=ADD oder DEL; a[2]= DeviceName;
|
# @a => a[0]:<NAME>; a[1]=ADD oder DEL; a[2]= DeviceName;
|
||||||
# a[3]=FEED:STREAM:VALUE:STREAM:VALUE&FEED-2:STREAM,VALUE
|
# a[3]=FEED:STREAM:VALUE:STREAM:VALUE&FEED-2:STREAM,VALUE
|
||||||
# READINGS setzten oder l<EFBFBD>schen
|
# READINGS setzten oder l?schen
|
||||||
if($a[1] eq "DEL")
|
if($a[1] eq "DEL")
|
||||||
{
|
{
|
||||||
GetLogLevel($a[0],2),"PACHLOG -> DELETE: A0= ". $a[0] . " A1= " . $a[1] . " A2=" . $a[2];
|
GetLogLevel($a[0],2),"PACHLOG -> DELETE: A0= ". $a[0] . " A1= " . $a[1] . " A2=" . $a[2];
|
||||||
@@ -142,11 +143,16 @@ sub PachLog_Notify ($$)
|
|||||||
{
|
{
|
||||||
my ($me, $trigger) = @_;
|
my ($me, $trigger) = @_;
|
||||||
my $d = $me->{NAME};
|
my $d = $me->{NAME};
|
||||||
|
return "" if($attr{$d} && $attr{$d}{disable});
|
||||||
my $t = $trigger->{NAME};
|
my $t = $trigger->{NAME};
|
||||||
|
#LogLevel
|
||||||
|
my $ll;
|
||||||
|
if(defined($attr{$d}{'loglevel'})){$ll = $attr{$d}{'loglevel'};}
|
||||||
|
else {$ll = 5;}
|
||||||
# Eintrag fuer Trigger-Device vorhanden
|
# Eintrag fuer Trigger-Device vorhanden
|
||||||
if(!defined($defs{$d}{READINGS}{$t}))
|
if(!defined($defs{$d}{READINGS}{$t}))
|
||||||
{
|
{
|
||||||
Log 5, ("PACHLOG[INFO] => " . $t . " => Nicht definiert");
|
Log $ll, ("PACHLOG[INFO] => " . $t . " => Nicht definiert");
|
||||||
return undef;}
|
return undef;}
|
||||||
|
|
||||||
# Umwandeln 1234:0:temperature:1:humidity => %feed
|
# Umwandeln 1234:0:temperature:1:humidity => %feed
|
||||||
@@ -173,19 +179,18 @@ sub PachLog_Notify ($$)
|
|||||||
# FS20: VAL = on => 1 && VAL = off => 0
|
# FS20: VAL = on => 1 && VAL = off => 0
|
||||||
# @a = split(' ', $i);
|
# @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";
|
||||||
@@ -196,7 +201,7 @@ sub PachLog_Notify ($$)
|
|||||||
$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));
|
my ($u_name,$u_symbol,$u_type,$u_tag) = split(',',&PachLog_ReadingToUnit($r,$ll));
|
||||||
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";
|
||||||
@@ -205,61 +210,76 @@ sub PachLog_Notify ($$)
|
|||||||
}
|
}
|
||||||
$eeml .= "</environment>\n";
|
$eeml .= "</environment>\n";
|
||||||
$eeml .= "</eeml>\n";
|
$eeml .= "</eeml>\n";
|
||||||
Log 5, "PACHLOG -> " . $t . " EEML => " . $eeml;
|
Log $ll, "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
|
||||||
|
$ua->timeout(3);
|
||||||
$res = $ua->request(PUT $url,'Content' => $eeml);
|
$res = $ua->request(PUT $url,'Content' => $eeml);
|
||||||
# Ueberpruefen wir, ob alles okay war:
|
# Ueberpruefen wir, ob alles okay war:
|
||||||
if ($res->is_success())
|
if ($res->is_success())
|
||||||
{
|
{
|
||||||
Log 0,("PACHLOG => Update[" . $t ."] => SUCCESS\n");
|
Log 0,("PACHLOG => Update[" . $t ."]: " . $cvs_data . " >> SUCCESS\n");
|
||||||
# Time setzten
|
# Time setzten
|
||||||
$defs{$d}{READINGS}{$t}{TIME} = TimeNow();
|
$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($)
|
################################################################################
|
||||||
|
sub PachLog_ReadingToUnit($$)
|
||||||
{
|
{
|
||||||
# Unit fuer EEML: <unit symbol="C" type="derivedSI">Celsius</unit>
|
# Unit fuer EEML: <unit symbol="C" type="derivedSI">Celsius</unit>
|
||||||
# Input: READING z.B. temperature
|
# 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",
|
||||||
|
'rain_now' => "Rain,l/m2,contextDependentUnits,Rain",
|
||||||
'wind' => "Wind,m/s,contextDependentUnits,Wind",
|
'wind' => "Wind,m/s,contextDependentUnits,Wind",
|
||||||
);
|
);
|
||||||
if(defined($unit{$in})) {return $unit{$in};}
|
if(defined($unit{$in})) {
|
||||||
|
Log $ll ,("PACHLOG[ReadingToUnit] " . $in . " >> " . $unit{$in} );
|
||||||
|
return $unit{$in};}
|
||||||
else {return undef;}
|
else {return undef;}
|
||||||
}
|
}
|
||||||
sub ReadingToNumber($)
|
################################################################################
|
||||||
|
sub ReadingToNumber($$)
|
||||||
{
|
{
|
||||||
# Input: reading z.B. 21.1 (Celsius) oder dim10%, on-for-oldtimer etc.
|
# Input: reading z.B. 21.1 (Celsius) oder dim10%, on-for-oldtimer etc.
|
||||||
# Output: 21.1 oder 10
|
# Output: 21.1 oder 10
|
||||||
# ERROR = undef
|
# ERROR = undef
|
||||||
# Alles au<EFBFBD>er Nummern loeschen $t =~ s/[^0123456789.]//g;
|
# Alles au?er Nummern loeschen $t =~ s/[^0123456789.-]//g;
|
||||||
my $in = shift;
|
my ($in,$ll) = @_;
|
||||||
Log 5, "PACHLOG[ReadingToNumber] => in => $in";
|
Log $ll, "PACHLOG[ReadingToNumber] => in => $in";
|
||||||
# Bekannte READINGS FS20 Devices oder FHT
|
# Bekannte READINGS FS20 Devices oder FHT
|
||||||
if($in =~ /^on|Switch.*on/i) {$in = 1;}
|
if($in =~ /^on|Switch.*on/i) {$in = 1;}
|
||||||
if($in =~ /^off|Switch.*off|lime-protection/i) {$in = 0;}
|
if($in =~ /^off|Switch.*off|lime-protection/i) {$in = 0;}
|
||||||
# Keine Zahl vorhanden
|
# Keine Zahl vorhanden
|
||||||
if($in !~ /\d{1}/) {return undef;}
|
if($in !~ /\d{1}/) {
|
||||||
|
Log $ll, "PACHLOG[ReadingToNumber] No Number: $in";
|
||||||
|
return undef;}
|
||||||
# Mehrfachwerte in READING z.B. CUM_DAY: 5.040 CUM: 334.420 COST: 0.00
|
# Mehrfachwerte in READING z.B. CUM_DAY: 5.040 CUM: 334.420 COST: 0.00
|
||||||
my @b = split(' ', $in);
|
my @b = split(' ', $in);
|
||||||
if(int(@b) gt 2) {return undef;}
|
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
|
# Nur noch Zahlen z.B. dim10% = 10 oder 21.1 (Celsius) = 21.1
|
||||||
$in =~ s/[^0123456789.]//g;
|
if (int(@b) eq 2){
|
||||||
Log 5, "PACHLOG[ReadingToNumber] => out => $in";
|
Log $ll, "PACHLOG[ReadingToNumber] Split:WhiteSpace-0- $b[0]";
|
||||||
|
$in = $b[0];
|
||||||
|
}
|
||||||
|
$in =~ s/[^0123456789.-]//g;
|
||||||
|
Log $ll, "PACHLOG[ReadingToNumber] => out => $in";
|
||||||
return $in
|
return $in
|
||||||
}
|
}
|
||||||
1;
|
1;
|
||||||
|
|||||||
@@ -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 <name> PachLog <Pachube-API-Key></code> <br>
|
<br><code>define <name> PachLog <Pachube-API-Key></code> <br>
|
||||||
<br>
|
<br>
|
||||||
<Pachube-API-Key>:<br>
|
<Pachube-API-Key>:<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 <NAME> ADD <FHEM-DEVICENAME> FEED-NR:ID:READING:ID:READING</code><br><br>
|
<code>set <NAME> ADD <FHEM-DEVICENAME> 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 <NAME> ADD <My-KS300> 1234:0temperature:1:humidity:2:wind:3:rain</code><br><br>
|
<code>set <NAME> ADD <My-KS300> 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 <NAME> DEL <FHEM-DEVICENAME></code><br><br>
|
<code>set <NAME> DEL <FHEM-DEVICENAME></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>
|
||||||
|
|||||||
Reference in New Issue
Block a user