WWW Reader und Textparser ohne Instanzen

Hallo zusammen,

ich versuche momentan eine möglichkeit zu finden um Quelltext aus einer Homepage in Variablen zu schreiben.
Da ich eine Siemens GLT mit hunderten Datenpunkten Auslesen und verarbeiten will ist es mühsam die alle per Hand
reinzuhacken. Ich habe es dennoch getan und 200 www Reader und dazu passende Textparser anzulegen, nun sind Maus und Tastatur defekt :slight_smile:

Ich bin daher auf die Idee zu kommen die Webpage per PHP abzufragen und durch einen Code Schnipsel den ich gefunden habe durchzuparsen und in eine Variable zu schreiben.
Das Funktioniert soweit ganz gut allerdings bekomme ich jetzt nur noch einen einstelligen Wert zurück. ( zb. 17,00 °C ist im echo eine 1 ) … momentan stecke ich fest. Hat jemand ne Idee dazu ?


<?
// Das ist der www Reader in Scriptform. Der Reader gibt ein Array aus.
// das Array wird Implodet. Dann werden die Variablen vor und nach dem Wert definiert.
// Wir machen aus dem String dann noch einen Float Wert.

$lines = file("http://localhost:47800/explorer/2098177/0/312");
$stringlines = implode($lines);

$start = "present-value";
$ende = "object-typeanalog";


// ausschneiden vom Ende von $start bis zum Anfang von $ende
$search = substr($stringlines,
    // Ende von $start = Anfang von $start + Länge von $start
    strpos($stringlines, $start) + strlen($start),
    // Anzahl Zeichen bis zum Anfang von $ende = Anfang von $ende minus Ende von $start
    strpos($stringlines, $ende) - (strpos($stringlines, $start) + strlen($start)));

$daten = settype($search, "Integer"); // Wandelt String in Integer um
SetValueInteger(25278,$daten); // Setzt die Daten in die Integer Variable

// print_r($lines);
{
echo $daten;
// echo $stringlines;
}
?>

Zeig mal einen ganzen Datensatz her :slight_smile: Außerdem ist vielleicht das hilfreich: http://php.net/manual/de/function.floatval.php

paresy

Moin,

eine komplette Beispielzeile wäre hilfreich ;).

Versuch es mal mit „float“, aber das Komma könnte stören, versuch es dann durch einen Punkt zu ersetzen ;).

Paresy war schneller, einen hätte ich noch „…integers cannot have decimal places.“

So sieht die ausgabe nach dem Implode als String aus :


  body {
        padding-top: 60px;
        padding-bottom: 40px;
      }
      .sidebar-nav {
        padding: 9px 0;
      }

      @media (max-width: 980px) {
        /* Enable use of floated navbar text */
        .navbar-text.pull-right {
          float: none;
          padding-left: 5px;
          padding-right: 5px;
        }
      }Wacnet - BACnet network explorerWacnetPowered by BACnetHelp.comExplorerConfigsREPLServicesData loggingDevicesPXM20ETMP021005fc (1050108)PXM20ETMP021006f0 (1050352)Ambiance'AS01 (2098177)Ambiance'AS02 (2098178)Ambiance'AS03 (2098179)Ambiance'AS04 (2098180)Object properties:resolution0.1notification-class33event-enableto-normaltrueto-faulttrueto-off-normaltrueprofile-name7-BA-PX-AI-SBCv05.10event-time-stamps["2155-07-23T17:19:17.550Z" "2155-07-23T17:19:17.550Z" "2155-07-23T17:19:17.550Z"]present-value26.779999object-typeanalog-inputobject-nameB1'Z01'A'Ahu01'TExacked-transitionsto-normaltrueto-faulttrueto-off-normaltruenotify-type0status-flagsin-alarmfalsefaultfalseout-of-servicefalseoverriddenfalsecov-increment0.2time-delay0low-limit0.0unitsdegrees-celsiuslimit-enablelow-limit-enabletruehigh-limit-enabletruehigh-limit80.0reliabilityno-fault-detectedevent-statenormalout-of-servicefalseobject-identifier[:analog-input 312]descriptionAblufttemperaturdeadband0.5



Nö … leider nichts gebracht, Die SetValue Variable ist auch eine Float Variable.
Bekomme nur eine 1 ausgegeben.

<?

// Das ist der www Reader in Scriptform. Der Reader gibt ein Array aus.
// das Array wird Implodet. Dann werden die Variablen vor und nach dem Wert definiert.
// Wir machen aus dem String dann noch einen Float Wert.

$lines = file("http://localhost:47800/explorer/2098177/0/312");
$stringlines = implode($lines);

$start = "present-value";
$ende = "object-typeanalog";


// ausschneiden vom Ende von $start bis zum Anfang von $ende
$search = substr($stringlines,
    // Ende von $start = Anfang von $start + Länge von $start
    strpos($stringlines, $start) + strlen($start),
    // Anzahl Zeichen bis zum Anfang von $ende = Anfang von $ende minus Ende von $start
    strpos($stringlines, $ende) - (strpos($stringlines, $start) + strlen($start)));

$daten = settype($search, "float"); // Wandelt String in Integer um
SetValue(53397,$daten); // Setzt die Daten in die Integer Variable

// print_r($lines);
{
echo $daten;
// echo $stringlines;
}

?>

floatval brachte leider garkeinen Wert, zumindestens vermute ich das da nur eine 0 ausgegeben wird.

$daten = floatval($search); // Wandelt String in Integer um
SetValue(53397,$daten); // Setzt die Daten in die Integer Variable

Du solltest nicht imploden, sondern besser das Array durchsuchen, da du auch " und ’ im String hast, bringt das manche Funktionen durcheinander. Wenn das Ergebnis der Seite immer gleich ist, dann könnte der Wert eventuell immer in der gleichen Arrayzeile stehen.

Hast du dir die tatsächlich gefundenen Start- und Endepositionen angesehen? Ist das wirklich die korrekte Position? Gib doch erstmal nur den gefunden String aus, umwandeln kannst du dann immer noch.

Die Frage ist, wie die Zeile mit dem Wert wirklich genau aussieht, inkl. eventueller LF und CR.

Hi Ralf,

danke für deine Unterstützung bin echt am verzweifeln …
Das mit dem Daten aus dem Array ziehen habe ich mir am anfang auch überlegt. Ich habe
blos noch keinen Weg gefunden die Daten aus dem Array zu bekommen.

An der [16] bin ich Interessiert, habe aber im moment keine Idee wie ich den wert zwischen present-value24.6object-typeanalog in einen Float wert bekomme.
Bei den Arrays haperts bei mir noch ein bissl mitm verständniss.

Array
(
    [0] => 

    [1] =>   body {

    [2] =>         padding-top: 60px;

    [3] =>         padding-bottom: 40px;

    [4] =>       }

    [5] =>       .sidebar-nav {

    [6] =>         padding: 9px 0;

    [7] =>       }

    [8] => 

    [9] =>       @media (max-width: 980px) {

    [10] =>         /* Enable use of floated navbar text */

    [11] =>         .navbar-text.pull-right {

    [12] =>           float: none;

    [13] =>           padding-left: 5px;

    [14] =>           padding-right: 5px;

    [15] =>         }

    [16] =>       }Wacnet - BACnet network explorerWacnetPowered by BACnetHelp.comExplorerConfigsREPLServicesData loggingDevicesPXM20ETMP021005fc (1050108)PXM20ETMP021006f0 (1050352)Ambiance'AS01 (2098177)Ambiance'AS02 (2098178)Ambiance'AS03 (2098179)Ambiance'AS04 (2098180)Object properties:resolution0.1notification-class33event-enableto-normaltrueto-faulttrueto-off-normaltrueprofile-name7-BA-PX-AI-SBCv05.10event-time-stamps["2155-07-23T17:19:17.550Z" "2155-07-23T17:19:17.550Z" "2155-07-23T17:19:17.550Z"]present-value24.6object-typeanalog-inputobject-nameB1'Z01'A'Ahu01'TExacked-transitionsto-normaltrueto-faulttrueto-off-normaltruenotify-type0status-flagsin-alarmfalsefaultfalseout-of-servicefalseoverriddenfalsecov-increment0.2time-delay0low-limit0.0unitsdegrees-celsiuslimit-enablelow-limit-enabletruehigh-limit-enabletruehigh-limit80.0reliabilityno-fault-detectedevent-statenormalout-of-servicefalseobject-identifier[:analog-input 312]descriptionAblufttemperaturdeadband0.5
)

$content = Sys_GetURLContent("http://localhost:47800/explorer/2098177/0/312");
if (preg_match('/'.preg_quote("present-value").'(.*?)'.preg_quote("object-typeanalog").'/s', $content, $matches)) {
    $value = floatval($matches[1]);
    SetValue(53397, $value);
}

paresy

Danke Paresy,

Gibt 0,0 zurück :frowning: … irgendwas stimmt da aber nicht.

Hier ist mein Test-Skript. Läuft super.

$content = <<<EOD
Wacnet - BACnet network explorerWacnetPowered by BACnetHelp.comExplorerConfigsREPLServicesData loggingDevicesPXM20ETMP021005fc (1050108)PXM20ETMP021006f0 (1050352)Ambiance'AS01 (2098177)Ambiance'AS02 (2098178)Ambiance'AS03 (2098179)Ambiance'AS04 (2098180)Object properties:resolution0.1notification-class33event-enableto-normaltrueto-faulttrueto-off-normaltrueprofile-name7-BA-PX-AI-SBCv05.10event-time-stamps["2155-07-23T17:19:17.550Z" "2155-07-23T17:19:17.550Z" "2155-07-23T17:19:17.550Z"]present-value24.6object-typeanalog-inputobject-nameB1'Z01'A'Ahu01'TExacked-transitionsto-normaltrueto-faulttrueto-off-normaltruenotify-type0status-flagsin-alarmfalsefaultfalseout-of-servicefalseoverriddenfalsecov-increment0.2time-delay0low-limit0.0unitsdegrees-celsiuslimit-enablelow-limit-enabletruehigh-limit-enabletruehigh-limit80.0reliabilityno-fault-detectedevent-statenormalout-of-servicefalseobject-identifier[:analog-input 312]descriptionAblufttemperaturdeadband0.5
EOD;

if (preg_match('/'.preg_quote("present-value").'(.*?)'.preg_quote("object-typeanalog").'/s', $content, $matches)) {
    $value = floatval($matches[1]);
    echo $value;
//    SetValue(53397 /*[Objekt #53397 existiert nicht]*/, $value);
}

paresy

Okay,

wenn ich den String direkt als Variable angebe klappts. Vielleicht haperts bei mir da mit den Leerzeichen und Leerzeilen.

Bei :

$content = Sys_GetURLContent("http://localhost:47800/explorer/2098177/0/312");
echo $content;

Bekomme ich das da :


  body {
        padding-top: 60px;
        padding-bottom: 40px;
      }
      .sidebar-nav {
        padding: 9px 0;
      }

      @media (max-width: 980px) {
        /* Enable use of floated navbar text */
        .navbar-text.pull-right {
          float: none;
          padding-left: 5px;
          padding-right: 5px;
        }
      }Wacnet - BACnet network explorerWacnetPowered by BACnetHelp.comExplorerConfigsREPLServicesData loggingDevicesPXM20ETMP021005fc (1050108)PXM20ETMP021006f0 (1050352)Ambiance'AS01 (2098177)Ambiance'AS02 (2098178)Ambiance'AS03 (2098179)Ambiance'AS04 (2098180)Object properties:resolution0.1notification-class33event-enableto-normaltrueto-faulttrueto-off-normaltrueprofile-name7-BA-PX-AI-SBCv05.10event-time-stamps["2155-07-23T17:19:17.550Z" "2155-07-23T17:19:17.550Z" "2155-07-23T17:19:17.550Z"]present-value28.4object-typeanalog-inputobject-nameB1'Z01'A'Ahu01'TExacked-transitionsto-normaltrueto-faulttrueto-off-normaltruenotify-type0status-flagsin-alarmfalsefaultfalseout-of-servicefalseoverriddenfalsecov-increment0.2time-delay0low-limit0.0unitsdegrees-celsiuslimit-enablelow-limit-enabletruehigh-limit-enabletruehigh-limit80.0reliabilityno-fault-detectedevent-statenormalout-of-servicefalseobject-identifier[:analog-input 312]descriptionAblufttemperaturdeadband0.5


Update :

Langsam nähere ich mich dem Ziel, nun sind Leerzeilen und Leerzeichen draussen, aber dennoch kein Erfolg.
Ich glaube ihn stört das ganze HTML im String, kann des sein ?

<?

$content = Sys_GetURLContent("http://localhost:47800/explorer/2098177/0/312");
$string = preg_replace('/
|\r|
/', ' ', $content); // Kill doch mal Leerzeilen
$clearstring = str_replace(' ','',$string); // Kill Leerzeichen

if (preg_match('/'.preg_quote("present-value").'(.*?)'.preg_quote("object-typeanalog").'/s', $clearstring, $matches)) {
 $value = floatval($matches[1]);

SetValue(12059 /*[AMBIANCE\Kontrollzentrum\Systemstatus - Left\Test2]*/ , $value);
}

//echo $clearstring;
 // echo $string;
//print_r($matches);
    
?>

Nochn kleines Update, ich werd noch Verrückt mit dem Datensatz :slight_smile: Ich glaub ich stell mich schon arg
Blöd an … aber ich versuche mich da reinzufinden.

Habe nun mal Paresys Code verwendet. Dieser funktioniert sicherlich ganz gut wenn man einen kompletten String verwendet. Habe mal die Leerzeilen und die Leerzeichen komplett entfernt und das HTML Gedönse am Anfang.
Getestet, nichts … garnichts, noch nichtmal die Uhrzeit an der Zielvariable ändert sich.
Der Code sieht nun so aus :

<?

$content = Sys_GetURLContent("http://localhost:47800/explorer/2098177/0/312"); // Hier wird der Inhalt der Page Geholt als Quelltext
$string = preg_replace('/
|\r|
/', ' ', $content); // Entfernt Leerzeilen aus dem String
$clearstring = str_replace(' ','',$string); // Entfernt Leerzeichen aus dem String
$clearstring_01 = str_replace('body{padding-top:60px;padding-bottom:40px;}.sidebar-nav{padding:9px0;}@media(max-width:980px){/*Enableuseoffloatednavbartext*/.navbar-text.pull-right{float:none;padding-left:5px;padding-right:5px;}}','',$clearstring);

if (preg_match('/'.preg_quote("present-value").'(.*?)'.preg_quote("object-typeanalog").'/s', $clearstring_01, $matches)) {
$value = floatval($matches[1]);
// $value = settype($matches[1], 'float');

SetValue(12059 /*[AMBIANCE\Kontrollzentrum\Cloud\Test2]*/,$value); // Schreibe Float Wert in Variable
}


?>

Die Variable $clearstring_01 gibt dann folgendes aus. Und dann gehts nicht mehr weiter.

Wacnet-BACnetnetworkexplorerWacnetPoweredbyBACnetHelp.comExplorerConfigsREPLServicesDataloggingDevicesPXM20ETMP021005fc(1050108)PXM20ETMP021006f0(1050352)Ambiance'AS01(2098177)Ambiance'AS02(2098178)Ambiance'AS03(2098179)Ambiance'AS04(2098180)Objectproperties:resolution0.1notification-class33event-enableto-normaltrueto-faulttrueto-off-normaltrueprofile-name7-BA-PX-AI-SBCv05.10event-time-stamps["2155-07-23T17:19:17.550Z""2155-07-23T17:19:17.550Z""2155-07-23T17:19:17.550Z"]present-value23.8object-typeanalog-inputobject-nameB1'Z01'A'Ahu01'TExacked-transitionsto-normaltrueto-faulttrueto-off-normaltruenotify-type0status-flagsin-alarmfalsefaultfalseout-of-servicefalseoverriddenfalsecov-increment0.2time-delay0low-limit0.0unitsdegrees-celsiuslimit-enablelow-limit-enabletruehigh-limit-enabletruehigh-limit80.0reliabilityno-fault-detectedevent-statenormalout-of-servicefalseobject-identifier[:analog-input312]descriptionAblufttemperaturdeadband0.5