Börsenticker

Habe das Script in Post #9 angepasst :wink:

Konntest Du die Charts nachbauen?

Gruß
Pitti

Danke.
Ich hab das Skript aus Post 9 mal kurz probiert.
Leider kommt in der hinzugefügten Codezeile ein Syntaxerror…

Hier was ich meine:

Hier mein erster Webfrontversuch - Habs dank deines Beispiels schon fast geschafft!
Kannst du mir noch verraten was du oben bei deinem Aktienkurz definiert hast, dass dies nicht 50% des Bildschirms einnimmt. Damit mehr für die GRaphen übrig bleibt… Hier was ich meine:

P.S. habs gerade gefunden mit der Webfrontansicht:


Das sieht doch schon sehr gut aus :wink:

Aufteilung des SplitPane:

[ul]
[li]Größe = 80[/li][li]Größeneinheit = Pixel[/li][li]Rand anzeigen = Nein[/li][/ul]

PS: man kann es wie Du mit Prozenten machen, aber dann ist es von der Auflösung abhängig. Besser sind glaube ich Pixel.

Beim Syntaxfehler kann es eigentlich nur ein unsichtbares Zeichen sein - hatte ich auch schon mal.
Beim Editieren des Posts (#9) hatte ich Schwieriegkeiten mit dem Einrücken. Formatiere die Zeilen einfach mal neu und lösch die Tabs und setze neue, bin gespannt ob das hilft.

Ciao Pitti

Hi Leute,

wenn ich das richtig sehe funktioniert jetzt auch Google nicht mehr :frowning: Wie sieht es bei Euch aus?

Ciao Pitti

Soo, habe selbst die Lösung gefunden. Google hat im Bereich Finanzen einiges neu gebaut bzw. umgebaut.
Dabei scheint sich die URL geändert zu haben:

ALT:
https://www.google.com/finance?q=xxxx

NEU:
https://finance.google.com/finance?q=xxxx

Also www => finance!

Ciao Pitti

Vielen Dank. mal wieder :wink:

Läuft…:loveips:

Hallo,

funktioniert das Script beu Euch noch???

Es läuft zwar ohne Fehler, jedoch werden die Variablen nicht aktualisiert.

Gruß Proxima

Hi,

leider hat Google die finance-URL auch schon wieder eingestellt.

Ich habe es jetzt für mich über eine „normale“ Suchanfrage und parsen der HTML-Ergebnisseite gelöst.
Läuft seit einiger Zeit stabil, aber ist halt nicht mehr so universell verwendbar wie vorher.

Ich kann Dir das Script gern geben und dann musst Du schauen ob es für Deine „Aktienwerte“ funktioniert.

Gruß Heiko

Hallo,

ja, ich würde gerne Dein Script probieren.

Gruß Proxima

Hi,

hier mal das Script das bei mir funktioniert (andere WKN).


<?
################################################################################
# Scriptbezeichnung: Online.StockExchange.ips.php
# Version:	2.1.20180319
# Author:	Heiko Wilknitz (@Pitti)
#
# Changelog:
#		15.03.2018 - Umstellung auf Curl
#		19.03.2018 - Umstellung auf Google Search
#
# Börsenticker:
#	Google Search:	
#		https://www.google.de/search?q=<WKN>
#		WKN = Wertpapierkennnummer
#			  ETR:xxx => Xetra
#			  FRA:xxx => Frankfurt
#
#	Beispiel:
#		https://www.google.com/search?q=ETR: BMW
#
# Installation:
#	- WKN-Array unter Konfiguration mit den entsprechenden Werten befüllen
#	- Script in der Konsole ausführen
#
# ------------------------------ Konfiguration ---------------------------------
#
$wkn = array(
	"ETA:BMW"		=> "BMW"	// Bayerische Motoren Werke AG
);
#
# ----------------------------------- ID´s -------------------------------------
#
#
################################################################################


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


if($_IPS['SENDER'] == "TimerEvent") {
	// alle untergeordneten Objekt einsammeln
	$ids = IPS_GetChildrenIDs($_IPS['SELF']);
	// echo print_r($ids);
	foreach ($ids as $id) {
		// for each Wertkennzeichen daten holen
		$array = IPS_GetObject($id);
		// Float-Variable?
		if ($array['ObjectType'] == 2) {
			// Google
			$url = 'https://www.google.de/search?q='.$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);
			$stock = GetMark($page, '<span style="font-size:157%"><b>*</b>'); 
			$dec = ToFloat($stock);
			//IPS_LogMessage("BOERSE", $dec);
			if($dec > 0) {
				SetValue($id, $dec);
			}
		}		
	}
}	

# ------------------------------ Funktionen ------------------------------------

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

function CreateEventByName($id, $name, $type) 
{ 
   $eid = @IPS_GetEventIDByName($name, $id); 
   if($eid===false) { 
      $eid = IPS_CreateEvent($type); 
      IPS_SetParent($eid, $id); 
      IPS_SetName($eid, $name); 
   } 
   return $eid; 
}

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


################################################################################
?>

Hallo,

@ pitti: Danke für das Script. Leider funktioniert das mit den meisten meiner Aktien nicht.
@ all: Nutzt jemand vielleicht etwas anderes, um Börsenkurse von Aktien, Fonds, usw. abzurufen? Vielleicht auch von kostenpflichtigen Seiten?

Gruß Proxima

Hallo,

da das Thema schon was älter ist: gibt es aktuell eine Möglichkeit Aktienkurse in IPS einzufügen?

Grüße

Ich greif das Thema noch mal auf. Gibt es eventuell ein Modul oder Script das Aktien Kurse abfragen kann ? Oder Cryptowährungen ? Würde gerne den Bitcoin im Auge behalten :stuck_out_tongue:

Bei Finanztreff kann man sich eine Watchlist mit bis zu 100 Werten anlegen und sich diese täglich als Mail zusenden lassen. Die Kurse werden als csv an die Mail angehängt und enthalten neben Schlusskurs auch Tageshoch- und -tiefkurs.
Mit IPS speichere ich die angehängte Datei auf meinen Server. Die Weiterverarbeitung erfolgt dann allerdings in Access.

ich frage meine Cyptowährungen auf verschiedenen Seiten ab, da es nicht alle auf einer Seite gibt/gab.
Hab aber kein Modul sondern nur Scripte.

z.B.:

https://www.blockchain.com/de/api/exchange_rates_api

Da ich nicht programmieren kann, habe ich das ganz einfach über einen Textparser gelöst und hole die Werte aus den einzelnen Coin Seiten. z.B. Bitcoin (BTC) price, market cap | $60,183.89 | Charts | COIN360

Hier mal noch ein andere Service für Crypto’s

Beispiel URL ist dann:
https://api.coinbase.com/v2/exchange-rates?currency=EUR

An der IPS Implementierung :loveips: arbeite ich noch, der Service ist gut verfügbar und kostenlos!

Hier die fertige Script Variante zum holen von Crypto Werten via Coinbase API.
Vorteil: Das Script holt eine große Anzahl an Werten mit einem Call.

Danke an @Pitte für die gut strukturierte Vorarbeit!

<?
################################################################################
#
# Scriptbezeichnung: Crypto.Coinbase.ips.php
# Version:	1.0.0
# Author:	Jörg Grote
#
# Changelog:
#		12.09.2023 initial version
#
# Cryptoticker:
#	Coinbase:	
#	    get latest crypto rates via REST
#       https://docs.cloud.coinbase.com/sign-in-with-coinbase/docs/api-exchange-rates#http-request
#
#	Beispiel:
#		https://api.coinbase.com/v2/exchange-rates?currency=EUR
#
# Installation:
#	- crypto-Array unter Konfiguration mit den entsprechenden Werten befüllen
#	- Script in der Konsole ausführen
#
# ------------------------------ Konfiguration ---------------------------------
#
$crypto = array(
	"BTC"		=> "BTC",	// Bitcoin
    "ETH"		=> "ETH"	// Etherium
);
#
# ----------------------------------- ID´s -------------------------------------
#
#
################################################################################
$enable_logging = false;

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($crypto as $ident => $name) {
		$vid = CreateVariableByName($_IPS['SELF'], $name, 2 /*Float*/);
		IPS_SetInfo($vid, $ident);
		IPS_SetIcon($vid, "Graph");
        if ($enable_logging) {
            AC_SetLoggingStatus($id_archive_handler, $vid, true);
        }
	}
}

if($_IPS['SENDER'] == "TimerEvent" or $_IPS['SENDER'] == "Execute") {

    //Coinbase, alle Crypto als JSON Daten lesen.
    $url = 'https://api.coinbase.com/v2/exchange-rates?currency=EUR';
    $req = file_get_contents($url);	
    $dec = json_decode($req, false);

    // alle untergeordneten Objekt einsammeln
	$ids = IPS_GetChildrenIDs($_IPS['SELF']);

	foreach ($ids as $id) {
		// for each Crypto in Object
		$array = IPS_GetObject($id);
		// Float-Variable?
		if ($array['ObjectType'] == 2) {
            $rate = $dec->{'data'}->{'rates'}->{$array['ObjectInfo']};
            $curr = (1/$rate *100)/100;
			if($curr > 0) {
				SetValue($id, round($curr, 2));
			}            
		}		
	}
}	

# ------------------------------ Funktionen ------------------------------------

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

function CreateEventByName($id, $name, $type) 
{ 
   $eid = @IPS_GetEventIDByName($name, $id); 
   if($eid===false) { 
      $eid = IPS_CreateEvent($type); 
      IPS_SetParent($eid, $id); 
      IPS_SetName($eid, $name); 
   } 
   return $eid; 
}

################################################################################
?>
1 „Gefällt mir“

Cool, danke für die Crypto Sache, werde ich gern probieren.

@alle
Schade dass es nix universelles für Börsenkurse gibt.
Brauch es gar nicht selber, aber damit könnte ich einen Kollegen für Symcon zusätzlich motivieren :slight_smile:

Cheers Seppm

Ich mach das immer noch sehr simple via Google z.B: ETR:NWO - Google Search
und parse dann den Kurs aus dem HTML. Läuft seit 2018 stabil ohne Änderung!

Gruß Heiko