- changed unit names for degree to html encoded value

- corrected negative value calculation for dpt7
- added dpt14 support (contributed by Olaf, Thanks)
- corrected calculation of percent, (people should use percent rather than percent255)
- added a lot of more alias/models
- added all accepted models to the defined attributes, so the gui can offer all models

git-svn-id: svn://svn.code.sf.net/p/fhem/code/trunk@2589 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
hotmaz
2013-01-28 21:00:15 +00:00
parent 887f8e3239
commit ed2b1d6a00

View File

@@ -5,6 +5,14 @@ package main;
use strict;
use warnings;
# Open Tasks
# - precision for model percent to 0,1
# - send time & date methods and as command
# - send 4bit values for (8bit-types)
# - allow defined groups that are only used for sending of data (no status shown)
# - add convinience method for sending dim values / allow slider
# - get should also be able to get for a given group
my %eib_c2b = (
"off" => "00",
"on" => "01",
@@ -29,9 +37,13 @@ my %models = (
my %eib_dpttypes = (
# 1-Octet unsigned value (handled as dpt7)
"dpt5" => {"CODE"=>"dpt7", "UNIT"=>""},
"percent" => {"CODE"=>"dpt7", "UNIT"=>"%"},
# 1-Octet unsigned value
"dpt5" => {"CODE"=>"dpt5", "UNIT"=>"", "factor"=>1},
"percent" => {"CODE"=>"dpt5", "UNIT"=>"%", "factor"=>100/255},
"dpt5.003" => {"CODE"=>"dpt5", "UNIT"=>"°", "factor"=>360/255},
"angle" => {"CODE"=>"dpt5", "UNIT"=>"°", "factor"=>360/255}, # alias for dpt5.003
"dpt5.004" => {"CODE"=>"dpt5", "UNIT"=>"%", "factor"=>1},
"percent255" => {"CODE"=>"dpt5", "UNIT"=>"%", "factor"=>1}, #alias for dpt5.004
# 2-Octet unsigned Value (current, length, brightness)
"dpt7" => {"CODE"=>"dpt7", "UNIT"=>""},
@@ -42,10 +54,22 @@ my %eib_dpttypes = (
"timeperiod-min" => {"CODE"=>"dpt7", "UNIT"=>"min"},
"timeperiod-h" => {"CODE"=>"dpt7", "UNIT"=>"h"},
# 2-Octet unsigned Value (Temp / Light)
# 2-Octet Float Value (Temp / Light)
"dpt9" => {"CODE"=>"dpt9", "UNIT"=>""},
"tempsensor" => {"CODE"=>"dpt9", "UNIT"=>"Celsius"},
"tempsensor" => {"CODE"=>"dpt9", "UNIT"=>"°C"},
"lightsensor" => {"CODE"=>"dpt9", "UNIT"=>"Lux"},
"speedsensor" => {"CODE"=>"dpt9", "UNIT"=>"m/s"},
"speedsensor-km/h" => {"CODE"=>"dpt9", "UNIT"=>"km/h"},
"pressuresensor" => {"CODE"=>"dpt9", "UNIT"=>"Pa"},
"rainsensor" => {"CODE"=>"dpt9", "UNIT"=>"l/m<>"},
"time1sensor" => {"CODE"=>"dpt9", "UNIT"=>"s"},
"time2sensor" => {"CODE"=>"dpt9", "UNIT"=>"ms"},
"humiditysensor" => {"CODE"=>"dpt9", "UNIT"=>"%"},
"airqualitysensor" => {"CODE"=>"dpt9", "UNIT"=>"ppm"},
"voltage-mV" => {"CODE"=>"dpt9", "UNIT"=>"mV"},
"current-mA2" => {"CODE"=>"dpt9", "UNIT"=>"mA"},
"power" => {"CODE"=>"dpt9", "UNIT"=>"kW"},
"powerdensity" => {"CODE"=>"dpt9", "UNIT"=>"W/m<>"},
# Time of Day
"dpt10" => {"CODE"=>"dpt10", "UNIT"=>""},
@@ -58,6 +82,9 @@ my %eib_dpttypes = (
# 4-Octet unsigned value (handled as dpt7)
"dpt12" => {"CODE"=>"dpt7", "UNIT"=>""},
# 4-Octet single precision float
"dpt14" => {"CODE"=>"dpt14", "UNIT"=>""},
);
@@ -73,7 +100,8 @@ EIB_Initialize($)
$hash->{DefFn} = "EIB_Define";
$hash->{UndefFn} = "EIB_Undef";
$hash->{ParseFn} = "EIB_Parse";
$hash->{AttrList} = "IODev do_not_notify:1,0 ignore:0,1 dummy:1,0 showtime:1,0 model:EIB loglevel:0,1,2,3,4,5,6";
$hash->{AttrList} = "IODev do_not_notify:1,0 ignore:0,1 dummy:1,0 showtime:1,0 loglevel:0,1,2,3,4,5,6 model:"
. join(",", keys %eib_dpttypes);
}
@@ -349,7 +377,16 @@ EIB_ParseByDatapointType($$$)
Log(4,"EIB parse $value for $name model: $model dpt: $code unit: $unit");
if ($code eq "dpt7")
if ($code eq "dpt5")
{
my $dpt5factor = $eib_dpttypes{"$model"}{"factor"};
my $fullval = hex($value);
$transval = $fullval;
$transval = sprintf("%.0f",$transval * $dpt5factor) if($dpt5factor != 0);
Log(5,"EIB $code parse $value = $fullval factor = $dpt5factor translated: $transval");
} elsif ($code eq "dpt7")
{
my $fullval = hex($value);
$transval = $fullval;
@@ -363,8 +400,9 @@ EIB_ParseByDatapointType($$$)
$sign = -1 if(($fullval & 0x8000)>0);
my $exp = ($fullval & 0x7800)>>11;
my $mant = ($fullval & 0x07FF);
$mant = -(~($mant-1)&0x07FF) if($sign==-1);
$transval = ($sign * $mant * (2**$exp))/100;
$transval = (1<<$exp)*0.01*$mant;
Log(5,"EIB $code parse $value = $fullval sign: $sign mant: $mant exp: $exp translated: $transval");
@@ -394,6 +432,22 @@ EIB_ParseByDatapointType($$$)
Log(5,"EIB $code parse $value = $fullval day: $day month: $month year: $year translated: $transval");
} elsif ($code eq "dpt14") # contributed by Olaf
{
# 4 byte single precision float
my $byte0 = hex(substr($value,0,2));
my $sign = ($byte0 & 0x80) ? -1 : 1;
my $bytee = hex(substr($value,0,4));
my $expo = (($bytee & 0x7F80) >> 7) - 127;
my $bytem = hex(substr($value,2,6));
my $mant = ($bytem & 0x7FFFFF | 0x800000);
$transval = $sign * (2 ** $expo) * ($mant / (1 <<23));
Log(5,"EIB $code parse $value translated: $transval");
} elsif ($code eq "dptxx") {
}
@@ -539,7 +593,11 @@ eib_name2hex($)
The device state in FHEM is interpreted and shown according to the specification.
<ul>
<li>dpt5</li>
<li>dpt5.003</li>
<li>angle</li>
<li>percent</li>
<li>dpt5.004</li>
<li>percent255</li>
<li>dpt7</li>
<li>length-mm</li>
<li>current-mA</li>
@@ -550,11 +608,25 @@ eib_name2hex($)
<li>dpt9</li>
<li>tempsensor</li>
<li>lightsensor</li>
<li>speedsensor</li>
<li>speedsensor-km/h</li>
<li>pressuresensor</li>
<li>rainsensor</li>
<li>time1sensor</li>
<li>time2sensor</li>
<li>humiditysensor</li>
<li>airqualitysensor</li>
<li>voltage-mV</li>
<li>current-mA2</li>
<li>current-mA2</li>
<li>power</li>
<li>powerdensity</li>
<li>dpt10</li>
<li>time</li>
<li>dpt11</li>
<li>date</li>
<li>dpt12</li>
<li>dpt14</li>
</ul>
</li>
</ul>