Börsenticker

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;
}

3 „Gefällt mir“