WWWReader_Update Page geht auf RPI nicht

Hallo,

ich nutze den WWWReader um eine URL in einen Webbrower zu posten. Leider funktioniert das Script nicht mehr. Inzwischen habe auch WWWReader_SetPage durch SetProperty ersetzt, aber es funktioniert nicht. Die Funktion WWWReader_UpdatePage bekommt immer die Fehlermeldung.

Fatal error: Call to undefined function WWWReader_UpdatePage()

Auch wenn ich es direkt im WWWReader versuche kommt diese Fehlermeldung.

Der alte Code unter Win7:

<?

$IP_Adresse = „http://“.GetValueString(19289 /[Zentrale Variablen\IP_Adresse]/)."/icontrol.dll?ccmd=".$PHC;

//Icontrol aufrufen
WWWReader_SetPage(24783 /[WWW Reader]/, $IP_Adresse);

//Aenderung abspeichern
IPS_ApplyChanges(24783 /[WWW Reader]/);

WWWReader_UpdatePage(24783 /[WWW Reader]/);

?>

Der neue Code:

<?

$PHC = $_IPS[‚PHC‘];

$IP_Adresse = „http://“.GetValueString(19289 /[Zentrale Variablen\IP_Adresse_iControl]/)."/icontrol.dll?ccmd=".$PHC;

//Icontrol aufrufen
IPS_SetProperty(57605 /[WWW Reader]/, ‚URL‘, $IP_Adresse);

//Aenderung abspeichern
IPS_ApplyChanges(57605 /[WWW Reader]/);

//Ausfuehren
WWWReader_UpdatePage(57605 /[WWW Reader]/);

Gruß
Klaus

Das Prefix ist anders. WWW_UpdatePage sollte gehen. Ich werde das mal entsprechend Dokumentieren.

paresy

Ah jetzt gehts.

Danke für die schnelle Hilfe

Gruß
Klaus

Gut das es dieses Forum gibt! Ich hatte mich gewundert, warum meine Abfragen von Web-Seiten nicht mehr funktionieren!!! :confused:
Allerdings habe ich noch nicht rausgefunden, wie ich den TextParser bzw. die dort hinterlegten Regeln anpassen kann. Die Funktion TextParser_EditRule funktioniert bei mir zumindest nicht mehr! Geht das auch mit IPS_SetProperty? Wenn ich mir das Objekt ausgeben lasse, kann ich aber leider nicht auf den PropertyName (String) schließen, bei dem die Regeln hinterlegt sind! Jedwede Hilfe ist willkommen… :slight_smile:

Array
(
[ChildrenIDs] => Array
(
)

[HasChildren] =&gt; 
[ObjectIcon] =&gt; 
[ObjectID] =&gt; 30376
[ObjectIdent] =&gt; 
[ObjectInfo] =&gt; 
[ObjectIsHidden] =&gt; 
[ObjectIsReadOnly] =&gt; 
[ObjectName] =&gt; EUREXtextParser
[ObjectPosition] =&gt; 0
[ObjectSummary] =&gt; 
[ObjectType] =&gt; 1
[ParentID] =&gt; 17159

)

Hab’ jetzt noch was gefunden: Scheint mit IPS_SetProperty zu gehen! Allerdings verstehe ich die Parameter der Funktion nicht wirklich! Kann da jemand mit einem Beispiel helfen? Neben Objekt-ID und ‚Rule‘ ist wohl ein Array zu übergeben. Aber was sind die möglichen Argumente?

Array("ParseType" => $ParseType, "TagOne" => $TagOne, "TagTwo" => $TagTwo, "Variable", $Variable)

Abend!

Hier steht ein wenig, aber nicht viel :smiley: >> Piiiiiiiiio :slight_smile:
IPS_SetProperty — IP-Symcon :: Automatisierungssoftware

Damit kannst du eine bestehende TextParser Config auslesen (zum Abschauen der notwendigen Daten, bzw. Aufbau vom String):

$TextParser_ID = 12345;  // ID der TextParser IO-Instanz
$TextParserEinstellungen = IPS_GetConfiguration($TextParser_ID);
print_r($TextParserEinstellungen);

Also irgendwie steh ich grad auf dem Schlauch :frowning:
Das hier…

$TextParser_ID = 11111;
$TP_VarID = 22222;  // ID der Variable, die das Ergebnis vom TextParser aufnehmen soll
$TP_TagTwo = "BBB";
$TP_TagOne = "AAA";
$TP_Type = 4;  // 1 = Text abschneiden vor // 2 = Text abschneiden hinter // 3 = Hole Text // 4 = Text ausschneiden zwischen
IPS_SetProperty($TextParser_ID, "Rules", '[{\"Variable\":$TP_VarID,\"TagTwo\":$TP_TagTwo,\"TagOne\":$TP_TagOne,\"ParseType\":$TP_Type}]');
IPS_ApplyChanges($TextParser_ID);

…ergibt diese Fehlermeldung: „Warning: Expected value of type int for ParseType“
Bug?

Selbst wenn ich direkt eine Zahl eintrage…

IPS_SetProperty($TextParser_ID, "Rules", '[{\"Variable\":$TP_VarID,\"TagTwo\":$TP_TagTwo,\"TagOne\":$TP_TagOne,\"ParseType\":3}]');

…kommt die gleiche Warnung…

Grüße,
Chris

Du kannst entweder die Kompatibilitätsfunktionen aktivieren, oder mal in die __compatibility.inc.php schauen. Dort ist deine fehlende Funktion nachgebaut und du kannst schauen wie die Magie dahinter ist :smiley:

paresy

Ok, hab die „Magie“ dahinter gefunden…aber die funktioniert auch nicht :stuck_out_tongue: :smiley: Nix mit „Magic happens“ :frowning:

Dieser Code:

$TextParser_ID = 11111;
TextParser_AddRule($TextParser_ID, 4, "AAA", "BBB", 12345);

…spuckt das hier aus:

Warning: Expected value of type int for Variable in C:\IP-Symcon\scripts__compatibility.inc.php on line 4252

Was in der „__compatibility.inc.php“ steht ist ja quasi genau das, was ich in meinem Beispiel versucht hatte, nur in eine Funktion gesteckt.

Geht das unter IPS 4.x? Bei mir in der aktuellen 3.4 auf jeden Fall nicht… Oder habe ich 2 Mal den gleichen Fehler gemacht? g

Grüße,
Chris

Ich habe jetzt nach langem suchen die Lösung für mein Problem gefunden. Ich muss allerdings sagen, dass ich mit dem sehr generischen API von IPS nicht wirklich zufrieden bin, zumal es einfach an der Doku mangelt. Nichts desto trotz: Im Fall vom TextParser erwartet Property als Argument einen (ziemlich kryptischen) String:

Mein Beispielcode sieht jetzt wie folgt aus und sollte dann hoffentlich kompatibel zu neuen Versionen von IPS sein:


// Beispiel für drei Regeln 
$rule1 = "<span>" . $obereBasis . "</span>";
$rule2 = "<span>" . $basisPreis . "</span>";

$ruleString1 = '{"Variable":0,"TagTwo":"","TagOne":"' . $rule1 . '","ParseType":1}';
$ruleString2 = '{"Variable":0,"TagTwo":"","TagOne":"' . $rule2 . '","ParseType":2}';
$ruleString3 = '{"Variable":18200,"TagTwo":"</span></td>","TagOne":"PRICE.wtkm:options_options_snapshot_1","ParseType":4}';

$ruleString = '[' . $ruleString1 . ',' . $ruleString2 . ',' . $ruleString3 . ']';
if ($rc = IPS_SetProperty (30376, 'Rules', $ruleString) == true) {

	if ($rc = IPS_ApplyChanges (30376) == true) {

		if ($rc = IPS_SetProperty (30065 /*[WWW Reader EUREX]*/, 'URL', $url) == true) {

			if ($rc = IPS_ApplyChanges (30065 /*[WWW Reader EUREX]*/) == true) {

		 		if ($rc = WWW_UpdatePage (30065 /*[WWW Reader EUREX]*/) == true) {

				}
			}
		}
	}
}

if ($rc == true) {
	$returnValue = GetValueString (18200 /*[Programme\apps\AktienUeberwachungsModul\aktuellerOptionsKurs]*/);
	return $returnValue;
} else {
   return -1;
}

Was ich mir übrigens mal wünschen würde, wäre eine Entwicklungsumgebung, mit der ich Step-by-Step debuggen kann. Ich glaube, dass würde meine Produktivität deutlich erhöhen… :smiley:
So kann man nur mit echo und print_r arbeiten und das ist echt mühselig!

Der ist doch gar nicht kryptisch :smiley:

Versuch es mal mit json_decode und json_encode.

Michael

Abend Michael!

Hast du es mal selbst getestet? Und es kommt kein Fehler?

Grüße,
Chris

Nein; darauf bezog ich mich aber auch nicht.

Ich meine nur den krptischen String.
Das Ist halt ein Array, welches als json-String in eine Eigenschaft geschrieben wird.
Nur darauf wollte ich hinaus.
Die Fehlermeldung sieht für mich wirklich nach einen Bug aus.

Bei anderen Instanzen gibt es das aber auch. Und dort funktioniert es, z.B. bei dem EventControl, oder bei den neuen WebHooks :slight_smile:

So, eben noch mal getestet.
Bei mir klappt das mit IPS 4.


$TextParser_ID = 11242 /*[Text Parser]*/;
$TextParserEinstellungen =  json_decode(IPS_GetProperty($TextParser_ID,"Rules"),1);
echo "ALT:".PHP_EOL;
var_dump($TextParserEinstellungen);

$NewRule = array(
"Variable" => 32144,  // ID der Variable, die das Ergebnis vom TextParser aufnehmen soll
"TagTwo" => "BBB",
"TagOne" => "AAA",
"ParseType" => 4  // 1 = Text abschneiden vor // 2 = Text abschneiden hinter // 3 = Hole Text // 4 = Text ausschneiden zwischen
);
$TextParserEinstellungen[] = $NewRule; // $NewRule hinten anhängen.
IPS_SetProperty($TextParser_ID, "Rules", json_encode($TextParserEinstellungen));
IPS_ApplyChanges($TextParser_ID);
echo "------------------------------------------------------------".PHP_EOL;
echo "NEU:".PHP_EOL;
$TextParserEinstellungen =  json_decode(IPS_GetProperty($TextParser_ID,"Rules"),1);
var_dump($TextParserEinstellungen);

Erzeugt bei mir:


ALT:
array(1) {
  [0]=>
  array(4) {
    ["Variable"]=>
    int(32144)
    ["TagTwo"]=>
    string(6) ""
    ["TagOne"]=>
    string(5) ""
    ["ParseType"]=>
    int(4)
  }
}
------------------------------------------------------------
NEU:
array(2) {
  [0]=>
  array(4) {
    ["Variable"]=>
    int(32144)
    ["TagTwo"]=>
    string(6) ""
    ["TagOne"]=>
    string(5) ""
    ["ParseType"]=>
    int(4)
  }
  [1]=>
  array(4) {
    ["Variable"]=>
    int(32144)
    ["TagTwo"]=>
    string(3) "BBB"
    ["TagOne"]=>
    string(3) "AAA"
    ["ParseType"]=>
    int(4)
  }
}

Michael

Danke fürs testen! Mit deinem Code klappt es.

Dann ist es wohl wirklich ein Bug, weil weder direkt als Array geschrieben klappt es, noch über die Funktionen in der "__compatibility.inc.php "…
…kommt immer das erwähnte „Warning“.

Auch wenn ich grad nicht wirklich den Unterschied verstehe :smiley:

Grüße,
Chris

Das Array habe ich bei euch nicht gesehen?! Und das kann ja nicht gehen.
Es wird ja ein String erwartet.
Wobei der Code von dir mit dem String, immer nur ‚Ungültige JSON in …‘ erzeugte.

Da fehlten ein paar ", escapezeichen etc…

So haut auch das hin:


IPS_SetProperty($TextParser_ID, "Rules", "[{\"Variable\":$TP_VarID,\"TagTwo\":\"$TP_TagTwo\",\"TagOne\":\"$TP_TagOne\",\"ParseType\":$TP_Type}]");

Update… tja ist ein Bug in der __compatibility.inc.php
Zeile 4251 und 4265 sind falsch:


...  = Array("ParseType" => $ParseType, "TagOne" => $TagOne, "TagTwo" => $TagTwo, "Variable", $Variable);

Korrekt:

... = Array("ParseType" => $ParseType, "TagOne" => $TagOne, "TagTwo" => $TagTwo, "Variable" => $Variable);

Michael

Oh man :rolleyes: Das sind diese Feinheiten, die mich immer ewig Zeit kosten…wo es mir einfach am entscheidenden Wissen fehlt :rolleyes:

Jetzt wo ich es direkt nebeneinander sehe, ist mir der (mein) Fehler klar… Danke!

Aber mit „TextParser_AddRule“ komme ich trotzdem nicht klar :smiley: Also entweder bin ich nach wie vor zu doof, oder da stimmt wirklich was nicht…

-Chris-

@Bayaro: Der Fehler wird im nächsten Update der 4.0er gelöst sein.

paresy

Ah, zum Glück war es doch ein Fehler :smiley: Nur bringt mir der Fix leider noch nichts, da ich nach wie vor nicht auf IPS 4.x updaten kann :frowning: Ich warte noch sehnlichst auf die Webserver und SSL…mit den anderen Punkten komme ich dann schon irgendwie klar…erstmal…

Grüße,
Chris