Webseite auslesen

Ich hab es schon mal versucht, aber ich hab mit den Boardmitteln nicht geschafft.
Ich würde gerne den Status dieser Seite

auslesen
Im Prinzip alles was unter „Current System Status“ steht. Es könnten auch mehrere Zeilen sein. Operational ist ein Indikato für alles ok. Alles andere ist ein Fehler.
Hintergrund ist der, dass meine Herzkörper leider nur über die Cloud von IPS angesprochen werden können. Also die Regler. Wenn dieser Dienst ausfällt, dann funktioniert nur die lokale Regelung über die Basiseinheit der Evohome. Das ist im Grunde auch gut so. Nur würde ich das in IPS gerne wissen, zum einen um einen Status zu setzen und zum anderen, damit ich die Änderung der Vorlauftemperatur und den ganzen Prozess anhalten kann und auf „Notebtrieb“ umstelle. Dafür hab ich schon eine Lösung, ich müsste nur wissen, dass da was im Argen ist.
Vielleicht hat einer eine Idee, wie ich das machen kann.

Du könntest mit file_get_content die Seite einlesen, den Inhalt zwischen den beiden Überschriften filtern und den Rest dann in die gewünschten Strings zerlegen. Die ganzen Elemente sind relativ ordentlich mit DIV und CLASS versehen, so das man das vermutlich auseinander gedrösselt bekommen.

Aber so wie sie irgendetwas strukturelles auf der Seite ändern, klappt das nicht mehr und muss angepasst werden.

Das könnte ich probieren. Danke. Gibts für das herausfiltern eine PHP Funktion?

Ich nutze Folgendes

$Antwort = file_get_contents( $URL );
$result = get_mark($Antwort, '<td>'.$ort.'</td>*</tr>')[0];
// Diese Funktion trennt die relevanten Bereiche aus dem Ausschnitt heraus $string ist dabei der zu durchsuchende Gesamtstring,
// in $Mark sind durch "*" getrennt der Beginn des zu suchenden Strings und das Ende des zu suchende Abschnittes. Beispiel für den Text "<div>*</div></li>"
function get_mark($string,$mark) {
	$ausgabe = array();
	$template = explode("*",$mark);
	$mark = $template[0];
	$end = $template[1];
	$string = strstr($string,$mark);
	$temp = explode($mark,$string);
	$a = 1;
	foreach ($temp as $tempx) {
		$tempx = explode($end,$tempx);
		$tempx = $tempx[0];
		if ($tempx) {
			array_push ($ausgabe,$tempx);
		}
	}
	return $ausgabe;
}
das funktioniert, solange der Inhalt noch String ist.

Ansonsten musstd du danach versuchen alles überflüssige soweit machbar aufzuräumen, nicht schön und fehleranfällig, aber z.B.

$result = strip_tags($result);
$result = str_replace(’ ‚, ’ ‚, $result);
$result = str_replace(‘------‘, ‚0‘, $result);

sind da meist meine Freunde ;-) .

Vielen Dank. Das hat mir schon sehr geholfen. Hab es etwas umgebaut.

function Evohome_Resideo_Status($string,$mark,$cutstring) {
	$ausgabe = array();
	$template = explode("*",$mark);
	$mark = $template[0];
	$end = $template[1];
	$string = strstr($string,$mark);
	$temp = explode($mark,$string);
	$a = 1;
	foreach ($temp as $tempx) {
		$tempx = explode($end,$tempx);
		$tempx = $tempx[0];
		if ($tempx) {
			array_push ($ausgabe,$tempx);
		}
	}
    $status = strip_tags($ausgabe[0]);
    //voderen Teil löschen
    $status=substr($status,strpos($status,$cutstring),strlen($status));
    //Zeilenumbrüche löschen
    $status=preg_replace("#[\r\n]#", '', $status);
    //das ? zu Nutze machen um den String zu teilen
    $status=explode("?",$status);
    //Leerzeichen entfernen
    $status[0]=trim($status[0]);
    $status[1]=trim($status[1]);
    return $status;
}
$status = file_get_contents( "https://status.resideo.com/" );

$result = Evohome_Resideo_Status($status, '<div data-component-id="qrp8wsyx548g"*</div>',"My");

$result = Evohome_Resideo_Status($status, '<div data-component-id="r6927yr8xzy0"*</div>',"Total");

$result = Evohome_Resideo_Status($status, '<div data-component-id="tptmdxqp76gk"*</div>',"Total");

$result = Evohome_Resideo_Status($status, '<div data-component-id="j45w17rdjgrw"*</div>',"Honeywell");

Ergebins

array(2) {
  [0]=>
  string(36) "My Total Connect Comfort Application"
  [1]=>
  string(12) "Major Outage"
}
array(2) {
  [0]=>
  string(47) "Total Connect Comfort International Application"
  [1]=>
  string(12) "Major Outage"
}
array(2) {
  [0]=>
  string(46) "Total Connect Comfort International Web Portal"
  [1]=>
  string(12) "Major Outage"
}
array(2) {
  [0]=>
  string(14) "Honeywell Home"
  [1]=>
  string(11) "Operational"
}

Wenn du direkt in ein Array wandelst, dann könntest du die Inhalte auch wie folgt suchen

// array_search with partial matches and optional search by key

function array_find($needle, $haystack, $search_keys = false) {

  if(!is_array($haystack)) return false;

  foreach($haystack as $key=>$value) {

      $what = ($search_keys) ? $key : $value;

      if(strpos($what, $needle)!==false) return $key;

  }

  return false;

}

und wenn die Ergebnisszeilen prinzipiell immer vorhanden sind, dann sollte die Suche danach vielleicht doch relativ staibl sein.

Danke. Ich wandle nicht direkt, sondern erst am Ende. Ich mach mir da das „?“ zu Nutze, das da drinnen ist um die beiden Teile zu trennen und was ordentliches zu bekommen.

Guten Morgen
Vielleicht als abschließende Info zu diesem Thema. Es funktioniert sehr gut. Heute wieder ein Fehler in IPS bezüglich Evohome. Also ich nachgesehen und bemerkt, dass sie eben Wartungen durchführen.
Das ist auf der Webseite

Und das kommt bei mir an


Auszug aus meinem Logfile (IPD Logfile)

1 „Gefällt mir“