Brauche Hilfe beim Text Parser / WWW Reader

Hallo,

ich möchte die Daten meiner PV Anlage aus dem dazugehörigen Webserver auslesen.
Leider findet man im Forum nur sehr wenig und das Handbuch ist mir persönlich auch leider keine große Hilfe da ich einfach nicht verstehe wo Texte abgeschnitten und ausgelesen werden müssen. Nach Stundenlangem probieren bin ich nun mal auf eure Hilfe angewiesen.

Vielleicht kann mir ja mal jemand eine kleine Step by Step Anleitung zaubern.

DIes ist erstmal der Seitenquelltext der Startseite des Webservers:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link rel="stylesheet" type="text/css" media="screen" href="../style/screen.css">
<link rel="stylesheet" type="text/css" media="print" href="../style/print.css">
<link rel="stylesheet" type="text/css" media="screen" href="../style/cal.css">
<!--[if IE 6]>
  <style type="text/css">@import url(../style/screen_ie6x.css);</style>
<![endif]-->
<script language="JavaScript" src="../script/main.js"></script>
<script language="JavaScript" src="../script/cal_1.js"></script>
<script language="JavaScript" src="../script/cal_2.js"></script>
<script language="JavaScript">
	function checkTimeDiff() {
		var obj_Date = new Date();
		var client_Sec = parseInt(obj_Date.getTime() / 1000);
		var client_DiffTimeZone = obj_Date.getTimezoneOffset() * 60;
		var client_Time = client_Sec + client_DiffTimeZone;
		var system_Time = 1413794402;
		var total_TimeDiff = client_Time - system_Time;
		if ( total_TimeDiff < -600 || total_TimeDiff > 600 ) {
			//document.getElementById('timeDiff').style.display='block';
		}
		else {
			//document.getElementById('timeDiff').style.display='none';
		}
		var redir = document.getElementsByName('redirect');
		if (redir[0]) {
				redir[0].submit();
		}
		return true;
	}
</script>
<title>PV Anlage  - Startseite</title>
</head>
<body onload="checkTimeDiff()">
<div id="wrapper">
<div id="skipnavi">
    <h1 id="logo">Platinum Webmaster I</h1>
    <h2>PV-Anlagenüberwachung</h2>
    <hr>
</div>
<!-- HEADER -->
<div id="header">
     <a id="anc_service" name="anc_service"></a>
	    <h3 class="none">Servicefunktion</h3>
	    <div id="serviceNavi">
	    	<span class="none">Sprachauswahl:</span>
		    <ul id="langBlock">
				
	        <li><a href="?s=main&l=de"><img src="../images/header/flag_de.gif" alt="Deutsch" title="Deutsch"></a></li>
        
	        <li><a href="?s=main&l=en"><img src="../images/header/flag_en.gif" alt="English" title="English"></a></li>
        
	        <li><a href="?s=main&l=nl"><img src="../images/header/flag_nl.gif" alt="Niederländisch" title="Niederländisch"></a></li>
        
	        <li><a href="?s=main&l=fr"><img src="../images/header/flag_fr.gif" alt="Français" title="Français"></a></li>
        
	        <li><a href="?s=main&l=es"><img src="../images/header/flag_es.gif" alt="Español" title="Español"></a></li>
        
	        <li><a href="?s=main&l=it"><img src="../images/header/flag_it.gif" alt="Italiano" title="Italiano"></a></li>
        
		    </ul>
	   </div>
	   <div id="bar">
	   </div>
	   <div id="login_status">
        
	        
	        	Willkommen
 	      	
	        <span class="none"> | </span>
	        <a href="?s=login&o=/_462e1f618062a7edcee3bd3178795b1a_/%3fs%3dmain">Anmelden</a>
 	       
    </div>
</div>
<hr class="none">
<!-- HEADER END -->
<div id="shd_main_repeat">
    <div id="shd_main_head">
        <div id="main">
            <!-- leftColumn -->
            <div id="leftColumn">
	    			<a id="anc_navigation" name="anc_navigation"></a>
                <div class="menu-wrapper">
                    <h3 class="none">Hauptnavigation</h3>
										<ul class="ebene1">

<li><a class="selected" href="?s=main">Startseite</a></li>

<li><a href="?s=systemstatus">Anlagenstatus</a></li>

<li><a href="?s=reporting">Auswertungen</a></li>
</ul>

                </div>
            </div>
            <!-- /leftColumn -->
            <hr class="none">
            <a id="anc_content" name="anc_content"></a>
            <div id="content">
                <NOSCRIPT>
                <div class="jswarning">Die JavaScript-Unterstützung Ihres Browsers ist derzeit deaktiviert. Diese ist für die Bedienung zwingend erforderlich.
                </div>
                </NOSCRIPT>
                
<h1>PV Anlage l</h1>
<div class="main-picture">

<img src="/images/upload/plant.jpg">

</div>
<form>
<input type="hidden" name="s" value="main">
<input type="hidden" name="action" value="submit"> 
<table class="table_vertical">
	<caption>Anlageninformation</caption>

	<tr><th>Beschreibung:</th><td>23,63 KW</td></tr>


	<tr><th>Betreiber:</th><td>Fam. ...</td></tr>


</table>
<br><br>

<table class="table_vertical">
	<caption>Anlagenstatus</caption>
	
	<tr>
		<th>Aktueller Gesamtstatus:</th>
		<td><img src="../images/status_green.gif" title="Alle Wechselrichter speisen ein und sind erreichbar"></td>
	</tr>
	
	
		
	<tr>
		<th>Gesamtleistung:</th>
		<td>5 976 W</td>
	</tr>
	
		
	<tr>
		<th>Gesamttagesertrag:</th>
		<td>5,8 kWh (2,86 €)</td>
	</tr>
	
	
	
	
	<tr>
		<th>Letztes Ereignis:</th>
		<td><a href="?s=monitoring" title="Die Mail konnte nicht versandt werden: Couldn't authenticate '...@gmx.de:...'.">20.10.2014 03:29:50</a></td>
	</tr>
	
	
	
		
</table>
</form>
<br>
	
<table class="main-graph">
	<tr>
		<td>
			<div style="background: transparent url(/images/report/bg_report_loader.gif) center 80px no-repeat; width: 600px; height: 300px; overflow: visible">
				<img src="?s=reportimg&repCall=daypowermini&date=2014-10-20">
			</div>
		</td>
	</tr>
</table>

            </div>
            <br class="clearall">
        </div>
    </div>
</div>
<hr class="none">

<div id="shd_footer">
    <div id="footer">
        <address>
            <a id="anc_subnavi" name="anc_subnavi"></a>
            (c) 2010 Diehl AKO  |  Softwareversion: 1.2.4.1
        </address>
    </div>
</div>
</div>
</body>
</html>
<!--
	// additional information
	pwm_manual_rev.nr.aa_01-2007
	de
	?s=main
-->

DIese beiden Daten möchte ich für den Anfang erstmal auslesen und in eine Variable schreiben:

	<tr>
		<th>Gesamtleistung:</th>
		<td>5 976 W</td>
	</tr>
	
		
	<tr>
		<th>Gesamttagesertrag:</th>
		<td>5,8 kWh (2,86 €)</td>
	</tr>

Die Ip Adresse des Webservers in meinen Netzwerk ist: 192.168.1.35

Ich hoffe das ich mit eurer Hilfe dann die weiteren Daten alleine auslesen kann.

Gruß Daniel

Hallo Daniel.

Ich habe gerade selber mit dem TextParser experimentiert und nutze folgenden Weg:

  1. Den TextParser eine neue Regel hinzufügen-Text ausschneiden zwischen-Tag eins: (Ein kopierter Textschnipsel aus kurz vor dem gewünschtem „Textblock“) - tag zwei: (Ein kopierter Textschnipsel aus kurz nach dem gewünschtem „Textblock“) - Ausgang Variable-> eine Stringvariable (vorher anlegen)-OK

2014-10-20 19_09_01-IP-Symcon Verwaltungskonsole.png

  1. Jetzt habe ich mit ein Script zum „Text-Feinausschneiden“ gebaut, dass aus der Stringvariable (ID30541) den Inhalt um die verbliebenen HTML-Tags (z.B. <br> etc.) und Leerzeichen entfernt. Das Ergebnis wird in eine weitere Variable (ID48993, bei mir Float) geschrieben. Das Script wird durch die Veränderung der Stringvariable getriggert (angestossen).
setvalue(30541 , trim(strip_tags(getvalue(30541 ))));
setvalue(48993 , floatval(getvalue(30541 )));

Edit:
Du müsstest Dir wohl zwei Regeln nacheinander hinzufügen (Tag1 „Gesamtleistung:“ Tag2 „</td>“ nach Stringvariable1 und Tag1 „Gesamttagesertrag:“ Tag2 „</td>“ nach Stringvariable2).

Vielleicht hilft es Dir ein wenig mehr ins Boot…

Gruß
Lutz

Hallo Lutz,

dank dir kann ich ein erstes Erfolgserlebnis verzeichnen :smiley:

Zumindest sehe ich schonmal den gewünschten Wert.
Leider bekomme ich das <td> nicht aus dem Wert.

ICh verstehe auch was du da mit deinem Script machst, aber sind diese beiden Zeilen in deinem Script schon alles?? :confused:

Musst du nicht irgendwo angeben was ausgeschnitten werden muss? Spätestens beim PHP hört es leider bei mir auf.
Kann man das eventuell mit Boardmitteln besser kürzen? Also mit dem Text Parser irgendwie?

Unbenannt.JPG

Hallo zusammen,

ich versuch mal ein bischen zu helfen :wink:

Lutz definiert mit den beiden PHP Funktionen „trim“ und „strip_tags“ schon was abgeschnitten werden soll.

Hier zur näheren erläuterung:

http://php.net/manual/de/function.strip-tags.php
http://php.net/manual/de/function.trim.php

D.h. mit strip_tags sollte dein <td> weg sein. und mit trim das Leerzeichen. Aber folgendes, so wie ich das sehe möchtest du ja den Wert auslesen welcher über die Site ausgelesen wird, richtig?! Und damit ist deine Variable falsch, denn da brauchst du eine Integer Variable und keine String.
Hier wieder zur erklärung (etwas nach unten scrollen zu den Typen):
http://www.ip-symcon.de/service/dokumentation/konzepte/variablen/
Das „W“, also die Einheit definierts du über ein Varibalenprofil:
http://www.ip-symcon.de/service/dokumentation/konzepte/variablen/variablenprofile/

Ich habe bei mir folgenden Aufbau:

WWWReader liest Site aus -> Buffer Variable als Ziel (String) ->Feintuning Script (das bei änderung der Buffer Variable angestoßen wird) -> Wert Variable (Integer)

Pass bitte mal deinen WWWReader möglichst so an dass nur die auszulesende Zahl vorhanden ist (also keine Einheiten u.ä.)

Das Skript könnte dann so aussehen, wenn es über eine Variablen Ereignis aufgerufen wurde (bei aktualisierung):


<?php

// Liest die Daten der auslößenden Variable
$DataBuffer = $_IPS['VALUE'];
// Schneidet HTML und Leerzeichen ab
$Data = trim(strip_tags($DataBuffer));
// Du kannst dir auch immer mit Echo mal zwischendrin die Werte ausgeben lassen: 
echo $Data;
// Umwandeln in Integer (sollten aber nur noch Ziffern enthalten sein im String).
$Data = intval($Data);
//Schreibe die Werte in die Integer Variable
SetValueInteger(47788, $Data); // ID Ist noch anzupassen


?>

Hoffe es hilft dir ein bischen :wink:

Edit: Sehe gerade noch du hast auch Float Werte drinne, dann entsprechend die Typen anpassen.

@Lutz: Du kannst den Wert der auslößende Variable auch einfach mit $_IPS[‚VALUE‘] auslesen. Ebenso die ID mit $_IPS[‚VARIABLE‘]. Dann wir dein Script flexibler :smiley:

http://www.ip-symcon.de/service/dokumentation/konzepte/skripte/systemvariablen/

Grüße Korbi

Hallo Soundman,

danke auch für deine Hilfe.

Leider ist es so das hier 2 Welten aufeinander prallen :smiley: (Ich und PHP)

Bevor ich jetzt hier überhaupt weitermachen habe ich nochmal eine Grundsatzfrage.

Was passiert wenn sich der Quelltext der Seite täglich oder mit Ändereung der Leistung ändert??
Macht es dann überhaupt hier Sinn weiterzumachen??

Hier der Quelltext von heute früh:

	<tr>
		<th>Gesamtleistung:</th>
		<td>2 190 W</td>
	</tr>
	
		
	<tr>
		<th>Gesamttagesertrag:</th>
		<td>0,8 kWh (0,38 €)</td>
	</tr>

Zum Vergleich von gestern:

    <tr>
        <th>Gesamtleistung:</th>
        <td>5 976 W</td>
    </tr>
    
        
    <tr>
        <th>Gesamttagesertrag:</th>
        <td>5,8 kWh (2,86 €)</td>
    </tr>  

Irgendwie scheinen die Werte im Quelltext auch gar nicht mit der Anzeige im Webserver überein zu stimmen.
Hier mal ein Screenshot mit dem dazugehörigen Quelltext um die gleiche Uhrzeit.

<tr>
		<th>Gesamtleistung:</th>
		<td>6 839 W</td>
	</tr>
	
		
	<tr>
		<th>Gesamttagesertrag:</th>
		<td>3,0 kWh (1,47 €)</td>
	</tr>

Unbenannt.JPG

So wie ich das sehe müsste dann ja das " " auch noch rausgekürzt werden. Wer weiß wie der Quelltext dann morgen ausschaut?

ICh brauch ne ehrliche Meinung, macht es Sinn das weiterzuverfolgen für mich als PHP Noob?? Ich blick ja jetzt schon nicht durch.
Ist es technisch überhaupt möglich die Seite auszulesen?

Morgen King-Nova,

also grundsätzlich geht so etwas schon. Wir haben hier bei uns auch einen Wechselrichter mit Weboberfläche und der wird auch ausgelesen(mit unterschiedlichen Werten also: 2,3 bzw 4 Stellig). Und das verarbeiten mit PHP ist auch nicht so schlimm, dass bekommen wir schon hin. Muss nur dazu sagen dass ich kein PHP Pro bin. Hab mir das im Laufe der Zeit selbst angeeignet, soll heissen mein Code ist nicht immer der Weisheit letzter Schluss :wink: Aber so langs funktioniert :smiley:

Werde mich heute Abend nochmal melden.

Grüße

Hallo King-Nova,

wie versprochen jetzt die Lösung.

Als erste legst du eine Struktur wie in meinen Screenshot an:

Dann musst du deinen WWWReader so konfigurieren dass er die Zeilen so ausließt:

 
        <td>2 190 W</td>
    </tr>
    
        
    <tr>
        <th>Gesamttagesertrag:</th>
        <td>0,8 kWh (0,38 €)</td>
    </tr>  

Also als Startpunkt: Gesamtleistung:
und als Endpunkt z.B. das Eurozeichen:

Dieser Inhalt muss dann in die Buffer Variable geschrieben werden bei jedem Aufruf.
(Im Ausgang vom WWWReader definieren)

Dann kommt in das Script folgender Inhalt (IDs anpassen nicht vergessen):

<?php

//<td>5 976 W</td></tr><tr><th>Gesamttagesertrag:</th><td>5,8 kWh (2,86 €)</td></tr>


// Inhalt der Buffer Variable
$BufferData = $_IPS['VALUE'];
//Daten werden vor der Watt angabe beschnitten
$BufferData = substr($BufferData, strpos($BufferData,"<td>"));
// Daten werden an "W" geschnitten
$BufferLeistung  = substr($BufferData,0,strpos($BufferData,"W"));
// Leerzeichen und HTML Tags werden abgeschnitten
$BufferLeistung  = trim(strip_tags($BufferLeistung ));

// Wenn   im String vorkommt wird dieser entfernt
if(strpos($BufferLeistung ,"&") !== false){
	//Vor   ausschneiden
  $Leistung = substr($BufferLeistung,0,1);
  	//Nach   ausschneiden und an den vorhandenen Wert anfügen
  $Leistung .= substr($BufferLeistung,7,3);
  // Variable in Inerger umwandlen
  $Leistung = intval($Leistung);
  // Wert in dei IPS Variable schreiben
  SetValueInteger(57346  /*[Test\Solar auslesen\Leistung]*/, $Leistung);

}else{
	// Wenn kein   definiert ist d.h. Wert kleiner 1000 dann nur umwandeln
  $Leistung = intval($BufferLeistung);
  SetValueInteger(57346  /*[Test\Solar auslesen\Leistung]*/, $Leistung);

}
// Alles vor "</th>" abschneiden
$BufferErtrag = substr($BufferData, strpos($BufferData,"</th>"));
// HTML Tags entfernen
$BufferErtrag = strip_tags($BufferErtrag);
// Alles hinter kWh (incl. kWh) abschneiden
$Ertrag = substr($BufferErtrag,0,strpos($BufferErtrag,"kWh"));
// Leerzeichen entfernen
$Ertrag = trim($Ertrag);
// Das Komma gegen einen Punkt tauschen (in php ist der Punkt das Komma in Float)
$Ertrag = str_replace(",",".",$Ertrag);
// In Float umwandeln
$Ertrag = floatval($Ertrag);
// IPS Variable schreiben
SetValueFloat(16644  /*[Test\Solar auslesen\Ertrag]*/, $Ertrag);

?>

Ich hab mir mal die Mühe gemacht jede Zeile zu kommentieren, ich hoffe das hilft dir das ganze besser zu verstehen.

Wenn ich keinen Fehler gemacht habe, ist jetzt egal wie viele Stellen deinen Werte haben. Aber am besten beobachten…

Und gib bitte kurz Feedback ob alles läuft. :cool:

Grüße Korbi

Hallo Soundman,

das war echt knorke von dir :wink: Vielen Dank!

Das funktioniert alles auf anhieb. Das hätte ich nieeeemals hinbekommen.

Allerdings wirft das Script einen Hinweis raus:

Notice: Undefined index: VALUE in C:\IP-Symcon\scripts\11335.ips.php on line 7

Das ist diese Zeile:

$BufferData = $_IPS['VALUE'];

Keine Ahnung ob das so sein muss, aber es funktioniert auch mit diesem Hinweis.

So siehts nun erstmal fürs erste aus. Muss noch ein wenig was anpassen aber die Werte habe ich schonmal in der Variable.

Ich werd mal versuchen ob ich nun die restlichen Daten der Wechselrichter auslesen kann. Da werd ich mich mal dran versuchen.

Was ich mich auch noch frage, kann man einen zweiten WWWReader konfigurieren?
Also wenn ich die Daten aus einer anderen Seite des Webservers auslesen möchte. Ich kann im WWW Reader immer nur eine Konfiguration machen?

Hallo King-Nova,

das freut mich wenn´s läuft :smiley: ich hab auch mal so angefangen, und ohne die Hilfe hier aus dem Forum wäre ich auch noch ganz am Anfang.

Die Fehlermeldung tritt aber nur auf wenn du das Script manuell startest oder? Ich meine dass kommt daher dass $_IPS[‚VALUE‘]; erst durch das Ereignis (Script bei Variablen aktuallisierung ausführen) definiert wird.

Ja klar, sollte kein Problem sein weitere WWWREader anzulegen. Du könntest natürlich auch den einen mit PHP manipulieren http://www.ip-symcon.de/service/dokumentation/befehlsreferenz/instanzenverwaltung/konfiguration/ips-setproperty/

aber das würde ich dir jetzt noch nicht empfehlen :stuck_out_tongue: mach einfach pro Seite eine eigene Instanz, ist warscheinlich auch übersichtlicher.

Meld dich einfach wenn noch was nicht läuft

Grüße Korbi