Habe ich noch nie probiert, falls der gewünschte Handelsplatz in der URL abgebildet wird, würde es vermutlich funktionieren.
Moin Moin,
ich wäre den Thread mal wieder auf weil ich möchte auch Aktienkurse abrufen… Script habe ich erstellt. Es kommt aber leider nur dieser Fehler mit dem ich so nix anfangen kann. Es wird auf Dein Script System.Funktion.ips.php verwiesen.
Vielleicht kannst du Patti ja mal schauen. Danke!
Gruß Michael
Ergänzung: hat sich erledigt, habs hingekriegt!!
Gruß Michael
Moin Moin,
stehe just php-mäßig auf dem Schlauch… ich möchte das Script erweitern indem ich nicht nur den Wert der einzelnen Werte abrufe und in eine Variable ($wkn, $id) schreibe, sondern auch den Gesamtwert Monitoren.
Dazu habe ich ein weiteres Array $stk / $id mit der Anzahl des jeweiligen Werte eingerichtet.
Wie gesagt, es funktioniert auch alles und der Gesamtwert wird auch richtig berechnet und in eine Var geschrieben. Allerdings bekomme ich immer den Fehler
Undefined array key 28420 in /var/lib/symcon/scripts/28479.ips.php on line 83
Das ganze steht in einer „foreach“ Schleife
Was läuft da falsch und kann mir jemand auf die Sprünge helfen. Bin halt kein php-Spezi.
Danke und Gruß Michael
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;
}
Copy&Paste, das Array aus meinem Script kopiert und das Ergebnis als sehr gut befunden .
Dann muss ich nur mein Überwachungsscript anpassen, das auf stärkere Abweichung prüft und Meldungen abgibt.
Ich habe bei mir das Ereignis angepasst, damit die Abrufe nur zu mehr oder weniger Öffnungszeiten in der Woche erfolgen.
Das mit den Öffnungszeiten hatte ich auch im Sinn, hab aber beim Überfliegen keinen Marker auf der Seite gesehen, ob der Markt geöffnet oder geschlossen ist. Muss ich vielleicht nochmal genauer hinsehen.
Ich frage nur Mo-Fr ab, so genau nehme ich es dann auch nicht .
Hab nochmal geschaut aber tatsächlich nichts gefunden. Da müsste man die einzelnen Börsen manuell hinzufügen. Mal sehen.
Aber mir ist noch aufgefallen, dass das ~Euro Profil natürlich nicht immer passt (z.B. beim DAX). Das lässt sich aber noch verbessern. Werde das vermutlich morgen mal ändern.
Hallo @Smudo ,
ich habe Dein Script ausprobiert und erhalte bei jedem Durchlauf diese Meldung:
27.11.2024, 19:45:07 | ScriptEngine | Result for Event 48378
Warning: Cannot auto-convert value for parameter VariableValue (invalid stod argument) in C:\ProgramData\Symcon\scripts\46747.ips.php on line 101
Warning: Cannot auto-convert value for parameter VariableValue (invalid stod argument) in C:\ProgramData\Symcon\scripts\46747.ips.php on line 101
Warning: Cannot auto-convert value for parameter VariableValue (invalid stod argument) in C:\ProgramData\Symcon\scripts\46747.ips.php on line 101
Warning: Cannot auto-convert value for parameter VariableValue (invalid stod argument) in C:\ProgramData\Symcon\scripts\46747.ips.php on line 101
Könntest Du das noch iwi fixen …
Grüße
Proxima
Wahnsinn, nach 6 Jahren Laufzeit mit G**gle jetzt auf Tagesschau umgebaut
@Smudo Coole Sache, das mit den Tageswerten!
Das schöne ist, konnte meine Variablen einfach weiter nutzen
Gruß Heiko
Kannst du dein wkn array posten? Dann kann ich mal schauen.
Du bei Tagesveränderung passt was noch nicht ganz, speziell bei +/- 0. Kannste mal schauen?
Da steht dann sowas im Quelltext:
<span class="change"><span class="neutral icon_neutral">±0,00 (±0,00%)</span></span>
Danke & Gruß
Heiko
PS:
Habe die das Suchkriterium erweitert …
$search = '//span[contains(@class, "icon_pos") or contains(@class, "icon_neg") or contains(@class, "icon_neutral")]';
Damit geht es!
Super,
an neutral hatte ich nicht gedacht. Ich habe es gleich mal oben im Script geändert und noch eine weitere Änderung hinzugefügt.
Jetzt werden wieder, wie es glaube ich auch im alten Script war, nur noch die Variablen aktualisiert, die sich geändert haben.
Da sind sowieso noch ein paar Kleinigkeiten zu machen, ist noch „Work in Progress“
Das Problem von Proxima wird vermutlich von einem anderen Wertpapiertyp stammen, ich habe sie noch nicht alle ausprobiert. Werde ich korrigieren, wenn ich weiß, welche wkn nicht funktioniert.
Hallo,
@Smudo : Meine aktuelle Watchlist (wkn array):
$wkn = array(
"de000a0x7541-5435248" => "ACATIS Value Event Fonds A", // ACATIS Value Event Fonds A
"de0008474024-5412840" => "DWS ESG Akkumula LC", // DWS ESG Akkumula LC
"lu0386885296-5417179" => "Pic Gl Megatr Sel P dy€", // Pic Gl Megatr Sel P dy€
"lu0058720904-5414082" => "AB I Int Health Care Ptf A", // AB I Int Health Care Ptf A
"gb0031215220-9524" => "CARNIVAL PLC DL 1,66", // CARNIVAL PLC DL 1,66
"lu0323578657-5839820" => "FvSSic Multiple Opp R", // FvSSic Multiple Opp R
"de000a0ycbq8-6472726" => "ODDO BHF Money Market DR€", // ODDO BHF Money Market DR€
);
Grüße
Proxima
Bei mir läuft das ohne Fehler durch.
Ich vermute, dass es an der Abfrage der Tagesänderung lag. Das ist bereits behoben. Kopier mal das aktuelle Script nochmal über das alte und füge deine WKN wieder ein. Ich denke das wird jetzt laufen.
Gruß Smudo
Ja, läuft bei mir jetzt auch …
Soderle … jetzt gibt’s doch noch eine Fehlermeldung:
28.11.2024, 13:53:05 | ScriptEngine | Result for Event 48378
Warning: Variable #0 existiert nicht in C:\ProgramData\Symcon\scripts\46747.ips.php on line 128
Warning: Variable #0 existiert nicht in C:\ProgramData\Symcon\scripts\46747.ips.php on line 131
das sind bei mir diese Zeilen:
Grüße & D A N K E
Zeig mal Dein Objektbaum! Haste das Script einfach so mal ausgeführt?
Ich komme zwar nicht drauf, wie es dazu kommt aber versuch mal die Zeilen 128 bis 131 mit folgendem Code zu ersetzen.
if (isset($cip)) {
$old=GetValueFloat($cip);
$resultFL = floatval($resultFL);
$resultFL=number_format($resultFL, 2, '.', '');
if ($old!=$resultFL){SetValueFloat($cip,$resultFL);}
}