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 )