Börsenticker

Den Code habe ich eingefügt.
Bei Ausführung von Hand → keine Meldung. Der Scripttimer braucht noch 10 Minuten …

OK, das ist ne Menge.
Auf wieviel Sekunden hast du die Aktualisierung eingestellt?
Ach da hast du es ja geschrieben.
Na, mit der kleinen Änderung von etwas weiter oben wird der Fehler weg sein. Du musst nur mal darauf achten ob noch alle Werte aktualisiert werden.
Zum Testen kannst du den Timer (Zeile 22) ja auch mal vorübergehen auf 15 Sekunden oder so einstellen.

Was mir gerade einfällt ist, dass du immer wenn du wkn´s hinzufügst, das Script einmal manuell ausführen musst, sonst könnte es zu dem von dir genannten Fehler kommen, weil die neuen Variablen nicht angelegt wurden.

1 „Gefällt mir“

Genau, deshalb wollte ich den Objektbaum mal sehen

Kopiert und funktioniert :relaxed:

Vielen Dank für die Arbeit. Bin begeistert!

:+1: :+1: :+1:
Danke funktioniert

Sorry, aber bei mir noch immer die Meldung beim Timer-Aufruf (alle 900 Sek.):

28.11.2024, 22:06:05 | ScriptEngine         | Result for Event 48378

Warning: Variable #0 existiert nicht in C:\ProgramData\Symcon\scripts\46747.ips.php on line 129

Warning: Variable #0 existiert nicht in C:\ProgramData\Symcon\scripts\46747.ips.php on line 132

Warning: Variable #0 existiert nicht in C:\ProgramData\Symcon\scripts\46747.ips.php on line 129

Warning: Variable #0 existiert nicht in C:\ProgramData\Symcon\scripts\46747.ips.php on line 132

:man_shrugging:

Dann poste nochmal dein wkn array. Wenn du das hier nicht öffentlich teilen möchtest, kannst du es mir ja per pn zukommen lassen.
Ich gehe davon aus, dass du nach jeder Änderung des wkn arrays das Script einmal mit ausführen manuell gestartet hast.

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€
            );

wknWerte Array:

$wknWerte = array(
                "Eröffnung",
                "Tages-Hoch",
                "Tages-Tief",
                "52 Wochen-Hoch",
                "52 Wochen-Tief",
                "Allzeit-Hoch",
                "Allzeit-Tief",
                "Schluss Vortag",
                "Geld",
                "Brief"
                );

Und selbstverständlich wird nach jeder Änderung am Script, dieses mittels Button „Ausführen“ von Hand ausgeführt.

Hmm, fällt mir so aktuell nichts ein. Bei mir läuft es mit deinen Werten aktuell mit Aktualisierungsrate von 10 Sekunden ohne Fehlermeldungen.
Dummerweise habe ich aber inzwischen das komplette Script nochmal überarbeitet. Vielleicht liegt es daran.

Hier ist die aktuelle Version, die auch so bleiben soll, wenn nicht noch Fehler auftauchen. Wenn es damit noch Fehler macht, sag nochmal Bescheid.

<?php

//Werte holen von: https://www.tagesschau.de/wirtschaft/boersenkurse/
//Den Wert auf der Seite aufrufen und den letzten Abschnitt der URL verwenden.

//Bei Änderung des arrays muss das Script unbedingt einmal manuell ausgeführt werden.
//Variablen von entfernten Werten werden nicht automatisch gelöscht. 

$wkn = array(
	"dax-index-846900"	=> "DAX",	
    "25133685" => "Bitcoin",
    //"eu0009652759-25108390" => "EUR/USD",
    "xc0009655157-4770761" => "Gold"
    
    );

$wknWerte = array( //Aktuell mögliche Werte: Eröffnung, Tages-Hoch, Tages-Tief, 52 Wochen-Hoch, 52 Wochen-Tief, Allzeit-Hoch, Allzeit-Tief, Schluss Vortag, Geld, Brief
    "Eröffnung",
    "Tages-Hoch",
    "Tages-Tief"
    );

$wknInfo = array( //Aktuell mögliche Werte: WKN, ISIN, Wertpapiertyp, Währung, Börse
    "WKN",
    "ISIN",
    "Wertpapiertyp",
    "Währung",
    "Börse"
    );  

$Aktualisierungsrate=200;  //Aktualisierungsrate in Sekunden
$wknWerteErstellen=1;
$wknInfoErstellen=0;

//###################################

if ($_IPS['SENDER'] == "Execute") {
	// ID des ArchiveHandler ermitteln 
	$instances = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}'); 
    $id_archive_handler = $instances[0]; 

    //Variablenprofil "Punkte" anlegen
    if (!IPS_VariableProfileExists("Punkte")){
        IPS_CreateVariableProfile ("Punkte", 2) ;
        IPS_SetVariableProfileIcon ("Punkte", "circle-small");
        IPS_SetVariableProfileDigits ("Punkte", 2);
        IPS_SetVariableProfileText("Punkte", "", " Pkt");
        }

	// pro WKN eine Variable
	foreach($wkn as $ident => $name) {
        $url = 'https://www.tagesschau.de/wirtschaft/boersenkurse/'.$ident.'/';
        $xpath=curl($url);
        $waehrung = @$xpath->query("//span[contains(text(), 'Währung:')]")->item(0)->textContent;
        $waehrung = str_replace("Währung: ", "", $waehrung);
		$vid = CreateVariableByName($_IPS['SELF'], $name, 2 /*Float*/);
       	IPS_SetInfo($vid, $ident);
		IPS_SetIcon($vid, "Graph");
 	    AC_SetLoggingStatus($id_archive_handler, $vid, true);
        $profil=getprofil($waehrung);
        IPS_SetVariableCustomProfile($vid, $profil);
        // Variablen für die Kurswerte anlegen
        $pid=$vid;
        $name="Tagesveränderung";
        $vid = CreateVariableByName($pid, $name, 3);
        
        if ($wknWerteErstellen==1){
        foreach($wknWerte as $name) {
            $vid = CreateVariableByName($pid, $name, 2);
            IPS_SetVariableCustomProfile((@IPS_GetObjectIDByName($name, $pid)),$profil);
            }
        }
        
        if ($wknInfoErstellen==1){
        foreach ($wknInfo as $name) {
            $node = $xpath->query('//span[contains(text(), "' . $name . ':")]')->item(0);
            if ($node) {
                $result= (trim(str_replace($name . ':', '', $node->textContent)));
                if ($result!=""){
                $vid = CreateVariableByName($pid, $name, 3);
                SetValueString($vid,$result);
                IPS_SetPosition($vid, 5);
                    }
                } 
            }
        }
	}
    IPS_SetScriptTimer($_IPS['SELF'],3);
    }


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'].'/';
            $xpath=curl($url);
            $result = $xpath->query('//td[text()="Kurs"]/following-sibling::td[@class="ri"]')->item(0)->textContent;
            $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) {
                $result = @$xpath->query('//td[text()="'.$name.'"]/following-sibling::td[@class="ri"]')->item(0)->textContent;
                $resultFL = ToFloat($result);
                //if ($resultFL==""){@IPS_DeleteVariable ((@IPS_GetObjectIDByName($name, $id)));}
                if ($resultFL!=""){
                    $cip=@IPS_GetObjectIDByName($name, $id);
                    if ($cip!="") {
                        $old=GetValueFloat($cip);
                        $resultFL = floatval($resultFL);
                        $resultFL=number_format($resultFL, 2, '.', '');
                        if ($old!=$resultFL){SetValueFloat($cip,$resultFL);}
                        }
                    }   
                }
            $result = @$xpath->query('//span[contains(@class, "icon_pos") or contains(@class, "icon_neg") or contains(@class, "icon_neutral")]')->item(0)->textContent;
            $cid=@IPS_GetObjectIDByName("Tagesveränderung", $id);
            $old=GetValueString($cid);
            if ($old!=$result){SetValueString($cid,$result);}

		    }		
	    }
    }	

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

// 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 curl($url){
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $output = curl_exec($ch); 
    curl_close($ch); 
    $dom = new DOMDocument(); 
    @$dom->loadHTML('<?xml encoding="UTF-8">' . $output);
    $xpath = new DOMXPath($dom); 
    return $xpath;
}

function getprofil($waehrung){

    switch ($waehrung) {
        case 'Euro':
            $profil="~Euro";
            break;
        case 'US-Dollar':
            $profil="~Dollar";
            break;
        case 'Punkte':
            $profil="Punkte";
            break;
        default:
            $profil="Punkte";
        break;
    }
    return $profil;

}

OK, jetzt habe ich den Fehler auch. Hab aber noch keine Idee warum. Nur damit du schon mal Bescheid weisst. Ich muss mal weiter schauen. Aus irgend einem Grund bringt

$cip=@IPS_GetObjectIDByName($name, $id);

manchmal keine ID obwohl $name und $id vorhanden sind und auch scheinbar stimmen. Ich muss nochmal schauen. Vor allem dass das erst nach einer gewissen Zeit anfängt ist schon merkwürdig.

Habe den Fehler gefunden.
Die aktuelle Version habe ich oben eingefügt. Damit sollte es dann ohne Fehler laufen.