Webschnittstelle ansprechen

Alle Jahre wieder … wenn ich dann mal nach längerer Zeit mal wieder was anpassen möchte fällts mir schwer das wieder zusammenzukriegen. Helft mir doch mal auf die Sprünge :slight_smile:

Also ich möchte ne Webseite auslesen (von meinem ESP8266) der haut sowas raus wie:
PH:6,8
Redox:720

Also {Name}:{Wert}{LF}

Naja gut das zerlegen dürfte ich normal mit PHP schon hinbekommen, wobei vielleicht jmd ne elegante Idee hat das auszulesen und direkt Variablen anzulegen, dann gerne her damit. Und das ein oder andere kann man natürlich auch setzen. Das wäre dann der Rückweg vonner gesetzen Variablen zu nem URL Aufruf. Auch da die Frage wie am besten?

Aber das aktuelle Problem (Step by Step) ist jetzt ehr die Webseite lesen. Mach Ich ein WWW Reader mit ner Regvar, dann kommt das da in Teilen an, das möchte ich ja nicht. Also wie krieg ich am besten die komplette Antwort um sie dann im Script zu verarbeiten? Ist da ein IPS Weg, oder nehm ich lieber ein Getriggertes Script, dass dann beispielsweise
Sys_GetURLContent($Url); oder file_get_contents( $URL ); verwendet.

Gruß,
Jan

P.s: Zugegebnermassen ist mein IPS etwas veraltet (5.5) - aber ich denke das dürfte bei dem Problem eigentlich keine Rolle spielen.

Wenn du den Text Parser nicht nutzen magst würde ich ein Skript und das nutzen.

paresy

Einen universellen page parser gibt es nicht weil die Web-Seiten einfach zu unterschiedliche sind. In deinem Fall würde ich mal schauen was bei $text=file_get_contents($URL); var_dump($text) bei dir ankommt und falls PH: dort als Klartext steht mit strpos diese Stelle und die von Redox: suchen und die Zahl dahinter einlesen.

Ralf

Das es nix fertiges gibt war mir klar, bin nur im Thema IPS und PHP etwas eingerostet. Von daher anzupassendes Sniplet reicht schon. Aber gut dann bin ich auf jeden fall wohl bei im Script lesen.

@paresy ich hab nix gegen den Text Parser, aber sind einige Werte wo ich es vermeiden wollte das alles „händisch“ anzulegen. Ich hatte auch damit mal versucht den kompletten Text (Start und End Tag eingebaut) zu bekommen hat auch irgendwie nicht geklappt.

Das PHP Script ließt im ersten Schritt die Daten ein, z.B. mit file_get_contents

Dann zerlegst du die Antwort bei \n in einzelne Zeichenketten, das geht z.B. mit $zeilen = explode( "\n", $webseitdaten);

Jetzt läufst du die Zeilen durch foreach($zeilen as $zeile) und trennst sie bei :, wieder mit $zeile = explode(":", $zeilen);

Die einzelnen Werte jetzt sinnigerweise noch um leerzeichen, etc. beschneiden mit $key=trim($zeile[0]); und $value=trim($zeile[1]);

Die Zuordnung in die Symcon Variable kannst du bequem mit einem Ident machen, wobei der $key dem Ident entspricht.

$id = IPS_GetObjectIDByIdent($key, 12345 /* ID von den Variablen übergeordneter Kategorie*/);

Wert Schreiben:
SetValue($id, $value);

Ein automatisches Anlegen ist schwierig, weil du den Datentyp (String, int, float, bool) nur erraten kannst und das geht oft schief.

Dennoch eine Hilfe könnte folgender Schnipsel sein:

// 1. Parameter: Schlüssel/Ident
// 2: Anzeigename
// 3: Profiltyp: 0: bool, 1: int, 2: float, 3: string 
// 4: Archivieren true/false
$a = array(
array("PH","PH-Wert ",2,"myProfilePHwert",false),
array("Redox","Redox",1, "~irgendeinDefaultProfil", true)
);
$i=0;
foreach($a as $v){
    $id = IPS_CreateVariable($v[2]);
    IPS_SetIdent($id, $ident);
    IPS_SetName($id, $v[1]);
    IPS_SetParent($id, 12345 /*hier ID anpassen*/);
    IPS_SetVariableCustomProfile($id, $v[3]);
    AC_SetLoggingStatus(/*hier ID vom Archiv*/, $id, $v[4]);
    IPS_SetPosition($id, $i+40);

    $i++;
}

Vielen Dank, das hat soweit die Hirnzellen erneuert :-). Zusammen mit Sniplets aus meinen eigenen Skripten passts erstmal.