mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-05 02:19:31 +00:00
git-svn-id: https://svn.fhem.de/fhem/trunk@2755 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
22003cba26
commit
6db3002175
@ -31,14 +31,14 @@
|
||||
# attr emx CostM
|
||||
#
|
||||
# Cost rate during daytime (€ per kWh)
|
||||
# attr emx CrateD <cost rate in €/unit>
|
||||
# attr emx CostD <cost rate in €/unit>
|
||||
#
|
||||
# Start and end of daytime cost rate - optional
|
||||
# attr emx CrateDStart <time as hh:mm>
|
||||
# attr emx CrateDEnd <time as hh:mm>
|
||||
# attr emx CostDStart <time as hh:mm>
|
||||
# attr emx CostDEnd <time as hh:mm>
|
||||
#
|
||||
# Cost rate during nighttime (cost per unit) - only if needed
|
||||
# attr emx CrateN <cost rate in €/unit>
|
||||
# attr emx CostN <cost rate in €/unit>
|
||||
#
|
||||
########################################################################################
|
||||
#
|
||||
@ -108,7 +108,7 @@ sub EMX_Initialize ($) {
|
||||
$hash->{Match} = "^E0.................\$";
|
||||
|
||||
$hash->{AttrList} = "IODev " .
|
||||
"model:EMEM,EMWZ,EMGZ loglevel LogM LogY CrateD CrateDStart CrateDEnd CrateN CostM ".
|
||||
"model:EMEM,EMWZ,EMGZ loglevel LogM LogY CostD CDStart CDEnd CostN CostM ".
|
||||
$readingFnAttributes;
|
||||
}
|
||||
|
||||
@ -160,9 +160,6 @@ sub EMX_Define ($$) {
|
||||
if( $a[2] !~ m/^\d+$/ || $a[2] < 1 || $a[2] > 12 );
|
||||
$hash->{CODE} = $a[2];
|
||||
|
||||
#-- TODO: check for consistency of attributes !
|
||||
|
||||
|
||||
#--counts per unit etc.
|
||||
if($a[2] >= 1 && $a[2] <= 4) { # EMWZ
|
||||
$hash->{READINGS}{"reading"}{FACTOR} = $a[3];
|
||||
@ -223,7 +220,7 @@ sub EMX_InitializeDevice ($) {
|
||||
Log 1, $ret
|
||||
if( defined($ret));
|
||||
return $ret
|
||||
if( defined($ret));
|
||||
if( defined($ret));
|
||||
|
||||
return undef;
|
||||
}
|
||||
@ -244,7 +241,7 @@ sub EMX_FormatValues ($) {
|
||||
my $name = $hash->{NAME};
|
||||
my ($model,$factor,$period,$unit,$runit,$midnight,$cval,$vval,$rval,$pval,$dval,$deltim,$delcnt,$msg);
|
||||
my ($svalue,$dvalue,$mvalue) = ("","","");
|
||||
my $cost;
|
||||
my $cost = 0;
|
||||
|
||||
my ($sec, $min, $hour, $day, $month, $year, $wday,$yday,$isdst) = localtime(time);
|
||||
my ($seco,$mino,$houro,$dayo,$montho,$yearo,$dayrest);
|
||||
@ -295,7 +292,6 @@ sub EMX_FormatValues ($) {
|
||||
}else {
|
||||
#-- put into READINGS
|
||||
readingsBeginUpdate($hash);
|
||||
readingsBulkUpdate($hash,"count",$emx_cnt);
|
||||
$svalue = "raw $emx_cnt";
|
||||
|
||||
#-- get the old values (raw counts, always integer)
|
||||
@ -333,7 +329,7 @@ sub EMX_FormatValues ($) {
|
||||
#-- Translate from device into physical units
|
||||
# $factor = no. of counts per unit
|
||||
# $emx_peak has to be divided by 20 = 60 min/ 5 min
|
||||
if( $model eq "EMWZ" ){
|
||||
if( ($model eq "EMWZ") || ($model eq "emulator") ){
|
||||
$vval = int($cval/$factor*1000)/1000;
|
||||
$rval = int($emx_5min*12/$factor*1000)/1000;
|
||||
$pval = int($emx_peak/($factor*20)*1000)/1000;
|
||||
@ -348,28 +344,61 @@ sub EMX_FormatValues ($) {
|
||||
} else {
|
||||
Log 3,"EMX: Wrong device model $model";
|
||||
}
|
||||
$svalue = sprintf("W: %5.2f %s P: %5.2f %s Pmax: %5.3f %s",$vval,$unit,$rval,$runit,$pval,$runit);
|
||||
|
||||
#-- calculate cost
|
||||
if( defined($main::attr{$name}{"CrateD"}) ){
|
||||
if( defined($main::attr{$name}{"CostD"}) ){
|
||||
#-- single rate counter
|
||||
if( !defined($main::attr{$name}{"CrateN"}) ){
|
||||
$cost = $vval*$main::attr{$name}{"CrateD"};
|
||||
if( !defined($main::attr{$name}{"CostN"}) ){
|
||||
$cost = $vval*$main::attr{$name}{"CostD"};
|
||||
#-- dual rate counter
|
||||
}else{
|
||||
#--determine period 1 = still night, 2 = day, 3 = night again
|
||||
my @crs=split(':',$main::attr{$name}{"CrateDStart"});
|
||||
my @crs=split(':',$main::attr{$name}{"CrateDEnd"});
|
||||
my @crs = split(':',$main::attr{$name}{"CDStart"});
|
||||
my @cre = split(':',$main::attr{$name}{"CDEnd"});
|
||||
my @tim = split(/[- :]/,$emx_cnt_tim);
|
||||
#-- if one of them fails, we switch to single rate mode
|
||||
if( (int(@crs) ne 2) || (int(@cre) ne 2) ){
|
||||
$cost = $vval*$main::attr{$name}{"CostD"};
|
||||
delete $main::attr{$name}{"CostN"};
|
||||
Log 3,"EMX: $name has improper cost rate time specification";
|
||||
} else {
|
||||
#-- period 1
|
||||
if ( ($hour<=$crs[0]) & ($min<$crs[1]) ){
|
||||
#-- period 2
|
||||
}elsif ( ($hour<=$crs[0]) & ($min<$crs[1]) ){
|
||||
#-- period 3
|
||||
}else{
|
||||
if ( (($hour-$crs[0])*60 + $min-$crs[1])<0 ){
|
||||
$cost = $vval*$main::attr{$name}{"CostN"};
|
||||
#-- period 2
|
||||
}elsif ( (($hour-$cre[0])*60 + $min-$cre[1])<0 ){
|
||||
my $delta = ($tim[3]-$crs[0])*60 + ($tim[4]-$crs[1]) + $tim[5]/60.0;
|
||||
my $oldval = $hash->{READINGS}{"reading"}{VAL};
|
||||
#-- previous measurement was in period 1
|
||||
if( $delta < 0 ){
|
||||
$cost = $hash->{READINGS}{"cost"}{VAL} +
|
||||
$main::attr{$name}{"CostN"}*($vval-$oldval)*(1+$delta/5.0)+
|
||||
$main::attr{$name}{"CostD"}*($vval-$oldval)*(-$delta/5.0);
|
||||
} else{
|
||||
$cost = $hash->{READINGS}{"cost"}{VAL} + $main::attr{$name}{"CostD"}*($vval-$oldval);
|
||||
}
|
||||
#-- period 3
|
||||
}else{
|
||||
my $delta = ($tim[3]-$cre[0])*60 + ($tim[4]-$cre[1]) +$tim[5]/60.0;
|
||||
my $oldval = $hash->{READINGS}{"reading"}{VAL};
|
||||
#-- previous measurement was in period 2
|
||||
if( $delta < 0 ){
|
||||
$cost = $hash->{READINGS}{"cost"}{VAL} +
|
||||
$main::attr{$name}{"CostD"}*($vval-$oldval)*(1+$delta/5.0)+
|
||||
$main::attr{$name}{"CostN"}*($vval-$oldval)*(-$delta/5.0);
|
||||
} else{
|
||||
$cost = $hash->{READINGS}{"cost"}{VAL} + $main::attr{$name}{"CostN"}*($vval-$oldval);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$cost = floor($cost*10000+0.5)/10000;
|
||||
}
|
||||
|
||||
#-- state format
|
||||
$svalue = sprintf("W: %5.2f %s P: %5.2f %s Pmax: %5.3f %s",$vval,$unit,$rval,$runit,$pval,$runit);
|
||||
#-- put into READING
|
||||
readingsBulkUpdate($hash,"count",$emx_cnt);
|
||||
readingsBulkUpdate($hash,"reading",$vval);
|
||||
readingsBulkUpdate($hash,"rate",$rval);
|
||||
readingsBulkUpdate($hash,"peak",$pval);
|
||||
@ -377,9 +406,9 @@ sub EMX_FormatValues ($) {
|
||||
|
||||
#-- Daily/monthly accumulated value
|
||||
if( $daybreak == 1 ){
|
||||
my @month = EMX_GetMonth($hash);
|
||||
my $total = $month[0]+$vval;
|
||||
$dvalue = sprintf("D_%02d Wd: %5.2f Wm: %6.2f",$day,$vval,$total);
|
||||
my @monthv = EMX_GetMonth($hash);
|
||||
my $total = $monthv[0]+$vval;
|
||||
$dvalue = sprintf("D_%02d Wd: %5.2f Wm: %6.2f Cd: %5.2f €",$day,$vval,$total,int($cost*100)/100);
|
||||
readingsBulkUpdate($hash,"day",$dvalue);
|
||||
if( $monthbreak == 1){
|
||||
$mvalue = sprintf("M_%02d Wm: %6.2f",$month,$total);
|
||||
@ -793,6 +822,21 @@ sub EMX_emu ($$) {
|
||||
<li><a name="emx_logy"><code>attr <name> <LogY>
|
||||
<string></code></a>
|
||||
<br />Device name (<i>not file name</i>) of the yearly logfile </li>
|
||||
<li><a name="emx_costm"><code>attr <name> <CostM>
|
||||
<float></code></a>
|
||||
<br />Cost per month</li>
|
||||
<li><a name="emx_costd"><code>attr <name> <CostD>
|
||||
<float></code></a>
|
||||
<br />Cost per unit (during daytime, when the following attributes are given)</li>
|
||||
<li><a name="emx_costn"><code>attr <name> <CostN>
|
||||
<float></code></a>
|
||||
<br />Cost per unit during night time</li>
|
||||
<li><a name="emx_cdstart"><code>attr <name> <CDStart>
|
||||
<hh:mm></code></a>
|
||||
<br />Time of day when daytime cost rate starts</li>
|
||||
<li><a name="emx_cdend"><code>attr <name> <CDEnd>
|
||||
<hh:mm></code></a>
|
||||
<br />Time of day when daytime cost rate ends</li>
|
||||
<li>Standard attributes <a href="#alias">alias</a>, <a href="#comment">comment</a>, <a
|
||||
href="#event-on-update-reading">event-on-update-reading</a>, <a
|
||||
href="#event-on-change-reading">event-on-change-reading</a>, <a
|
||||
|
Loading…
x
Reference in New Issue
Block a user