Es ist sicherlich nicht das Ziel von Openhab, Aktienkurse zu verarbeiten, aber da Openhab wohl normalerweise 24/7 läuft, bietet sich die Erfassung von Kursen eigentlich ab. Hier mein Wertpapierprojekt :
Die Kurse werden von einer zeitgesteuerten Rule erfasst und direkt in die Items geschrieben. Dafür müßen die Namen der Items einem Schema folgen :
Die ISIN-Nummer gefolgt von _Name für den Wertpapiernamen, _Geld für Nachfrage, _Brief für Angebot und _Delta für die Veränderung zum Vortag. Es können nur Listen eingelesen werden : DAX, MDAX, TecDAX, SDAX usw. Weiterhin besteht die Möglichkeit, alle Aktien mit einem bestimmten Anfangsbuchstaben einzulesen. Es müßen nur Items erzeugt werden, von Aktien, die euch interessieren. Die Daten kommen von Tradegate und sind kostenlos. Es gibt keine API, die Daten werden aus den HTML-Seiten geparst. Hier Beispiele für die Items : ( Die GRuppe ist noch wichtig, darüber erreicht ich die Items )
Code: Alles auswählen
Group g_Stock "Aktien Items"
// Allianz
String DE0008404005_Name (g_Stock)
Number DE0008404005_Geld (g_Stock)
Number DE0008404005_Brief (g_Stock)
Number DE0008404005_Delta (g_Stock)
// BASF
String DE000BASF111_Name (g_Stock)
Number DE000BASF111_Geld (g_Stock)
Number DE000BASF111_Brief (g_Stock)
Number DE000BASF111_Delta (g_Stock)
// Daimler
String DE0007100000_Name (g_Stock)
Number DE0007100000_Geld (g_Stock)
Number DE0007100000_Brief (g_Stock)
Number DE0007100000_Delta (g_Stock)
// Telekom
String DE0005557508_Name (g_Stock)
Number DE0005557508_Geld (g_Stock)
Number DE0005557508_Brief (g_Stock)
Number DE0005557508_Delta (g_Stock)
// Linde
String IE00BZ12WP82_Name (g_Stock)
Number IE00BZ12WP82_Geld (g_Stock)
Number IE00BZ12WP82_Brief (g_Stock)
Number IE00BZ12WP82_Delta (g_Stock)
// RWE
String DE0007037129_Name (g_Stock)
Number DE0007037129_Geld (g_Stock)
Number DE0007037129_Brief (g_Stock)
Number DE0007037129_Delta (g_Stock)
// SAP
String DE0007164600_Name (g_Stock)
Number DE0007164600_Geld (g_Stock)
Number DE0007164600_Brief (g_Stock)
Number DE0007164600_Delta (g_Stock)
// Siemens
String DE0007236101_Name (g_Stock)
Number DE0007236101_Geld (g_Stock)
Number DE0007236101_Brief (g_Stock)
Number DE0007236101_Delta (g_Stock)
Code: Alles auswählen
val Get_Stock_Data =
[ String HTTPAddr // HTTP-Adresse, von der wir die Daten holen wollen
|
var String[] werte // Die HTML-Zeilen der einzelnen Päckchen der Aktienwerte
var String wert // Die eine Zeile eines Wertes
var String hs // Allgemeiner HilfsString
var Integer count // Anzahl der Aktienwerte
var Integer i // Die Schleifenvariable
var response = sendHttpGetRequest(HTTPAddr)
var lBody = response.substring(response.indexOf('<tbody') , response.indexOf('</tbody>'));
werte = lBody.split('<tr') // Aufteilen in Päckchen mit den Werten Pro Aktie
count = werte.size
logInfo("Aktiendaten", "Anzahl {}",count)
for (i=1; i<count; i++){
var String isin // String für die ISIN
var String name // String für den Wertpapiernamen
var String bid // String für Nachfrage
var String ask // String für Angebot
var String delta // String für Veränderung zum Vortag
wert = werte.get(i)
hs = wert.substring(wert.indexOf('id="name'), wert.indexOf('</td>')) // Den String mit ISIN und Namen rausschneiden
isin = hs.substring(hs.indexOf('isin='), hs.indexOf('</a>'))
name = isin.substring(isin.indexOf('">') + 2, isin.length)
isin = isin.substring(5, isin.indexOf('">'))
hs = wert.substring(wert.indexOf('<td id="bid'), wert.indexOf('<td id="ask'))
bid = hs.substring(hs.indexOf('">') + 2, hs.indexOf('</td>'))
bid = bid.replace(',','.')
hs = wert.substring(wert.indexOf('<td id="ask'), wert.indexOf('<td id="sum'))
ask = hs.substring(hs.indexOf('">') + 2, hs.indexOf('</td>'))
ask = ask.replace(',','.')
hs = wert.substring(wert.indexOf('<td id="delta'), wert.indexOf('%</td>'))
delta = hs.substring(hs.indexOf('">') + 2, hs.length)
delta = delta.replace(',','.')
logInfo("Aktiendaten","ISIN {} Name {} Geld {} Brief {} Delta {}",isin,name,bid,ask,delta)
val String visin = isin // Nur, damit die Fehlermeldungen in VSCode verschwinden
var wtemp = g_Stock.members.findFirst[j | j.name == visin + "_Name"]
if (wtemp !== null) {
wtemp.postUpdate(name)
}
wtemp = g_Stock.members.findFirst[j | j.name == visin + "_Geld"]
if (wtemp !== null) {
wtemp.postUpdate(bid)
}
wtemp = g_Stock.members.findFirst[j | j.name == visin + "_Brief"]
if (wtemp !== null) {
wtemp.postUpdate(ask)
}
wtemp = g_Stock.members.findFirst[j | j.name == visin + "_Delta"]
if (wtemp !== null) {
wtemp.postUpdate(delta)
}
}
]
/*
Weitere Adressen, von denen man Kurse holen kann
"https://www.tradegate.de/indizes.php?index=DE000A1EXRV0" // DAX
"https://www.tradegate.de/indizes.php?index=DE000A1EXRW8" // MDAX
"https://www.tradegate.de/indizes.php?index=DE000A1EXRY4" // TECDAX
"https://www.tradegate.de/indizes.php?index=DE000A1EXRX6" // SDAX
"https://www.tradegate.de/indizes.php?index=EU0009658145" // Eurostock 50
"https://www.tradegate.de/indizes.php?index=US0000000002" // US-Top-Titel
"https://www.tradegate.de/indizes.php?buchstabe=A" // Alle Aktien die Mit A anfangen
*/
rule "Aktienkurse Tradegate"
when
Time cron "0 * * * * ?"
then
Get_Stock_Data.apply("https://www.tradegate.de/indizes.php?index=DE000A1EXRV0") // DAX
end
Ich hoffe, es hilft
Glückauf
guinnes