Hallo zusammen,
da ich mich auch gerade mal mit den Börsenkursen fürs IP-Symcon beschäftigt habe, kann ich ja auch mal das abgewandelte Script von mir teilen. In diesem Script werden zusätzlich alle möglichen zusätzlichen Kurswerte ausgelesen. Z. B Eröffnungskurse oder Schlusskurse oder die Tägliche Änderung usw.
Gruß, Smudo.
<?php
//Werte holen von: https://www.tagesschau.de/wirtschaft/boersenkurse/
//Den Wert auf der Seite aufrufen und den letzten Abschnitt der URL verwenden.
$wkn = array(
"dax-index-846900" => "DAX",
"xc0009655157-4770761" => "Gold",
"25133685" => "Bitcoin"
);
//Aktuell mögliche Werte: Eröffnung, Tages-Hoch, Tages-Tief, 52 Wochen-Hoch, 52 Wochen-Tief, Allzeit-Hoch, Allzeit-Tief, Schluss Vortag, Geld, Brief
//Bei Änderung muss das Script einmal von Hand gestartet werden. Variablen von entfernten Werten werden nicht automatisch gelöscht.
//Die Tagesveränderung des Kurses wird über die Variable aktiviert. 0 = aus; 1 = an
$wknWerte = array(
"Eröffnung",
"Tages-Hoch",
"Tages-Tief"
);
$TageskursveraenderungAktiv=1;
$Aktualisierungsrate=900; //Aktualisierungsrate in Sekunden
//###################################
if ($_IPS['SENDER'] == "Execute") {
// ID des ArchiveHandler ermitteln
$instances = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}');
$id_archive_handler = $instances[0];
// pro WKN eine Variable
foreach($wkn as $ident => $name) {
$vid = CreateVariableByName($_IPS['SELF'], $name, 2 /*Float*/);
IPS_SetInfo($vid, $ident);
IPS_SetIcon($vid, "Graph");
AC_SetLoggingStatus($id_archive_handler, $vid, true);
IPS_SetVariableCustomProfile($vid, "~Euro");
// Variablen für die Kurswerte anlegen
$pid=$vid;
if ($TageskursveraenderungAktiv==1){
$name="Tagesveränderung";
$vid = CreateVariableByName($pid, $name, 3);
}
foreach($wknWerte as $name) {
$vid = CreateVariableByName($pid, $name, 2);
IPS_SetVariableCustomProfile((@IPS_GetObjectIDByName($name, $pid)), "~Euro");
}
}
IPS_SetScriptTimer($_IPS['SELF'],2);
}
if($_IPS['SENDER'] == "TimerEvent") {
IPS_SetScriptTimer($_IPS['SELF'],$Aktualisierungsrate);
// alle untergeordneten Objekt einsammeln
$ids = IPS_GetChildrenIDs($_IPS['SELF']);
foreach ($ids as $id) {
// for each Wertkennzeichen daten holen
$array = IPS_GetObject($id);
// Float-Variable?
if ($array['ObjectType'] == 2) {
$url = 'https://www.tagesschau.de/wirtschaft/boersenkurse/'.$array['ObjectInfo'].'/';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
$page = curl_exec($curl);
curl_close($curl);
$kursdaten = GetMark($page, '<table class="cnttable zebra to le">*</tbody>');
$search='//td[text()="Kurs"]/following-sibling::td[@class="ri"]';
$result= DOMdoc($kursdaten,$search);
$kurs = ToFloat($result);
$old=GetValueFloat($id);
$kurs = floatval($kurs);
$kurs=number_format($kurs, 2, '.', '');
if ($old!=$kurs){SetValueFloat($id, $kurs);}
// zu jedem WKZ die zusätzlichen Daten holen
foreach($wknWerte as $name) {
$searchStr='//td[text()="'.$name.'"]/following-sibling::td[@class="ri"]';
$result= DOMdoc($kursdaten,$searchStr);
$resultFL = ToFloat($result);
if ($resultFL=="N/A"){@IPS_DeleteVariable ((@IPS_GetObjectIDByName($name, $id)));}
else{
$cip=@IPS_GetObjectIDByName($name, $id);
if (isset($cip)) {
$old=GetValueFloat($cip);
$resultFL = floatval($resultFL);
$resultFL=number_format($resultFL, 2, '.', '');
if ($old!=$resultFL){SetValueFloat($cip,$resultFL);}
}
}
}
if ($TageskursveraenderungAktiv==1){
$searchchange = GetMark($page, '<span class="change">*</span>');
$search = '//span[contains(@class, "icon_pos") or contains(@class, "icon_neg") or contains(@class, "icon_neutral")]';
$change= DOMdoc($searchchange,$search);
$cid=@IPS_GetObjectIDByName("Tagesveränderung", $id);
$old=GetValueString($cid);
if ($old!=$change){SetValueString($cid,$change);}
}
}
}
}
function CreateVariableByName($id, $name, $type)
{
$vid = @IPS_GetVariableIDByName($name, $id);
if($vid===false) {
$vid = IPS_CreateVariable($type);
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
}
return $vid;
}
// 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 GetMark($string, $mark) {
$find = explode("*",$mark);
$lens = strlen($find[0]);
$lene = strlen($find[1]);
$start = strpos($string, $find[0]);
$stop = strpos($string, $find[1], $start+$lens);
$inner = substr($string, $start+$lens, $stop-$start-$lens);
return $inner;
}
// Umwandlung einer Zahlenrepräsentations als String in eine echte Gleitkommazahl
function ToFloat($str) {
if(strstr($str, ",")) {
$str = str_replace(".", "", $str); // replace dots (thousand seps) with blancs
$str = str_replace(",", ".", $str); // replace ',' with '.'
}
return $str; // take some last chances with floatval
}
function DOMdoc($kursdaten, $search) {
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML('<?xml encoding="UTF-8">' . $kursdaten);
libxml_clear_errors();
$xpath = new DOMXPath($dom);
$elements = $xpath->query($search);
// Überprüfe, ob das Element gefunden wurde und speichere den Inhalt in einer Variablen
if ($elements->length >0) {
$value = $elements->item(0)->nodeValue;
}
else { $value="N/A";
}
return $value;
}