[Workaround gefunden] - Auslesen einer http Antwort klappt mal und mal nicht

Begonnen von maxritti, 04 April 2014, 16:00:48

Vorheriges Thema - Nächstes Thema

maxritti

Hallo zusammen,

irgendwie komme ich mal wieder nicht weiter.

Ich habe ein Modul etwas angepasst um meinen Solarlog 200 auslesen zu können.

http://forum.fhem.de/index.php/topic,13600.0.html

Jetzt hat mich jemand aus dem Forum kontaktiert ob das nicht auch auf seine Umgebung anzupassen wäre.

Nun gut. Sollte ja machbar sein.

Dumm nur, dass das Modul bei mir einwandfrei läuft und bei ihm eine Info nicht ausgelesen wird.

Vielleicht hat dazu jemand einen Tip, wo es hier hängen könnte.
Das Modul habe ich mal angehangen, allerdings reicht auch folgende kleine Testfunktion um dies zu reproduzieren:

#############
# Solarlog Test Routine
#############

sub SolarlogTest() {
my $browser = LWP::UserAgent->new();
my $req = $browser->get('http://192.168.1.2/pc.js?min0');
my $dec_req = $req->decoded_content();

Log3 "SolarlogTest:", 3, "$dec_req";

$dec_req =~ /(.*)AnzahlWR(.*)(\d+)(.*)/;
Log3 "SolarlogTest:", 3, "AnzahlWR: $1 - $2  - $3";

}


Diese habe ich mal in die 99_myUtils.pm eingebaut.

Wie man sieht, wird dort die IP 192.168.1.2 der Solarlog abgefragt.
Da kommt dann eine Seite zurück, wo diverse Sachen der Anlage drin stehen.


var AnlagenKWP=1234
var time_start = new Array(8,7,6,6,6,5,5,7,7,7,7,8)
var time_end = new Array(17,18,20,21,21,22,22,21,20,19,17,17)
var sollMonth = new Array(3,5,9,10,12,13,13,12,10,7,4,2)
var SollYearKWP=900
var AnzahlWR = 3
var MaxWRP=new Array(AnzahlWR)
MaxWRP[0]=new Array(6000,40000,500000,5500000)
MaxWRP[1]=new Array(6600,50000,950000,9000000)
MaxWRP[2]=new Array(2100,17000,350000,3000000)
var WRInfo = new Array(AnzahlWR)
WRInfo[0]=new Array("S0-IN","         1",6000,1,"Verbrauch",1,null,null,0,null,9,2,0,1000,null)
WRInfo[0][14]=2
WRInfo[0][15]=0
WRInfo[0][16]=0
WRInfo[1]=new Array("SPR_123","         1",333,1,"Sunpower",1,null,null,0,null,5,0,0,1000,null)
WRInfo[1][16]=2
WRInfo[2]=new Array("IG134","         2",2440,1,"Fronius",1,null,null,0,null,5,0,0,1000,null)
WRInfo[2][16]=2
...
m[mi++]="04.04.14 00:10:00|217;0;35|0;0;0;0|0;0;0;0"
m[mi++]="04.04.14 00:05:00|196;0;17|0;0;0;0|0;0;0;0"
m[mi++]="04.04.14 00:00:00|192;0;0|0;0;0;0|0;0;0;0"
da[dx++]="04.04.14|3808;2117|3523;1898|1608;680"


Jetzt wollte ich mein Modul so bauen, dass wenn ein Objekt definiert wird die allgemeinen Daten wie Anzahl Wechselrichter und die Namen der Wechselrichter ausgelesen werden.
Danach wird dann regemässig die Zeile da[dx++]... ausgewertet, wo aktuelle Infos drin stehen.

Und nun kommts.

Bei mir klappt das alles wunderbar.
Sobald mein Modul bei dem Kollegen aus dem Forum eingerichtet wird, kann die Zeile var AnzahlWR = 3 nicht mehr mit dem regulären Ausdruck gefunden und ausgewertet werden.
Da kommt immer nichts zurück.
Jetzt habe ich spasseshalber mal die Antwortdatei welche von seinem Solarlog kommt auf einen stinknormalen Webserver gelegt und dieses abfragen lassen.
Und siehe da. Er kann den Wert 3 ermitteln.
Ich verstehe nicht, warum der Wert nicht korrekt ermittelt werden kann, sofern die Daten direkt von seinem Solarlog kommen.
Es ist ja eigentlich genau die gleiche Datei.

So sieht die Ausgabe aus, wenn er seinen Solarlog abfragt:

2014.04.04 12:56:15 3: AnzahlWR:  -   -

und so, wenn die gleiche Antwortdatei auf einem Webserver liegt:

2014.04.04 15:12:34 3: AnzahlWR: var  -  =   - 3

Die weiteren reg. Ausdrücke in dem Modul, welche da[dx++]... auswerten, klappen einwandfrei.

Wir haben auch schon mal den Loglevel verbose auf 5 gesetzt, aber nichts zu sehen, was das Problem sein könnte.
Er findet einfach nur nichts.

Hat dazu jemand eine Idee, wie wir hier dem Problem auf die Schliche kommen können?

Eventuell noch als Info. Bei mir läuft Fhem auf einem Debian Server, bei ihm auf einer Fritzbox.

maxritti

Vielleicht hätte ich hier noch die Stelle aus dem Modul posten sollen, welche die Probleme bereitet.


my $browser = LWP::UserAgent->new();
my $req = $browser->get('http://'.$host.'/pc.js?min0');
my $dec_req = $req->decoded_content();

$dec_req =~ /(.*)AnzahlWR(.*)(\d+)(.*)/;
Log3 "SolarlogTest:", 3, "AnzahlWR: $1 - $2  - $3";
 
$hash->{COUNTWR} = 3;

maxritti

Hallo,

ich werde hier noch verrückt.
Irgendwo scheint es doch an meinem regulären Ausdruck zu liegen.

Getestet habe ich jetzt mal mit http://www.regexe.de
Als zu scannenden Text habe ich dies hier eingegeben:

var AnlagenKWP=9580
var time_start = new Array(8,7,6,6,6,5,5,7,7,7,7,8)
var time_end = new Array(17,18,20,21,21,22,22,21,20,19,17,17)
var sollMonth = new Array(3,5,9,10,12,13,13,12,10,7,4,2)
var SollYearKWP=900
var AnzahlWR = 3
var MaxWRP=new Array(AnzahlWR)
MaxWRP[0]=new Array(6000,40000,500000,5500000)
MaxWRP[1]=new Array(6600,50000,950000,9000000)
MaxWRP[2]=new Array(2100,17000,350000,3000000)
var WRInfo = new Array(AnzahlWR)
WRInfo[0]=new Array("S0-IN","         1",6000,1,"Verbrauch",1,null,null,0,null,9,2,0,1000,null)
WRInfo[0][14]=2
WRInfo[0][15]=0
WRInfo[0][16]=0
WRInfo[1]=new Array("SPR_6501F_2_EU","         1",7140,1,"Sunpower",1,null,null,0,null,5,0,0,1000,null)
WRInfo[1][16]=2
WRInfo[2]=new Array("IG 20","         2",2440,1,"Fronius",1,null,null,0,null,5,0,0,1000,null)
WRInfo[2][16]=2


Gebe ich auf der Seite (.*)AnzahlWR(.*)(\d+)(.*) als regulären Ausdruck ein, ohne Punkt als Umbruch und ohne Ersetzung, bekomme ich diese Antwort:

1. var AnzahlWR = 3
1.1. Gruppe: var
1.2. Gruppe: =
1.3. Gruppe: 3
1.4. Gruppe:

   
Passt meiner Meinung nach auch. Halt nur bei dem Kollegen der die Fritzbox hat, kommt da nichts vernünftiges zurück.

Jetzt habe ich mal spasseshalber eine Zeile weiter oben das "SollYearKWP" gescannt und wollte die 900 bekommen.
Also mal den reguläre Ausdruck nach (.*)SollYearKWP(.*)(\d+)(.*) geändert. Und nun wundere ich mich über dieses Ergebnis:

1. var SollYearKWP=900
1.1. Gruppe: var
1.2. Gruppe: =90
1.3. Gruppe: 0
1.4. Gruppe:

   
Wie kommt der denn da auf die Idee, das "=90" als eine Gruppe zu sehen und die letzte 0 als Gruppe 3?
Das "=" sollte doch mit (.*) als beliebiges Zeichen erkannt werden oder?
Zumindest klappt das ja bei (.*)AnzahlWR(.*)(\d+)(.*).

Vielleicht hat das Problem auch was mit dem eigentlich zu tun, dass der die AnzahlWR ab und zu findet und mal nicht.

Momentan sitze ich wirklich so hier

(http://www.poolpowershop-forum.de/images/smilies/smilie_denk_33.gif)

maxritti

Ich schliesse hier mal meine Alleinunterhaltungspost :)

Verstanden habe ich das zwar immer noch nicht, aber folgender Code findet nun auch auf der Fritzbox die korrekte Anzahl von WR.

  $dec_req =~ /(.*)var\sAnzahlWR(.*)/;
  my @wr = split('=', $2);
  my $cwr = $wr[1];

  $hash->{COUNTWR} = $cwr - 1;