Wertpapieranzeige: Unterschied zwischen den Versionen

Aus FHEMWiki
(Die Seite wurde neu angelegt: „Der [[{{PAGENAME}}|Artikel "Wertpapieranzeige"]] beschreibt das Vorgehen zur Erzeugung einer komfortablen Anzeige verschiedener Wertpapier in einer Liste auf B…“)
 
 
(11 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Der [[{{PAGENAME}}|Artikel "Wertpapieranzeige"]] beschreibt das Vorgehen zur Erzeugung einer komfortablen Anzeige verschiedener Wertpapier in einer Liste auf Basis des Modules 98_STOCKQUOTES.pm
Der [[{{PAGENAME}}|Artikel "Wertpapieranzeige"]] beschreibt das Vorgehen zur Erzeugung einer komfortablen Anzeige verschiedener Wertpapiere in einer Liste auf Basis des Modules [[STOCKQUOTES]].
== Stockquotes ==
Die Einrichtung eines Depots mit dem Modul 98 STOCKQUOTES wird ('''Wo?''') beschrieben. Für das folgende nehmen wir an, dass in dem Depot verschiedene Teildepots mit unterschiedlichen Währungen vorhanden sind, z.B. ''Depot_EUR'' für Euro, ''Depot_CAD'' für kanadische Dollar.
== readingsGroup
[code]define Depot_Detail readingsgroup < >,<Symbol>,<Stock>,<Value>,<Change_Rel>,<Change_Abs>,<Trend>,<Rate>,<Count>,<Cur>
Depot_EUR:depot_cur_value_total,depot_p_change_total,depot_value_diff_total,depot_buy_value_total:t
Depot_EUR:@2,<#1>,(.*)_name,#1_d_cur_value_total,#1_d_p_change_total,#1_d_value_diff_total,#1_close,#1_last,#1_d_stockcount,
Depot_USD:depot_cur_value_total,depot_p_change_total,depot_value_diff_total,depot_buy_value_total:t
Depot_USD:@2,<#1>,(.*)_name,#1_d_cur_value_total,#1_d_p_change_total,#1_d_value_diff_total,#1_close,#1_last,#1_d_stockcount,#1_currency
Depot_CAD:depot_cur_value_total,depot_p_change_total,depot_value_diff_total,depot_buy_value_total:t
Depot_CAD:@2,<#1>,(.*)_name,#1_d_cur_value_total,#1_d_p_change_total,#1_d_value_diff_total,#1_close,#1_last,#1_d_stockcount,#1_currency
Depot_NOK:depot_cur_value_total,depot_p_change_total,depot_value_diff_total,depot_buy_value_total:t
Depot_NOK:@2,<#1>,(.*)_name,#1_d_cur_value_total,#1_d_p_change_total,#1_d_value_diff_total,#1_close,#1_last,#1_d_stockcount,#1_currency
Depot_GBP:depot_cur_value_total,depot_p_change_total,depot_value_diff_total,depot_buy_value_total:t
Depot_GBP:@2,<#1>,(.*)_name,#1_d_cur_value_total,#1_d_p_change_total,#1_d_value_diff_total,#1_close,#1_last,#1_d_stockcount,#1_currency
Depot_R:depot_cur_value_total,depot_p_change_total,depot_value_diff_total,depot_buy_value_total:t
Depot_R:@2,<#1>,(.*)_name,#1_last,#1_close,#1_d_stockcount,#1_d_cur_value_total,#1_d_p_change_total,#1_d_value_diff_total,#1_currency


attr Depot_Detail valueColumns { 'depot_cur_value_total' => 'colspan="2"','depot_buy_value_total' => 'colspan="4"'}
== Ergebnis ==
''Natürlich'' habe ich hier die wirklichen Zahlen unkenntlich gemacht (pah, 9.1.2021)
attr Depot_Detail valueFormat
 
{if($READING =~ /.*name/){$VALUE=~/.*\((.*)\).*/;;$VALUE=$1}
[[File:Depot.png|800px]]
  elsif($READING =~ /.*((cur_value_total)|(value_diff_total))/ && $DEVICE eq "Depot_EUR"){$VALUE.="€"}
 
elsif($READING =~ /.*((cur_value_total)|(value_diff_total))/ && $DEVICE eq "Depot_R"){$VALUE.="€"}
==Voraussetzungen==
  elsif($READING =~ /.*((cur_value_total)|(value_diff_total))/ && $DEVICE =~ /Depot_(.*)/ ){$VALUE=(int($VALUE/ReadingsVal("EUR_".$1,"rate",1)*100)/100)."€"}
Für das Folgende nehmen wir an, dass in dem Depot verschiedene Teildepots mit unterschiedlichen Währungen vorhanden sind, z.B. ''Depot2_EUR'' für Euro, ''Depot2_GBP'' für britische Pfund.
 
Für jede Fremdwährung (z.B. GBP) muss ferner irgendein Device existieren (z.B. als [[Dummy]]), in welchem der Umrechnungskurs steht und per Perl-Funktion
:<code> Value("EUR_GBP")</code>
(bzw. entsprechend für andere Währungen) abgefragt werden kann. Diese Abfrage wird für die Formatierung benötigt und muss ggf. angepasst werden.
 
== readingsGroup ==
Zunächst wird die [[readingsGroup]] definiert, dabei gibt es zwei(!) Zeilen für jedes Teildepot in einer anderen Währung:
define Depot2_Detail readingsGroup < >,<Symbol>,<Stock>,<Value>,<Change_Rel>,<Change_Abs>,<Trend>,<Rate>,<Count>,<Cur>
Depot2_EUR:depot_cur_value_total,depot_p_change_total,depot_value_diff_total,depot_buy_value_total:t
Depot2_EUR:@2,<#1>,(.*)_name,#1_d_cur_value_total,#1_d_p_change_total,#1_d_value_diff_total,#1_close,#1_last,#1_d_stockcount
Depot2_USD:depot_cur_value_total,depot_p_change_total,depot_value_diff_total,depot_buy_value_total:t
Depot2_USD:@2,<#1>,(.*)_name,#1_d_cur_value_total,#1_d_p_change_total,#1_d_value_diff_total,#1_close,#1_last,#1_d_stockcount,#1_currency
Depot2_SEK:depot_cur_value_total,depot_p_change_total,depot_value_diff_total,depot_buy_value_total:t
Depot2_SEK:@2,<#1>,(.*)_name,#1_d_cur_value_total,#1_d_p_change_total,#1_d_value_diff_total,#1_close,#1_last,#1_d_stockcount,#1_currency
Depot2_GBP:depot_cur_value_total,depot_p_change_total,depot_value_diff_total,depot_buy_value_total:t
Depot2_GBP:@2,<#1>,(.*)_name,#1_d_cur_value_total,#1_d_p_change_total,#1_d_value_diff_total,#1_close,#1_last,#1_d_stockcount,#1_currency
Die Kopfzeilen und -spalten werden mit breiteren Tabellenspalten versehen und hervorgehoben:
attr Depot2_Detail valueColumns { 'depot_cur_value_total' => 'colspan="2"','depot_buy_value_total' => 'colspan="4"'}
attr Depot2_Detail nameStyle style="font-weight:bold"
 
=== Formatierungen ===
Als Nächstes werden die Einzelwerte formatiert und bei Fremdwährungen umgerechnet. Dabei kann man auf spezielle Eigenschaften der Teildepots eingehen - beispielsweise wird im Nachfolgenden der ''_close''-Wert durch den Kursprovider nicht für eine Aktie, sondern für 100 Aktien angegeben und muss entsprechend herunterskaliert werden.
attr Depot2_Detail valueFormat
{if($READING =~ /.*name/){$VALUE=~/.*\((.*)\).*/;;$VALUE=$1}
  elsif($READING =~ /.*((cur_value_total)|(value_diff_total))/ && $DEVICE eq "Depot2_EUR"){$VALUE.="€"}
  elsif($READING =~ /.*((cur_value_total)|(value_diff_total))/ && $DEVICE =~ /Depot2_(.*)/ ){$VALUE=(int($VALUE/Value("EUR_".$1)*100)/100)."€"}
  elsif($READING =~ /.*p_change_total/){$VALUE=(int($VALUE*10)/10)."%"}
  elsif($READING =~ /.*p_change_total/){$VALUE=(int($VALUE*10)/10)."%"}
  elsif($READING =~ /(.*)_close/ && $DEVICE eq "Depot_GBP" && $1 !~ /VEV.*/){my $tr=(100*ReadingsVal("$DEVICE",$1."_last",1)/ReadingsVal("$DEVICE",$1."_close",1)-1);(int(1000*$tr)/10)."%% ".(($tr>0.01)?"🢁":(($tr>0.001)?"🢅":(($tr>-0.001)?"🢂":(($tr>-0.01)?"🢆":"🢃")))) }
  elsif($READING =~ /(.*)_close/ && $DEVICE eq "Depot2_GBP"){my $tr=(100*ReadingsVal("$DEVICE",$1."_last",1)/ReadingsVal("$DEVICE",$1."_close",1)-1);(int(1000*$tr)/10)."%% ".(($tr>0.01)?"🢁":(($tr>0.001)?"🢅":(($tr>-0.001)?"🢂":(($tr>-0.01)?"🢆":"🢃")))) }
  elsif($READING =~ /(.*)_close/){my $tr=(ReadingsVal("$DEVICE",$1."_last",1)/ReadingsVal("$DEVICE",$1."_close",1)-1);(int(1000*$tr)/10)."%% ".(($tr>0.01)?"🢁":(($tr>0.001)?"🢅":(($tr>-0.001)?"🢂":(($tr>-0.01)?"🢆":"🢃")))) }}
  elsif($READING =~ /(.*)_close/){my $tr=(ReadingsVal("$DEVICE",$1."_last",1)/ReadingsVal("$DEVICE",$1."_close",1)-1);(int(1000*$tr)/10)."%% ".(($tr>0.01)?"🢁":(($tr>0.001)?"🢅":(($tr>-0.001)?"🢂":(($tr>-0.01)?"🢆":"🢃")))) }}


=== Farben ===
attr Depot_Detail valueStyle {if($READING =~ /depot.*/ ){'style="background-color:#aaaaff;font-weight:bold;text-align:right"'}
Im letzten Schritt werden jetzt noch Farben hinzugegeben
attr Depot_Detail valueStyle  
{if($READING =~ /depot.*/ ){'style="background-color:#aaaaff;font-weight:bold;text-align:right"'}
  elsif($READING =~ /.*cur_value_total/){'style="text-align:right"'}
  elsif($READING =~ /.*cur_value_total/){'style="text-align:right"'}
  elsif($READING =~ /.*((p_change_total)|(d_value_diff_total))/ && $VALUE<0){'style="color:red;text-align:right"'}
  elsif($READING =~ /.*((p_change_total)|(d_value_diff_total))/ && $VALUE<0){'style="color:red;text-align:right"'}
  elsif($READING =~ /.*((p_change_total)|(d_value_diff_total))/ && $VALUE>0){'style="color:green;text-align:right"'}
  elsif($READING =~ /.*((p_change_total)|(d_value_diff_total))/ && $VALUE>0){'style="color:green;text-align:right"'}
  elsif($READING =~ /(.*)_close/ && $DEVICE eq "Depot_GBP" && $1 !~ /VEV.*/){my $tr=(100*ReadingsVal("$DEVICE",$1."_last",1)/ReadingsVal("$DEVICE",$1."_close",1)-1);'style="text-align:right;color:'.(($tr>0.01)?'green"':(($tr>0.001)?'#aaff44"':(($tr>-0.001)?'black"':(($tr>-0.01)?'#ffdd88"':'red"')))) }
  elsif($READING =~ /(.*)_close/ && $DEVICE eq "Depot2_GBP"){my $tr=(100*ReadingsVal("$DEVICE",$1."_last",1)/ReadingsVal("$DEVICE",$1."_close",1)-1);'style="text-align:right;color:'. (($tr>0.01)?'green"':(($tr>0.001)?'#aaff44"':(($tr>-0.001)?'black"':(($tr>-0.01)?'#ffdd88"':'red"')))) }
  elsif($READING =~ /(.*)_close/){my $tr=(ReadingsVal("$DEVICE",$1."_last",1)/ReadingsVal("$DEVICE",$1."_close",1)-1);'style="text-align:right;color:'.(($tr>0.01)?'green"':(($tr>0.001)?'#aaff44"':(($tr>-0.001)?'black"':(($tr>-0.01)?'#ffdd88"':'red"')))) }}
  elsif($READING =~ /(.*)_close/){my $tr=(ReadingsVal("$DEVICE",$1."_last",1)/ReadingsVal("$DEVICE",$1."_close",1)-1);'style="text-align:right;color:'.(($tr>0.01)?'green"':(($tr>0.001)?'#aaff44"':(($tr>-0.001)?'black"':(($tr>-0.01)?'#ffdd88"':'red"')))) }}


[[Kategorie:Code Snippets]]
[[Kategorie:Code Snippets]]

Aktuelle Version vom 17. Februar 2024, 18:37 Uhr

Der Artikel "Wertpapieranzeige" beschreibt das Vorgehen zur Erzeugung einer komfortablen Anzeige verschiedener Wertpapiere in einer Liste auf Basis des Modules STOCKQUOTES.

Ergebnis

Natürlich habe ich hier die wirklichen Zahlen unkenntlich gemacht (pah, 9.1.2021)

Depot.png

Voraussetzungen

Für das Folgende nehmen wir an, dass in dem Depot verschiedene Teildepots mit unterschiedlichen Währungen vorhanden sind, z.B. Depot2_EUR für Euro, Depot2_GBP für britische Pfund.

Für jede Fremdwährung (z.B. GBP) muss ferner irgendein Device existieren (z.B. als Dummy), in welchem der Umrechnungskurs steht und per Perl-Funktion

Value("EUR_GBP")

(bzw. entsprechend für andere Währungen) abgefragt werden kann. Diese Abfrage wird für die Formatierung benötigt und muss ggf. angepasst werden.

readingsGroup

Zunächst wird die readingsGroup definiert, dabei gibt es zwei(!) Zeilen für jedes Teildepot in einer anderen Währung:

define Depot2_Detail readingsGroup < >,<Symbol>,<Stock>,<Value>,<Change_Rel>,<Change_Abs>,<Trend>,<Rate>,<Count>,<Cur> 
Depot2_EUR:depot_cur_value_total,depot_p_change_total,depot_value_diff_total,depot_buy_value_total:t
Depot2_EUR:@2,<#1>,(.*)_name,#1_d_cur_value_total,#1_d_p_change_total,#1_d_value_diff_total,#1_close,#1_last,#1_d_stockcount
Depot2_USD:depot_cur_value_total,depot_p_change_total,depot_value_diff_total,depot_buy_value_total:t
Depot2_USD:@2,<#1>,(.*)_name,#1_d_cur_value_total,#1_d_p_change_total,#1_d_value_diff_total,#1_close,#1_last,#1_d_stockcount,#1_currency
Depot2_SEK:depot_cur_value_total,depot_p_change_total,depot_value_diff_total,depot_buy_value_total:t
Depot2_SEK:@2,<#1>,(.*)_name,#1_d_cur_value_total,#1_d_p_change_total,#1_d_value_diff_total,#1_close,#1_last,#1_d_stockcount,#1_currency 
Depot2_GBP:depot_cur_value_total,depot_p_change_total,depot_value_diff_total,depot_buy_value_total:t
Depot2_GBP:@2,<#1>,(.*)_name,#1_d_cur_value_total,#1_d_p_change_total,#1_d_value_diff_total,#1_close,#1_last,#1_d_stockcount,#1_currency

Die Kopfzeilen und -spalten werden mit breiteren Tabellenspalten versehen und hervorgehoben:

attr Depot2_Detail valueColumns { 'depot_cur_value_total' => 'colspan="2"','depot_buy_value_total' => 'colspan="4"'}
attr Depot2_Detail nameStyle style="font-weight:bold"

Formatierungen

Als Nächstes werden die Einzelwerte formatiert und bei Fremdwährungen umgerechnet. Dabei kann man auf spezielle Eigenschaften der Teildepots eingehen - beispielsweise wird im Nachfolgenden der _close-Wert durch den Kursprovider nicht für eine Aktie, sondern für 100 Aktien angegeben und muss entsprechend herunterskaliert werden.

attr Depot2_Detail valueFormat 	
{if($READING =~ /.*name/){$VALUE=~/.*\((.*)\).*/;;$VALUE=$1}
elsif($READING =~ /.*((cur_value_total)|(value_diff_total))/ && $DEVICE eq "Depot2_EUR"){$VALUE.="€"}
elsif($READING =~ /.*((cur_value_total)|(value_diff_total))/ && $DEVICE =~ /Depot2_(.*)/ ){$VALUE=(int($VALUE/Value("EUR_".$1)*100)/100)."€"}
elsif($READING =~ /.*p_change_total/){$VALUE=(int($VALUE*10)/10)."%"}
elsif($READING =~ /(.*)_close/ && $DEVICE eq "Depot2_GBP"){my $tr=(100*ReadingsVal("$DEVICE",$1."_last",1)/ReadingsVal("$DEVICE",$1."_close",1)-1);(int(1000*$tr)/10)."%% ".(($tr>0.01)?"🢁":(($tr>0.001)?"🢅":(($tr>-0.001)?"🢂":(($tr>-0.01)?"🢆":"🢃")))) }
elsif($READING =~ /(.*)_close/){my $tr=(ReadingsVal("$DEVICE",$1."_last",1)/ReadingsVal("$DEVICE",$1."_close",1)-1);(int(1000*$tr)/10)."%% ".(($tr>0.01)?"🢁":(($tr>0.001)?"🢅":(($tr>-0.001)?"🢂":(($tr>-0.01)?"🢆":"🢃")))) }}

Farben

Im letzten Schritt werden jetzt noch Farben hinzugegeben

attr Depot_Detail valueStyle 
{if($READING =~ /depot.*/ ){'style="background-color:#aaaaff;font-weight:bold;text-align:right"'}
elsif($READING =~ /.*cur_value_total/){'style="text-align:right"'}
elsif($READING =~ /.*((p_change_total)|(d_value_diff_total))/ && $VALUE<0){'style="color:red;text-align:right"'}
elsif($READING =~ /.*((p_change_total)|(d_value_diff_total))/ && $VALUE>0){'style="color:green;text-align:right"'}
elsif($READING =~ /(.*)_close/ && $DEVICE eq "Depot2_GBP"){my $tr=(100*ReadingsVal("$DEVICE",$1."_last",1)/ReadingsVal("$DEVICE",$1."_close",1)-1);'style="text-align:right;color:'. (($tr>0.01)?'green"':(($tr>0.001)?'#aaff44"':(($tr>-0.001)?'black"':(($tr>-0.01)?'#ffdd88"':'red"')))) }
elsif($READING =~ /(.*)_close/){my $tr=(ReadingsVal("$DEVICE",$1."_last",1)/ReadingsVal("$DEVICE",$1."_close",1)-1);'style="text-align:right;color:'.(($tr>0.01)?'green"':(($tr>0.001)?'#aaff44"':(($tr>-0.001)?'black"':(($tr>-0.01)?'#ffdd88"':'red"')))) }}