2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-19 00:26:03 +00:00

HP1000: refactoring code structure

git-svn-id: https://svn.fhem.de/fhem/trunk@13993 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
jpawlowski 2017-04-14 23:17:40 +00:00
parent 771abe0589
commit 489807e4c5

View File

@ -38,6 +38,85 @@ use List::Util qw(sum);
use Scalar::Util qw(looks_like_number); use Scalar::Util qw(looks_like_number);
use Data::Dumper; use Data::Dumper;
my %HP1000_wuMapping = (
# PWS => 'FHEM',
# name translation for general readings
light => 'luminosity',
solarradiation => 'solarradiation',
windcomp => 'wind_compasspoint',
windcomp_avg2m => 'wind_compasspoint_avg2m',
winddir => 'wind_direction',
winddir_avg2m => 'wind_direction_avg2m',
windgustdir => 'wind_gust_direction',
windgustdir_10m => 'wind_gust_direction_sum10m',
# name translation for Metric standard
dewpoint => 'dewpoint',
indewpoint => 'indoorDewpoint',
humidity => 'humidity',
outhumiabs => 'humidityAbs',
relbaro => 'pressure',
absbaro => 'pressureAbs',
indoorhumidity => 'indoorHumidity',
inhumiabs => 'indoorHumidityAbs',
rainrate => 'rain',
dailyrain => 'rain_day',
weeklyrain => 'rain_week',
monthlyrain => 'rain_month',
yearlyrain => 'rain_year',
outtemp => 'temperature',
intemp => 'indoorTemperature',
windchill => 'wind_chill',
windgust => 'wind_gust',
windgust_10m => 'wind_gust_sum10m',
windgustmps => 'wind_gust_mps',
windgustmps_10m => 'wind_gust_mps_sum10m',
windspeed => 'wind_speed',
windspeed_avg2m => 'wind_speed_avg2m',
windspeedmps => 'wind_speed_mps',
windspdmps_avg2m => 'wind_speed_mps_avg2m',
# other formats
barommm => 'pressure_mm',
absbarommm => 'pressureAbs_mm',
windgustbft => 'wind_gust_bft',
windgustbft_10m => 'wind_gust_bft_sum10m',
windgustkn => 'wind_gust_kn',
windgustkn_10m => 'wind_gust_kn_sum10m',
windspeedbft => 'wind_speed_bft',
windspdbft_avg2m => 'wind_speed_bft_avg2m',
windspeedkn => 'wind_speed_kn',
windspdkn_avg2m => 'wind_speed_kn_avg2m',
# name translation for Angloamerican standard
dewptf => 'dewpoint_f',
indoordewptf => 'indoorDewpoint_f',
outhumi => 'humidity',
outhumiabsf => 'humidityAbs_f',
baromin => 'pressure_in',
absbaromin => 'pressureAbs_in',
inhumi => 'indoorHumidity',
indoorhumidityabsf => 'indoorHumidityAbs',
rainin => 'rain_in',
dailyrainin => 'rain_day_in',
weeklyrainin => 'rain_week_in',
monthlyrainin => 'rain_month_in',
yearlyrainin => 'rain_year_in',
tempf => 'temperature_f',
indoortempf => 'indoorTemperature_f',
windchillf => 'wind_chill_f',
windgustfts => 'wind_gust_fts',
windgustfts_10m => 'wind_gust_fts_sum10m',
windgustmph => 'wind_gust_mph',
windgustmph_10m => 'wind_gust_mph_sum10m',
windspeedfts => 'wind_speed_fts',
windspdfts_avg2m => 'wind_speed_fts_avg2m',
windspeedmph => 'wind_speed_mph',
windspdmph_avg2m => 'wind_speed_mph_avg2m',
);
######################### #########################
sub HP1000_addExtension($$$) { sub HP1000_addExtension($$$) {
my ( $name, $func, $link ) = @_; my ( $name, $func, $link ) = @_;
@ -89,6 +168,7 @@ sub HP1000_Initialize($) {
'UVR' => { rtype => 'uwpscm', }, 'UVR' => { rtype => 'uwpscm', },
'UVcondition' => { rtype => 'condition_uvi', }, 'UVcondition' => { rtype => 'condition_uvi', },
'UVcondition_rgb' => { rtype => 'rgbhex', }, 'UVcondition_rgb' => { rtype => 'rgbhex', },
'battery' => { rtype => 'oknok', },
'condition' => { rtype => 'condition_weather', }, 'condition' => { rtype => 'condition_weather', },
'daylight' => { rtype => 'yesno', }, 'daylight' => { rtype => 'yesno', },
'dewpoint' => { rtype => 'c', formula_symbol => 'Td', }, 'dewpoint' => { rtype => 'c', formula_symbol => 'Td', },
@ -344,7 +424,7 @@ sub HP1000_CGI() {
my $servertype; my $servertype;
#TODO: should better be blocked in FHEMWEB already #TODO: should better be blocked in FHEMWEB already
return ( "text/plain; charset=utf-8", "booting up" ) return ( "text/plain; charset=utf-8", "Booting up" )
unless ($init_done); unless ($init_done);
# incorrect FHEMWEB instance used # incorrect FHEMWEB instance used
@ -365,7 +445,7 @@ sub HP1000_CGI() {
# return error if no such device # return error if no such device
return ( "text/plain; charset=utf-8", return ( "text/plain; charset=utf-8",
"No HP1000 device for webhook /updateweatherstation" ) "No HP1000 device for webhook /updateweatherstation" )
unless ($name); unless ( IsDevice( $name, 'HP1000' ) );
# extract values from URI # extract values from URI
foreach my $pv ( split( "&", $URI ) ) { foreach my $pv ( split( "&", $URI ) ) {
@ -374,13 +454,12 @@ sub HP1000_CGI() {
$pv =~ s/%([\dA-F][\dA-F])/chr(hex($1))/ige; $pv =~ s/%([\dA-F][\dA-F])/chr(hex($1))/ige;
my ( $p, $v ) = split( "=", $pv, 2 ); my ( $p, $v ) = split( "=", $pv, 2 );
$webArgs->{$p} = $v ne "" ? Encode::encode_utf8($v) : $v; $webArgs->{$p} = Encode::encode_utf8($v)
if ( $v ne "" );
} }
if ( !defined( $webArgs->{softwaretype} ) if ( !defined( $webArgs->{softwaretype} )
|| !defined( $webArgs->{dateutc} ) || !defined( $webArgs->{dateutc} )
|| !defined( $webArgs->{ID} )
|| !defined( $webArgs->{PASSWORD} )
|| !defined( $webArgs->{action} ) ) || !defined( $webArgs->{action} ) )
{ {
Log3 $name, 5, Log3 $name, 5,
@ -388,6 +467,29 @@ sub HP1000_CGI() {
return ( "text/plain; charset=utf-8", "Insufficient data" ); return ( "text/plain; charset=utf-8", "Insufficient data" );
} }
if ( $webArgs->{action} ne "updateraw" ) {
Log3 $name, 5,
"HP1000: action $webArgs->{action} is not implemented:\n"
. Dumper($webArgs);
return ( "text/plain; charset=utf-8",
"Action $webArgs->{action} was not implemented" );
}
if (
defined( $hash->{ID} )
&& defined( $hash->{PASSWORD} )
&& ( $hash->{ID} ne $webArgs->{ID}
|| $hash->{PASSWORD} ne $webArgs->{PASSWORD} )
)
{
Log3 $name, 4,
"HP1000: received data containing wrong credentials:\n"
. Dumper($webArgs);
return ( "text/plain; charset=utf-8", "Wrong credentials" );
}
} }
# no data received # no data received
@ -417,6 +519,9 @@ sub HP1000_CGI() {
$hash->{SYSTEMTIME_UTC} = $webArgs->{dateutc}; $hash->{SYSTEMTIME_UTC} = $webArgs->{dateutc};
$hash->{FW} = ""; $hash->{FW} = "";
$hash->{FW_PORT} = ""; $hash->{FW_PORT} = "";
$hash->{UPLOAD_TYPE} = "default";
$hash->{UPLOAD_TYPE} = "customize"
if ( defined( $webArgs->{solarradiation} ) );
foreach ( devspec2array('TYPE=FHEMWEB:FILTER=TEMPORARY!=1') ) { foreach ( devspec2array('TYPE=FHEMWEB:FILTER=TEMPORARY!=1') ) {
if ( AttrVal( $_, "webname", "fhem" ) eq "weatherstation" ) { if ( AttrVal( $_, "webname", "fhem" ) eq "weatherstation" ) {
@ -426,18 +531,6 @@ sub HP1000_CGI() {
} }
} }
if (
defined( $hash->{ID} )
&& defined( $hash->{PASSWORD} )
&& ( $hash->{ID} ne $webArgs->{ID}
|| $hash->{PASSWORD} ne $webArgs->{PASSWORD} )
)
{
Log3 $name, 4, "HP1000: received data containing wrong credentials:\n"
. Dumper($webArgs);
return ( "text/plain; charset=utf-8", "Wrong credentials" );
}
Log3 $name, 5, "HP1000: received data:\n" . Dumper($webArgs); Log3 $name, 5, "HP1000: received data:\n" . Dumper($webArgs);
# rename wind speed values as those are in m/sec and # rename wind speed values as those are in m/sec and
@ -451,10 +544,7 @@ sub HP1000_CGI() {
delete $webArgs->{windgust}; delete $webArgs->{windgust};
} }
# calculate readings for Metric standard from Angloamerican standard # Special handling for humidity values
#
# humidity (special case here!)
$webArgs->{inhumi} = $webArgs->{indoorhumidity} $webArgs->{inhumi} = $webArgs->{indoorhumidity}
if ( defined( $webArgs->{indoorhumidity} ) if ( defined( $webArgs->{indoorhumidity} )
&& !defined( $webArgs->{inhumi} ) ); && !defined( $webArgs->{inhumi} ) );
@ -471,298 +561,175 @@ sub HP1000_CGI() {
if ( defined( $webArgs->{outhumi} ) if ( defined( $webArgs->{outhumi} )
&& !defined( $webArgs->{humidity} ) ); && !defined( $webArgs->{humidity} ) );
# dewpoint in Celsius (convert from dewptf) my %HP1000_wuMappingEquivalent = (
if ( defined( $webArgs->{dewptf} )
&& $webArgs->{dewptf} ne "" # Metric => 'Angloamerican',
&& !defined( $webArgs->{dewpoint} ) )
{ dewpoint => 'dewptf',
$webArgs->{dewpoint} = indewpoint => 'indoordewptf',
UConv::f2c( $webArgs->{dewptf} ); humidity => 'outhumi',
outhumiabs => 'outhumiabsf',
relbaro => 'baromin',
absbaro => 'absbaromin',
indoorhumidity => 'inhumi',
inhumiabs => 'indoorhumidityabsf',
rainrate => 'rainin',
dailyrain => 'dailyrainin',
weeklyrain => 'weeklyrainin',
monthlyrain => 'monthlyrainin',
yearlyrain => 'yearlyrainin',
outtemp => 'tempf',
intemp => 'indoortempf',
windchill => 'windchillf',
windgustmps => 'windgustmph',
windspeedmps => 'windspeedmph',
);
my %HP1000_wuMappingEquivalent_rev =
%{ { reverse %HP1000_wuMappingEquivalent } };
# calculate readings for Metric standard from Angloamerican standard
#
# calculate Celsius based values based on Fahrenheit
foreach ( 'dewptf', 'tempf', 'indoortempf', 'windchillf' ) {
my $k = $HP1000_wuMappingEquivalent_rev{$_};
next unless ( $webArgs->{$_} && $k && !defined( $webArgs->{$k} ) );
Log3 $name, 5, "HP1000: Adding calculated value for $k from $_";
$webArgs->{$k} = UConv::f2c( $webArgs->{$_} );
} }
# relbaro in hPa (convert from baromin) # calculate hPa based values based on inHg
if ( defined( $webArgs->{baromin} ) foreach ( 'baromin', 'absbaromin' ) {
&& $webArgs->{baromin} ne "" my $k = $HP1000_wuMappingEquivalent_rev{$_};
&& !defined( $webArgs->{relbaro} ) ) next unless ( $webArgs->{$_} && $k && !defined( $webArgs->{$k} ) );
{
$webArgs->{relbaro} = UConv::inhg2hpa( $webArgs->{baromin} ); Log3 $name, 5, "HP1000: Adding calculated value for $k from $_";
$webArgs->{$k} = UConv::inhg2hpa( $webArgs->{$_} );
} }
# absbaro in hPa (convert from absbaromin) # calculate milimeter based values based on inch
if ( defined( $webArgs->{absbaromin} ) foreach (
&& $webArgs->{absbaromin} ne "" 'rainin', 'dailyrainin', 'weeklyrainin',
&& !defined( $webArgs->{absbaro} ) ) 'monthlyrainin', 'yearlyrainin'
)
{ {
$webArgs->{absbaro} = my $k = $HP1000_wuMappingEquivalent_rev{$_};
UConv::inhg2hpa( $webArgs->{absbaromin} ); next unless ( $webArgs->{$_} && $k && !defined( $webArgs->{$k} ) );
Log3 $name, 5, "HP1000: Adding calculated value for $k from $_";
$webArgs->{$k} = UConv::in2mm( $webArgs->{$_} );
} }
# rainrate in mm/h (convert from rainin) # calculate kph based values based on mph
if ( defined( $webArgs->{rainin} ) foreach ( 'windgustmph', 'windspeedmph' ) {
&& $webArgs->{rainin} ne "" my $k = $HP1000_wuMappingEquivalent_rev{$_};
&& !defined( $webArgs->{rainrate} ) ) next unless ( $webArgs->{$_} && $k && !defined( $webArgs->{$k} ) );
{
$webArgs->{rainrate} = UConv::in2mm( $webArgs->{rainin} ); Log3 $name, 5, "HP1000: Adding calculated value for $k from $_";
$webArgs->{$k} = UConv::mph2mps( $webArgs->{$_} );
} }
# dailyrain in mm (convert from dailyrainin) # windgust in km/h (convert from windgustmps)
if ( defined( $webArgs->{dailyrainin} ) if ( defined( $webArgs->{windgustmps} )
&& $webArgs->{dailyrainin} ne "" && !defined( $webArgs->{windgust} ) )
&& !defined( $webArgs->{dailyrain} ) )
{ {
$webArgs->{dailyrain} = Log3 $name, 5,
UConv::in2mm( $webArgs->{dailyrainin} ); "HP1000: Adding calculated value for windgust from windgustmps";
$webArgs->{windgust} =
UConv::mps2kph( $webArgs->{windgustmps} );
} }
# weeklyrain in mm (convert from weeklyrainin) # windspeed in km/h (convert from windspeedmps)
if ( defined( $webArgs->{weeklyrainin} ) if ( defined( $webArgs->{windspeedmps} )
&& $webArgs->{weeklyrainin} ne "" && !defined( $webArgs->{windspeed} ) )
&& !defined( $webArgs->{weeklyrain} ) )
{ {
$webArgs->{weeklyrain} = Log3 $name, 5,
UConv::in2mm( $webArgs->{weeklyrainin} ); "HP1000: Adding calculated value for windspeed from windspeedmps";
} $webArgs->{windspeed} =
UConv::mps2kph( $webArgs->{windspeedmps} );
# monthlyrain in mm (convert from monthlyrainin)
if ( defined( $webArgs->{monthlyrainin} )
&& $webArgs->{monthlyrainin} ne ""
&& !defined( $webArgs->{monthlyrain} ) )
{
$webArgs->{monthlyrain} =
UConv::in2mm( $webArgs->{monthlyrainin} );
}
# yearlyrain in mm (convert from yearlyrainin)
if ( defined( $webArgs->{yearlyrainin} )
&& $webArgs->{yearlyrainin} ne ""
&& !defined( $webArgs->{yearlyrain} ) )
{
$webArgs->{yearlyrain} =
UConv::in2mm( $webArgs->{yearlyrainin} );
}
# outtemp in Celsius (convert from tempf)
if ( defined( $webArgs->{tempf} )
&& $webArgs->{tempf} ne ""
&& !defined( $webArgs->{outtemp} ) )
{
$webArgs->{outtemp} =
UConv::f2c( $webArgs->{tempf} );
}
# intemp in Celsius (convert from indoortempf)
if ( defined( $webArgs->{indoortempf} )
&& $webArgs->{indoortempf} ne ""
&& !defined( $webArgs->{intemp} ) )
{
$webArgs->{intemp} =
UConv::f2c( $webArgs->{indoortempf} );
}
# windchill in Celsius (convert from windchillf)
if ( defined( $webArgs->{windchillf} )
&& $webArgs->{windchillf} ne ""
&& !defined( $webArgs->{windchill} ) )
{
$webArgs->{windchill} =
UConv::f2c( $webArgs->{windchillf} );
} }
# windgust in km/h (convert from windgustmph) # windgust in km/h (convert from windgustmph)
if ( defined( $webArgs->{windgustmph} ) if ( defined( $webArgs->{windgustmph} )
&& $webArgs->{windgustmph} ne ""
&& !defined( $webArgs->{windgust} ) ) && !defined( $webArgs->{windgust} ) )
{ {
Log3 $name, 5,
"HP1000: Adding calculated value for windgust from windgustmph";
$webArgs->{windgust} = $webArgs->{windgust} =
UConv::mph2kph( $webArgs->{windgustmph} ); UConv::mph2kph( $webArgs->{windgustmph} );
} }
# windspeed in km/h (convert from windspeedmph) # windspeed in km/h (convert from windspeedmph)
if ( defined( $webArgs->{windspeedmph} ) if ( defined( $webArgs->{windspeedmph} )
&& $webArgs->{windspeedmph} ne ""
&& !defined( $webArgs->{windspeed} ) ) && !defined( $webArgs->{windspeed} ) )
{ {
Log3 $name, 5,
"HP1000: Adding calculated value for windspeed from windspeedmph";
$webArgs->{windspeed} = $webArgs->{windspeed} =
UConv::mph2kph( $webArgs->{windspeedmph} ); UConv::mps2kph( $webArgs->{windspeedmph} );
}
# windspeed in km/h (convert from windspdmph)
if ( defined( $webArgs->{windspdmph} )
&& $webArgs->{windspdmph} ne ""
&& !defined( $webArgs->{windspeed} ) )
{
$webArgs->{windspeed} =
UConv::mph2kph( $webArgs->{windspdmph} );
} }
# calculate readings for Angloamerican standard from Metric standard # calculate readings for Angloamerican standard from Metric standard
# #
# humidity (special case here!) # calculate Fahrenheit based values based on Celsius
$webArgs->{indoorhumidity} = $webArgs->{inhumi} foreach ( 'dewpoint', 'outtemp', 'intemp', 'windchill' ) {
if ( defined( $webArgs->{inhumi} ) my $k = $HP1000_wuMappingEquivalent{$_};
&& !defined( $webArgs->{indoorhumidity} ) ); next unless ( $webArgs->{$_} && $k && !defined( $webArgs->{$k} ) );
# dewptf in Fahrenheit (convert from dewpoint) Log3 $name, 5, "HP1000: Adding calculated value for $k from $_";
if ( defined( $webArgs->{dewpoint} ) $webArgs->{$k} = UConv::c2f( $webArgs->{$_} );
&& $webArgs->{dewpoint} ne ""
&& !defined( $webArgs->{dewptf} ) )
{
$webArgs->{dewptf} =
UConv::c2f( $webArgs->{dewpoint} );
} }
# baromin in inch (convert from relbaro) # calculate inHg based values based on hPa
if ( defined( $webArgs->{relbaro} ) foreach ( 'relbaro', 'absbaro' ) {
&& $webArgs->{relbaro} ne "" my $k = $HP1000_wuMappingEquivalent{$_};
&& !defined( $webArgs->{baromin} ) ) next unless ( $webArgs->{$_} && $k && !defined( $webArgs->{$k} ) );
{
$webArgs->{baromin} = UConv::hpa2inhg( $webArgs->{relbaro} ); Log3 $name, 5, "HP1000: Adding calculated value for $k from $_";
$webArgs->{$k} = UConv::hpa2inhg( $webArgs->{$_}, 2 );
} }
# absbaromin in inch (convert from absbaro) # calculate inch based values based on milimeter
if ( defined( $webArgs->{absbaro} ) foreach ( 'rainrate', 'dailyrain', 'weeklyrain', 'monthlyrain',
&& $webArgs->{absbaro} ne "" 'yearlyrain' )
&& !defined( $webArgs->{absbaromin} ) )
{ {
$webArgs->{absbaromin} = my $k = $HP1000_wuMappingEquivalent{$_};
UConv::hpa2inhg( $webArgs->{absbaro} ); next unless ( $webArgs->{$_} && $k && !defined( $webArgs->{$k} ) );
Log3 $name, 5, "HP1000: Adding calculated value for $k from $_";
$webArgs->{$k} = UConv::mm2in( $webArgs->{$_}, 2 );
} }
# rainin in in/h (convert from rainrate) # calculate kph based values based on mph
if ( defined( $webArgs->{rainrate} ) foreach ( 'windgustmps', 'windspeedmps' ) {
&& $webArgs->{rainrate} ne "" my $k = $HP1000_wuMappingEquivalent{$_};
&& !defined( $webArgs->{rainin} ) ) next unless ( $webArgs->{$_} && $k && !defined( $webArgs->{$k} ) );
{
$webArgs->{rainin} = UConv::mm2in( $webArgs->{rainrate} ); Log3 $name, 5, "HP1000: Adding calculated value for $k from $_";
$webArgs->{$k} = UConv::mps2mph( $webArgs->{$_} );
} }
# dailyrainin in inch (convert from dailyrain) # windgustmph in mph (convert from windgustmps)
if ( defined( $webArgs->{dailyrain} ) if ( defined( $webArgs->{windgustmps} )
&& $webArgs->{dailyrain} ne ""
&& !defined( $webArgs->{dailyrainin} ) )
{
$webArgs->{dailyrainin} =
UConv::mm2in( $webArgs->{dailyrain} );
}
# weeklyrainin in inch (convert from weeklyrain)
if ( defined( $webArgs->{weeklyrain} )
&& $webArgs->{weeklyrain} ne ""
&& !defined( $webArgs->{weeklyrainin} ) )
{
$webArgs->{weeklyrainin} =
UConv::mm2in( $webArgs->{weeklyrain} );
}
# monthlyrainin in inch (convert from monthlyrain)
if ( defined( $webArgs->{monthlyrain} )
&& $webArgs->{monthlyrain} ne ""
&& !defined( $webArgs->{monthlyrainin} ) )
{
$webArgs->{monthlyrainin} =
UConv::mm2in( $webArgs->{monthlyrain} );
}
# yearlyrainin in inch (convert from yearlyrain)
if ( defined( $webArgs->{yearlyrain} )
&& $webArgs->{yearlyrain} ne ""
&& !defined( $webArgs->{yearlyrainin} ) )
{
$webArgs->{yearlyrainin} =
UConv::mm2in( $webArgs->{yearlyrain} );
}
# tempf in Fahrenheit (convert from outtemp)
if ( defined( $webArgs->{outtemp} )
&& $webArgs->{outtemp} ne ""
&& !defined( $webArgs->{tempf} ) )
{
$webArgs->{tempf} =
UConv::c2f( $webArgs->{outtemp} );
}
# indoortempf in Fahrenheit (convert from intemp)
if ( defined( $webArgs->{intemp} )
&& $webArgs->{intemp} ne ""
&& !defined( $webArgs->{indoortempf} ) )
{
$webArgs->{indoortempf} =
UConv::c2f( $webArgs->{intemp} );
}
# windchillf in Fahrenheit (convert from windchill)
if ( defined( $webArgs->{windchill} )
&& $webArgs->{windchill} ne ""
&& !defined( $webArgs->{windchillf} ) )
{
$webArgs->{windchillf} =
UConv::c2f( $webArgs->{windchill} );
}
# windgustmps in m/s (convert from windgust)
if ( defined( $webArgs->{windgust} )
&& $webArgs->{windgust} ne ""
&& !defined( $webArgs->{windgustmps} ) )
{
$webArgs->{windgustmps} =
UConv::kph2mps( $webArgs->{windgust} );
}
# windgust in km/h (convert from windgustmps,
# not exactly from angloamerican...)
if ( defined( $webArgs->{windgustmps} )
&& $webArgs->{windgustmps} ne ""
&& !defined( $webArgs->{windgust} ) )
{
$webArgs->{windgust} =
UConv::mps2kph( $webArgs->{windgustmps} );
}
# windgustmph in mph (convert from windgust)
if ( defined( $webArgs->{windgust} )
&& $webArgs->{windgust} ne ""
&& !defined( $webArgs->{windgustmph} ) ) && !defined( $webArgs->{windgustmph} ) )
{ {
Log3 $name, 5,
"HP1000: Adding calculated value for windgustmph from windgustmps";
$webArgs->{windgustmph} = $webArgs->{windgustmph} =
UConv::kph2mph( $webArgs->{windgust} ); UConv::mps2mph( $webArgs->{windgustmps} );
} }
# windspeedmps in m/s (convert from windspeed, # windspeedmph in mph (convert from windspeedmps)
# not exactly from angloamerican...) if ( defined( $webArgs->{windspeedmps} )
if ( defined( $webArgs->{windspeed} )
&& $webArgs->{windspeed} ne ""
&& !defined( $webArgs->{windspeedmps} ) )
{
$webArgs->{windspeedmps} =
UConv::kph2mps( $webArgs->{windspeed} );
}
# windspeed in km/h (convert from windspeedmps)
if ( defined( $webArgs->{windspeedmps} )
&& $webArgs->{windspeedmps} ne ""
&& !defined( $webArgs->{windspeed} ) )
{
$webArgs->{windspeed} =
UConv::mps2kph( $webArgs->{windspeedmps} );
}
# windspdmph in mph (convert from windspeed)
if ( defined( $webArgs->{windspeed} )
&& $webArgs->{windspeed} ne ""
&& !defined( $webArgs->{windspeedmph} ) ) && !defined( $webArgs->{windspeedmph} ) )
{ {
Log3 $name, 5,
"HP1000: Adding calculated value for windspeedmph from windspeedmps";
$webArgs->{windspeedmph} = $webArgs->{windspeedmph} =
UConv::kph2mph( $webArgs->{windspeed} ); UConv::mps2mph( $webArgs->{windspeedmps} );
}
# windspdmph in mph (convert from windspeed)
if ( defined( $webArgs->{windspeed} )
&& $webArgs->{windspeed} ne ""
&& !defined( $webArgs->{windspdmph} ) )
{
$webArgs->{windspdmph} =
UConv::kph2mph( $webArgs->{windspeed} );
} }
# write general readings # write general readings
@ -771,67 +738,22 @@ sub HP1000_CGI() {
while ( ( my $p, my $v ) = each %$webArgs ) { while ( ( my $p, my $v ) = each %$webArgs ) {
# delete empty values
if ( $v eq "" ) {
delete $webArgs->{$p};
next;
}
# ignore those values # ignore those values
next next
if ( $p eq "dateutc" if ( $p eq "action"
|| $p eq "action" || $p eq "dateutc"
|| $p eq "softwaretype" || $p eq "lowbatt"
|| $p eq "realtime" || $p eq "realtime"
|| $p eq "rtfreq" || $p eq "rtfreq"
|| $p eq "softwaretype"
|| $p eq "humidity" || $p eq "humidity"
|| $p eq "indoorhumidity" || $p eq "indoorhumidity"
|| $p eq "UV"
|| $p eq "UVR"
|| $p eq "ID" || $p eq "ID"
|| $p eq "PASSWORD" ); || $p eq "PASSWORD" );
$p = "_" . $p; $p = $HP1000_wuMapping{$p} ? $HP1000_wuMapping{$p} : "_" . $p;
# name translation for general readings
$p = "humidity" if ( $p eq "_outhumi" );
$p = "indoorHumidity" if ( $p eq "_inhumi" );
$p = "luminosity" if ( $p eq "_light" );
$p = "solarradiation" if ( $p eq "_solarradiation" );
$p = "wind_direction" if ( $p eq "_winddir" );
$p = "UV" if ( $p eq "_UV" && $hash->{SERVER_TYPE} eq "php" );
$p = "UVR" if ( $p eq "_UV" && $hash->{SERVER_TYPE} ne "php" );
# name translation for Metric standard
$p = "dewpoint" if ( $p eq "_dewpoint" );
$p = "pressure" if ( $p eq "_relbaro" );
$p = "pressureAbs" if ( $p eq "_absbaro" );
$p = "rain" if ( $p eq "_rainrate" );
$p = "rain_day" if ( $p eq "_dailyrain" );
$p = "rain_week" if ( $p eq "_weeklyrain" );
$p = "rain_month" if ( $p eq "_monthlyrain" );
$p = "rain_year" if ( $p eq "_yearlyrain" );
$p = "temperature" if ( $p eq "_outtemp" );
$p = "indoorTemperature" if ( $p eq "_intemp" );
$p = "wind_chill" if ( $p eq "_windchill" );
$p = "wind_gust" if ( $p eq "_windgust" );
$p = "wind_gust_mps" if ( $p eq "_windgustmps" );
$p = "wind_speed" if ( $p eq "_windspeed" );
$p = "wind_speed_mps" if ( $p eq "_windspeedmps" );
# name translation for Angloamerican standard
$p = "dewpoint_f" if ( $p eq "_dewptf" );
$p = "pressure_in" if ( $p eq "_baromin" );
$p = "pressureAbs_in" if ( $p eq "_absbaromin" );
$p = "rain_in" if ( $p eq "_rainin" );
$p = "rain_day_in" if ( $p eq "_dailyrainin" );
$p = "rain_week_in" if ( $p eq "_weeklyrainin" );
$p = "rain_month_in" if ( $p eq "_monthlyrainin" );
$p = "rain_year_in" if ( $p eq "_yearlyrainin" );
$p = "temperature_f" if ( $p eq "_tempf" );
$p = "indoorTemperature_f" if ( $p eq "_indoortempf" );
$p = "wind_chill_f" if ( $p eq "_windchillf" );
$p = "wind_gust_mph" if ( $p eq "_windgustmph" );
$p = "wind_speed_mph" if ( $p eq "_windspeedmph" );
$p = "wind_speed_mph" if ( $p eq "_windspdmph" );
readingsBulkUpdate( $hash, $p, $v ); readingsBulkUpdate( $hash, $p, $v );
} }
@ -839,6 +761,13 @@ sub HP1000_CGI() {
# calculate additional readings # calculate additional readings
# #
# battery
my $battery = "ok";
if ( defined( $webArgs->{lowbatt} ) ) {
$battery = "low" if ( $webArgs->{lowbatt} );
readingsBulkUpdateIfChanged( $hash, "battery", $battery );
}
# israining # israining
my $israining = 0; my $israining = 0;
$israining = 1 $israining = 1
@ -850,7 +779,7 @@ sub HP1000_CGI() {
&& !defined( $webArgs->{solarradiation} ) ) && !defined( $webArgs->{solarradiation} ) )
{ {
$webArgs->{solarradiation} = $webArgs->{solarradiation} =
UConv::lux2wpsm( $webArgs->{light} ); UConv::lux2wpsm( $webArgs->{light}, 2 );
readingsBulkUpdate( $hash, "solarradiation", readingsBulkUpdate( $hash, "solarradiation",
$webArgs->{solarradiation} ); $webArgs->{solarradiation} );
} }
@ -899,26 +828,22 @@ sub HP1000_CGI() {
if ( defined( $webArgs->{UV} ) ) { if ( defined( $webArgs->{UV} ) ) {
# php reports UV as index # UV is already in UV-index format when upload-type
# UVR (convert from UVI) # is set to 'customize'. Wunderground format is 'customize'.
if ( $hash->{SERVER_TYPE} eq 'php' ) { if ( $hash->{UPLOAD_TYPE} eq "customize" ) {
$webArgs->{UVI} = $webArgs->{UV}; $webArgs->{UVR} = UConv::uvi2uwpscm( $webArgs->{UV} )
$webArgs->{UVR} = UConv::uvi2uwpscm( $webArgs->{UVI} ); unless ( defined( $webArgs->{UVR} ) );
readingsBulkUpdate( $hash, "UVR", $webArgs->{UVR} );
} }
# jsp reports UV as radiation
# UV (convert from uW/cm2)
else { else {
$webArgs->{UVR} = $webArgs->{UV}; $webArgs->{UVR} = $webArgs->{UV};
$webArgs->{UVI} = UConv::uwpscm2uvi( $webArgs->{UVR} ); $webArgs->{UV} = UConv::uwpscm2uvi( $webArgs->{UVR} );
readingsBulkUpdate( $hash, "UV", $webArgs->{UVI} );
} }
}
# UVcondition readingsBulkUpdate( $hash, "UV", $webArgs->{UV} );
if ( defined( $webArgs->{UVI} ) ) { readingsBulkUpdate( $hash, "UVR", $webArgs->{UVR} );
my ( $v, $rgb ) = UConv::uvi2condition( $webArgs->{UVI} );
# UVcondition
my ( $v, $rgb ) = UConv::uvi2condition( $webArgs->{UV} );
readingsBulkUpdateIfChanged( $hash, "UVcondition", $v ); readingsBulkUpdateIfChanged( $hash, "UVcondition", $v );
readingsBulkUpdateIfChanged( $hash, "UVcondition_rgb", $rgb ); readingsBulkUpdateIfChanged( $hash, "UVcondition_rgb", $rgb );
} }
@ -965,10 +890,10 @@ sub HP1000_CGI() {
) )
); );
$webArgs->{indoordewpointf} = $webArgs->{indoordewptf} =
round( dewpoint_dewpoint( $webArgs->{indoortempf}, $h ), 1 ); round( dewpoint_dewpoint( $webArgs->{indoortempf}, $h ), 1 );
readingsBulkUpdate( $hash, "indoorDewpoint_f", readingsBulkUpdate( $hash, "indoorDewpoint_f",
$webArgs->{indoordewpointf} ); $webArgs->{indoordewptf} );
} }
# humidityAbs # humidityAbs
@ -1044,10 +969,9 @@ sub HP1000_CGI() {
# wind_compasspoint # wind_compasspoint
if ( defined( $webArgs->{winddir} ) ) { if ( defined( $webArgs->{winddir} ) ) {
$webArgs->{windcompasspoint} = $webArgs->{windcomp} =
UConv::direction2compasspoint( $webArgs->{winddir} ); UConv::direction2compasspoint( $webArgs->{winddir} );
readingsBulkUpdate( $hash, "wind_compasspoint", readingsBulkUpdate( $hash, "wind_compasspoint", $webArgs->{windcomp} );
$webArgs->{windcompasspoint} );
} }
# wind_speed_bft in Beaufort (convert from km/h) # wind_speed_bft in Beaufort (convert from km/h)
@ -1094,8 +1018,9 @@ sub HP1000_CGI() {
# averages/wind_direction_avg2m # averages/wind_direction_avg2m
if ( defined( $webArgs->{winddir} ) ) { if ( defined( $webArgs->{winddir} ) ) {
my $v = sprintf( '%0.0f', my $v =
HP1000_GetAvg( $hash, "winddir", 2 * 60, $webArgs->{winddir} ) ); round( HP1000_GetAvg( $hash, "winddir", 2 * 60, $webArgs->{winddir} ),
0 );
if ( $hash->{INTERVAL} > 0 ) { if ( $hash->{INTERVAL} > 0 ) {
readingsBulkUpdate( $hash, "wind_direction_avg2m", $v ); readingsBulkUpdate( $hash, "wind_direction_avg2m", $v );
@ -1105,10 +1030,10 @@ sub HP1000_CGI() {
# averages/wind_compasspoint_avg2m # averages/wind_compasspoint_avg2m
if ( defined( $webArgs->{winddir_avg2m} ) ) { if ( defined( $webArgs->{winddir_avg2m} ) ) {
$webArgs->{windcompasspoint_avg2m} = $webArgs->{windcomp_avg2m} =
UConv::direction2compasspoint( $webArgs->{winddir_avg2m} ); UConv::direction2compasspoint( $webArgs->{winddir_avg2m} );
readingsBulkUpdate( $hash, "wind_compasspoint_avg2m", readingsBulkUpdate( $hash, "wind_compasspoint_avg2m",
$webArgs->{windcompasspoint_avg2m} ); $webArgs->{windcomp_avg2m} );
} }
# averages/wind_speed_avg2m in km/h # averages/wind_speed_avg2m in km/h
@ -1130,34 +1055,33 @@ sub HP1000_CGI() {
if ( $hash->{INTERVAL} > 0 ) { if ( $hash->{INTERVAL} > 0 ) {
readingsBulkUpdate( $hash, "wind_speed_mph_avg2m", $v ); readingsBulkUpdate( $hash, "wind_speed_mph_avg2m", $v );
$webArgs->{windspdmph_avg2m} = $v; $webArgs->{windspdmph_avg2m} = $v;
$webArgs->{windspeedmph_avg2m} = $v;
} }
} }
# averages/wind_speed_bft_avg2m in Beaufort (convert from km/h) # averages/wind_speed_bft_avg2m in Beaufort (convert from km/h)
if ( defined( $webArgs->{windspeed_avg2m} ) ) { if ( defined( $webArgs->{windspeed_avg2m} ) ) {
$webArgs->{windspeedbft_avg2m} = $webArgs->{windspdbft_avg2m} =
UConv::kph2bft( $webArgs->{windspeed_avg2m} ); UConv::kph2bft( $webArgs->{windspeed_avg2m} );
readingsBulkUpdate( $hash, "wind_speed_bft_avg2m", readingsBulkUpdate( $hash, "wind_speed_bft_avg2m",
$webArgs->{windspeedbft_avg2m} ); $webArgs->{windspdbft_avg2m} );
} }
# averages/wind_speed_kn_avg2m in Kn (convert from km/h) # averages/wind_speed_kn_avg2m in Kn (convert from km/h)
if ( defined( $webArgs->{windspeed_avg2m} ) ) { if ( defined( $webArgs->{windspeed_avg2m} ) ) {
$webArgs->{windspeedkn_avg2m} = $webArgs->{windspdkn_avg2m} =
UConv::kph2kn( $webArgs->{windspeed_avg2m} ); UConv::kph2kn( $webArgs->{windspeed_avg2m} );
readingsBulkUpdate( $hash, "wind_speed_kn_avg2m", readingsBulkUpdate( $hash, "wind_speed_kn_avg2m",
$webArgs->{windspeedkn_avg2m} ); $webArgs->{windspdkn_avg2m} );
} }
# averages/wind_speed_mps_avg2m in m/s # averages/wind_speed_mps_avg2m in m/s
if ( defined( $webArgs->{windspeed_avg2m} ) ) { if ( defined( $webArgs->{windspeed_avg2m} ) ) {
my $v = UConv::kph2mps( $webArgs->{windspeed_avg2m} ); my $v = UConv::kph2mps( $webArgs->{windspeed_avg2m} );
$webArgs->{windspeedmps_avg2m} = $webArgs->{windspdmps_avg2m} =
( $v > 0.5 ? round( $v, 1 ) : "0.0" ); ( $v > 0.5 ? round( $v, 1 ) : "0.0" );
readingsBulkUpdate( $hash, "wind_speed_mps_avg2m", readingsBulkUpdate( $hash, "wind_speed_mps_avg2m",
$webArgs->{windspeedmps_avg2m} ); $webArgs->{windspdmps_avg2m} );
} }
# averages/wind_gust_sum10m # averages/wind_gust_sum10m
@ -1231,7 +1155,7 @@ sub HP1000_GetSum($$$$;$) {
return $v if ( $avg && $hash->{INTERVAL} < 1 ); return $v if ( $avg && $hash->{INTERVAL} < 1 );
return "0" if ( $hash->{INTERVAL} < 1 ); return "0" if ( $hash->{INTERVAL} < 1 );
my $max = sprintf( "%.0f", $s / $hash->{INTERVAL} ); my $max = round( $s / $hash->{INTERVAL}, 0 );
$max = "1" if ( $max < 1 ); $max = "1" if ( $max < 1 );
my $return; my $return;
@ -1242,14 +1166,16 @@ sub HP1000_GetSum($$$$;$) {
. Dumper( $hash->{helper}{history}{$t} ); . Dumper( $hash->{helper}{history}{$t} );
if ($avg) { if ($avg) {
$return = sprintf( "%.1f", $return = round(
sum( @{ $hash->{helper}{history}{$t} } ) / sum( @{ $hash->{helper}{history}{$t} } ) /
@{ $hash->{helper}{history}{$t} } ); @{ $hash->{helper}{history}{$t} },
1
);
Log3 $name, 5, "HP1000 $name: Average for $t: $return"; Log3 $name, 5, "HP1000 $name: Average for $t: $return";
} }
else { else {
$return = sprintf( "%.1f", sum( @{ $hash->{helper}{history}{$t} } ) ); $return = round( sum( @{ $hash->{helper}{history}{$t} } ), 1 );
Log3 $name, 5, "HP1000 $name: Sum for $t: $return"; Log3 $name, 5, "HP1000 $name: Sum for $t: $return";
} }
@ -1331,6 +1257,7 @@ sub HP1000_PushWU($$) {
my $http_noshutdown = AttrVal( $name, "http-noshutdown", "1" ); my $http_noshutdown = AttrVal( $name, "http-noshutdown", "1" );
my $wu_user = AttrVal( $name, "wu_id", "" ); my $wu_user = AttrVal( $name, "wu_id", "" );
my $wu_pass = AttrVal( $name, "wu_password", "" ); my $wu_pass = AttrVal( $name, "wu_password", "" );
my $wu_realtime = AttrVal( $name, "wu_realtime", undef );
my $wu_indoorValues = AttrVal( $name, "wu_indoorValues", 1 ); my $wu_indoorValues = AttrVal( $name, "wu_indoorValues", 1 );
my $wu_dataValues = AttrVal( $name, "wu_dataValues", undef ); my $wu_dataValues = AttrVal( $name, "wu_dataValues", undef );
@ -1349,18 +1276,21 @@ sub HP1000_PushWU($$) {
return; return;
} }
if ( AttrVal( $name, "wu_realtime", "1" ) eq "0" ) { if ( defined($wu_realtime) && $wu_realtime eq "0" ) {
Log3 $name, 5, "HP1000 $name: Explicitly turning off realtime"; Log3 $name, 5, "HP1000 $name: Explicitly turning off realtime";
delete $webArgs->{realtime}; delete $webArgs->{realtime};
delete $webArgs->{rtfreq}; delete $webArgs->{rtfreq};
} }
elsif ( AttrVal( $name, "wu_realtime", "0" ) eq "1" ) { elsif ($wu_realtime) {
Log3 $name, 5, "HP1000 $name: Explicitly turning on realtime"; Log3 $name, 5, "HP1000 $name: Explicitly turning on realtime";
$webArgs->{realtime} = 1; $webArgs->{realtime} = 1;
} }
if ($wu_dataValues) { if ($wu_dataValues) {
my %HP1000_wuMapping_rev = %{ { reverse %HP1000_wuMapping } };
my %dummy; my %dummy;
$wu_dataValues =~ s/\$name/$name/g;
my ( $err, @a ) = ReplaceSetMagic( \%dummy, 0, ($wu_dataValues) ); my ( $err, @a ) = ReplaceSetMagic( \%dummy, 0, ($wu_dataValues) );
if ($err) { if ($err) {
Log3 $name, 3, "HP1000 $name: error parsing wu_dataValues: $err"; Log3 $name, 3, "HP1000 $name: error parsing wu_dataValues: $err";
@ -1369,13 +1299,21 @@ sub HP1000_PushWU($$) {
my ( undef, $h ) = parseParams( \@a ); my ( undef, $h ) = parseParams( \@a );
foreach ( keys %$h ) { foreach ( keys %$h ) {
next unless $_ ne ""; next unless $_ ne "";
my $n = $_;
if ( $HP1000_wuMapping_rev{$_} ) {
$n = $HP1000_wuMapping_rev{$_};
Log3 $name, 4,
"HP1000 $name: Remapping reading name from $_ to $n";
}
Log3 $name, 4, Log3 $name, 4,
"HP1000 $name: Adding new value for WU: $_=$h->{$_}" "HP1000 $name: Adding new value for WU: $n=$h->{$_}"
unless ( defined( $webArgs->{$_} ) ); unless ( defined( $webArgs->{$n} ) );
Log3 $name, 4, Log3 $name, 4,
"HP1000 $name: Replacing existing value for WU: $_=$h->{$_}" "HP1000 $name: Replacing existing value for WU: $n=$h->{$_}"
if ( defined( $webArgs->{$_} ) ); if ( defined( $webArgs->{$n} ) );
$webArgs->{$_} = $h->{$_};
$webArgs->{$n} = $h->{$_};
} }
} }
} }
@ -1397,24 +1335,10 @@ sub HP1000_PushWU($$) {
my $cmd; my $cmd;
while ( my ( $key, $value ) = each %{$webArgs} ) { while ( my ( $key, $value ) = each %{$webArgs} ) {
if ( $key eq "softwaretype" || $key eq "dateutc" ) { $value = urlEncode($value)
$value = urlEncode($value); if ( $key =~ /^(softwaretype|dateutc)$/i );
}
elsif ( $key eq "UVI" ) { if ( !$wu_indoorValues && $key =~ m/^in/i ) {
$key = "UV";
$value = $value;
}
elsif ( $key eq "UV" ) {
next;
}
if ( !$wu_indoorValues
&& $key =~
m/^(indoorhumidity|indoortempf|indoordewpointf|inhumi|intemp|indewpoint)/i
)
{
Log3 $name, 4, "HP1000 $name: excluding indoor value $key=$value"; Log3 $name, 4, "HP1000 $name: excluding indoor value $key=$value";
next; next;
} }