FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: astat am 16 Juli 2013, 22:30:20

Titel: Hilfe bei JSON Request
Beitrag von: astat am 16 Juli 2013, 22:30:20
Hallo,

Vielleicht kann mir ja jemand helfen, ich komme nicht weiter. Egal was ich auch versuche den Request auszuwerten bekomme ich die Meldung:

 Can't use string ("{"status":"ok","result":[{"power"...) as a HASH ref while "strict refs" in use at

hab schon stundenlang gegoogled und probiert aber nix hilft.

Print geht immer - siehe # ....
Sobald ich sonst etwas mit $message machen will kommt die Meldung.

Was mache ich falsch oder was habe ich vergessen.

Gruß

Thomas




use strict;
use warnings;
use JSON;
use Time::Piece;
use Data::Dumper;
use LWP::UserAgent;
use HTTP::Request;
use Mozilla::CA;

sub
DISCOVERGY_Initialize($)
{
  my ($hash) = @_;

  $hash->{DefFn}     = "DISCOVERGY_Define";
  $hash->{AttrList}  = "delay loglevel:0,1,2,3,4,5,6 ".
    "stateS ".
    $readingFnAttributes;
}

sub
DISCOVERGY_Define($$)
{
  my ($hash, $def) = @_;
  my $name=$hash->{NAME}||"";
  my @a = split("[ \t][ \t]*", $def);

  my $user = $a[2]||"";
  my $password = $a[3]||"";
  my $meterid = $a[4]||"";
  my $reading = $a[5]||"";
  my $delay = $a[6]||"";
 
  $attr{$name}{delay}=$delay if $delay;

  return "Wrong syntax: use define <name> DISCOVERGY <user> <password> <meterId> <Wert:power/energy> <poll-delay>" if(int(@a) != 7);

  $hash->{user} = $user;
  $hash->{password} = $password;
  $hash->{meterid} = $meterid;
  $hash->{Reading} = $reading;
 
  InternalTimer(gettimeofday(), "DISCOVERGY_GetStatus", $hash, 0);
 
  return undef;
}

sub
DISCOVERGY_GetStatus($)
{
  my ($hash) = @_;
  my $name = $hash->{NAME}||"";
  my $meterid = $hash->{meterid}||"";
  my $password = $hash->{password}||"";
  my $reading = $hash->{Reading}||"";
#  
  my $delay=$attr{$name}{delay}||300;
#  
  InternalTimer(gettimeofday()+$delay, "DISCOVERGY_GetStatus", $hash, 0);
#
  if(!defined($hash->{user})) { return("");
   }
 
my $user = $hash->{user}||"";
my $URL="https://my.discovergy.com/json/Api.get".$reading."?&user=".$user."&password=".$password."&meterId=".$meterid."&numOfSeconds=2";
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => $URL);
 
my $resp = $ua->request($req);
if ($resp->is_success) {
my $message = $resp->decoded_content;

print Dumper($message);

# $VAR1 = '{"status":"ok","result":[{"power":263320,"time":1373995968579}]}';

print "Received reply: $message\n";

# {"status":"ok","result":[{"power":501610,"time":1373922658794}]}

}
else {
    print "HTTP GET error code: ", $resp->code, "\n";
    print "HTTP GET error message: ", $resp->message, "\n";

 }
}
1;
Titel: Aw: Hilfe bei JSON Request
Beitrag von: betateilchen am 16 Juli 2013, 22:33:55
kommentiere mal die erste Zeile Deines Codings aus.
Titel: Aw: Hilfe bei JSON Request
Beitrag von: astat am 16 Juli 2013, 23:48:09
Hallo,

die Meldung kommt dann nicht mehr aber wenn ich das hier versuche:



print "Status = " . $message->{'status'} . "\n";
my @result = @{$message->{'result'}};
foreach my $f (@result) {
  print $f->{'power'} . "\n";
}



bekomme ich diese Meldung:

Use of uninitialized value in array dereference at


was mach ich nur falsch ?

Gruß

Thomas