Gleitende Mittelwerte berechnen und loggen: Unterschied zwischen den Versionen

Aus FHEMWiki
(Weiterleitung nach Gleitende Mittelwerte erstellt)
(Änderung 11843 von Pahenning (Diskussion) rückgängig gemacht.)
Zeile 1: Zeile 1:
#WEITERLEITUNG [[Gleitende Mittelwerte]]
Für verschiedene Wettersensoren ist es oftmals wünschenswert relative Mittelwerte auszugeben oder in den Logs zu speichern und zu plotten. Die momentanen Winddaten eines KS300 sind oft stark schwankend. Hier wäre ein Mittelwert z.B. der letzten 2-3 Stunden interessant. Auch für die Außentemperatur ist anhand eines Mittelwertes der letzten 24 Stunden evtl. ein gewisser Trend der generellen Entwicklung der Temperatur ableitbar.
 
Mit Modulen wie rain oder avarage ist konzeptbedingt meist nur ein Mittelwert von fixen Zeiträumen (aktuelle Tag, Monat, etc.) möglich. Aus diesem Grund habe ich ein kleines Perl-Script geschrieben, welches eine Funktion bereitstellt, die über einen beliebigen Zeitraum, ausgehend von der aktuellen Zeit, über beliebige File- oder DbLogs Mittelwertw berechnet und ausgibt.
== Subroutine myAverage() in 99_MyUtils anlegen ==
Zuerst muss die Subroutine myAverage in die 99_MyUtils übernommen werden. Wenn noch nicht vorhanden, sollte die Datei dann so aussehen:
 
<nowiki>package main;
use strict;
use warnings;
use POSIX;
sub
MyUtils_Initialize($$)
{
my ($hash) = @_;
}
##########################################################
# myAverage
# berechnet den Mittelwert aus LogFiles über einen beliebigen Zeitraum
sub
myAverage($$$)
{
my ($offset,$logfile,$cspec) = @_;
my $period_s = strftime &quot;%Y-%m-%d\x5f%H:%M:%S&quot;, localtime(time-$offset);
my $period_e = strftime &quot;%Y-%m-%d\x5f%H:%M:%S&quot;, localtime;
my $oll = $attr{global}{verbose};
$attr{global}{verbose} = 0;
my @logdata = split(&quot;\n&quot;, fhem(&quot;get $logfile - - $period_s $period_e $cspec&quot;));
$attr{global}{verbose} = $oll;
my ($cnt, $cum, $avg) = (0)x3;
foreach (@logdata){
  my @line = split(&quot; &quot;, $_);
  if(defined $line[1] &amp;&amp; &quot;$line[1]&quot; ne &quot;&quot;){
  $cnt += 1;
  $cum += $line[1];
  }
}
if(&quot;$cnt&quot; &gt; 0){$avg = sprintf(&quot;%0.1f&quot;, $cum/$cnt)};
Log 4, (&quot;myAverage: File: $logfile, Field: $cspec, Period: $period_s bis $period_e, Count: $cnt, Cum: $cum, Average: $avg&quot;);
return $avg;
}
##########################################################
1;</nowiki>
 
== Funktion myAverage() aufrufen und nutzen ==
Jetzt kann die Funktion myAverage(&lt;offset&gt;, &lt;logfile&gt;, &lt;column-spec&gt;) ganz normal auf der fhem-Konsole (telnet localhost 7072) genutzt werden. Hier z.B. die Ausgabe des Mittelwertes des Windesensors eines KS300 über die letzten 3 Stunden (Angabe in 3*3600s) oder der Temperaturmittelwert der letzten 24h.
 
Mit FileLog:
 
<nowiki>fhem&gt; {myAverage(&quot;10800&quot;, &quot;FileLog_KS300&quot;, &quot;8:::&quot;)}
6.3
fhem&gt; {myAverage(&quot;86400&quot;, &quot;FileLog_KS300&quot;, &quot;4:::&quot;)}
-2.7
fhem&gt;</nowiki>
Mit DbLog:
 
<nowiki>fhem&gt; {myAverage(&quot;10800&quot;, &quot;myDbLog&quot;, &quot;KS300:wind::&quot;)}
5.9
fhem&gt; {myAverage(&quot;86400&quot;, &quot;myDbLog&quot;, &quot;KS300:temperature::&quot;)}
-2.7
fhem&gt;</nowiki>
Ähnlich ist die Verwendung in perl-Code in der fhem.cfg:
 
<nowiki>my $avg = myAverage(&quot;10800&quot;, &quot;FileLog_KS300&quot;, &quot;8:::&quot;);;\</nowiki>
Ein notify, welches bei jedem neuen Sensorwert die Mitteltemperatur der letzten 24h als event "average-temp xy" ins Logfile schreibt, schaut dann wie folgt aus:
 
<nowiki>define KS300_T_notify notify KS300:temperature.* {\
fhem('trigger KS300 average-temp: '.myAverage(&quot;86400&quot;, &quot;FileLog_KS300&quot;, &quot;4:::&quot;));;\
}</nowiki>
<!-- korrigiert lt. http://forum.fhem.de/index.php/topic,11622.msg170331.html#msg170331 -->
 
Analog dazu wäre mit den Winddaten zu verfahren.
 
== Eigenes Filelog und Plot ==
=== Definitionen ===
Ich schreibe ein komplett eigenes Logfile und lasse über eine spezielle gplot-Definition die Temperatur- und Winddaten loggen und plotten.
 
<nowiki>define KS300_W dummy
define KS300_W_notify notify KS300:wind.* {\
my $avg = myAverage(&quot;10800&quot;, &quot;FileLog_KS300&quot;, &quot;8:::&quot;);;\
my $event = sprintf(&quot;Wc:&#160;%%0.1f Wd:&#160;%%0.1f Wm:&#160;%%0.1f Wlh:&#160;%%0.1f&quot;, ReadingsVal(&quot;KS300&quot;,&quot;wind&quot;,&quot;0&quot;), ReadingsVal(&quot;KS300&quot;,&quot;W_avg_day&quot;,&quot;0&quot;), ReadingsVal(&quot;KS300&quot;,&quot;W_avg_month&quot;,&quot;0&quot;), $avg);;\
Log 2, (&quot;K300_W: Event: $event&quot;);;\
fhem(&quot;trigger KS300_W data: $event&quot;);;\
fhem(&quot;trigger KS300 average-wind: $avg&quot;);;\
}
define FileLog_KS300_W FileLog ./log/KS300_W-%Y.log KS300_W.*
attr FileLog_KS300_W logtype text
attr FileLog_KS300_W room Logs
define KS300_TH dummy
define KS300_TH_notify notify KS300:temperature.* {\
my $avg = myAverage(&quot;86400&quot;, &quot;FileLog_KS300&quot;, &quot;4:::&quot;);;\
my $event = sprintf(&quot;Tc:&#160;%%0.1f Hc:&#160;%%0.1f Tavg:&#160;%%0.1f&quot;, ReadingsVal(&quot;KS300&quot;,&quot;temperature&quot;,&quot;0&quot;), ReadingsVal(&quot;KS300&quot;,&quot;humidity&quot;,&quot;0&quot;), $avg);;\
Log 2, (&quot;K300_TH: Event: $event&quot;);;\
fhem(&quot;trigger KS300_TH data: $event&quot;);;\
fhem('trigger KS300 average-temp: '.$avg);;\
}
define FileLog_KS300_TH FileLog ./log/KS300_TH-%Y.log KS300_TH.*
attr FileLog_KS300_TH logtype text
attr FileLog_KS300_TH room Logs</nowiki>
Die Definitionen für die Plots schauen so aus:
 
<nowiki>define weblink_KS300_W weblink fileplot FileLog_KS300_W:ks300_wind:CURRENT
attr weblink_KS300_W label &quot;Wind - Min: $data{min1}, Max: $data{max1}, Last: $data{currval1}&quot;
attr weblink_KS300_W room Dachterasse
define weblink_KS300_TH weblink fileplot FileLog_KS300_TH:ks300_temphum:CURRENT
attr weblink_KS300_TH label &quot;Temperatur/Feuchte - Min: $data{min1}, Max: $data{max1}, Last: $data{currval1}&quot;
attr weblink_KS300_TH room Dachterasse
define weblink_KS300_R weblink fileplot FileLog_KS300:ks300_rain10:CURRENT
attr weblink_KS300_R label &quot;Regen - Min: $data{min1}, Max: $data{max1}, Last: $data{currval1}&quot;
attr weblink_KS300_R room Dachterasse</nowiki>
 
 
=== angepasste gplot-Dateien ===
Nun noch die speziellen gplot-Dateien.
ks300_wind.gplot
 
<nowiki>############################
# Display the wind values of a KS300.
# Corresponding FileLog definition:
# define &lt;filelogname&gt; FileLog ./log/KS300_W-%Y.log KS300_W.*
set terminal png transparent size &lt;SIZE&gt; crop
set output '&lt;OUT&gt;.png'
set xdata time
set timefmt &quot;%Y-%m-%d_%H:%M:%S&quot;
set xlabel &quot; &quot;
set ytics nomirror
#set y2tics
set ytics
set title '&lt;L1&gt;'
set grid xtics ytics
set yrange [0:]
set y2range [0:]
set ylabel &quot;Wind (aktuell) [km/h]&quot;
set y2label &quot;Wind (gemittelt) [km/h]&quot;
set format y2 &quot;%0.1f&quot;
#FileLog 5:Wc\x3a:0:
#FileLog 11:Wlh\x3a:0:
plot &quot;&lt;IN&gt;&quot; using 1:5 ls l7fill axes x1y1 title 'Wind (aktuell)' with lines,\
  &quot;&lt;IN&gt;&quot; using 1:11 ls l5 axes x1y2 title 'Wind (3h-Mittel)' with steps,\</nowiki>
ks300_temphum.gplot
 
<nowiki>############################
# Display the Temperature und Humidity values of a KS300.
# Corresponding FileLog definition:
# define &lt;filelogname&gt; FileLog ./log/KS300_TH-%Y.log KS300_TH.*
set terminal png transparent size &lt;SIZE&gt; crop
set output '&lt;OUT&gt;.png'
set xdata time
set timefmt &quot;%Y-%m-%d_%H:%M:%S&quot;
set xlabel &quot; &quot;
set ytics nomirror
set y2tics
#set ytics
set title '&lt;L1&gt;'
set grid xtics y2tics
set y2label &quot;Temperatur [°C]&quot;
set ylabel &quot;Luftfeuchte [%]&quot;
#FileLog 5:Tc\x3a:0:
#FileLog 9:Tavg\x3a:0:
#FileLog 7:Hc\x3a:0:
plot &quot;&lt;IN&gt;&quot; using 1:5 axes x1y2 ls l0 title 'Temperatur' with lines,\
  &quot;&lt;IN&gt;&quot; using 1:9 axes x1y2 ls l10 title 'Temperatur (24h-Mittel)' with lines,\
  &quot;&lt;IN&gt;&quot; using 1:7 axes x1y1 ls l2fill title 'Luftfeuchte' with lines</nowiki>
Den Plot für den Regen habe ich noch um Punkt-Plots für den israining-Status erweitert, so dass Punkte bei "yes" geplottet werden.
ks300_rain10.gplot
 
<nowiki>############################
# Display the Rain values of a KS300.
# Corresponding FileLog definition:
# define &lt;filelogname&gt; FileLog ./log/KS300-%Y.log KS300:T:.*
set terminal png transparent size &lt;SIZE&gt; crop
set output '&lt;OUT&gt;.png'
set xdata time
set timefmt &quot;%Y-%m-%d_%H:%M:%S&quot;
set xlabel &quot; &quot;
set ytics nomirror
#set y2tics
set ytics
set title '&lt;L1&gt;'
set grid xtics ytics
set y2range [0.5:1.5]
set y2tics (&quot;&quot; 0, &quot;Regen&quot; 1)
set pointsize 7
set ylabel &quot;Regen (l/m²)&quot;
set yrange [0:]
# Computing Rain/h and Rain/d values by accumulating the changes.
#FileLog 10:IR\x3a:0:delta-h
#FileLog 10:IR\x3a:0:delta-d
#FileLog 12:IR:0:$fld[11]=~&quot;yes&quot;?1:0
plot &quot;&lt;grep -v avg_ &lt;IN&gt; | perl -ane '\
    @a = split(\&quot;[_:]\&quot;, $F[0]);\
    if(defined($lh) &amp;&amp; $lh ne $a[1])\
    { printf(\&quot;${ld}_$lh:30:00&#160;%f\n\&quot;, $hv); $hv = 0; }\
    if($lv) { $hv += ($F[9]-$lv); }\
    $lh = $a[1]; $ld = $a[0]; $lv = $F[9];\
    END { printf(\&quot;${ld}_$lh:30:00&#160;%f\n\&quot;, $hv) }'&quot;\
  using 1:2 axes x1y1 ls l1fill title 'Regen pro Stunde' with histeps,\
  &quot;&lt;grep -v avg_ &lt;IN&gt; | perl -ane '\
    @a = split(\&quot;[_]\&quot;, $F[0]);\
    if(defined($ld) &amp;&amp; $ld ne $a[0]) {\
    printf(\&quot;${ld}_12:00:00&#160;%f\n\&quot;, $dv); $dv = 0; }\
    if($lv) { $dv += ($F[9]-$lv); }\
    $ld = $a[0]; $lv = $F[9];\
    END {printf(\&quot;${ld}_12:00:00&#160;%f\n\&quot;, $dv)}'&quot;\
  using 1:2 axes x1y1 ls l7 title 'Regen pro Tag' with histeps
  &quot;&lt;grep -v avg_ &lt;IN&gt; | awk '{print $1, $12==\&quot;yes\&quot;? 1&#160;: 0; }'&quot;\
  using 1:2 axes x1y2 ls l11fill title 'Regen aktuell' with points</nowiki>
Eventuell müssen in den gplots noch die Linienstile/Farben den eigenen Bedürfnissen angepasst werden. Ich verwende hier eigene Farben und Füllungen.
[[Kategorie:HOWTOS]]
[[Kategorie:Code Snippets]]

Version vom 29. Juli 2015, 05:32 Uhr

Für verschiedene Wettersensoren ist es oftmals wünschenswert relative Mittelwerte auszugeben oder in den Logs zu speichern und zu plotten. Die momentanen Winddaten eines KS300 sind oft stark schwankend. Hier wäre ein Mittelwert z.B. der letzten 2-3 Stunden interessant. Auch für die Außentemperatur ist anhand eines Mittelwertes der letzten 24 Stunden evtl. ein gewisser Trend der generellen Entwicklung der Temperatur ableitbar.

Mit Modulen wie rain oder avarage ist konzeptbedingt meist nur ein Mittelwert von fixen Zeiträumen (aktuelle Tag, Monat, etc.) möglich. Aus diesem Grund habe ich ein kleines Perl-Script geschrieben, welches eine Funktion bereitstellt, die über einen beliebigen Zeitraum, ausgehend von der aktuellen Zeit, über beliebige File- oder DbLogs Mittelwertw berechnet und ausgibt.

Subroutine myAverage() in 99_MyUtils anlegen

Zuerst muss die Subroutine myAverage in die 99_MyUtils übernommen werden. Wenn noch nicht vorhanden, sollte die Datei dann so aussehen:

package main;
use strict;
use warnings;
use POSIX;
sub
MyUtils_Initialize($$)
{
 my ($hash) = @_;
}
##########################################################
# myAverage
# berechnet den Mittelwert aus LogFiles über einen beliebigen Zeitraum
sub
myAverage($$$)
{
 my ($offset,$logfile,$cspec) = @_;
 my $period_s = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime(time-$offset);
 my $period_e = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime;
 my $oll = $attr{global}{verbose};
 $attr{global}{verbose} = 0; 
 my @logdata = split("\n", fhem("get $logfile - - $period_s $period_e $cspec"));
 $attr{global}{verbose} = $oll; 
 my ($cnt, $cum, $avg) = (0)x3;
 foreach (@logdata){
  my @line = split(" ", $_);
  if(defined $line[1] && "$line[1]" ne ""){
   $cnt += 1;
   $cum += $line[1];
  }
 }
 if("$cnt" > 0){$avg = sprintf("%0.1f", $cum/$cnt)};
 Log 4, ("myAverage: File: $logfile, Field: $cspec, Period: $period_s bis $period_e, Count: $cnt, Cum: $cum, Average: $avg");
 return $avg;
}
##########################################################
1;

Funktion myAverage() aufrufen und nutzen

Jetzt kann die Funktion myAverage(<offset>, <logfile>, <column-spec>) ganz normal auf der fhem-Konsole (telnet localhost 7072) genutzt werden. Hier z.B. die Ausgabe des Mittelwertes des Windesensors eines KS300 über die letzten 3 Stunden (Angabe in 3*3600s) oder der Temperaturmittelwert der letzten 24h.

Mit FileLog:

fhem> {myAverage("10800", "FileLog_KS300", "8:::")}
6.3
fhem> {myAverage("86400", "FileLog_KS300", "4:::")}
-2.7
fhem>

Mit DbLog:

fhem> {myAverage("10800", "myDbLog", "KS300:wind::")}
5.9
fhem> {myAverage("86400", "myDbLog", "KS300:temperature::")}
-2.7
fhem>

Ähnlich ist die Verwendung in perl-Code in der fhem.cfg:

my $avg = myAverage("10800", "FileLog_KS300", "8:::");;\

Ein notify, welches bei jedem neuen Sensorwert die Mitteltemperatur der letzten 24h als event "average-temp xy" ins Logfile schreibt, schaut dann wie folgt aus:

define KS300_T_notify notify KS300:temperature.* {\
 fhem('trigger KS300 average-temp: '.myAverage("86400", "FileLog_KS300", "4:::"));;\
}

Analog dazu wäre mit den Winddaten zu verfahren.

Eigenes Filelog und Plot

Definitionen

Ich schreibe ein komplett eigenes Logfile und lasse über eine spezielle gplot-Definition die Temperatur- und Winddaten loggen und plotten.

define KS300_W dummy
define KS300_W_notify notify KS300:wind.* {\
 my $avg = myAverage("10800", "FileLog_KS300", "8:::");;\
 my $event = sprintf("Wc: %%0.1f Wd: %%0.1f Wm: %%0.1f Wlh: %%0.1f", ReadingsVal("KS300","wind","0"), ReadingsVal("KS300","W_avg_day","0"), ReadingsVal("KS300","W_avg_month","0"), $avg);;\
 Log 2, ("K300_W: Event: $event");;\
 fhem("trigger KS300_W data: $event");;\
 fhem("trigger KS300 average-wind: $avg");;\
}
define FileLog_KS300_W FileLog ./log/KS300_W-%Y.log KS300_W.*
attr FileLog_KS300_W logtype text
attr FileLog_KS300_W room Logs
define KS300_TH dummy
define KS300_TH_notify notify KS300:temperature.* {\
 my $avg = myAverage("86400", "FileLog_KS300", "4:::");;\
 my $event = sprintf("Tc: %%0.1f Hc: %%0.1f Tavg: %%0.1f", ReadingsVal("KS300","temperature","0"), ReadingsVal("KS300","humidity","0"), $avg);;\
 Log 2, ("K300_TH: Event: $event");;\
 fhem("trigger KS300_TH data: $event");;\
 fhem('trigger KS300 average-temp: '.$avg);;\
}
define FileLog_KS300_TH FileLog ./log/KS300_TH-%Y.log KS300_TH.*
attr FileLog_KS300_TH logtype text
attr FileLog_KS300_TH room Logs

Die Definitionen für die Plots schauen so aus:

define weblink_KS300_W weblink fileplot FileLog_KS300_W:ks300_wind:CURRENT
attr weblink_KS300_W label "Wind - Min: $data{min1}, Max: $data{max1}, Last: $data{currval1}"
attr weblink_KS300_W room Dachterasse
define weblink_KS300_TH weblink fileplot FileLog_KS300_TH:ks300_temphum:CURRENT
attr weblink_KS300_TH label "Temperatur/Feuchte - Min: $data{min1}, Max: $data{max1}, Last: $data{currval1}"
attr weblink_KS300_TH room Dachterasse
define weblink_KS300_R weblink fileplot FileLog_KS300:ks300_rain10:CURRENT
attr weblink_KS300_R label "Regen - Min: $data{min1}, Max: $data{max1}, Last: $data{currval1}"
attr weblink_KS300_R room Dachterasse


angepasste gplot-Dateien

Nun noch die speziellen gplot-Dateien. ks300_wind.gplot

############################
# Display the wind values of a KS300.
# Corresponding FileLog definition:
# define <filelogname> FileLog ./log/KS300_W-%Y.log KS300_W.*
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set ytics nomirror
#set y2tics
set ytics
set title '<L1>'
set grid xtics ytics
set yrange [0:]
set y2range [0:]
set ylabel "Wind (aktuell) [km/h]"
set y2label "Wind (gemittelt) [km/h]"
set format y2 "%0.1f"
#FileLog 5:Wc\x3a:0:
#FileLog 11:Wlh\x3a:0:
plot "<IN>" using 1:5 ls l7fill axes x1y1 title 'Wind (aktuell)' with lines,\
   "<IN>" using 1:11 ls l5 axes x1y2 title 'Wind (3h-Mittel)' with steps,\

ks300_temphum.gplot

############################
# Display the Temperature und Humidity values of a KS300.
# Corresponding FileLog definition:
# define <filelogname> FileLog ./log/KS300_TH-%Y.log KS300_TH.*
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set ytics nomirror
set y2tics
#set ytics
set title '<L1>'
set grid xtics y2tics
set y2label "Temperatur [°C]"
set ylabel "Luftfeuchte [%]"
#FileLog 5:Tc\x3a:0:
#FileLog 9:Tavg\x3a:0:
#FileLog 7:Hc\x3a:0:
plot "<IN>" using 1:5 axes x1y2 ls l0 title 'Temperatur' with lines,\
   "<IN>" using 1:9 axes x1y2 ls l10 title 'Temperatur (24h-Mittel)' with lines,\
   "<IN>" using 1:7 axes x1y1 ls l2fill title 'Luftfeuchte' with lines

Den Plot für den Regen habe ich noch um Punkt-Plots für den israining-Status erweitert, so dass Punkte bei "yes" geplottet werden. ks300_rain10.gplot

############################
# Display the Rain values of a KS300.
# Corresponding FileLog definition:
# define <filelogname> FileLog ./log/KS300-%Y.log KS300:T:.*
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set ytics nomirror
#set y2tics
set ytics
set title '<L1>'
set grid xtics ytics
set y2range [0.5:1.5]
set y2tics ("" 0, "Regen" 1)
set pointsize 7
set ylabel "Regen (l/m²)"
set yrange [0:]
# Computing Rain/h and Rain/d values by accumulating the changes.
#FileLog 10:IR\x3a:0:delta-h
#FileLog 10:IR\x3a:0:delta-d
#FileLog 12:IR:0:$fld[11]=~"yes"?1:0
plot "<grep -v avg_ <IN> | perl -ane '\
    @a = split(\"[_:]\", $F[0]);\
    if(defined($lh) && $lh ne $a[1])\
     { printf(\"${ld}_$lh:30:00 %f\n\", $hv); $hv = 0; }\
    if($lv) { $hv += ($F[9]-$lv); }\
    $lh = $a[1]; $ld = $a[0]; $lv = $F[9];\
    END { printf(\"${ld}_$lh:30:00 %f\n\", $hv) }'"\
   using 1:2 axes x1y1 ls l1fill title 'Regen pro Stunde' with histeps,\
   "<grep -v avg_ <IN> | perl -ane '\
    @a = split(\"[_]\", $F[0]);\
    if(defined($ld) && $ld ne $a[0]) {\
     printf(\"${ld}_12:00:00 %f\n\", $dv); $dv = 0; }\
     if($lv) { $dv += ($F[9]-$lv); }\
     $ld = $a[0]; $lv = $F[9];\
     END {printf(\"${ld}_12:00:00 %f\n\", $dv)}'"\
   using 1:2 axes x1y1 ls l7 title 'Regen pro Tag' with histeps
   "<grep -v avg_ <IN> | awk '{print $1, $12==\"yes\"? 1 : 0; }'"\
   using 1:2 axes x1y2 ls l11fill title 'Regen aktuell' with points

Eventuell müssen in den gplots noch die Linienstile/Farben den eigenen Bedürfnissen angepasst werden. Ich verwende hier eigene Farben und Füllungen.