git-svn-id: https://svn.fhem.de/fhem/trunk@3030 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
@@ -27,6 +27,7 @@
|
|||||||
# get <name> reading => measurement for all channels
|
# get <name> reading => measurement for all channels
|
||||||
# get <name> alarm => alarm measurement settings for all channels
|
# get <name> alarm => alarm measurement settings for all channels
|
||||||
# get <name> status => alarm and i/o status for all channels
|
# get <name> status => alarm and i/o status for all channels
|
||||||
|
# get <name> version => OWX version number
|
||||||
#
|
#
|
||||||
# set <name> interval => set period for measurement
|
# set <name> interval => set period for measurement
|
||||||
#
|
#
|
||||||
@@ -74,12 +75,13 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
sub Log($$);
|
sub Log($$);
|
||||||
|
|
||||||
|
my $owx_version="3.21";
|
||||||
|
#-- fixed raw channel name, flexible channel name
|
||||||
|
my @owg_fixed = ("A","B","C","D");
|
||||||
|
my @owg_channel = ("A","B","C","D");
|
||||||
#-- value globals
|
#-- value globals
|
||||||
my @owg_status;
|
my @owg_status;
|
||||||
my $owg_state;
|
my $owg_state;
|
||||||
#-- channel name - fixed is the first array, variable the second
|
|
||||||
my @owg_fixed = ("A","B","C","D");
|
|
||||||
my @owg_channel = ("A","B","C","D");
|
|
||||||
#-- channel values - always the raw values from the device
|
#-- channel values - always the raw values from the device
|
||||||
my @owg_val=("","","","");
|
my @owg_val=("","","","");
|
||||||
#-- channel mode - fixed for now
|
#-- channel mode - fixed for now
|
||||||
@@ -102,6 +104,7 @@ my %gets = (
|
|||||||
"reading" => "",
|
"reading" => "",
|
||||||
"alarm" => "",
|
"alarm" => "",
|
||||||
"status" => "",
|
"status" => "",
|
||||||
|
"version" => ""
|
||||||
);
|
);
|
||||||
|
|
||||||
my %sets = (
|
my %sets = (
|
||||||
@@ -261,6 +264,49 @@ sub OWAD_Define ($$) {
|
|||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
########################################################################################
|
||||||
|
#
|
||||||
|
# OWAD_ChannelNames - find the real channel names
|
||||||
|
#
|
||||||
|
# Parameter hash = hash of device addressed
|
||||||
|
#
|
||||||
|
########################################################################################
|
||||||
|
|
||||||
|
sub OWAD_ChannelNames($) {
|
||||||
|
my ($hash) = @_;
|
||||||
|
|
||||||
|
my $name = $hash->{NAME};
|
||||||
|
my $state = $hash->{READINGS}{"state"}{VAL};
|
||||||
|
|
||||||
|
my ($cname,@cnama,$unit,@unarr);
|
||||||
|
|
||||||
|
for (my $i=0;$i<int(@owg_fixed);$i++){
|
||||||
|
#-- name
|
||||||
|
$cname = defined($attr{$name}{$owg_fixed[$i]."Name"}) ? $attr{$name}{$owg_fixed[$i]."Name"} : $owg_fixed[$i]."|voltage";
|
||||||
|
@cnama = split(/\|/,$cname);
|
||||||
|
if( int(@cnama)!=2){
|
||||||
|
Log 1, "OWAD: Incomplete channel name specification $cname. Better use $cname|<type of data>"
|
||||||
|
if( $state eq "defined");
|
||||||
|
push(@cnama,"unknown");
|
||||||
|
}
|
||||||
|
$owg_channel[$i]=$cnama[0];
|
||||||
|
|
||||||
|
#-- unit
|
||||||
|
$unit = defined($attr{$name}{$owg_fixed[$i]."Unit"}) ? $attr{$name}{$owg_fixed[$i]."Unit"} : "Volt|V";
|
||||||
|
@unarr= split(/\|/,$unit);
|
||||||
|
if( int(@unarr)!=2 ){
|
||||||
|
Log 1, "OWAD: Incomplete channel unit specification $unit. Better use $unit|<abbreviation>"
|
||||||
|
if( $state eq "defined");
|
||||||
|
push(@unarr,"");
|
||||||
|
}
|
||||||
|
|
||||||
|
#-- put into readings
|
||||||
|
$hash->{READINGS}{$owg_channel[$i]}{TYPE} = $cnama[1];
|
||||||
|
$hash->{READINGS}{$owg_channel[$i]}{UNIT} = $unarr[0];
|
||||||
|
$hash->{READINGS}{$owg_channel[$i]}{UNITABBR} = $unarr[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
########################################################################################
|
########################################################################################
|
||||||
#
|
#
|
||||||
# OWAD_InitializeDevice - delayed setting of initial readings and channel names
|
# OWAD_InitializeDevice - delayed setting of initial readings and channel names
|
||||||
@@ -272,35 +318,14 @@ sub OWAD_Define ($$) {
|
|||||||
sub OWAD_InitializeDevice($) {
|
sub OWAD_InitializeDevice($) {
|
||||||
my ($hash) = @_;
|
my ($hash) = @_;
|
||||||
|
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
my $interface = $hash->{IODev}->{TYPE};
|
my $interface = $hash->{IODev}->{TYPE};
|
||||||
|
|
||||||
#-- Initial readings
|
#-- Initial readings
|
||||||
@owg_val = ("","","","");
|
@owg_val = ("","","","");
|
||||||
|
|
||||||
#-- Set channel names, channel units and alarm values
|
#-- Initial alarm values
|
||||||
for( my $i=0;$i<int(@owg_fixed);$i++) {
|
for( my $i=0;$i<int(@owg_fixed);$i++) {
|
||||||
#-- name
|
|
||||||
my $cname = defined($attr{$name}{$owg_fixed[$i]."Name"}) ? $attr{$name}{$owg_fixed[$i]."Name"} : $owg_fixed[$i]."|voltage";
|
|
||||||
my @cnama = split(/\|/,$cname);
|
|
||||||
if( int(@cnama)!=2){
|
|
||||||
Log 1, "OWAD: Incomplete channel name specification $cname. Better use $cname|<type of data>";
|
|
||||||
push(@cnama,"unknown");
|
|
||||||
}
|
|
||||||
|
|
||||||
#-- unit
|
|
||||||
my $unit = defined($attr{$name}{$owg_fixed[$i]."Unit"}) ? $attr{$name}{$owg_fixed[$i]."Unit"} : "Volt|V";
|
|
||||||
my @unarr= split(/\|/,$unit);
|
|
||||||
if( int(@unarr)!=2 ){
|
|
||||||
Log 1, "OWAD: Incomplete channel unit specification $unit. Better use $unit|<abbreviation>";
|
|
||||||
push(@unarr,"");
|
|
||||||
}
|
|
||||||
|
|
||||||
#-- put into readings
|
|
||||||
$owg_channel[$i] = $cnama[0];
|
|
||||||
$hash->{READINGS}{"$owg_channel[$i]"}{TYPE} = $cnama[1];
|
|
||||||
$hash->{READINGS}{"$owg_channel[$i]"}{UNIT} = $unarr[0];
|
|
||||||
$hash->{READINGS}{"$owg_channel[$i]"}{UNITABBR} = $unarr[1];
|
|
||||||
$hash->{ERRCOUNT} = 0;
|
$hash->{ERRCOUNT} = 0;
|
||||||
|
|
||||||
#-- alarm enabling
|
#-- alarm enabling
|
||||||
@@ -363,6 +388,7 @@ sub OWAD_FormatValues($) {
|
|||||||
my ($offset,$factor,$vval,$vlow,$vhigh,$vfunc,$ret);
|
my ($offset,$factor,$vval,$vlow,$vhigh,$vfunc,$ret);
|
||||||
my $vfuncall = "";
|
my $vfuncall = "";
|
||||||
my $svalue = "";
|
my $svalue = "";
|
||||||
|
|
||||||
#-- insert initial values
|
#-- insert initial values
|
||||||
for( my $k=0;$k<int(@owg_fixed);$k++ ){
|
for( my $k=0;$k<int(@owg_fixed);$k++ ){
|
||||||
$vfuncall .= "\$owg_val[$k]=$owg_val[$k];";
|
$vfuncall .= "\$owg_val[$k]=$owg_val[$k];";
|
||||||
@@ -384,22 +410,19 @@ sub OWAD_FormatValues($) {
|
|||||||
return if( $owg_val[$i] eq "");
|
return if( $owg_val[$i] eq "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#-- obtain channel names
|
||||||
|
OWAD_ChannelNames($hash);
|
||||||
|
|
||||||
#-- check if device needs to be initialized
|
#-- check if device needs to be initialized
|
||||||
OWAD_InitializeDevice($hash)
|
OWAD_InitializeDevice($hash)
|
||||||
if( $hash->{READINGS}{"state"}{VAL} eq "defined");
|
if( $hash->{READINGS}{"state"}{VAL} eq "defined");
|
||||||
|
|
||||||
#-- put into READINGS
|
#-- put into READINGS
|
||||||
readingsBeginUpdate($hash);
|
readingsBeginUpdate($hash);
|
||||||
|
|
||||||
#-- formats for output
|
#-- formats for output
|
||||||
for (my $i=0;$i<int(@owg_fixed);$i++){
|
for (my $i=0;$i<int(@owg_fixed);$i++){
|
||||||
my $cname = defined($attr{$name}{$owg_fixed[$i]."Name"}) ? $attr{$name}{$owg_fixed[$i]."Name"} : $owg_fixed[$i]."|voltage";
|
|
||||||
my @cnama = split(/\|/,$cname);
|
|
||||||
$owg_channel[$i]=$cnama[0];
|
|
||||||
|
|
||||||
my $unit = defined($attr{$name}{$owg_fixed[$i]."Unit"}) ? $attr{$name}{$owg_fixed[$i]."Unit"} : "Volt|V";
|
|
||||||
my @unarr= split(/\|/,$unit);
|
|
||||||
|
|
||||||
#-- skip a few things when the values are undefined or zero
|
#-- skip a few things when the values are undefined or zero
|
||||||
if( !defined($owg_val[$i]) ){
|
if( !defined($owg_val[$i]) ){
|
||||||
$svalue .= "$owg_channel[$i]: ???"
|
$svalue .= "$owg_channel[$i]: ???"
|
||||||
@@ -419,12 +442,15 @@ sub OWAD_FormatValues($) {
|
|||||||
} else {
|
} else {
|
||||||
$vfunc = "V$owg_fixed[$i]";
|
$vfunc = "V$owg_fixed[$i]";
|
||||||
}
|
}
|
||||||
$hash->{tempf}{"$owg_fixed[$i]"}{function} = $vfunc;
|
$hash->{tempf}{$owg_fixed[$i]}{function} = $vfunc;
|
||||||
|
|
||||||
#-- replace by proper values (VA -> $owg_val[0] etc.)
|
#-- replace by proper values (VA -> $owg_val[0] etc.)
|
||||||
|
# careful: how to prevent {VAL} from being replaced ?
|
||||||
for( my $k=0;$k<int(@owg_fixed);$k++ ){
|
for( my $k=0;$k<int(@owg_fixed);$k++ ){
|
||||||
my $sstr = "V$owg_fixed[$k]";
|
my $sstr = "V$owg_fixed[$k]";
|
||||||
|
$vfunc =~ s/VAL/WERT/g;
|
||||||
$vfunc =~ s/$sstr/\$owg_val[$k]/g;
|
$vfunc =~ s/$sstr/\$owg_val[$k]/g;
|
||||||
|
$vfunc =~ s/WERT/VAL/g;
|
||||||
}
|
}
|
||||||
|
|
||||||
#-- determine the measured value from the function
|
#-- determine the measured value from the function
|
||||||
@@ -446,7 +472,7 @@ sub OWAD_FormatValues($) {
|
|||||||
$main::attr{$name}{$owg_fixed[$i]."High"}=$vhigh;
|
$main::attr{$name}{$owg_fixed[$i]."High"}=$vhigh;
|
||||||
|
|
||||||
#-- string buildup for return value, STATE and alarm
|
#-- string buildup for return value, STATE and alarm
|
||||||
$svalue .= sprintf( "%s: %5.3f %s", $owg_channel[$i], $vval,$unarr[1]);
|
$svalue .= sprintf( "%s: %5.3f %s", $owg_channel[$i], $vval,$hash->{READINGS}{$owg_channel[$i]}{UNITABBR});
|
||||||
|
|
||||||
#-- Test for alarm condition
|
#-- Test for alarm condition
|
||||||
$alarm = "none";
|
$alarm = "none";
|
||||||
@@ -548,6 +574,11 @@ sub OWAD_Get($@) {
|
|||||||
return "$name.interval => $value";
|
return "$name.interval => $value";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#-- get version
|
||||||
|
if( $a[1] eq "version") {
|
||||||
|
return "$name.version => $owx_version";
|
||||||
|
}
|
||||||
|
|
||||||
#-- reset presence
|
#-- reset presence
|
||||||
$hash->{PRESENT} = 0;
|
$hash->{PRESENT} = 0;
|
||||||
|
|
||||||
@@ -757,11 +788,12 @@ sub OWAD_Set($@) {
|
|||||||
|
|
||||||
#-- define vars
|
#-- define vars
|
||||||
my $ret = undef;
|
my $ret = undef;
|
||||||
my $channel = undef;
|
my $channon = undef;
|
||||||
my $channo = undef;
|
my $channo = undef;
|
||||||
my $factor;
|
my $factor;
|
||||||
my $offset;
|
my $offset;
|
||||||
my $condx;
|
my $condx;
|
||||||
|
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
my $model = $hash->{OW_MODEL};
|
my $model = $hash->{OW_MODEL};
|
||||||
|
|
||||||
@@ -779,11 +811,11 @@ sub OWAD_Set($@) {
|
|||||||
|
|
||||||
#-- find out which channel we have
|
#-- find out which channel we have
|
||||||
my $tc =$key;
|
my $tc =$key;
|
||||||
if( $tc =~ s/(.*)(Alarm|Low|High)/$channel=$1/se ) {
|
if( $tc =~ s/(.*)(Alarm|Low|High)/$channon=$1/se ) {
|
||||||
for (my $i=0;$i<int(@owg_fixed);$i++){
|
for (my $i=0;$i<int(@owg_fixed);$i++){
|
||||||
if( $tc eq $owg_fixed[$i] ){
|
if( $tc eq $owg_fixed[$i] ){
|
||||||
$channo = $i;
|
$channo = $i;
|
||||||
$channel = $tc;
|
$channon = $tc;
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,17 +28,18 @@
|
|||||||
# get <name> midnight <channel> => todays starting value for counter
|
# get <name> midnight <channel> => todays starting value for counter
|
||||||
# get <name> counter <channel> => value for counter
|
# get <name> counter <channel> => value for counter
|
||||||
# get <name> counters => values for both counters
|
# get <name> counters => values for both counters
|
||||||
|
# get <name> version => OWX version number
|
||||||
#
|
#
|
||||||
# set <name> interval => set query interval for measurement
|
# set <name> interval => set query interval for measurement
|
||||||
# set <name> memory <page> => 32 byte string into page 0..13
|
# set <name> memory <page> => 32 byte string into page 0..13
|
||||||
# set <name> midnight <channel> => todays starting value for counter
|
# set <name> midnight <channel> => todays starting value for counter
|
||||||
#
|
#
|
||||||
# Additional attributes are defined in fhem.cfg, in some cases per channel, where <channel>=A,B
|
# Additional attributes are defined in fhem.cfg, in some cases per channel, where <channel>=A,B
|
||||||
# Note: attributes are read only during initialization procedure - later changes are not used.
|
|
||||||
#
|
#
|
||||||
# attr <name> LogM <string> = device name (not file name) of monthly log file
|
# attr <name> LogM <string> = device name (not file name) of monthly log file
|
||||||
# attr <name> <channel>Name <string>|<string> = name for the channel | a type description for the measured value
|
# attr <name> <channel>Name <string>|<string> = name for the channel | a type description for the measured value
|
||||||
# attr <name> <channel>Unit <string>|<string> = unit of measurement for this channel | its abbreviation
|
# attr <name> <channel>Unit <string>|<string> = unit of measurement for this channel | its abbreviation
|
||||||
|
# attr <name> <channel>Rate <string>|<string> = name for the channel ratw | a type description for the measured value
|
||||||
# attr <name> <channel>Offset <float> = offset added to the reading in this channel
|
# attr <name> <channel>Offset <float> = offset added to the reading in this channel
|
||||||
# attr <name> <channel>Factor <float> = factor multiplied to (reading+offset) in this channel
|
# attr <name> <channel>Factor <float> = factor multiplied to (reading+offset) in this channel
|
||||||
# attr <name> <channel>Mode <string> = counting mode = normal(default) or daily
|
# attr <name> <channel>Mode <string> = counting mode = normal(default) or daily
|
||||||
@@ -52,7 +53,7 @@
|
|||||||
# after each interval <date> <name> <channel>: <value> <unit> <value> / <unit>/<period> <channel>: <value> <unit> / <value> <unit>/<period>
|
# after each interval <date> <name> <channel>: <value> <unit> <value> / <unit>/<period> <channel>: <value> <unit> / <value> <unit>/<period>
|
||||||
# example: 2012-07-30_00:07:55 OWX_C Taste: 17.03 p 28.1 p/h B: 7.0 cts 0.0 cts/min
|
# example: 2012-07-30_00:07:55 OWX_C Taste: 17.03 p 28.1 p/h B: 7.0 cts 0.0 cts/min
|
||||||
# after midnight <new date> <name> <old day> <old date> <channel>: <value> <unit> <channel>: <value> <unit>
|
# after midnight <new date> <name> <old day> <old date> <channel>: <value> <unit> <channel>: <value> <unit>
|
||||||
# example: 2012-07-30_00:00:57 OWX_C D_29: 2012-7-29_23:59:59 Taste: 110.0 p, B: 7.0 cts
|
# example: 2012-07-30_00:00:57 OWX_C D29: 2012-7-29_23:59:59 Taste: 110.0 p, B: 7.0 cts
|
||||||
########################################################################################
|
########################################################################################
|
||||||
#
|
#
|
||||||
# This programm is free software; you can redistribute it and/or modify
|
# This programm is free software; you can redistribute it and/or modify
|
||||||
@@ -78,10 +79,12 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
sub Log($$);
|
sub Log($$);
|
||||||
|
|
||||||
#-- channel name - fixed is the first array, variable the second
|
my $owx_version="3.21";
|
||||||
my @owg_fixed = ("A","B");
|
#-- fixed raw channel name, flexible channel name
|
||||||
my @owg_channel;
|
my @owg_fixed = ("A","B");
|
||||||
my @owg_rate;
|
my @owg_channel = ("A","B");
|
||||||
|
my @owg_rate = ("A_rate","B_rate");
|
||||||
|
|
||||||
#-- channel values - always the raw values from the device
|
#-- channel values - always the raw values from the device
|
||||||
my @owg_val;
|
my @owg_val;
|
||||||
my @owg_midnight;
|
my @owg_midnight;
|
||||||
@@ -94,7 +97,9 @@ my %gets = (
|
|||||||
"memory" => "",
|
"memory" => "",
|
||||||
"midnight" => "",
|
"midnight" => "",
|
||||||
"counter" => "",
|
"counter" => "",
|
||||||
"counters" => ""
|
"counters" => "",
|
||||||
|
"month" => "",
|
||||||
|
"version" => ""
|
||||||
);
|
);
|
||||||
|
|
||||||
my %sets = (
|
my %sets = (
|
||||||
@@ -108,7 +113,6 @@ my %updates = (
|
|||||||
"counter" => ""
|
"counter" => ""
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
########################################################################################
|
########################################################################################
|
||||||
#
|
#
|
||||||
# The following subroutines are independent of the bus interface
|
# The following subroutines are independent of the bus interface
|
||||||
@@ -136,6 +140,7 @@ sub OWCOUNT_Initialize ($) {
|
|||||||
$readingFnAttributes;
|
$readingFnAttributes;
|
||||||
for( my $i=0;$i<int(@owg_fixed);$i++ ){
|
for( my $i=0;$i<int(@owg_fixed);$i++ ){
|
||||||
$attlist .= " ".$owg_fixed[$i]."Name";
|
$attlist .= " ".$owg_fixed[$i]."Name";
|
||||||
|
$attlist .= " ".$owg_fixed[$i]."Rate";
|
||||||
$attlist .= " ".$owg_fixed[$i]."Offset";
|
$attlist .= " ".$owg_fixed[$i]."Offset";
|
||||||
$attlist .= " ".$owg_fixed[$i]."Factor";
|
$attlist .= " ".$owg_fixed[$i]."Factor";
|
||||||
$attlist .= " ".$owg_fixed[$i]."Unit";
|
$attlist .= " ".$owg_fixed[$i]."Unit";
|
||||||
@@ -218,32 +223,98 @@ sub OWCOUNT_Define ($$) {
|
|||||||
$hash->{IODev}=$attr{$name}{"IODev"}
|
$hash->{IODev}=$attr{$name}{"IODev"}
|
||||||
if( defined($attr{$name}{"IODev"}) );
|
if( defined($attr{$name}{"IODev"}) );
|
||||||
AssignIoPort($hash);
|
AssignIoPort($hash);
|
||||||
if( (!defined($hash->{IODev}->{NAME})) || (!defined($hash->{IODev})) ){
|
if( (!defined($hash->{IODev}->{NAME})) || (!defined($hash->{IODev})) ){
|
||||||
return "OWSWITCH: Warning, no 1-Wire I/O device found for $name.";
|
return "OWSWITCH: Warning, no 1-Wire I/O device found for $name.";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if( $hash->{IODev}->{PRESENT} != 1 ){
|
|
||||||
# return "OWSWITCH: Warning, 1-Wire I/O device ".$hash->{IODev}->{NAME}." not present for $name.";
|
|
||||||
#}
|
|
||||||
$modules{OWCOUNT}{defptr}{$id} = $hash;
|
$modules{OWCOUNT}{defptr}{$id} = $hash;
|
||||||
#--
|
#--
|
||||||
readingsSingleUpdate($hash,"state","defined",1);
|
readingsSingleUpdate($hash,"state","defined",1);
|
||||||
Log 3, "OWCOUNT: Device $name defined.";
|
Log 3, "OWCOUNT: Device $name defined.";
|
||||||
|
|
||||||
#-- Initialization reading according to interface type
|
|
||||||
my $interface= $hash->{IODev}->{TYPE};
|
|
||||||
|
|
||||||
#-- Start timer for initialization in a few seconds
|
|
||||||
InternalTimer(time()+5, "OWCOUNT_InitializeDevice", $hash, 0);
|
|
||||||
|
|
||||||
#-- Start timer for updates
|
#-- Start timer for updates
|
||||||
InternalTimer(time()+5+$hash->{INTERVAL}, "OWCOUNT_GetValues", $hash, 0);
|
InternalTimer(time()+10, "OWCOUNT_GetValues", $hash, 0);
|
||||||
|
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
########################################################################################
|
||||||
|
#
|
||||||
|
# OWCOUNT_ChannelNames - find the real channel names
|
||||||
|
#
|
||||||
|
# Parameter hash = hash of device addressed
|
||||||
|
#
|
||||||
|
########################################################################################
|
||||||
|
|
||||||
|
sub OWCOUNT_ChannelNames($) {
|
||||||
|
my ($hash) = @_;
|
||||||
|
|
||||||
|
my $name = $hash->{NAME};
|
||||||
|
my $state = $hash->{READINGS}{"state"}{VAL};
|
||||||
|
|
||||||
|
my ($cname,@cnama,$unit,@unarr,$runit,$period);
|
||||||
|
|
||||||
|
for (my $i=0;$i<int(@owg_fixed);$i++){
|
||||||
|
#-- name
|
||||||
|
$cname = defined($attr{$name}{$owg_fixed[$i]."Name"}) ? $attr{$name}{$owg_fixed[$i]."Name"} : $owg_fixed[$i]."|event";
|
||||||
|
@cnama = split(/\|/,$cname);
|
||||||
|
if( int(@cnama)!=2){
|
||||||
|
Log 1, "OWCOUNT: Incomplete channel name specification $cname. Better use $cname|<type of data>"
|
||||||
|
if( $state eq "defined");
|
||||||
|
push(@cnama,"unknown");
|
||||||
|
}
|
||||||
|
#-- unit
|
||||||
|
$unit = defined($attr{$name}{$owg_fixed[$i]."Unit"}) ? $attr{$name}{$owg_fixed[$i]."Unit"} : "counts|cts";
|
||||||
|
@unarr= split(/\|/,$unit);
|
||||||
|
if( int(@unarr)!=2 ){
|
||||||
|
Log 1, "OWCOUNT: Incomplete channel unit specification $unit. Better use $unit|<abbreviation>"
|
||||||
|
if( $state eq "defined");
|
||||||
|
push(@unarr,"");
|
||||||
|
}
|
||||||
|
|
||||||
|
#-- put into readings
|
||||||
|
$owg_channel[$i]=$cnama[0];
|
||||||
|
$hash->{READINGS}{$owg_channel[$i]}{TYPE} = $cnama[1];
|
||||||
|
$hash->{READINGS}{$owg_channel[$i]}{UNIT} = $unarr[0];
|
||||||
|
$hash->{READINGS}{$owg_channel[$i]}{UNITABBR} = $unarr[1];
|
||||||
|
|
||||||
|
$period = defined($attr{$name}{$owg_fixed[$i]."Period"}) ? $attr{$name}{$owg_fixed[$i]."Period"} : "hour";
|
||||||
|
#-- put into readings
|
||||||
|
$hash->{READINGS}{$owg_channel[$i]}{PERIOD} = $period;
|
||||||
|
|
||||||
|
#-- rate
|
||||||
|
$cname = defined($attr{$name}{$owg_fixed[$i]."Rate"}) ? $attr{$name}{$owg_fixed[$i]."Rate"} : $cnama[0]."_rate|".$cnama[1]."_rate";
|
||||||
|
@cnama = split(/\|/,$cname);
|
||||||
|
if( int(@cnama)!=2){
|
||||||
|
Log 1, "OWCOUNT: Incomplete rate name specification $cname. Better use $cname|<type of data>"
|
||||||
|
if( $state eq "defined");
|
||||||
|
push(@cnama,"unknown");
|
||||||
|
}
|
||||||
|
|
||||||
|
#-- rate unit
|
||||||
|
my $runit = "";
|
||||||
|
if( $period eq "hour" ){
|
||||||
|
$runit = "/h";
|
||||||
|
}elsif( $period eq "minute" ){
|
||||||
|
$runit = "/min";
|
||||||
|
} else {
|
||||||
|
$runit = "/s";
|
||||||
|
}
|
||||||
|
#-- put into readings
|
||||||
|
$owg_rate[$i]=$cnama[0];
|
||||||
|
$hash->{READINGS}{$owg_rate[$i]}{TYPE} = $cnama[1];
|
||||||
|
$hash->{READINGS}{$owg_rate[$i]}{UNIT} = $unarr[0].$runit;
|
||||||
|
$hash->{READINGS}{$owg_rate[$i]}{UNITABBR} = $unarr[1].$runit;
|
||||||
|
|
||||||
|
#-- some special cases
|
||||||
|
# Energy/Power
|
||||||
|
$hash->{READINGS}{$owg_rate[$i]}{UNIT} = "kW"
|
||||||
|
if ($unarr[0].$runit eq "kWh/h" );
|
||||||
|
$hash->{READINGS}{$owg_rate[$i]}{UNITABBR} = "kW"
|
||||||
|
if ($unarr[1].$runit eq "kWh/h" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
########################################################################################
|
########################################################################################
|
||||||
#
|
#
|
||||||
# OWCOUNT_InitializeDevice - delayed setting of initial readings and channel names
|
# OWCOUNT_InitializeDevice - delayed setting of initial readings and channel names
|
||||||
@@ -257,79 +328,15 @@ sub OWCOUNT_InitializeDevice($) {
|
|||||||
|
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
$hash->{PRESENT} = 0;
|
$hash->{PRESENT} = 0;
|
||||||
|
|
||||||
#-- Set channel names, channel units and alarm values
|
#-- initial values
|
||||||
for( my $i=0;$i<int(@owg_fixed);$i++) {
|
for( my $i=0;$i<int(@owg_fixed);$i++) {
|
||||||
#-- initial readings
|
#-- initial readings
|
||||||
$owg_val[$i] = "";
|
$owg_val[$i] = "";
|
||||||
$owg_midnight[$i] = 0.0;
|
$owg_midnight[$i] = "";
|
||||||
#-- name
|
|
||||||
my $cname = defined($attr{$name}{$owg_fixed[$i]."Name"}) ? $attr{$name}{$owg_fixed[$i]."Name"} : $owg_fixed[$i]."|event";
|
|
||||||
my @cnama = split(/\|/,$cname);
|
|
||||||
if( int(@cnama)!=2){
|
|
||||||
Log 1, "OWCOUNT: Incomplete channel name specification $cname. Better use $cname|<type of data>";
|
|
||||||
push(@cnama,"unknown");
|
|
||||||
}
|
|
||||||
|
|
||||||
#-- unit
|
|
||||||
my $unit = defined($attr{$name}{$owg_fixed[$i]."Unit"}) ? $attr{$name}{$owg_fixed[$i]."Unit"} : "counts|cts";
|
|
||||||
my @unarr= split(/\|/,$unit);
|
|
||||||
if( int(@unarr)!=2 ){
|
|
||||||
Log 1, "OWCOUNT: Incomplete channel unit specification $unit. Better use <long unit desc>|$unit";
|
|
||||||
push(@unarr,"");
|
|
||||||
}
|
|
||||||
|
|
||||||
#-- rate unit
|
|
||||||
my $period = defined($attr{$name}{$owg_fixed[$i]."Period"}) ? $attr{$name}{$owg_fixed[$i]."Period"} : "hour";
|
|
||||||
|
|
||||||
#-- offset and scale factor
|
|
||||||
my $offset = defined($attr{$name}{$owg_fixed[$i]."Offset"}) ? $attr{$name}{$owg_fixed[$i]."Offset"} : 0;
|
|
||||||
my $factor = defined($attr{$name}{$owg_fixed[$i]."Factor"}) ? $attr{$name}{$owg_fixed[$i]."Factor"} : 1;
|
|
||||||
#-- put into readings
|
|
||||||
$owg_channel[$i] = $cnama[0];
|
|
||||||
$hash->{READINGS}{"$owg_channel[$i]"}{TYPE} = $cnama[1];
|
|
||||||
$hash->{READINGS}{"$owg_channel[$i]"}{UNIT} = $unarr[0];
|
|
||||||
$hash->{READINGS}{"$owg_channel[$i]"}{UNITABBR} = $unarr[1];
|
|
||||||
$hash->{READINGS}{"$owg_channel[$i]"}{PERIOD} = $period;
|
|
||||||
$hash->{READINGS}{"$owg_channel[$i]"}{OFFSET} = $offset;
|
|
||||||
$hash->{READINGS}{"$owg_channel[$i]"}{FACTOR} = $factor;
|
|
||||||
|
|
||||||
$owg_rate[$i] = $cnama[0]."_rate";
|
|
||||||
my $runit = "";
|
|
||||||
if( $period eq "hour" ){
|
|
||||||
$runit = "/h";
|
|
||||||
}elsif( $period eq "minute" ){
|
|
||||||
$runit = "/min";
|
|
||||||
} else {
|
|
||||||
$runit = "/s";
|
|
||||||
}
|
|
||||||
$hash->{READINGS}{"$owg_rate[$i]"}{TYPE} = $cnama[1]."_rate";
|
|
||||||
$hash->{READINGS}{"$owg_rate[$i]"}{UNIT} = $unarr[0].$runit;
|
|
||||||
$hash->{READINGS}{"$owg_rate[$i]"}{UNITABBR} = $unarr[1].$runit;
|
|
||||||
#-- some special cases
|
|
||||||
# Energy/Power
|
|
||||||
$hash->{READINGS}{"$owg_rate[$i]"}{UNIT} = "kW"
|
|
||||||
if ($unarr[0].$runit eq "kWh/h" );
|
|
||||||
$hash->{READINGS}{"$owg_rate[$i]"}{UNITABBR} = "kW"
|
|
||||||
if ($unarr[1].$runit eq "kWh/h" );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#-- set status according to interface type
|
return undef;
|
||||||
my $interface= $hash->{IODev}->{TYPE};
|
|
||||||
|
|
||||||
#-- OWX interface
|
|
||||||
if( !defined($interface) ){
|
|
||||||
return "OWCOUNT: Interface missing";
|
|
||||||
} elsif( $interface eq "OWX" ){
|
|
||||||
#-- OWFS interface
|
|
||||||
#}elsif( $interface eq "OWFS" ){
|
|
||||||
# $ret = OWFSAD_GetPage($hash,"reading");
|
|
||||||
#-- Unknown interface
|
|
||||||
}else{
|
|
||||||
return "OWCOUNT: InitializeDevice with wrong IODev type $interface";
|
|
||||||
}
|
|
||||||
#-- Initialize all the display stuff
|
|
||||||
OWCOUNT_FormatValues($hash);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
########################################################################################
|
########################################################################################
|
||||||
@@ -344,70 +351,93 @@ sub OWCOUNT_FormatValues($) {
|
|||||||
my ($hash) = @_;
|
my ($hash) = @_;
|
||||||
|
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
my ($offset,$factor,$period,$unit,$runit,$midnight,$vval,$vrate);
|
my ($offset,$factor,$period,$unit,$runit,$vval,$vrate);
|
||||||
my ($svalue,$dvalue,$mvalue) = ("","","");
|
my ($svalue,$dvalue,$mvalue) = ("","","");
|
||||||
my $galarm = 0;
|
my $galarm = 0;
|
||||||
|
|
||||||
my $tn = TimeNow();
|
my $tn = TimeNow();
|
||||||
my ($sec, $min, $hour, $day, $month, $year, $wday,$yday,$isdst) = localtime(time);
|
my ($sec, $min, $hour, $day, $month, $year, $wday,$yday,$isdst) = localtime(time);
|
||||||
my ($seco,$mino,$houro,$dayo,$montho,$yearo,$dayrest);
|
my ($seco,$mino,$houro,$dayo,$montho,$yearo,$dayrest);
|
||||||
my ($dt,$dv,$dval,$delt,$delf);
|
my ($daily, $dt,$dval,$dval2,$deltim,$delt,$delf);
|
||||||
my $daybreak = 0;
|
my $daybreak = 0;
|
||||||
my $monthbreak = 0;
|
my $monthbreak = 0;
|
||||||
|
|
||||||
my $present = $hash->{PRESENT};
|
my $present = $hash->{PRESENT};
|
||||||
|
|
||||||
|
#-- no change in any value if invalid reading
|
||||||
|
#for (my $i=0;$i<int(@owg_fixed);$i++){
|
||||||
|
# return if( $owg_val[$i] eq "");
|
||||||
|
#}
|
||||||
|
|
||||||
|
#-- obtain channel names
|
||||||
|
OWCOUNT_ChannelNames($hash);
|
||||||
|
|
||||||
|
#-- check if device needs to be initialized
|
||||||
|
OWCOUNT_InitializeDevice($hash)
|
||||||
|
if( $hash->{READINGS}{"state"}{VAL} eq "defined");
|
||||||
|
|
||||||
|
#-- Check, whether we have a new day at the next reading
|
||||||
|
$deltim = $hour*60.0+$min+$sec/60.0 - (1440 - $hash->{INTERVAL}/60.0);
|
||||||
|
if( $deltim>=0 ){
|
||||||
|
$daybreak = 1;
|
||||||
|
$monthbreak = 0;
|
||||||
|
#-- Timer data from tomorrow
|
||||||
|
my ($secn,$minn,$hourn,$dayn,$monthn,$yearn,$wdayn,$ydayn,$isdstn) = localtime(time() + $hash->{INTERVAL} + 3600);
|
||||||
|
#-- Check, whether we have a new month
|
||||||
|
if( $dayn == 1 ){
|
||||||
|
$monthbreak = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#-- put into READINGS
|
#-- put into READINGS
|
||||||
readingsBeginUpdate($hash);
|
readingsBeginUpdate($hash);
|
||||||
|
|
||||||
#-- formats for output
|
#-- formats for output
|
||||||
for (my $i=0;$i<int(@owg_fixed);$i++){
|
for (my $i=0;$i<int(@owg_fixed);$i++){
|
||||||
my $cname = defined($attr{$name}{$owg_fixed[$i]."Name"}) ? $attr{$name}{$owg_fixed[$i]."Name"} : $owg_fixed[$i];
|
|
||||||
my @cnama = split(/\|/,$cname);
|
#-- mode normal or daily
|
||||||
$owg_channel[$i]= $cnama[0];
|
$daily = 0;
|
||||||
$owg_rate[$i] = $cnama[0]."_rate";
|
if( defined($attr{$name}{$owg_fixed[$i]."Mode"} )){
|
||||||
|
if( $attr{$name}{$owg_fixed[$i]."Mode"} eq "daily"){
|
||||||
|
$daily = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$offset = $hash->{READINGS}{"$owg_channel[$i]"}{OFFSET};
|
#-- offset and scale factor
|
||||||
$factor = $hash->{READINGS}{"$owg_channel[$i]"}{FACTOR};
|
$offset = defined($attr{$name}{$owg_fixed[$i]."Offset"}) ? $attr{$name}{$owg_fixed[$i]."Offset"} : 0;
|
||||||
$unit = $hash->{READINGS}{"$owg_channel[$i]"}{UNITABBR};
|
$factor = defined($attr{$name}{$owg_fixed[$i]."Factor"}) ? $attr{$name}{$owg_fixed[$i]."Factor"} : 1;
|
||||||
$period = $hash->{READINGS}{"$owg_channel[$i]"}{PERIOD};
|
|
||||||
$runit = $hash->{READINGS}{"$owg_rate[$i]"}{UNITABBR};
|
#-- put into READINGS
|
||||||
|
$hash->{READINGS}{$owg_channel[$i]}{OFFSET} = $offset;
|
||||||
|
$hash->{READINGS}{$owg_channel[$i]}{FACTOR} = $factor;
|
||||||
|
|
||||||
|
$unit = $hash->{READINGS}{$owg_channel[$i]}{UNITABBR};
|
||||||
|
$period = $hash->{READINGS}{$owg_channel[$i]}{PERIOD};
|
||||||
|
$runit = $hash->{READINGS}{$owg_rate[$i]}{UNITABBR};
|
||||||
|
|
||||||
#-- skip some things if undefined
|
#-- skip some things if undefined
|
||||||
if( $owg_val[$i] eq ""){
|
if( $owg_val[$i] eq ""){
|
||||||
$svalue .= $owg_channel[$i].": ???";
|
$svalue .= $owg_channel[$i].": ???";
|
||||||
}else{
|
}else{
|
||||||
#-- only if attribute value mode=daily, take the midnight value from memory
|
#-- only if attribute value mode=daily, take the midnight value from memory
|
||||||
if( defined($attr{$name}{$owg_fixed[$i]."Mode"} )){
|
if( $daily == 1){
|
||||||
if( $attr{$name}{$owg_fixed[$i]."Mode"} eq "daily"){
|
$vval = int( (($owg_val[$i] + $offset)*$factor - $owg_midnight[$i])*100)/100;
|
||||||
$midnight = $owg_midnight[$i];
|
|
||||||
#-- parse float from midnight
|
|
||||||
$midnight =~ /([\d\.]+)/;
|
|
||||||
$midnight = 0.0 if(!(defined($midnight)));
|
|
||||||
} else {
|
|
||||||
$midnight = 0.0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$midnight = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#-- correct values for proper offset, factor
|
|
||||||
# careful: midnight value has not been corrected so far !
|
|
||||||
#-- 1 decimal
|
|
||||||
if( $factor == 1.0 ){
|
|
||||||
$vval = int(($owg_val[$i] + $offset - $midnight)*10)/10;
|
|
||||||
#-- 3 decimals
|
|
||||||
} else {
|
} else {
|
||||||
$vval = int((($owg_val[$i] + $offset)*$factor - $midnight)*1000)/1000;
|
$vval = int( ($owg_val[$i] + $offset)*$factor*100)/100;
|
||||||
}
|
}
|
||||||
|
|
||||||
#-- get the old values
|
#-- rate calculation: get the old values
|
||||||
my $oldval = $hash->{READINGS}{"$owg_channel[$i]"}{VAL};
|
my $oldval = $hash->{READINGS}{$owg_channel[$i]}{VAL};
|
||||||
my $oldtim = $hash->{READINGS}{"$owg_channel[$i]"}{TIME};
|
my $oldtim = $hash->{READINGS}{$owg_channel[$i]}{TIME};
|
||||||
$oldtim = "" if(!defined($oldtim));
|
$oldtim = "" if(!defined($oldtim));
|
||||||
|
|
||||||
#-- safeguard against the case where no previous measurement
|
#-- safeguard against the case where no previous measurement
|
||||||
if( length($oldtim) > 0 ){
|
if( length($oldtim) > 0 ){
|
||||||
|
#-- correct counter wraparound since last reading
|
||||||
|
if( $vval < $oldval) {
|
||||||
|
$oldval -= 65536*(65536*$factor);
|
||||||
|
}
|
||||||
|
|
||||||
#-- previous measurement time
|
#-- previous measurement time
|
||||||
($yearo,$montho,$dayrest) = split(/-/,$oldtim);
|
($yearo,$montho,$dayrest) = split(/-/,$oldtim);
|
||||||
$dayo = substr($dayrest,0,2);
|
$dayo = substr($dayrest,0,2);
|
||||||
@@ -416,38 +446,7 @@ sub OWCOUNT_FormatValues($) {
|
|||||||
#-- time dfifference to previous measurement and to midnight
|
#-- time dfifference to previous measurement and to midnight
|
||||||
$delt = ($hour-$houro)*3600 + ($min-$mino)*60 + ($sec-$seco);
|
$delt = ($hour-$houro)*3600 + ($min-$mino)*60 + ($sec-$seco);
|
||||||
$delf = $hour *3600 + $min *60 + $sec - 86400;
|
$delf = $hour *3600 + $min *60 + $sec - 86400;
|
||||||
if( ($delf+$hash->{INTERVAL}) >= 0 ){
|
|
||||||
$daybreak = 1;
|
|
||||||
#-- Timer data from tomorrow
|
|
||||||
my ($secn,$minn,$hourn,$dayn,$monthn,$yearn,$wdayn,$ydayn,$isdstn) = localtime(time() + 24*60*60);
|
|
||||||
#-- Check, whether we have a new month
|
|
||||||
if( (($delf+$hash->{INTERVAL}) > 0) && ($dayn == 1) ){
|
|
||||||
$monthbreak =1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#-- correct $vval for wraparound of 32 bit counter
|
|
||||||
if( ($vval < $oldval) && ($daybreak==0) && ($present==1) ){
|
|
||||||
Log 1,"OWCOUNT TODO: Counter wraparound";
|
|
||||||
}
|
|
||||||
|
|
||||||
if( $daybreak==1 ){
|
|
||||||
#-- linear extrapolation
|
|
||||||
$dt = -$delf/$delt;
|
|
||||||
$dv = ($vval-$oldval)*$dt;
|
|
||||||
$dval = $vval+$dv;
|
|
||||||
|
|
||||||
#-- in any mode store the interpolated value in the midnight store
|
|
||||||
OWXCOUNT_SetPage($hash,14+$i,sprintf("%f",$dval));
|
|
||||||
#-- string buildup for monthly logging
|
|
||||||
$dvalue .= sprintf( "%s: %5.1f %s", $owg_channel[$i], $dval,$unit);
|
|
||||||
if( $day<$dayo ){
|
|
||||||
$monthbreak = 1;
|
|
||||||
Log 1, "OWCOUNT: Change of month";
|
|
||||||
#-- string buildup for yearly logging
|
|
||||||
$mvalue .= sprintf( "%s: %5.1f %s", $owg_channel[$i], $dval,$unit);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#-- rate
|
#-- rate
|
||||||
if( ($delt > 0.0) && $present ){
|
if( ($delt > 0.0) && $present ){
|
||||||
$vrate = ($vval-$oldval)/$delt;
|
$vrate = ($vval-$oldval)/$delt;
|
||||||
@@ -460,42 +459,59 @@ sub OWCOUNT_FormatValues($) {
|
|||||||
}elsif( $period eq "minute" ){
|
}elsif( $period eq "minute" ){
|
||||||
$vrate*=60;
|
$vrate*=60;
|
||||||
}
|
}
|
||||||
$vrate = int($vrate * 1000)/1000;
|
$vrate = int($vrate * 100)/100;
|
||||||
|
|
||||||
if( !defined($runit) ){
|
#--midnight extrapolation only possible if previous measurement
|
||||||
Log 1,"OWCOUNT: Error in rate unit definition. i=$i, owg_rate[i]=".$owg_rate[$i];
|
if( $daybreak==1 ){
|
||||||
$runit = "ERR";
|
#-- linear extrapolation
|
||||||
}
|
$dt = -$delf/$delt;
|
||||||
|
$dval = int(($vval+($vval-$oldval)*$dt)*100)/100;
|
||||||
|
|
||||||
|
if( $daily == 1 ){
|
||||||
|
$dval2 = $dval+$owg_midnight[$i];
|
||||||
|
} else {
|
||||||
|
$dval2 = $dval;
|
||||||
|
}
|
||||||
|
|
||||||
|
#-- in any mode store the interpolated value in the midnight store
|
||||||
|
OWXCOUNT_SetPage($hash,14+$i,sprintf("%f",$dval2));
|
||||||
|
#-- string buildup for monthly and yearly logging
|
||||||
|
$dvalue .= sprintf( " %s: %5.1f %s", $owg_channel[$i], $dval,$unit);
|
||||||
|
$mvalue .= sprintf( " %s: %%5.1f %s", $owg_channel[$i], $unit);
|
||||||
|
} #-- end daybreak
|
||||||
|
|
||||||
#-- string buildup for return value and STATE
|
#-- string buildup for return value and STATE
|
||||||
#-- 1 decimal
|
#-- 1 decimal
|
||||||
if( $factor == 1.0 ){
|
if( $factor == 1.0 ){
|
||||||
$svalue .= sprintf( "%s: %5.1f %s / %5.2f %s", $owg_channel[$i], $vval,$unit,$vrate,$runit);
|
$svalue .= sprintf( "%s: %5.1f %s %s: %5.2f %s", $owg_channel[$i], $vval,$unit,$owg_rate[$i],$vrate,$runit);
|
||||||
#-- 3 decimals
|
#-- 3 decimals
|
||||||
} else {
|
} else {
|
||||||
$svalue .= sprintf( "%s: %5.3f %s / %5.2f %s", $owg_channel[$i], $vval,$unit,$vrate,$runit);
|
$svalue .= sprintf( "%s: %5.3f %s %s: %5.2f %s", $owg_channel[$i], $vval,$unit,$owg_rate[$i],$vrate,$runit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
readingsBulkUpdate($hash,"$owg_channel[$i]",$vval);
|
readingsBulkUpdate($hash,$owg_channel[$i],$vval);
|
||||||
readingsBulkUpdate($hash,"$owg_rate[$i]",$vrate);
|
readingsBulkUpdate($hash,$owg_rate[$i],$vrate);
|
||||||
}
|
}
|
||||||
#-- insert space
|
#-- insert space
|
||||||
if( $i<int(@owg_fixed)-1 ){
|
if( $i<int(@owg_fixed)-1 ){
|
||||||
$svalue .= " ";
|
$svalue .= " ";
|
||||||
$dvalue .= " ";
|
$dvalue .= " ";
|
||||||
}
|
}
|
||||||
}
|
}#-- end channel loop
|
||||||
|
|
||||||
#-- Daily/monthly cumulated value
|
#-- daybreak postprocessing
|
||||||
if( $daybreak == 1 ){
|
if( $daybreak == 1 ){
|
||||||
#-- TODO: recall the monthly summary
|
my $total;
|
||||||
#--my @month = OWCOUNT_GetMonth($hash);
|
#-- daily/monthly accumulated value
|
||||||
#my $total = $month[0]+$vval;
|
my @monthv = OWCOUNT_GetMonth($hash);
|
||||||
|
my $total0 = @monthv[0]->[1];
|
||||||
|
my $total1 = @monthv[1]->[1];
|
||||||
|
$dvalue = sprintf("D%02d ",$day).$dvalue;
|
||||||
readingsBulkUpdate($hash,"day",$dvalue);
|
readingsBulkUpdate($hash,"day",$dvalue);
|
||||||
if( $monthbreak == 1){
|
if( $monthbreak == 1){
|
||||||
$mvalue = sprintf("M_%02d SOME VALUE",$month);
|
$mvalue = sprintf("M%02d ",$month+1).$mvalue;
|
||||||
|
$mvalue = sprintf($mvalue,$total0,$total1);
|
||||||
readingsBulkUpdate($hash,"month",$mvalue);
|
readingsBulkUpdate($hash,"month",$mvalue);
|
||||||
Log 1,$name." has monthbreak ".$mvalue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -523,8 +539,7 @@ sub OWCOUNT_Get($@) {
|
|||||||
my $value = undef;
|
my $value = undef;
|
||||||
my $ret = "";
|
my $ret = "";
|
||||||
my $page;
|
my $page;
|
||||||
my $channo = undef;
|
my ($unit,$daily);
|
||||||
my $channel;
|
|
||||||
|
|
||||||
#-- check syntax
|
#-- check syntax
|
||||||
return "OWCOUNT: Get argument is missing @a"
|
return "OWCOUNT: Get argument is missing @a"
|
||||||
@@ -555,9 +570,44 @@ sub OWCOUNT_Get($@) {
|
|||||||
return "$name.interval => $value";
|
return "$name.interval => $value";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#-- get version
|
||||||
|
if( $a[1] eq "version") {
|
||||||
|
return "$name.version => $owx_version";
|
||||||
|
}
|
||||||
|
|
||||||
#-- reset presence
|
#-- reset presence
|
||||||
#-- TODO: THIS IS TOO STRONG !!!
|
$hash->{PRESENT} = 0;
|
||||||
#$hash->{PRESENT} = 0;
|
|
||||||
|
#-- get channel names
|
||||||
|
OWCOUNT_ChannelNames($hash);
|
||||||
|
|
||||||
|
#-- get month
|
||||||
|
if($a[1] eq "month") {
|
||||||
|
$value="$name.month =>\n";
|
||||||
|
my @month2 = OWCOUNT_GetMonth($hash);
|
||||||
|
#-- error case
|
||||||
|
if( int(@month2) == 1 ){
|
||||||
|
return $month2[0];
|
||||||
|
}
|
||||||
|
#-- 3 entries for each day
|
||||||
|
for(my $i=0;$i<int(@month2);$i++){
|
||||||
|
$unit = $hash->{READINGS}{$owg_channel[$i]}{UNITABBR};
|
||||||
|
#-- mode = daily ?
|
||||||
|
$daily = 0;
|
||||||
|
if( defined($attr{$name}{$owg_fixed[$i]."Mode"} )){
|
||||||
|
if( $attr{$name}{$owg_fixed[$i]."Mode"} eq "daily"){
|
||||||
|
$daily = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( $daily==1){
|
||||||
|
$value .= $owg_channel[$i]." monthly sum ".$month2[$i]->[1]." ".$unit.
|
||||||
|
" (average ".$month2[$i]->[2]." ".$unit."/d)\n";
|
||||||
|
}else{
|
||||||
|
$value .= $owg_channel[$i]." last midnight ".$month2[$i]->[1]." ".$unit."\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
#-- get memory page/counter according to interface type
|
#-- get memory page/counter according to interface type
|
||||||
my $interface= $hash->{IODev}->{TYPE};
|
my $interface= $hash->{IODev}->{TYPE};
|
||||||
@@ -565,14 +615,14 @@ sub OWCOUNT_Get($@) {
|
|||||||
#-- check syntax for getting memory page 0..13 or midnight A/B
|
#-- check syntax for getting memory page 0..13 or midnight A/B
|
||||||
if( ($reading eq "memory") || ($reading eq "midnight") ){
|
if( ($reading eq "memory") || ($reading eq "midnight") ){
|
||||||
if( $reading eq "memory" ){
|
if( $reading eq "memory" ){
|
||||||
return "OWCOUNT: set needs parameter when reading memory: <page>"
|
return "OWCOUNT: get needs parameter when reading memory: <page>"
|
||||||
if( int(@a)<2 );
|
if( int(@a)<2 );
|
||||||
$page=int($a[2]);
|
$page=int($a[2]);
|
||||||
if( ($page<0) || ($page>13) ){
|
if( ($page<0) || ($page>13) ){
|
||||||
return "OWXCOUNT: Wrong memory page requested";
|
return "OWXCOUNT: Wrong memory page requested";
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
return "OWCOUNT: set needs parameter when reading midnight: <channel>"
|
return "OWCOUNT: get needs parameter when reading midnight: <channel>"
|
||||||
if( int(@a)<2 );
|
if( int(@a)<2 );
|
||||||
#-- find out which channel we have
|
#-- find out which channel we have
|
||||||
if( ($a[2] eq $owg_channel[0]) || ($a[2] eq "A") ){
|
if( ($a[2] eq $owg_channel[0]) || ($a[2] eq "A") ){
|
||||||
@@ -644,8 +694,7 @@ sub OWCOUNT_Get($@) {
|
|||||||
return "OWCOUNT: Could not get values from device $name";
|
return "OWCOUNT: Could not get values from device $name";
|
||||||
}
|
}
|
||||||
$hash->{PRESENT} = 1;
|
$hash->{PRESENT} = 1;
|
||||||
return "OWCOUNT: $name.$reading => ".OWCOUNT_FormatValues($hash);
|
return "OWCOUNT: $name.$reading => ".OWCOUNT_FormatValues($hash);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
########################################################################################
|
########################################################################################
|
||||||
@@ -666,54 +715,67 @@ sub OWCOUNT_GetMonth($) {
|
|||||||
my $val;
|
my $val;
|
||||||
my @month = ();
|
my @month = ();
|
||||||
my @month2 = ();
|
my @month2 = ();
|
||||||
my @channel;
|
my @mchannel;
|
||||||
my ($total,$total2,$deltim,$av);
|
my ($total,$total2,$daily,$deltim,$av);
|
||||||
|
|
||||||
#-- Check current logfile
|
#-- Check current logfile
|
||||||
my $ln = $attr{$name}{"LogM"};
|
my $ln = $attr{$name}{"LogM"};
|
||||||
if( !(defined($ln))){
|
if( !(defined($ln))){
|
||||||
Log 1,"OWCOUNT_GetMonth: Attribute LogM is missing";
|
Log 1,"OWCOUNT_GetMonth: Attribute LogM is missing";
|
||||||
return undef;
|
return undef;
|
||||||
} else {
|
}
|
||||||
my $lf = $defs{$ln}{currentlogfile};
|
|
||||||
my $ret = open(OWXFILE, "< $lf" );
|
#-- get channel names
|
||||||
if( $ret) {
|
OWCOUNT_ChannelNames($hash);
|
||||||
while( <OWXFILE> ){
|
|
||||||
#-- line looks as
|
my $lf = $defs{$ln}{currentlogfile};
|
||||||
# 2013-02-09_23:59:31 <name> day D_09 <aname>: 180.0 cts <bname>: 180.0 cts etc.
|
my $ret = open(OWXFILE, "< $lf" );
|
||||||
my $line = $_;
|
if( $ret) {
|
||||||
chomp($line);
|
while( <OWXFILE> ){
|
||||||
if ( $line =~ m/$regexp/i){
|
#-- line looks as
|
||||||
my @linarr = split(' ',$line);
|
# 2013-02-09_23:59:31 <name> day: D09 <aname>: 180.0 <unit> <bname>: 180.0 <unit> etc.
|
||||||
my $day = $linarr[3];
|
my $line = $_;
|
||||||
$day =~ s/D_0+//;
|
chomp($line);
|
||||||
@channel = ();
|
if ( $line =~ m/$regexp/i){
|
||||||
for (my $i=0;$i<int(@owg_fixed);$i++){
|
my @linarr = split(' ',$line);
|
||||||
$val = $linarr[5+3*$i];
|
my $day = $linarr[3];
|
||||||
push(@channel,$val);
|
$day =~ s/D_0+//;
|
||||||
}
|
@mchannel = ();
|
||||||
push(@month,[@channel]);
|
for (my $i=0;$i<int(@owg_fixed);$i++){
|
||||||
|
$val = $linarr[5+3*$i];
|
||||||
|
push(@mchannel,$val);
|
||||||
}
|
}
|
||||||
|
push(@month,[@mchannel]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#-- sum and average
|
#-- sum and average
|
||||||
for (my $i=0;$i<int(@owg_fixed);$i++){
|
for (my $i=0;$i<int(@owg_fixed);$i++){
|
||||||
$total = 0.0;
|
$total = 0.0;
|
||||||
|
#-- summing only if mode daily
|
||||||
|
$daily = 0;
|
||||||
|
if( defined($attr{$name}{$owg_fixed[$i]."Mode"} )){
|
||||||
|
if( $attr{$name}{$owg_fixed[$i]."Mode"} eq "daily"){
|
||||||
|
$daily = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( $daily==1){
|
||||||
for (my $j=0;$j<int(@month);$j++){
|
for (my $j=0;$j<int(@month);$j++){
|
||||||
$total += $month[$j][$i];
|
$total += $month[$j][$i];
|
||||||
}
|
}
|
||||||
#-- add data from current day
|
|
||||||
$total = int($total*100)/100;
|
|
||||||
my ($sec,$min,$hour,$day,$month,$year,$wday,$yday,$isdst) = localtime(time);
|
|
||||||
my $deltim = ($hour+$min/60.0 + $sec/3600.0)/24.0;
|
|
||||||
my $total2 = int(100*($total+$hash->{READINGS}{"$owg_channel[$i]"}{VAL}))/100;
|
|
||||||
my $av = int(100*$total2/(int(@month)+$deltim))/100;
|
|
||||||
|
|
||||||
push(@month2,[($total,$total2,$av)]);
|
|
||||||
}
|
}
|
||||||
return @month2;
|
#-- add data from current day also for non-summed mode
|
||||||
|
$total = int($total*100)/100;
|
||||||
|
$total2 = int(100*($total+$hash->{READINGS}{$owg_channel[$i]}{VAL}))/100;
|
||||||
|
#-- number of days so far, including the present day
|
||||||
|
my ($sec,$min,$hour,$day,$month,$year,$wday,$yday,$isdst) = localtime(time);
|
||||||
|
my $deltim = int(@month)+($hour+$min/60.0 + $sec/3600.0)/24.0;
|
||||||
|
my $av = int(100*$total2/$deltim)/100;
|
||||||
|
#-- output format
|
||||||
|
push(@month2,[($total,$total2,$av)]);
|
||||||
}
|
}
|
||||||
|
return @month2;
|
||||||
}
|
}
|
||||||
|
|
||||||
#######################################################################################
|
#######################################################################################
|
||||||
@@ -731,8 +793,6 @@ sub OWCOUNT_GetValues($) {
|
|||||||
my $model = $hash->{OW_MODEL};
|
my $model = $hash->{OW_MODEL};
|
||||||
my $value = "";
|
my $value = "";
|
||||||
my $ret = "";
|
my $ret = "";
|
||||||
my $offset;
|
|
||||||
my $factor;
|
|
||||||
|
|
||||||
#-- define warnings
|
#-- define warnings
|
||||||
my $warn = "none";
|
my $warn = "none";
|
||||||
@@ -742,7 +802,7 @@ sub OWCOUNT_GetValues($) {
|
|||||||
RemoveInternalTimer($hash);
|
RemoveInternalTimer($hash);
|
||||||
InternalTimer(time()+$hash->{INTERVAL}, "OWCOUNT_GetValues", $hash, 1);
|
InternalTimer(time()+$hash->{INTERVAL}, "OWCOUNT_GetValues", $hash, 1);
|
||||||
|
|
||||||
#-- reset presence - maybe this is too strong
|
#-- reset presence -
|
||||||
$hash->{PRESENT} = 0;
|
$hash->{PRESENT} = 0;
|
||||||
|
|
||||||
#-- Get readings according to interface type
|
#-- Get readings according to interface type
|
||||||
@@ -802,11 +862,10 @@ sub OWCOUNT_Set($@) {
|
|||||||
my $ret = undef;
|
my $ret = undef;
|
||||||
my $page;
|
my $page;
|
||||||
my $data;
|
my $data;
|
||||||
my $channo = undef;
|
|
||||||
my $channel;
|
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
my $model = $hash->{OW_MODEL};
|
my $model = $hash->{OW_MODEL};
|
||||||
|
my ($cname,@cnama,@channel);
|
||||||
|
|
||||||
#-- set new timer interval
|
#-- set new timer interval
|
||||||
if($key eq "interval") {
|
if($key eq "interval") {
|
||||||
# check value
|
# check value
|
||||||
@@ -819,6 +878,9 @@ sub OWCOUNT_Set($@) {
|
|||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#-- get channel names
|
||||||
|
OWCOUNT_ChannelNames($hash);
|
||||||
|
|
||||||
#-- set memory page/counter according to interface type
|
#-- set memory page/counter according to interface type
|
||||||
my $interface= $hash->{IODev}->{TYPE};
|
my $interface= $hash->{IODev}->{TYPE};
|
||||||
|
|
||||||
@@ -922,7 +984,7 @@ sub OWFSCOUNT_GetPage($$) {
|
|||||||
if( ($page<0) || ($page>15) ){
|
if( ($page<0) || ($page>15) ){
|
||||||
return "OWXCOUNT: Wrong memory page requested";
|
return "OWXCOUNT: Wrong memory page requested";
|
||||||
}
|
}
|
||||||
#-- get values - or shoud we rather get the uncached ones ?
|
#-- get values - or shoud we rather get the uncached ones ?
|
||||||
if( $page == 14) {
|
if( $page == 14) {
|
||||||
$vval = OWServer_Read($master,"/$owx_add/counters.A");
|
$vval = OWServer_Read($master,"/$owx_add/counters.A");
|
||||||
$owg_str = OWServer_Read($master,"/$owx_add/pages/page.14");
|
$owg_str = OWServer_Read($master,"/$owx_add/pages/page.14");
|
||||||
@@ -934,6 +996,10 @@ sub OWFSCOUNT_GetPage($$) {
|
|||||||
if( ($vval eq "") || ($owg_str eq "") );
|
if( ($vval eq "") || ($owg_str eq "") );
|
||||||
|
|
||||||
$owg_val[0] = $vval;
|
$owg_val[0] = $vval;
|
||||||
|
#-- parse float from midnight
|
||||||
|
$owg_str =~ /([\d\.]+)/;
|
||||||
|
$owg_str = int($owg_str*100)/100;
|
||||||
|
$owg_str = 0.0 if(!(defined($owg_str)));
|
||||||
$owg_midnight[0] = $owg_str;
|
$owg_midnight[0] = $owg_str;
|
||||||
|
|
||||||
}elsif( $page == 15) {
|
}elsif( $page == 15) {
|
||||||
@@ -947,6 +1013,10 @@ sub OWFSCOUNT_GetPage($$) {
|
|||||||
if( ($vval eq "") || ($owg_str eq "") );
|
if( ($vval eq "") || ($owg_str eq "") );
|
||||||
|
|
||||||
$owg_val[1] = $vval;
|
$owg_val[1] = $vval;
|
||||||
|
#-- parse float from midnight
|
||||||
|
$owg_str =~ /([\d\.]+)/;
|
||||||
|
$owg_str = int($owg_str*100)/100;
|
||||||
|
$owg_str = 0.0 if(!(defined($owg_str)));
|
||||||
$owg_midnight[1] = $owg_str;
|
$owg_midnight[1] = $owg_str;
|
||||||
}else {
|
}else {
|
||||||
$owg_str = OWServer_Read($master,"/$owx_add/pages/page.".$page);
|
$owg_str = OWServer_Read($master,"/$owx_add/pages/page.".$page);
|
||||||
@@ -1066,14 +1136,21 @@ sub OWXCOUNT_GetPage($$) {
|
|||||||
return "OWXCOUNT: Device $owx_dev returns invalid data";
|
return "OWXCOUNT: Device $owx_dev returns invalid data";
|
||||||
}
|
}
|
||||||
|
|
||||||
#-- first ignore memory and only use counter (Fehler gefunden von jamesgo)
|
|
||||||
my $value = (ord($data[3])<<24) + (ord($data[2])<<16) +(ord($data[1])<<8) + ord($data[0]);
|
my $value = (ord($data[3])<<24) + (ord($data[2])<<16) +(ord($data[1])<<8) + ord($data[0]);
|
||||||
|
|
||||||
if( $page == 14) {
|
if( $page == 14) {
|
||||||
$owg_val[0] = $value;
|
$owg_val[0] = $value;
|
||||||
|
#-- parse float from midnight
|
||||||
|
$owg_str =~ /([\d\.]+)/;
|
||||||
|
$owg_str = int($owg_str*100)/100;
|
||||||
|
$owg_str = 0.0 if(!(defined($owg_str)));
|
||||||
$owg_midnight[0] = $owg_str;
|
$owg_midnight[0] = $owg_str;
|
||||||
}elsif( $page == 15) {
|
}elsif( $page == 15) {
|
||||||
$owg_val[1] = $value;
|
$owg_val[1] = $value;
|
||||||
|
#-- parse float from midnight
|
||||||
|
$owg_str =~ /([\d\.]+)/;
|
||||||
|
$owg_str = int($owg_str*100)/100;
|
||||||
|
$owg_str = 0.0 if(!(defined($owg_str)));
|
||||||
$owg_midnight[1] = $owg_str;
|
$owg_midnight[1] = $owg_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1158,13 +1235,17 @@ sub OWXCOUNT_SetPage($$$) {
|
|||||||
(prerequisite: Add this module's name to the list of clients in OWServer).
|
(prerequisite: Add this module's name to the list of clients in OWServer).
|
||||||
Please define an <a href="#OWX">OWX</a> device or <a href="#OWServer">OWServer</a> device first. <br/><p/>
|
Please define an <a href="#OWX">OWX</a> device or <a href="#OWServer">OWServer</a> device first. <br/><p/>
|
||||||
<br /><h4>Example</h4><br />
|
<br /><h4>Example</h4><br />
|
||||||
<code>define OWX_C OWCOUNT DS2423 CE780F000000 300</code>
|
<code>define OWC OWCOUNT 1D.CE780F000000 60</code>
|
||||||
<br />
|
<br />
|
||||||
<code>attr OWX_C AName Water|volume</code>
|
<code>attr OWC AName Energie|energy</code>
|
||||||
<br />
|
<br />
|
||||||
<code>attr OWX_C AUnit liters|l</code>
|
<code>attr OWC AUnit kWh|kWh</code>
|
||||||
<br />
|
<br />
|
||||||
<code>attr OWX_CAMode daily</code>
|
<code>attr OWC APeriod hour</code>
|
||||||
|
<br />
|
||||||
|
<code>attr OWC ARate Leistung|power</code>
|
||||||
|
<br />
|
||||||
|
<code>attr OWX_AMode daily</code>
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
<a name="OWCOUNTdefine"></a>
|
<a name="OWCOUNTdefine"></a>
|
||||||
@@ -1240,10 +1321,10 @@ sub OWXCOUNT_SetPage($$$) {
|
|||||||
<a name="OWCOUNTattr"></a>
|
<a name="OWCOUNTattr"></a>
|
||||||
<h4>Attributes</h4>
|
<h4>Attributes</h4>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a name="owcount_logm"><code>attr <name> LogM
|
<li><a name="owcount_logm"><code>attr <name> LogM
|
||||||
<string>|</code></a>
|
<string>|</code></a>
|
||||||
<br />device name (not file name) of monthly log file.</li>
|
<br />device name (not file name) of monthly log file.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>For each of the following attributes, the channel identification A,B may be used.</p>
|
<p>For each of the following attributes, the channel identification A,B may be used.</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a name="owcount_cname"><code>attr <name> <channel>Name
|
<li><a name="owcount_cname"><code>attr <name> <channel>Name
|
||||||
@@ -1252,6 +1333,9 @@ sub OWXCOUNT_SetPage($$$) {
|
|||||||
<li><a name="owcount_cunit"><code>attr <name> <channel>Unit
|
<li><a name="owcount_cunit"><code>attr <name> <channel>Unit
|
||||||
<string>|<string></code></a>
|
<string>|<string></code></a>
|
||||||
<br />unit of measurement for this channel | its abbreviation. </li>
|
<br />unit of measurement for this channel | its abbreviation. </li>
|
||||||
|
<li><a name="owcount_crate"><code>attr <name> <channel>Rate
|
||||||
|
<string>|<string></code></a>
|
||||||
|
<br />name for the channel rate | a type description for the measured value. </li>
|
||||||
<li><a name="owcount_coffset"><code>attr <name> <channel>Offset
|
<li><a name="owcount_coffset"><code>attr <name> <channel>Offset
|
||||||
<float></code></a>
|
<float></code></a>
|
||||||
<br />offset added to the reading in this channel. </li>
|
<br />offset added to the reading in this channel. </li>
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
#
|
#
|
||||||
# get <name> id => FAM_ID.ROM_ID.CRC
|
# get <name> id => FAM_ID.ROM_ID.CRC
|
||||||
# get <name> present => 1 if device present, 0 if not
|
# get <name> present => 1 if device present, 0 if not
|
||||||
|
# get <name> version => OWX version number
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
########################################################################################
|
########################################################################################
|
||||||
@@ -51,11 +52,13 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
sub Log($$);
|
sub Log($$);
|
||||||
|
|
||||||
|
my $owx_version="3.21";
|
||||||
#-- declare variables
|
#-- declare variables
|
||||||
my %gets = (
|
my %gets = (
|
||||||
"present" => "",
|
"present" => "",
|
||||||
"interval" => "",
|
"interval" => "",
|
||||||
"id" => ""
|
"id" => "",
|
||||||
|
"version" => ""
|
||||||
);
|
);
|
||||||
my %sets = (
|
my %sets = (
|
||||||
"interval" => ""
|
"interval" => ""
|
||||||
@@ -224,7 +227,7 @@ sub OWID_Get($@) {
|
|||||||
return "$name.id => $value";
|
return "$name.id => $value";
|
||||||
}
|
}
|
||||||
|
|
||||||
#-- get interval
|
#-- get interval
|
||||||
if($a[1] eq "interval") {
|
if($a[1] eq "interval") {
|
||||||
$value = $hash->{INTERVAL};
|
$value = $hash->{INTERVAL};
|
||||||
return "$name.interval => $value";
|
return "$name.interval => $value";
|
||||||
@@ -243,6 +246,12 @@ sub OWID_Get($@) {
|
|||||||
}
|
}
|
||||||
return "$name.present => $value";
|
return "$name.present => $value";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#-- get version
|
||||||
|
if( $a[1] eq "version") {
|
||||||
|
return "$name.version => $owx_version";
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
# get <name> counter => four values (16 Bit) of the gpio counter
|
# get <name> counter => four values (16 Bit) of the gpio counter
|
||||||
# get <name> version => firmware version of the LCD adapter
|
# get <name> version => firmware version of the LCD adapter
|
||||||
# get <name> memory <page> => get one of the internal memory pages 0..6
|
# get <name> memory <page> => get one of the internal memory pages 0..6
|
||||||
|
# get <name> version => OWX version number
|
||||||
#
|
#
|
||||||
# set <name> alert red|yellow|beep|none => set one of the alert states (gpio pins)
|
# set <name> alert red|yellow|beep|none => set one of the alert states (gpio pins)
|
||||||
# set <name> icon <num> on|off|blink => set one of the icons 0..14
|
# set <name> icon <num> on|off|blink => set one of the icons 0..14
|
||||||
@@ -61,6 +62,7 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
sub Log($$);
|
sub Log($$);
|
||||||
|
|
||||||
|
my $owx_version="3.21";
|
||||||
#-- controller may be HD44780 or KS0073
|
#-- controller may be HD44780 or KS0073
|
||||||
# these values have to be changed for different display
|
# these values have to be changed for different display
|
||||||
# geometries or memory maps
|
# geometries or memory maps
|
||||||
@@ -77,7 +79,7 @@ my %gets = (
|
|||||||
"memory" => "",
|
"memory" => "",
|
||||||
"gpio" => "",
|
"gpio" => "",
|
||||||
"counter" => "",
|
"counter" => "",
|
||||||
"version" => "",
|
"version" => ""
|
||||||
#"register" => "",
|
#"register" => "",
|
||||||
#"data" => ""
|
#"data" => ""
|
||||||
);
|
);
|
||||||
@@ -253,7 +255,7 @@ sub OWLCD_Get($@) {
|
|||||||
#-- get version
|
#-- get version
|
||||||
if($a[1] eq "version") {
|
if($a[1] eq "version") {
|
||||||
$value = OWXLCD_Get($hash,"version");
|
$value = OWXLCD_Get($hash,"version");
|
||||||
return "$name.version => $value";
|
return "$name.version => $owx_version (LCD firmware $value)";
|
||||||
}
|
}
|
||||||
|
|
||||||
#-- get EEPROM content
|
#-- get EEPROM content
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
# get <name> temperature => temperature measurement
|
# get <name> temperature => temperature measurement
|
||||||
# get <name> VDD => supply voltage measurement
|
# get <name> VDD => supply voltage measurement
|
||||||
# get <name> V|raw => raw external voltage measurement
|
# get <name> V|raw => raw external voltage measurement
|
||||||
|
# get <name> version => OWX version number
|
||||||
#
|
#
|
||||||
# set <name> interval => set period for measurement
|
# set <name> interval => set period for measurement
|
||||||
#
|
#
|
||||||
@@ -68,6 +69,7 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
sub Log($$);
|
sub Log($$);
|
||||||
|
|
||||||
|
my $owx_version="3.21";
|
||||||
#-- temperature and voltage globals - always the raw values from the device
|
#-- temperature and voltage globals - always the raw values from the device
|
||||||
my $owg_temp;
|
my $owg_temp;
|
||||||
my $owg_volt;
|
my $owg_volt;
|
||||||
@@ -81,8 +83,9 @@ my %gets = (
|
|||||||
"reading" => "",
|
"reading" => "",
|
||||||
"temperature" => "",
|
"temperature" => "",
|
||||||
"VDD" => "",
|
"VDD" => "",
|
||||||
"V" => "",
|
"VAD" => "",
|
||||||
"raw" => "",
|
"raw" => "",
|
||||||
|
"version" => ""
|
||||||
);
|
);
|
||||||
|
|
||||||
my %sets = (
|
my %sets = (
|
||||||
@@ -210,80 +213,55 @@ sub OWMULTI_Define ($$) {
|
|||||||
readingsSingleUpdate($hash,"state","defined",1);
|
readingsSingleUpdate($hash,"state","defined",1);
|
||||||
Log 3, "OWMULTI: Device $name defined.";
|
Log 3, "OWMULTI: Device $name defined.";
|
||||||
|
|
||||||
#-- Start timer for initialization in a few seconds
|
|
||||||
InternalTimer(time()+10, "OWMULTI_InitializeDevice", $hash, 0);
|
|
||||||
|
|
||||||
#-- Start timer for updates
|
#-- Start timer for updates
|
||||||
InternalTimer(time()+10+$hash->{INTERVAL}, "OWMULTI_GetValues", $hash, 0);
|
InternalTimer(time()+10, "OWMULTI_GetValues", $hash, 0);
|
||||||
|
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
########################################################################################
|
########################################################################################
|
||||||
#
|
#
|
||||||
# OWMULTI_InitializeDevice - delayed setting of initial readings and channel names
|
# OWMULTI_ChannelNames - find the real channel names
|
||||||
#
|
#
|
||||||
# Parameter hash = hash of device addressed
|
# Parameter hash = hash of device addressed
|
||||||
#
|
#
|
||||||
########################################################################################
|
########################################################################################
|
||||||
|
|
||||||
sub OWMULTI_InitializeDevice($) {
|
sub OWMULTI_ChannelNames($) {
|
||||||
my ($hash) = @_;
|
my ($hash) = @_;
|
||||||
|
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
my @args;
|
my $state = $hash->{READINGS}{"state"}{VAL};
|
||||||
|
|
||||||
#-- unit attribute defined ?
|
my ($cname,@cnama,$unit,@unarr);
|
||||||
$hash->{READINGS}{"temperature"}{UNIT} = defined($attr{$name}{"tempUnit"}) ? $attr{$name}{"tempUnit"} : "Celsius";
|
my ($tunit,$toffset,$tfactor,$tabbr,$vfunc);
|
||||||
$hash->{READINGS}{"temperature"}{TYPE} = "temperature";
|
|
||||||
|
|
||||||
#-- Initial readings
|
|
||||||
$owg_temp = "";
|
|
||||||
$owg_volt = "";
|
|
||||||
$owg_vdd = "";
|
|
||||||
#-- Set channel name, channel unit for voltage channel
|
#-- Set channel name, channel unit for voltage channel
|
||||||
my $cname = defined($attr{$name}{"VName"}) ? $attr{$name}{"VName"} : "voltage|voltage";
|
$cname = defined($attr{$name}{"VName"}) ? $attr{$name}{"VName"} : "voltage|voltage";
|
||||||
my @cnama = split(/\|/,$cname);
|
@cnama = split(/\|/,$cname);
|
||||||
if( int(@cnama)!=2){
|
if( int(@cnama)!=2){
|
||||||
Log 1, "OWMULTI: Incomplete channel name specification $cname. Better use $cname|<type of data>";
|
Log 1, "OWMULTI: Incomplete channel name specification $cname. Better use $cname|<type of data>"
|
||||||
|
if( $state eq "defined");
|
||||||
push(@cnama,"unknown");
|
push(@cnama,"unknown");
|
||||||
}
|
}
|
||||||
|
|
||||||
#-- unit
|
#-- unit
|
||||||
my $unit = defined($attr{$name}{"VUnit"}) ? $attr{$name}{"VUnit"} : "Volt|V";
|
$unit = defined($attr{$name}{"VUnit"}) ? $attr{$name}{"VUnit"} : "Volt|V";
|
||||||
my @unarr= split(/\|/,$unit);
|
@unarr= split(/\|/,$unit);
|
||||||
if( int(@unarr)!=2 ){
|
if( int(@unarr)!=2 ){
|
||||||
Log 1, "OWMULTI: Incomplete channel unit specification $unit. Better use $unit|<abbreviation>";
|
Log 1, "OWMULTI: Incomplete channel unit specification $unit. Better use $unit|<abbreviation>"
|
||||||
|
if( $state eq "defined");
|
||||||
push(@unarr,"");
|
push(@unarr,"");
|
||||||
}
|
}
|
||||||
|
|
||||||
#-- put into readings
|
#-- put into readings
|
||||||
$owg_channel = $cnama[0];
|
$owg_channel = $cnama[0];
|
||||||
$hash->{READINGS}{"$owg_channel"}{TYPE} = $cnama[1];
|
$hash->{READINGS}{$owg_channel}{TYPE} = $cnama[1];
|
||||||
$hash->{READINGS}{"$owg_channel"}{UNIT} = $unarr[0];
|
$hash->{READINGS}{$owg_channel}{UNIT} = $unarr[0];
|
||||||
$hash->{READINGS}{"$owg_channel"}{UNITABBR} = $unarr[1];
|
$hash->{READINGS}{$owg_channel}{UNITABBR} = $unarr[1];
|
||||||
|
|
||||||
#-- Initialize all the display stuff
|
#-- temperature scale
|
||||||
OWMULTI_FormatValues($hash);
|
$hash->{READINGS}{"temperature"}{UNIT} = defined($attr{$name}{"tempUnit"}) ? $attr{$name}{"tempUnit"} : "Celsius";
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
########################################################################################
|
|
||||||
#
|
|
||||||
# OWMULTI_FormatValues - put together various format strings
|
|
||||||
#
|
|
||||||
# Parameter hash = hash of device addressed, fs = format string
|
|
||||||
#
|
|
||||||
########################################################################################
|
|
||||||
|
|
||||||
sub OWMULTI_FormatValues($) {
|
|
||||||
my ($hash) = @_;
|
|
||||||
|
|
||||||
my $name = $hash->{NAME};
|
|
||||||
my ($tunit,$toffset,$tfactor,$tabbr,$tval,$vfunc,$vval);
|
|
||||||
my $svalue = "";
|
|
||||||
|
|
||||||
#-- attributes defined ?
|
|
||||||
$tunit = defined($attr{$name}{"tempUnit"}) ? $attr{$name}{"tempUnit"} : $hash->{READINGS}{"temperature"}{UNIT};
|
$tunit = defined($attr{$name}{"tempUnit"}) ? $attr{$name}{"tempUnit"} : $hash->{READINGS}{"temperature"}{UNIT};
|
||||||
$toffset = defined($attr{$name}{"tempOffset"}) ? $attr{$name}{"tempOffset"} : 0.0 ;
|
$toffset = defined($attr{$name}{"tempOffset"}) ? $attr{$name}{"tempOffset"} : 0.0 ;
|
||||||
$tfactor = 1.0;
|
$tfactor = 1.0;
|
||||||
@@ -301,21 +279,64 @@ sub OWMULTI_FormatValues($) {
|
|||||||
$tabbr="?";
|
$tabbr="?";
|
||||||
Log 1, "OWMULTI_FormatValues: unknown unit $tunit";
|
Log 1, "OWMULTI_FormatValues: unknown unit $tunit";
|
||||||
}
|
}
|
||||||
|
|
||||||
#-- these values are rather complex to obtain, therefore save them in the hash
|
#-- these values are rather complex to obtain, therefore save them in the hash
|
||||||
|
$hash->{READINGS}{"temperature"}{TYPE} = "temperature";
|
||||||
$hash->{READINGS}{"temperature"}{UNIT} = $tunit;
|
$hash->{READINGS}{"temperature"}{UNIT} = $tunit;
|
||||||
$hash->{READINGS}{"temperature"}{UNITABBR} = $tabbr;
|
$hash->{READINGS}{"temperature"}{UNITABBR} = $tabbr;
|
||||||
$hash->{tempf}{offset} = $toffset;
|
$hash->{tempf}{offset} = $toffset;
|
||||||
$hash->{tempf}{factor} = $tfactor;
|
$hash->{tempf}{factor} = $tfactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
########################################################################################
|
||||||
|
#
|
||||||
|
# OWMULTI_InitializeDevice - delayed setting of initial readings and channel names
|
||||||
|
#
|
||||||
|
# Parameter hash = hash of device addressed
|
||||||
|
#
|
||||||
|
########################################################################################
|
||||||
|
|
||||||
|
sub OWMULTI_InitializeDevice($) {
|
||||||
|
my ($hash) = @_;
|
||||||
|
|
||||||
|
my $name = $hash->{NAME};
|
||||||
|
|
||||||
|
#-- Initial readings
|
||||||
|
$owg_temp = "";
|
||||||
|
$owg_volt = "";
|
||||||
|
$owg_vdd = "";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
########################################################################################
|
||||||
|
#
|
||||||
|
# OWMULTI_FormatValues - put together various format strings
|
||||||
|
#
|
||||||
|
# Parameter hash = hash of device addressed, fs = format string
|
||||||
|
#
|
||||||
|
########################################################################################
|
||||||
|
|
||||||
|
sub OWMULTI_FormatValues($) {
|
||||||
|
my ($hash) = @_;
|
||||||
|
|
||||||
|
my $name = $hash->{NAME};
|
||||||
|
my ($toffset,$tfactor,$tval,$vfunc,$vval);
|
||||||
|
my $svalue = "";
|
||||||
|
|
||||||
#-- no change in any value if invalid reading
|
#-- no change in any value if invalid reading
|
||||||
return if( $owg_temp eq "");
|
return if( ($owg_temp eq "") || ($owg_vdd == 0) );
|
||||||
|
|
||||||
|
#-- obtain channel names
|
||||||
|
OWMULTI_ChannelNames($hash);
|
||||||
|
|
||||||
|
#-- check if device needs to be initialized
|
||||||
|
OWMULTI_InitializeDevice($hash)
|
||||||
|
if( $hash->{READINGS}{"state"}{VAL} eq "defined");
|
||||||
|
|
||||||
#-- correct values for proper offset, factor
|
#-- correct values for proper offset, factor
|
||||||
$tval = ($owg_temp + $toffset)*$tfactor;
|
$toffset = $hash->{tempf}{offset};
|
||||||
|
$tfactor = $hash->{tempf}{factor};
|
||||||
my $cname = defined($attr{$name}{"VName"}) ? $attr{$name}{"VName"} : "voltage|voltage";
|
$tval = ($owg_temp + $toffset)*$tfactor;
|
||||||
my @cnama = split(/\|/,$cname);
|
|
||||||
$owg_channel=$cnama[0];
|
|
||||||
|
|
||||||
#-- attribute VFunction defined ?
|
#-- attribute VFunction defined ?
|
||||||
$vfunc = defined($attr{$name}{"VFunction"}) ? $attr{$name}{"VFunction"} : "V";
|
$vfunc = defined($attr{$name}{"VFunction"}) ? $attr{$name}{"VFunction"} : "V";
|
||||||
@@ -338,11 +359,11 @@ sub OWMULTI_FormatValues($) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#-- string buildup for return value, STATE
|
#-- string buildup for return value, STATE
|
||||||
$svalue .= sprintf( "%s: %5.2f %s (T: %5.2f %s)", $owg_channel, $vval,$hash->{READINGS}{"$owg_channel"}{UNITABBR},$tval,$tabbr);
|
$svalue .= sprintf( "%s: %5.2f %s (T: %5.2f %s)", $owg_channel, $vval,$hash->{READINGS}{$owg_channel}{UNITABBR},$tval,$hash->{READINGS}{"temperature"}{UNITABBR});
|
||||||
|
|
||||||
#-- put into READINGS
|
#-- put into READINGS
|
||||||
readingsBeginUpdate($hash);
|
readingsBeginUpdate($hash);
|
||||||
readingsBulkUpdate($hash,"$owg_channel",$vval);
|
readingsBulkUpdate($hash,$owg_channel,$vval);
|
||||||
readingsBulkUpdate($hash,"VDD",$owg_vdd);
|
readingsBulkUpdate($hash,"VDD",$owg_vdd);
|
||||||
readingsBulkUpdate($hash,"temperature",$tval);
|
readingsBulkUpdate($hash,"temperature",$tval);
|
||||||
|
|
||||||
@@ -407,6 +428,11 @@ sub OWMULTI_Get($@) {
|
|||||||
return "$name.interval => $value";
|
return "$name.interval => $value";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#-- get version
|
||||||
|
if( $a[1] eq "version") {
|
||||||
|
return "$name.version => $owx_version";
|
||||||
|
}
|
||||||
|
|
||||||
#-- reset presence
|
#-- reset presence
|
||||||
$hash->{PRESENT} = 0;
|
$hash->{PRESENT} = 0;
|
||||||
|
|
||||||
@@ -427,12 +453,16 @@ sub OWMULTI_Get($@) {
|
|||||||
return "OWMULTI: Could not get values from device $name, reason $ret";
|
return "OWMULTI: Could not get values from device $name, reason $ret";
|
||||||
}
|
}
|
||||||
$hash->{PRESENT} = 1;
|
$hash->{PRESENT} = 1;
|
||||||
OWMULTI_FormatValues($hash);
|
|
||||||
|
|
||||||
#-- return the special reading
|
#-- return the special reading
|
||||||
if ($reading eq "reading") {
|
if ($reading eq "reading") {
|
||||||
return "OWMULTI: $name.reading => ".
|
return "OWMULTI: $name.reading => ".OWMULTI_FormatValues($hash);
|
||||||
$hash->{READINGS}{"$owg_channel"}{VAL};
|
}
|
||||||
|
|
||||||
|
#-- return the special reading
|
||||||
|
if ($reading eq "VAD") {
|
||||||
|
return "OWMULTI: $name.VAD => ".
|
||||||
|
$hash->{READINGS}{$owg_channel}{VAL};
|
||||||
}
|
}
|
||||||
if ($reading eq "temperature") {
|
if ($reading eq "temperature") {
|
||||||
return "OWMULTI: $name.temperature => ".
|
return "OWMULTI: $name.temperature => ".
|
||||||
@@ -442,7 +472,7 @@ sub OWMULTI_Get($@) {
|
|||||||
return "OWMULTI: $name.VDD => ".
|
return "OWMULTI: $name.VDD => ".
|
||||||
$hash->{READINGS}{"VDD"}{VAL};
|
$hash->{READINGS}{"VDD"}{VAL};
|
||||||
}
|
}
|
||||||
if ( ($reading eq "V")|($reading eq "raw")) {
|
if ( $reading eq "raw") {
|
||||||
return "OWMULTI: $name.V => ".
|
return "OWMULTI: $name.V => ".
|
||||||
$owg_volt;
|
$owg_volt;
|
||||||
}
|
}
|
||||||
@@ -483,14 +513,12 @@ sub OWMULTI_GetValues($@) {
|
|||||||
}elsif( $interface eq "OWServer" ){
|
}elsif( $interface eq "OWServer" ){
|
||||||
$ret = OWFSMULTI_GetValues($hash);
|
$ret = OWFSMULTI_GetValues($hash);
|
||||||
}else{
|
}else{
|
||||||
Log 3, "OWMULTI: GetValues with wrong IODev type $interface";
|
return "OWMULTI: GetValues with wrong IODev type $interface";
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#-- process results
|
#-- process results
|
||||||
if( defined($ret) ){
|
if( defined($ret) ){
|
||||||
Log 3, "OWMULTI: Could not get values from device $name, reason $ret";
|
return "OWMULTI: Could not get values from device $name, reason $ret";
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
$hash->{PRESENT} = 1;
|
$hash->{PRESENT} = 1;
|
||||||
|
|
||||||
@@ -825,10 +853,6 @@ sub OWXMULTI_GetValues($) {
|
|||||||
$owg_volt = ($msb*256+ $lsb)/100;
|
$owg_volt = ($msb*256+ $lsb)/100;
|
||||||
|
|
||||||
return undef;
|
return undef;
|
||||||
|
|
||||||
#} else {
|
|
||||||
# return "OWXMULTI: Unknown device family $hash->{OW_FAMILY}\n";
|
|
||||||
#}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#######################################################################################
|
#######################################################################################
|
||||||
@@ -886,8 +910,8 @@ sub OWXMULTI_SetValues($@) {
|
|||||||
<p>FHEM module to commmunicate with 1-Wire multi-sensors, currently the DS2438 smart battery
|
<p>FHEM module to commmunicate with 1-Wire multi-sensors, currently the DS2438 smart battery
|
||||||
monitor<br /> <br />This 1-Wire module works with the OWX interface module or with the OWServer interface module
|
monitor<br /> <br />This 1-Wire module works with the OWX interface module or with the OWServer interface module
|
||||||
(prerequisite: Add this module's name to the list of clients in OWServer).
|
(prerequisite: Add this module's name to the list of clients in OWServer).
|
||||||
Please define an <a href="#OWX">OWX</a> device or <a href="#OWServer">OWServer</a> device first. <br/></p>
|
Please define an <a href="#OWX">OWX</a> device or <a href="#OWServer">OWServer</a> device first.</p>
|
||||||
<br /><h4>Example</h4>
|
<h4>Example</h4>
|
||||||
<p>
|
<p>
|
||||||
<code>define OWX_M OWMULTI 7C5034010000 45</code>
|
<code>define OWX_M OWMULTI 7C5034010000 45</code>
|
||||||
<br />
|
<br />
|
||||||
@@ -896,14 +920,13 @@ sub OWXMULTI_SetValues($@) {
|
|||||||
<code>attr OWX_M VUnit percent|%</code>
|
<code>attr OWX_M VUnit percent|%</code>
|
||||||
<br />
|
<br />
|
||||||
<code>attr OWX_M VFunction (161.29 * V / VDD - 25.8065)/(1.0546 - 0.00216 * T)</code>
|
<code>attr OWX_M VFunction (161.29 * V / VDD - 25.8065)/(1.0546 - 0.00216 * T)</code>
|
||||||
<br />
|
</p>
|
||||||
</p><br />
|
|
||||||
<a name="OWMULTIdefine"></a>
|
<a name="OWMULTIdefine"></a>
|
||||||
<h4>Define</h4>
|
<h4>Define</h4>
|
||||||
<p>
|
<p>
|
||||||
<code>define <name> OWMULTI [<model>] <id> [<interval>]</code> or <br/>
|
<code>define <name> OWMULTI [<model>] <id> [<interval>]</code> or <br/>
|
||||||
<code>define <name> OWMULTI <fam>.<id> [<interval>]</code>
|
<code>define <name> OWMULTI <fam>.<id> [<interval>]</code>
|
||||||
<br /><br /> Define a 1-Wire multi-sensor<br /><br /></p>
|
<br /><br /> Define a 1-Wire multi-sensor</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<code>[<model>]</code><br /> Defines the sensor model (and thus 1-Wire family
|
<code>[<model>]</code><br /> Defines the sensor model (and thus 1-Wire family
|
||||||
@@ -925,7 +948,6 @@ sub OWXMULTI_SetValues($@) {
|
|||||||
<code><interval></code>
|
<code><interval></code>
|
||||||
<br />Measurement interval in seconds. The default is 300 seconds. </li>
|
<br />Measurement interval in seconds. The default is 300 seconds. </li>
|
||||||
</ul>
|
</ul>
|
||||||
<br />
|
|
||||||
<a name="OWMULTIset"></a>
|
<a name="OWMULTIset"></a>
|
||||||
<h4>Set</h4>
|
<h4>Set</h4>
|
||||||
<ul>
|
<ul>
|
||||||
@@ -933,7 +955,6 @@ sub OWXMULTI_SetValues($@) {
|
|||||||
<code>set <name> interval <int></code></a><br /> Measurement
|
<code>set <name> interval <int></code></a><br /> Measurement
|
||||||
interval in seconds. The default is 300 seconds. </li>
|
interval in seconds. The default is 300 seconds. </li>
|
||||||
</ul>
|
</ul>
|
||||||
<br />
|
|
||||||
<a name="OWMULTIget"></a>
|
<a name="OWMULTIget"></a>
|
||||||
<h4>Get</h4>
|
<h4>Get</h4>
|
||||||
<ul>
|
<ul>
|
||||||
@@ -948,7 +969,9 @@ sub OWXMULTI_SetValues($@) {
|
|||||||
<code>get <name> interval</code></a><br />Returns measurement interval in
|
<code>get <name> interval</code></a><br />Returns measurement interval in
|
||||||
seconds. </li>
|
seconds. </li>
|
||||||
<li><a name="owmulti_reading">
|
<li><a name="owmulti_reading">
|
||||||
<code>get <name> reading</code></a><br />Obtain the measurement value from
|
<code>get <name> reading</code></a><br />Obtain the measurement values </li>
|
||||||
|
<li><a name="owmulti_vad">
|
||||||
|
<code>get <name> VAD</code></a><br />Obtain the measurement value from
|
||||||
VFunction. </li>
|
VFunction. </li>
|
||||||
<li><a name="owmulti_temperature">
|
<li><a name="owmulti_temperature">
|
||||||
<code>get <name> temperature</code></a><br />Obtain the temperature value. </li>
|
<code>get <name> temperature</code></a><br />Obtain the temperature value. </li>
|
||||||
@@ -958,7 +981,6 @@ sub OWXMULTI_SetValues($@) {
|
|||||||
<code>get <name> V</code> or <code>get <name>
|
<code>get <name> V</code> or <code>get <name>
|
||||||
raw</code></a><br />Obtain the raw external voltage measurement. </li>
|
raw</code></a><br />Obtain the raw external voltage measurement. </li>
|
||||||
</ul>
|
</ul>
|
||||||
<br />
|
|
||||||
<a name="OWMULTIattr"></a>
|
<a name="OWMULTIattr"></a>
|
||||||
<h4>Attributes</h4>
|
<h4>Attributes</h4>
|
||||||
<ul>
|
<ul>
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
# state of 1 = OFF therefore corresponds to an output state of 1 = OFF, but a measured
|
# state of 1 = OFF therefore corresponds to an output state of 1 = OFF, but a measured
|
||||||
# state of 0 = ON can also be due to an external shortening of the output.
|
# state of 0 = ON can also be due to an external shortening of the output.
|
||||||
# get <name> gpio => values for channels
|
# get <name> gpio => values for channels
|
||||||
|
# get <name> version => OWX version number
|
||||||
#
|
#
|
||||||
# set <name> interval => set period for measurement
|
# set <name> interval => set period for measurement
|
||||||
# set <name> output <channel-name> on|off|on-for-timer <int>|on-for-timer <int>
|
# set <name> output <channel-name> on|off|on-for-timer <int>|on-for-timer <int>
|
||||||
@@ -74,9 +75,11 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
sub Log($$);
|
sub Log($$);
|
||||||
|
|
||||||
#-- channel name - fixed is the first array, variable the second
|
my $owx_version="3.21";
|
||||||
my @owg_fixed = ("A","B","C","D","E","F","G","H");
|
#-- fixed raw channel name, flexible channel name
|
||||||
my @owg_channel;
|
my @owg_fixed = ("A","B","C","D","E","F","G","H");
|
||||||
|
my @owg_channel = ("A","B","C","D","E","F","G","H");
|
||||||
|
|
||||||
#-- channel values - always the raw input resp. output values from the device
|
#-- channel values - always the raw input resp. output values from the device
|
||||||
my @owg_val;
|
my @owg_val;
|
||||||
my @owg_vax;
|
my @owg_vax;
|
||||||
@@ -86,7 +89,8 @@ my %gets = (
|
|||||||
"present" => "",
|
"present" => "",
|
||||||
"interval" => "",
|
"interval" => "",
|
||||||
"input" => "",
|
"input" => "",
|
||||||
"gpio" => ""
|
"gpio" => "",
|
||||||
|
"version" => ""
|
||||||
);
|
);
|
||||||
|
|
||||||
my %sets = (
|
my %sets = (
|
||||||
@@ -133,7 +137,7 @@ sub OWSWITCH_Initialize ($) {
|
|||||||
"stateS ".
|
"stateS ".
|
||||||
$readingFnAttributes;
|
$readingFnAttributes;
|
||||||
|
|
||||||
#-- correct list of attributes
|
#-- initial list of attributes
|
||||||
for( my $i=0;$i<8;$i++ ){
|
for( my $i=0;$i<8;$i++ ){
|
||||||
$attlist .= " ".$owg_fixed[$i]."Name";
|
$attlist .= " ".$owg_fixed[$i]."Name";
|
||||||
$attlist .= " ".$owg_fixed[$i]."Unit";
|
$attlist .= " ".$owg_fixed[$i]."Unit";
|
||||||
@@ -185,15 +189,12 @@ sub OWSWITCH_Define ($$) {
|
|||||||
if(int(@a)>=4) { $interval = $a[3]; }
|
if(int(@a)>=4) { $interval = $a[3]; }
|
||||||
if( $fam eq "3A" ){
|
if( $fam eq "3A" ){
|
||||||
$model = "DS2413";
|
$model = "DS2413";
|
||||||
@owg_fixed = ("A","B");
|
|
||||||
CommandAttr (undef,"$name model DS2413");
|
CommandAttr (undef,"$name model DS2413");
|
||||||
}elsif( $fam eq "12" ){
|
}elsif( $fam eq "12" ){
|
||||||
$model = "DS2406";
|
$model = "DS2406";
|
||||||
@owg_fixed = ("A","B");
|
|
||||||
CommandAttr (undef,"$name model DS2406");
|
CommandAttr (undef,"$name model DS2406");
|
||||||
}elsif( $fam eq "29" ){
|
}elsif( $fam eq "29" ){
|
||||||
$model = "DS2408";
|
$model = "DS2408";
|
||||||
@owg_fixed = ("A","B","C","D","E","F","G","H");
|
|
||||||
CommandAttr (undef,"$name model DS2408");
|
CommandAttr (undef,"$name model DS2408");
|
||||||
}else{
|
}else{
|
||||||
return "OWSWITCH: Wrong 1-Wire device family $fam";
|
return "OWSWITCH: Wrong 1-Wire device family $fam";
|
||||||
@@ -205,15 +206,12 @@ sub OWSWITCH_Define ($$) {
|
|||||||
if(int(@a)>=5) { $interval = $a[4]; }
|
if(int(@a)>=5) { $interval = $a[4]; }
|
||||||
if( $model eq "DS2413" ){
|
if( $model eq "DS2413" ){
|
||||||
$fam = "3A";
|
$fam = "3A";
|
||||||
@owg_fixed = ("A","B");
|
|
||||||
CommandAttr (undef,"$name model DS2413");
|
CommandAttr (undef,"$name model DS2413");
|
||||||
}elsif( $model eq "DS2406" ){
|
}elsif( $model eq "DS2406" ){
|
||||||
$fam = "12";
|
$fam = "12";
|
||||||
@owg_fixed = ("A","B");
|
|
||||||
CommandAttr (undef,"$name model DS2406");
|
CommandAttr (undef,"$name model DS2406");
|
||||||
}elsif( $model eq "DS2408" ){
|
}elsif( $model eq "DS2408" ){
|
||||||
$fam = "29";
|
$fam = "29";
|
||||||
@owg_fixed = ("A","B","C","D","E","F","G","H");
|
|
||||||
CommandAttr (undef,"$name model DS2408");
|
CommandAttr (undef,"$name model DS2408");
|
||||||
}else{
|
}else{
|
||||||
return "OWSWITCH: Wrong 1-Wire device model $model";
|
return "OWSWITCH: Wrong 1-Wire device model $model";
|
||||||
@@ -221,7 +219,7 @@ sub OWSWITCH_Define ($$) {
|
|||||||
} else {
|
} else {
|
||||||
return "OWSWITCH: $a[0] ID $a[2] invalid, specify a 12 or 2.12 digit value";
|
return "OWSWITCH: $a[0] ID $a[2] invalid, specify a 12 or 2.12 digit value";
|
||||||
}
|
}
|
||||||
|
|
||||||
#-- determine CRC Code - only if this is a direct interface
|
#-- determine CRC Code - only if this is a direct interface
|
||||||
$crc = defined($hash->{IODev}->{INTERFACE}) ? sprintf("%02x",OWX_CRC($fam.".".$id."00")) : "00";
|
$crc = defined($hash->{IODev}->{INTERFACE}) ? sprintf("%02x",OWX_CRC($fam.".".$id."00")) : "00";
|
||||||
|
|
||||||
@@ -244,19 +242,57 @@ sub OWSWITCH_Define ($$) {
|
|||||||
#--
|
#--
|
||||||
readingsSingleUpdate($hash,"state","defined",1);
|
readingsSingleUpdate($hash,"state","defined",1);
|
||||||
Log 3, "OWSWITCH: Device $name defined.";
|
Log 3, "OWSWITCH: Device $name defined.";
|
||||||
|
|
||||||
#-- Initialization reading according to interface type
|
|
||||||
my $interface= $hash->{IODev}->{TYPE};
|
|
||||||
|
|
||||||
#-- Start timer for initialization in a few seconds
|
|
||||||
InternalTimer(time()+10, "OWSWITCH_InitializeDevice", $hash, 0);
|
|
||||||
|
|
||||||
#-- Start timer for updates
|
#-- Start timer for updates
|
||||||
InternalTimer(time()+10+$hash->{INTERVAL}, "OWSWITCH_GetValues", $hash, 0);
|
InternalTimer(time()+10, "OWSWITCH_GetValues", $hash, 0);
|
||||||
|
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
########################################################################################
|
||||||
|
#
|
||||||
|
# OWSWITCH_ChannelNames - find the real channel names
|
||||||
|
#
|
||||||
|
# Parameter hash = hash of device addressed
|
||||||
|
#
|
||||||
|
########################################################################################
|
||||||
|
|
||||||
|
sub OWSWITCH_ChannelNames($) {
|
||||||
|
my ($hash) = @_;
|
||||||
|
|
||||||
|
my $name = $hash->{NAME};
|
||||||
|
my $state = $hash->{READINGS}{"state"}{VAL};
|
||||||
|
|
||||||
|
my ($cname,@cnama,$unit,@unarr);
|
||||||
|
|
||||||
|
for (my $i=0;$i<$cnumber{$attr{$name}{"model"}};$i++){
|
||||||
|
#-- name
|
||||||
|
$cname = defined($attr{$name}{$owg_fixed[$i]."Name"}) ? $attr{$name}{$owg_fixed[$i]."Name"} : $owg_fixed[$i]."|onoff";
|
||||||
|
@cnama = split(/\|/,$cname);
|
||||||
|
if( int(@cnama)!=2){
|
||||||
|
Log 1, "OWSWITCH: Incomplete channel name specification $cname. Better use $cname|<type of data>"
|
||||||
|
if( $state eq "defined");
|
||||||
|
push(@cnama,"unknown");
|
||||||
|
}
|
||||||
|
#-- put into readings
|
||||||
|
$owg_channel[$i] = $cnama[0];
|
||||||
|
$hash->{READINGS}{$owg_channel[$i]}{TYPE} = $cnama[1];
|
||||||
|
|
||||||
|
#-- unit
|
||||||
|
my $unit = defined($attr{$name}{$owg_fixed[$i]."Unit"}) ? $attr{$name}{$owg_fixed[$i]."Unit"} : "ON|OFF";
|
||||||
|
my @unarr= split(/\|/,$unit);
|
||||||
|
if( int(@unarr)!=2 ){
|
||||||
|
Log 1, "OWSWITCH: Wrong channel unit specification $unit, replaced by ON|OFF"
|
||||||
|
if( $state eq "defined");
|
||||||
|
$unit="ON|OFF";
|
||||||
|
}
|
||||||
|
|
||||||
|
#-- put into readings
|
||||||
|
$hash->{READINGS}{$owg_channel[$i]}{UNIT} = $unit;
|
||||||
|
$hash->{READINGS}{$owg_channel[$i]}{UNITABBR} = $unit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
########################################################################################
|
########################################################################################
|
||||||
#
|
#
|
||||||
# OWSWITCH_InitializeDevice - delayed setting of initial readings and channel names
|
# OWSWITCH_InitializeDevice - delayed setting of initial readings and channel names
|
||||||
@@ -266,55 +302,16 @@ sub OWSWITCH_Define ($$) {
|
|||||||
########################################################################################
|
########################################################################################
|
||||||
|
|
||||||
sub OWSWITCH_InitializeDevice($) {
|
sub OWSWITCH_InitializeDevice($) {
|
||||||
|
|
||||||
my ($hash) = @_;
|
my ($hash) = @_;
|
||||||
|
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
|
|
||||||
#-- Set channel names, channel units
|
#-- Initial readings
|
||||||
for( my $i=0;$i<$cnumber{$attr{$name}{"model"}} ;$i++) {
|
for( my $i=0;$i<$cnumber{$attr{$name}{"model"}} ;$i++) {
|
||||||
#-- Initial readings ERR
|
#-- Initial readings ERR
|
||||||
$owg_val[$i] = 1;
|
$owg_val[$i] = 1;
|
||||||
$owg_vax[$i] = 0;
|
$owg_vax[$i] = 0;
|
||||||
#-- name
|
|
||||||
my $cname = defined($attr{$name}{$owg_fixed[$i]."Name"}) ? $attr{$name}{$owg_fixed[$i]."Name"} : $owg_fixed[$i]."|onoff";
|
|
||||||
my @cnama = split(/\|/,$cname);
|
|
||||||
if( int(@cnama)!=2){
|
|
||||||
Log 1, "OWSWITCH: Incomplete channel name specification $cname. Better use $cname|<type of data>";
|
|
||||||
push(@cnama,"unknown");
|
|
||||||
}
|
|
||||||
|
|
||||||
#-- unit
|
|
||||||
my $unit = defined($attr{$name}{$owg_fixed[$i]."Unit"}) ? $attr{$name}{$owg_fixed[$i]."Unit"} : "ON|OFF";
|
|
||||||
my @unarr= split(/\|/,$unit);
|
|
||||||
if( int(@unarr)!=2 ){
|
|
||||||
Log 1, "OWSWITCH: Wrong channel unit specification $unit, replaced by ON|OFF";
|
|
||||||
$unit="ON|OFF";
|
|
||||||
}
|
|
||||||
|
|
||||||
#-- put into readings
|
|
||||||
$owg_channel[$i] = $cnama[0];
|
|
||||||
$hash->{READINGS}{"$owg_channel[$i]"}{TYPE} = $cnama[1];
|
|
||||||
$hash->{READINGS}{"$owg_channel[$i]"}{UNIT} = $unit;
|
|
||||||
$hash->{READINGS}{"$owg_channel[$i]"}{UNITABBR} = $unit;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#-- set status according to interface type
|
|
||||||
my $interface= $hash->{IODev}->{TYPE};
|
|
||||||
|
|
||||||
#-- OWX interface
|
|
||||||
if( !defined($interface) ){
|
|
||||||
return "OWSWITCH: Interface missing";
|
|
||||||
} elsif( $interface eq "OWX" ){
|
|
||||||
#-- OWFS interface
|
|
||||||
#}elsif( $interface eq "OWFS" ){
|
|
||||||
# $ret = OWFSAD_GetPage($hash,"reading");
|
|
||||||
#-- Unknown interface
|
|
||||||
}else{
|
|
||||||
return "OWSWITCH: InitializeDevice with wrong IODev type $interface";
|
|
||||||
}
|
|
||||||
|
|
||||||
#-- Initialize all the display stuff
|
|
||||||
OWSWITCH_FormatValues($hash);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
########################################################################################
|
########################################################################################
|
||||||
@@ -329,20 +326,24 @@ sub OWSWITCH_FormatValues($) {
|
|||||||
my ($hash) = @_;
|
my ($hash) = @_;
|
||||||
|
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
my ($offset,$factor,$vval,$vvax,$vstr,$cname,$unit,@unarr,@cnama,$valid);
|
my ($offset,$factor,$vval,$vvax,$vstr,@unarr,$valid);
|
||||||
my $svalue = "";
|
my $svalue = "";
|
||||||
|
|
||||||
#-- external shortening signature
|
#-- external shortening signature
|
||||||
my $sname = defined($attr{$name}{"stateS"}) ? $attr{$name}{"stateS"} : "☇";
|
my $sname = defined($attr{$name}{"stateS"}) ? $attr{$name}{"stateS"} : "☇";
|
||||||
|
|
||||||
|
#-- obtain channel names
|
||||||
|
OWSWITCH_ChannelNames($hash);
|
||||||
|
|
||||||
|
#-- check if device needs to be initialized
|
||||||
|
OWSWITCH_InitializeDevice($hash)
|
||||||
|
if( $hash->{READINGS}{"state"}{VAL} eq "defined");
|
||||||
|
|
||||||
#-- put into READINGS
|
#-- put into READINGS
|
||||||
readingsBeginUpdate($hash);
|
readingsBeginUpdate($hash);
|
||||||
|
|
||||||
#-- formats for output
|
#-- formats for output
|
||||||
for (my $i=0;$i<$cnumber{$attr{$name}{"model"}};$i++){
|
for (my $i=0;$i<$cnumber{$attr{$name}{"model"}};$i++){
|
||||||
$cname = defined($attr{$name}{$owg_fixed[$i]."Name"}) ? $attr{$name}{$owg_fixed[$i]."Name"} : $owg_fixed[$i];
|
|
||||||
@cnama = split(/\|/,$cname);
|
|
||||||
$owg_channel[$i]=$cnama[0];
|
|
||||||
|
|
||||||
#-- input state is 0 = ON or 1 = OFF
|
#-- input state is 0 = ON or 1 = OFF
|
||||||
$vval = $owg_val[$i];
|
$vval = $owg_val[$i];
|
||||||
@@ -350,8 +351,7 @@ sub OWSWITCH_FormatValues($) {
|
|||||||
$vvax = $owg_vax[$i];
|
$vvax = $owg_vax[$i];
|
||||||
|
|
||||||
#-- string buildup for return value and STATE
|
#-- string buildup for return value and STATE
|
||||||
$unit = defined($attr{$name}{$owg_fixed[$i]."Unit"}) ? $attr{$name}{$owg_fixed[$i]."Unit"} : "ON|OFF";
|
@unarr= split(/\|/,$hash->{READINGS}{$owg_channel[$i]}{UNIT});
|
||||||
@unarr= split(/\|/,$unit);
|
|
||||||
$vstr = $unarr[$vval];
|
$vstr = $unarr[$vval];
|
||||||
|
|
||||||
#-- put into readings only when valid
|
#-- put into readings only when valid
|
||||||
@@ -359,7 +359,7 @@ sub OWSWITCH_FormatValues($) {
|
|||||||
$vstr ="???"
|
$vstr ="???"
|
||||||
}else{
|
}else{
|
||||||
$vstr.= $sname if( ($vval == 0) && ($vvax == 1) );
|
$vstr.= $sname if( ($vval == 0) && ($vvax == 1) );
|
||||||
readingsBulkUpdate($hash,"$owg_channel[$i]",$vstr);
|
readingsBulkUpdate($hash,$owg_channel[$i],$vstr);
|
||||||
}
|
}
|
||||||
$svalue .= sprintf( "%s: %s" , $owg_channel[$i], $vstr);
|
$svalue .= sprintf( "%s: %s" , $owg_channel[$i], $vstr);
|
||||||
|
|
||||||
@@ -367,7 +367,6 @@ sub OWSWITCH_FormatValues($) {
|
|||||||
if( $i<($cnumber{$attr{$name}{"model"}}-1) ){
|
if( $i<($cnumber{$attr{$name}{"model"}}-1) ){
|
||||||
$svalue .= " ";
|
$svalue .= " ";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#-- STATE
|
#-- STATE
|
||||||
@@ -393,9 +392,7 @@ sub OWSWITCH_Get($@) {
|
|||||||
my $model = $hash->{OW_MODEL};
|
my $model = $hash->{OW_MODEL};
|
||||||
my ($value,$value2,$value3) = (undef,undef,undef);
|
my ($value,$value2,$value3) = (undef,undef,undef);
|
||||||
my $ret = "";
|
my $ret = "";
|
||||||
my $offset;
|
my ($offset,$factor,$page,$cname,@cnama,@channel);
|
||||||
my $factor;
|
|
||||||
my $page;
|
|
||||||
|
|
||||||
#-- check syntax
|
#-- check syntax
|
||||||
return "OWSWITCH: Get argument is missing @a"
|
return "OWSWITCH: Get argument is missing @a"
|
||||||
@@ -426,14 +423,21 @@ sub OWSWITCH_Get($@) {
|
|||||||
return "$name.interval => $value";
|
return "$name.interval => $value";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#-- get version
|
||||||
|
if( $a[1] eq "version") {
|
||||||
|
return "$name.version => $owx_version";
|
||||||
|
}
|
||||||
|
|
||||||
#-- reset presence
|
#-- reset presence
|
||||||
$hash->{PRESENT} = 0;
|
$hash->{PRESENT} = 0;
|
||||||
|
|
||||||
|
#-- get channel names
|
||||||
|
OWSWITCH_ChannelNames($hash);
|
||||||
|
|
||||||
#-- get values according to interface type
|
#-- get values according to interface type
|
||||||
my $interface= $hash->{IODev}->{TYPE};
|
my $interface= $hash->{IODev}->{TYPE};
|
||||||
|
|
||||||
#-- get single state
|
#-- get single state
|
||||||
# TODO: WAS passiert, wenn channel name noch falsch ist ?
|
|
||||||
if( $reading eq "input" ){
|
if( $reading eq "input" ){
|
||||||
return "OWSWITCH: get needs parameter when reading input: <channel>"
|
return "OWSWITCH: get needs parameter when reading input: <channel>"
|
||||||
if( int(@a)<2 );
|
if( int(@a)<2 );
|
||||||
@@ -451,17 +455,16 @@ sub OWSWITCH_Get($@) {
|
|||||||
if( $interface eq "OWX" ){
|
if( $interface eq "OWX" ){
|
||||||
$ret = OWXSWITCH_GetState($hash);
|
$ret = OWXSWITCH_GetState($hash);
|
||||||
#-- OWFS interface
|
#-- OWFS interface
|
||||||
#}elsif( $interface eq "OWFS" ){
|
}elsif( $interface eq "OWFS" ){
|
||||||
# $ret = OWFSSWITCH_GetPage($hash,"reading");
|
$ret = OWFSSWITCH_GetState($hash);
|
||||||
#-- Unknown interface
|
#-- Unknown interface
|
||||||
}else{
|
}else{
|
||||||
return "OWSWITCH: Get with wrong IODev type $interface";
|
return "OWSWITCH: Get with wrong IODev type $interface";
|
||||||
}
|
}
|
||||||
#-- process results
|
#-- process results
|
||||||
OWSWITCH_FormatValues($hash);
|
OWSWITCH_FormatValues($hash);
|
||||||
my @states = split(/,/,$hash->{STATE});
|
$hash->{PRESENT} = 1;
|
||||||
|
return $name.".".$a[2]." => ".$hash->{READINGS}{$owg_channel[$fnd]}{VAL};
|
||||||
return $a[2]." = ".$states[$fnd];
|
|
||||||
|
|
||||||
#-- get all states
|
#-- get all states
|
||||||
}elsif( $reading eq "gpio" ){
|
}elsif( $reading eq "gpio" ){
|
||||||
@@ -475,14 +478,13 @@ sub OWSWITCH_Get($@) {
|
|||||||
}else{
|
}else{
|
||||||
return "OWSWITCH: Get with wrong IODev type $interface";
|
return "OWSWITCH: Get with wrong IODev type $interface";
|
||||||
}
|
}
|
||||||
|
#-- process results
|
||||||
|
if( defined($ret) ){
|
||||||
|
return "OWSWITCH: Could not get values from device $name, reason $ret";
|
||||||
|
}
|
||||||
|
$hash->{PRESENT} = 1;
|
||||||
|
return "OWSWITCH: $name.$reading => ".OWSWITCH_FormatValues($hash);
|
||||||
}
|
}
|
||||||
#-- process results
|
|
||||||
if( defined($ret) ){
|
|
||||||
return "OWSWITCH: Could not get values from device $name, reason $ret";
|
|
||||||
}
|
|
||||||
$hash->{PRESENT} = 1;
|
|
||||||
return "OWSWITCH: $name.$reading => ".OWSWITCH_FormatValues($hash);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#######################################################################################
|
#######################################################################################
|
||||||
@@ -558,6 +560,11 @@ sub OWSWITCH_Set($@) {
|
|||||||
my $key = $a[1];
|
my $key = $a[1];
|
||||||
my $value = $a[2];
|
my $value = $a[2];
|
||||||
|
|
||||||
|
my $name = $hash->{NAME};
|
||||||
|
my $model = $hash->{OW_MODEL};
|
||||||
|
|
||||||
|
my ($ret,$cname,@cnama,@channel);
|
||||||
|
|
||||||
#-- for the selector: which values are possible
|
#-- for the selector: which values are possible
|
||||||
if (@a == 2){
|
if (@a == 2){
|
||||||
my $newkeys = join(" ", sort keys %sets);
|
my $newkeys = join(" ", sort keys %sets);
|
||||||
@@ -569,20 +576,12 @@ sub OWSWITCH_Set($@) {
|
|||||||
return "OWSWITCH: Set with unknown argument $a[1]";
|
return "OWSWITCH: Set with unknown argument $a[1]";
|
||||||
}
|
}
|
||||||
|
|
||||||
#-- define vars
|
|
||||||
my $ret = undef;
|
|
||||||
my $channel = undef;
|
|
||||||
my $channo = undef;
|
|
||||||
my $condx;
|
|
||||||
my $name = $hash->{NAME};
|
|
||||||
my $model = $hash->{OW_MODEL};
|
|
||||||
|
|
||||||
#-- reset the device
|
#-- reset the device
|
||||||
if($key eq "init") {
|
if($key eq "init") {
|
||||||
return "OWCOUNT: init needs parameter 'yes'"
|
return "OWSWITCH: init needs parameter 'yes'"
|
||||||
if($value ne "yes");
|
if($value ne "yes");
|
||||||
OWSWITCH_InitializeDevice($hash);
|
OWSWITCH_InitializeDevice($hash);
|
||||||
return "OWCOUNT: Re-initialized device";
|
return "OWSWITCH: Re-initialized device $name";
|
||||||
}
|
}
|
||||||
|
|
||||||
#-- set new timer interval
|
#-- set new timer interval
|
||||||
@@ -596,18 +595,21 @@ sub OWSWITCH_Set($@) {
|
|||||||
InternalTimer(gettimeofday()+$hash->{INTERVAL}, "OWSWITCH_GetValues", $hash, 1);
|
InternalTimer(gettimeofday()+$hash->{INTERVAL}, "OWSWITCH_GetValues", $hash, 1);
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#-- obtain channel names
|
||||||
|
OWSWITCH_ChannelNames($hash);
|
||||||
|
|
||||||
#-- Set readings according to interface type
|
#-- Set readings according to interface type
|
||||||
my $interface= $hash->{IODev}->{TYPE};
|
my $interface= $hash->{IODev}->{TYPE};
|
||||||
|
|
||||||
#-- set single state
|
#-- set single state
|
||||||
# TODO: WAS passiert, wenn channel name noch falsch ist ?
|
|
||||||
if( $key eq "output" ){
|
if( $key eq "output" ){
|
||||||
return "OWSWITCH: get needs parameter when writing output: <channel>"
|
return "OWSWITCH: get needs parameter when writing output: <channel>"
|
||||||
if( int(@a)<2 );
|
if( int(@a)<2 );
|
||||||
#-- find out which channel we have
|
#-- find out which channel we have
|
||||||
my $fnd=undef;
|
my $fnd=undef;
|
||||||
for (my $i=0;$i<$cnumber{$attr{$name}{"model"}};$i++){
|
for (my $i=0;$i<$cnumber{$attr{$name}{"model"}};$i++){
|
||||||
|
Log 1," testing $a[2] against $owg_channel[$i] and $owg_fixed[$i]";
|
||||||
if( ($a[2] eq $owg_channel[$i]) || ($a[2] eq $owg_fixed[$i]) ){
|
if( ($a[2] eq $owg_channel[$i]) || ($a[2] eq $owg_fixed[$i]) ){
|
||||||
$fnd=$i;
|
$fnd=$i;
|
||||||
last;
|
last;
|
||||||
@@ -724,8 +726,6 @@ sub OWSWITCH_Undef ($) {
|
|||||||
#
|
#
|
||||||
# Prefix = OWFSSWITCH
|
# Prefix = OWFSSWITCH
|
||||||
#
|
#
|
||||||
########################################################################################
|
|
||||||
|
|
||||||
########################################################################################
|
########################################################################################
|
||||||
#
|
#
|
||||||
# OWFSSWITCH_GetState - Get gpio ports from device
|
# OWFSSWITCH_GetState - Get gpio ports from device
|
||||||
@@ -1103,23 +1103,21 @@ sub OWXSWITCH_SetState($$) {
|
|||||||
<p>FHEM module to commmunicate with 1-Wire Programmable Switches <br />
|
<p>FHEM module to commmunicate with 1-Wire Programmable Switches <br />
|
||||||
<br />This 1-Wire module works with the OWX interface module or with the OWServer interface module
|
<br />This 1-Wire module works with the OWX interface module or with the OWServer interface module
|
||||||
(prerequisite: Add this module's name to the list of clients in OWServer).
|
(prerequisite: Add this module's name to the list of clients in OWServer).
|
||||||
Please define an <a href="#OWX">OWX</a> device or <a href="#OWServer">OWServer</a> device first. <br /></p>
|
Please define an <a href="#OWX">OWX</a> device or <a href="#OWServer">OWServer</a> device first.</p>
|
||||||
<br /><h4>Example</h4>
|
<h4>Example</h4>
|
||||||
<p>
|
<p>
|
||||||
<code>define OWX_S OWSWITCH DS2413 B5D502000000 60</code>
|
<code>define OWX_S OWSWITCH DS2413 B5D502000000 60</code>
|
||||||
<br />
|
<br />
|
||||||
<code>attr OWX_S AName Lampe|light</code>
|
<code>attr OWX_S AName Lampe|light</code>
|
||||||
<br />
|
<br />
|
||||||
<code>attr OWX_S AUnit AN|AUS</code>
|
<code>attr OWX_S AUnit AN|AUS</code>
|
||||||
<br />
|
|
||||||
</p>
|
</p>
|
||||||
<br />
|
|
||||||
<a name="OWSWITCHdefine"></a>
|
<a name="OWSWITCHdefine"></a>
|
||||||
<h4>Define</h4>
|
<h4>Define</h4>
|
||||||
<p>
|
<p>
|
||||||
<code>define <name> OWSWITCH [<model>] <id> [<interval>]</code> or <br/>
|
<code>define <name> OWSWITCH [<model>] <id> [<interval>]</code> or <br/>
|
||||||
<code>define <name> OWSWITCH <fam>.<id> [<interval>]</code>
|
<code>define <name> OWSWITCH <fam>.<id> [<interval>]</code>
|
||||||
<br /><br /> Define a 1-Wire switch.<br /><br /></p>
|
<br /><br /> Define a 1-Wire switch.<br /><br />
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<code>[<model>]</code><br /> Defines the switch model (and thus 1-Wire family
|
<code>[<model>]</code><br /> Defines the switch model (and thus 1-Wire family
|
||||||
@@ -1162,7 +1160,6 @@ sub OWXSWITCH_SetState($$) {
|
|||||||
<li><a name="owswitch_init">
|
<li><a name="owswitch_init">
|
||||||
<code>set <name> init yes</code></a><br /> Re-initialize the device</li>
|
<code>set <name> init yes</code></a><br /> Re-initialize the device</li>
|
||||||
</ul>
|
</ul>
|
||||||
<br />
|
|
||||||
<a name="OWSWITCHget"></a>
|
<a name="OWSWITCHget"></a>
|
||||||
<h4>Get</h4>
|
<h4>Get</h4>
|
||||||
<ul>
|
<ul>
|
||||||
@@ -1186,7 +1183,6 @@ sub OWXSWITCH_SetState($$) {
|
|||||||
<li><a name="owswitch_gpio">
|
<li><a name="owswitch_gpio">
|
||||||
<code>get <name> gpio</code></a><br />Obtain state of all channels</li>
|
<code>get <name> gpio</code></a><br />Obtain state of all channels</li>
|
||||||
</ul>
|
</ul>
|
||||||
<br />
|
|
||||||
<a name="OWSWITCHattr"></a>
|
<a name="OWSWITCHattr"></a>
|
||||||
<h4>Attributes</h4> For each of the following attributes, the channel identification A,B,...
|
<h4>Attributes</h4> For each of the following attributes, the channel identification A,B,...
|
||||||
may be used. <ul>
|
may be used. <ul>
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
# get <name> interval => query interval
|
# get <name> interval => query interval
|
||||||
# get <name> temperature => temperature measurement
|
# get <name> temperature => temperature measurement
|
||||||
# get <name> alarm => alarm temperature settings
|
# get <name> alarm => alarm temperature settings
|
||||||
|
# get <name> version => OWX version number
|
||||||
#
|
#
|
||||||
# set <name> interval => set period for measurement
|
# set <name> interval => set period for measurement
|
||||||
# set <name> tempLow => lower alarm temperature setting
|
# set <name> tempLow => lower alarm temperature setting
|
||||||
@@ -40,6 +41,9 @@
|
|||||||
# attr <name> stateAH "<string>" = character string for denoting high alarm condition, default is up triangle
|
# attr <name> stateAH "<string>" = character string for denoting high alarm condition, default is up triangle
|
||||||
# attr <name> tempOffset <float> = temperature offset in degree Celsius added to the raw temperature reading
|
# attr <name> tempOffset <float> = temperature offset in degree Celsius added to the raw temperature reading
|
||||||
# attr <name> tempUnit <string> = unit of measurement, e.g. Celsius/Kelvin/Fahrenheit or C/K/F, default is Celsius
|
# attr <name> tempUnit <string> = unit of measurement, e.g. Celsius/Kelvin/Fahrenheit or C/K/F, default is Celsius
|
||||||
|
# attr <name> tempConv onkick|onread = determines, whether a temperature measurement will happen when "kicked"
|
||||||
|
# through the OWX backend module (all temperature sensors at the same time), or on
|
||||||
|
# reading the sensor (1 second waiting time).
|
||||||
# attr <name> tempLow <float> = value for low alarm
|
# attr <name> tempLow <float> = value for low alarm
|
||||||
# attr <name> tempHigh <float> = value for high alarm
|
# attr <name> tempHigh <float> = value for high alarm
|
||||||
#
|
#
|
||||||
@@ -68,6 +72,7 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
sub Log($$);
|
sub Log($$);
|
||||||
|
|
||||||
|
my $owx_version="3.21";
|
||||||
#-- temperature globals - always the raw values from/for the device
|
#-- temperature globals - always the raw values from/for the device
|
||||||
my $owg_temp = "";
|
my $owg_temp = "";
|
||||||
my $owg_th = "";
|
my $owg_th = "";
|
||||||
@@ -82,7 +87,8 @@ my %gets = (
|
|||||||
"present" => "",
|
"present" => "",
|
||||||
"interval" => "",
|
"interval" => "",
|
||||||
"temperature" => "",
|
"temperature" => "",
|
||||||
"alarm" => ""
|
"alarm" => "",
|
||||||
|
"version" => ""
|
||||||
);
|
);
|
||||||
|
|
||||||
my %sets = (
|
my %sets = (
|
||||||
@@ -122,7 +128,7 @@ sub OWTHERM_Initialize ($) {
|
|||||||
$hash->{AttrList}= "IODev model:DS1820,DS18B20,DS1822 loglevel:0,1,2,3,4,5 ".
|
$hash->{AttrList}= "IODev model:DS1820,DS18B20,DS1822 loglevel:0,1,2,3,4,5 ".
|
||||||
"stateAL stateAH ".
|
"stateAL stateAH ".
|
||||||
"tempOffset tempUnit:C,Celsius,F,Fahrenheit,K,Kelvin ".
|
"tempOffset tempUnit:C,Celsius,F,Fahrenheit,K,Kelvin ".
|
||||||
"tempLow tempHigh ".
|
"tempConv:onkick,onread tempLow tempHigh ".
|
||||||
$readingFnAttributes;
|
$readingFnAttributes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -274,6 +280,23 @@ sub OWTHERM_InitializeDevice($) {
|
|||||||
$hash->{tempf}{offset} = $offset;
|
$hash->{tempf}{offset} = $offset;
|
||||||
$hash->{tempf}{factor} = $factor;
|
$hash->{tempf}{factor} = $factor;
|
||||||
|
|
||||||
|
#-- Check if temperature conversion is consistent
|
||||||
|
if( $interface eq "OWX" ){
|
||||||
|
if( defined($attr{$name}{tempConv}) && ( $attr{$name}{tempConv} eq "onkick") ){
|
||||||
|
if( !(defined($attr{$hash->{IODev}->{NAME}}{dokick})) ||
|
||||||
|
( defined($attr{$hash->{IODev}->{NAME}}{dokick}) && ($attr{$hash->{IODev}->{NAME}}{dokick} eq "0") )){
|
||||||
|
Log 1,"OWTHERM: Attribute tempConv=onkick changed to onread for $name because interface is not kicking";
|
||||||
|
$attr{$name}{tempConv}="onread";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}elsif( $interface eq "OWServer" ){
|
||||||
|
if( !(defined($attr{$name}{tempConv})) ||
|
||||||
|
(defined($attr{$name}{tempConv}) && ($attr{$name}{tempConv} eq "onread") ) ){
|
||||||
|
Log 1,"OWTHERM: Attribute tempConv=onread changed to onkick for $name because interface is OWFS";
|
||||||
|
$attr{$name}{tempConv}="onread";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#-- Set the attribute values if defined
|
#-- Set the attribute values if defined
|
||||||
if( defined($attr{$name}{"tempLow"}) ){
|
if( defined($attr{$name}{"tempLow"}) ){
|
||||||
$value = $attr{$name}{"tempLow"};
|
$value = $attr{$name}{"tempLow"};
|
||||||
@@ -437,11 +460,16 @@ sub OWTHERM_Get($@) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#-- get interval
|
#-- get interval
|
||||||
if($reading eq "interval") {
|
if($a[1] eq "interval") {
|
||||||
$value = $hash->{INTERVAL};
|
$value = $hash->{INTERVAL};
|
||||||
return "$name.interval => $value";
|
return "$name.interval => $value";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#-- get version
|
||||||
|
if( $a[1] eq "version") {
|
||||||
|
return "$name.version => $owx_version";
|
||||||
|
}
|
||||||
|
|
||||||
#-- reset presence
|
#-- reset presence
|
||||||
$hash->{PRESENT} = 0;
|
$hash->{PRESENT} = 0;
|
||||||
|
|
||||||
@@ -778,9 +806,10 @@ sub OWXTHERM_GetValues($) {
|
|||||||
my $owx_dev = $hash->{ROM_ID};
|
my $owx_dev = $hash->{ROM_ID};
|
||||||
#-- hash of the busmaster
|
#-- hash of the busmaster
|
||||||
my $master = $hash->{IODev};
|
my $master = $hash->{IODev};
|
||||||
|
my $name = $hash->{NAME};
|
||||||
|
|
||||||
#-- check, if the conversion has been called before - only on devices with real power
|
#-- check, if the conversion has been called before for all sensors
|
||||||
if( defined($attr{$hash->{IODev}->{NAME}}{buspower}) && ( $attr{$hash->{IODev}->{NAME}}{buspower} eq "real") ){
|
if( defined($attr{$name}{tempConv}) && ( $attr{$name}{tempConv} eq "onkick") ){
|
||||||
$con=0;
|
$con=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -981,7 +1010,9 @@ sub OWXTHERM_SetValues($@) {
|
|||||||
<ul>
|
<ul>
|
||||||
<li><a name="owtherm_interval">
|
<li><a name="owtherm_interval">
|
||||||
<code>set <name> interval <int></code></a><br /> Temperature
|
<code>set <name> interval <int></code></a><br /> Temperature
|
||||||
measurement intervall in seconds. The default is 300 seconds.</li>
|
readout intervall in seconds. The default is 300 seconds. <b>Attention:</b>This is the
|
||||||
|
readout interval. Whether an actual temperature measurement is performed, is determined by the
|
||||||
|
tempConv attribute </li>
|
||||||
<li><a name="owtherm_tempHigh">
|
<li><a name="owtherm_tempHigh">
|
||||||
<code>set <name> tempHigh <float></code></a>
|
<code>set <name> tempHigh <float></code></a>
|
||||||
<br /> The high alarm temperature (on the temperature scale chosen by the attribute
|
<br /> The high alarm temperature (on the temperature scale chosen by the attribute
|
||||||
@@ -1022,6 +1053,12 @@ sub OWXTHERM_SetValues($@) {
|
|||||||
</a>
|
</a>
|
||||||
<br />character string for denoting high alarm condition, default is upward
|
<br />character string for denoting high alarm condition, default is upward
|
||||||
triangle, e.g. the code &#x25B4; leading to the sign ▴ </li>
|
triangle, e.g. the code &#x25B4; leading to the sign ▴ </li>
|
||||||
|
<li><a name="owtherm_tempConv">
|
||||||
|
<code>attr <name> tempConv onkick|onread</code>
|
||||||
|
</a>
|
||||||
|
<br /> determines, whether a temperature measurement will happen when "kicked"
|
||||||
|
through the OWX backend module (all temperature sensors at the same time), or on
|
||||||
|
reading the sensor (1 second waiting time, default). </li>
|
||||||
<li><a name="owtherm_tempOffset"><code>attr <name> tempOffset <float></code>
|
<li><a name="owtherm_tempOffset"><code>attr <name> tempOffset <float></code>
|
||||||
</a>
|
</a>
|
||||||
<br />temperature offset in °C added to the raw temperature reading. </li>
|
<br />temperature offset in °C added to the raw temperature reading. </li>
|
||||||
|
|||||||
Reference in New Issue
Block a user