Device-Inverter-KOSTAL-PIKO
view release on metacpan or search on metacpan
lib/Device/Inverter/KOSTAL/PIKO.pm view on Meta::CPAN
]
)
{
my ( $attr, %spec ) = @$_;
my $last_resort = delete $spec{last_resort};
my $has_attr = "has_$attr";
# Include defaults in spec:
%spec = (
is => 'rw',
isa => 'Str',
lazy => 1,
default => sub {
my $self = shift;
$self->read_configfile;
return $self->$attr if $self->$has_attr;
if ( defined $last_resort
&& defined( my $value = $last_resort->($self) ) )
{
$self->$attr($value);
return $value;
}
confess("$attr not set");
},
predicate => $has_attr,
%spec
);
has $attr => %spec;
}
sub configure {
my ( $self, $config_subhash ) = @_;
while ( my ( $attr, $data ) = each %$config_subhash ) {
my $has_attr = "has_$attr";
$self->$attr($data) unless $self->$has_attr;
}
}
sub fetch_logdata {
my $self = shift;
$self->load( \$self->get( logdata_url => @_ ) );
}
sub get {
my ( $self, $what, %args ) = @_;
my $url = $self->$what;
require HTTP::Request;
require LWP::UserAgent;
( my $request = HTTP::Request->new( GET => $url ) )
->authorization_basic( $self->username, $self->password );
my $ua = LWP::UserAgent->new;
local *STDERR = \*STDERR;
if ( $args{progress_to} ) {
open STDERR, '>&', $args{progress_to};
$ua->show_progress(1);
}
my $response = $ua->request($request);
croak( "Could not fetch <$url>: " . $response->status_line )
unless $response->is_success;
$response->decoded_content;
}
sub get_current_status {
my $self = shift;
require Device::Inverter::KOSTAL::PIKO::Status;
Device::Inverter::KOSTAL::PIKO::Status->new(
$self->get( status_url => @_ ) );
}
sub load {
my $self = shift;
my ($source) = validate_pos( @_, 1 );
my %param = ( inverter => $self );
unless ( ref $source ) { # String => filename
open $param{fh}, '<:crlf', $param{filename} = $source
or croak(qq(Cannot open file "$source" for reading: $!));
}
elsif ( openhandle $source ) {
binmode( $source, ':crlf' );
$param{fh} = $source;
}
else {
open $param{fh}, '<:crlf', $source
or croak(qq(Cannot open reference for reading: $!));
}
require Device::Inverter::KOSTAL::PIKO::File;
Device::Inverter::KOSTAL::PIKO::File->new(%param);
}
sub read_configfile {
my $self = shift;
my $configfile = $self->configfile;
carp(qq(Config file "$configfile" not found)) unless -e $configfile;
require Config::INI::Reader;
my $config_hash = Config::INI::Reader->read_file($configfile);
if ( $self->has_number ) {
if ( defined( my $specific_config = $config_hash->{ $self->number } ) )
{
$self->configure($specific_config);
}
}
if ( defined( my $general_config = $config_hash->{_} ) ) {
$self->configure($general_config);
}
}
__PACKAGE__->meta->make_immutable;
no Mouse;
1;
__END__
=encoding UTF-8
=head1 NAME
Device::Inverter::KOSTAL::PIKO - represents a KOSTAL PIKO DC/AC converter
( run in 0.614 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )