2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-03 10:46:53 +00:00

60_Watches: contrib 0.5.0

git-svn-id: https://svn.fhem.de/fhem/trunk@21799 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2020-04-28 20:13:54 +00:00
parent 4d5a400ca1
commit 5d40c69bbc

View File

@ -3,7 +3,7 @@
######################################################################################################################### #########################################################################################################################
# 60_Watches.pm # 60_Watches.pm
# #
# (c) 2018 by Heiko Maaz # (c) 2018 - 2020 by Heiko Maaz
# e-mail: Heiko dot Maaz at t-online dot de # e-mail: Heiko dot Maaz at t-online dot de
# #
# This script is part of fhem. # This script is part of fhem.
@ -32,9 +32,11 @@ package main;
use strict; use strict;
use warnings; use warnings;
use Time::HiRes qw(time gettimeofday tv_interval);
# Versions History intern # Versions History intern
our %Watches_vNotesIntern = ( our %Watches_vNotesIntern = (
"0.5.0" => "28.04.2020 new values 'stopwatch', 'staticwatch' for attribute digitalDisplayPattern ",
"0.4.0" => "20.11.2018 text display ", "0.4.0" => "20.11.2018 text display ",
"0.3.0" => "19.11.2018 digital clock added ", "0.3.0" => "19.11.2018 digital clock added ",
"0.2.0" => "14.11.2018 station clock added ", "0.2.0" => "14.11.2018 station clock added ",
@ -48,9 +50,10 @@ sub Watches_Initialize($) {
my ($hash) = @_; my ($hash) = @_;
$hash->{DefFn} = "Watches_Define"; $hash->{DefFn} = "Watches_Define";
$hash->{SetFn} = "Watches_Set";
$hash->{AttrList} = "digitalColorBackground:colorpicker ". $hash->{AttrList} = "digitalColorBackground:colorpicker ".
"digitalColorDigits:colorpicker ". "digitalColorDigits:colorpicker ".
"digitalDisplayPattern:text,watch ". "digitalDisplayPattern:staticwatch,stopwatch,text,watch ".
"digitalDisplayText ". "digitalDisplayText ".
"modernColorBackground:colorpicker ". "modernColorBackground:colorpicker ".
"modernColorHand:colorpicker ". "modernColorHand:colorpicker ".
@ -75,7 +78,9 @@ sub Watches_Initialize($) {
$hash->{AttrFn} = "Watches_Attr"; $hash->{AttrFn} = "Watches_Attr";
$hash->{FW_hideDisplayName} = 1; # Forum 88667 $hash->{FW_hideDisplayName} = 1; # Forum 88667
# $hash->{FW_addDetailToSummary} = 1; # $hash->{FW_addDetailToSummary} = 1;
$hash->{FW_atPageEnd} = 1; # wenn 1 -> kein Longpoll ohne informid in HTML-Tag $hash->{FW_atPageEnd} = 1; # wenn 1 -> kein Longpoll ohne informid in HTML-Tag
return;
} }
@ -95,7 +100,50 @@ sub Watches_Define($$) {
readingsSingleUpdate($hash,"state", "initialized", 1); # Init für "state" readingsSingleUpdate($hash,"state", "initialized", 1); # Init für "state"
return undef; return;
}
################################################################
sub Watches_Set { ## no critic 'complexity'
my ($hash, @a) = @_;
return "\"set X\" needs at least an argument" if ( @a < 2 );
my $name = $a[0];
my $opt = $a[1];
my $prop = $a[2];
my $prop1 = $a[3];
my $prop2 = $a[4];
my $prop3 = $a[5];
my $model = $hash->{MODEL};
my $addp = AttrVal($name,"digitalDisplayPattern","watch");
return if(IsDisabled($name) || $addp !~ /stopwatch|staticwatch/);
my $setlist = "Unknown argument $opt, choose one of ";
$setlist .= "time " if($addp =~ /staticwatch/);
$setlist .= "start:noArg stop:noArg" if($addp =~ /stopwatch/);
if ($opt =~ /\bstart\b/) {
my $ms = int(time*1000);
readingsSingleUpdate($hash, "starttime", $ms, 0);
readingsSingleUpdate($hash, "state", "started", 1);
} elsif ($opt eq "stop") {
readingsSingleUpdate($hash, "state", "stopped", 1);
} elsif ($opt eq "time") {
return qq{The value(s) for "time" is invalid. Use parameter "hh mm ss" like "19 45 13".} if($prop>24 || $prop1>59 || $prop2>59);
readingsBeginUpdate ($hash);
readingsBulkUpdateIfChanged ($hash, "hour", $prop);
readingsBulkUpdateIfChanged ($hash, "minute", $prop1);
readingsBulkUpdate ($hash, "second", $prop2);
readingsEndUpdate ($hash,0);
} else {
return "$setlist";
}
return;
} }
################################################################ ################################################################
@ -109,28 +157,49 @@ sub Watches_Attr($$$$) {
# aName and aVal are Attribute name and value # aName and aVal are Attribute name and value
if ($cmd eq "set" && $hash->{MODEL} !~ /modern/i && $aName =~ /^modern.*/) { if ($cmd eq "set" && $hash->{MODEL} !~ /modern/i && $aName =~ /^modern.*/) {
return "\"$aName\" is only valid for Watches model \"Modern\""; return qq{"$aName" is only valid for Watches model "Modern"};
} }
if ($cmd eq "set" && $hash->{MODEL} !~ /station/i && $aName =~ /^station.*/) { if ($cmd eq "set" && $hash->{MODEL} !~ /station/i && $aName =~ /^station.*/) {
return "\"$aName\" is only valid for Watches model \"Station\""; return qq{"$aName" is only valid for Watches model "Station"};
} }
if ($cmd eq "set" && $hash->{MODEL} !~ /digital/i && $aName =~ /^digital.*/) { if ($cmd eq "set" && $hash->{MODEL} !~ /digital/i && $aName =~ /^digital.*/) {
return "\"$aName\" is only valid for Watches model \"Digital\""; return qq{"$aName" is only valid for Watches model "Digital"};
} }
if ($aName eq "disable") { if ($aName eq "disable") {
if($cmd eq "set") { if($cmd eq "set") {
$do = ($aVal) ? 1 : 0; $do = ($aVal) ? 1 : 0;
} }
$do = 0 if($cmd eq "del"); $do = 0 if($cmd eq "del");
$val = ($do == 1 ? "disabled" : "initialized"); $val = ($do == 1 ? "disabled" : "initialized");
readingsSingleUpdate($hash, "state", $val, 1); readingsSingleUpdate($hash, "state", $val, 1);
} }
if ($aName eq "digitalDisplayPattern") {
if($cmd eq "set") {
$do = $aVal;
}
$do = 0 if($cmd eq "del");
my @allrds = keys%{$defs{$name}{READINGS}};
for my $key(@allrds) {
# delete($defs{$name}{READINGS}{$key}) if($key ne "state");
next if($key =~ /\bstate\b/);
readingsDelete($hash,$key);
}
readingsSingleUpdate($hash, "state", "initialized", 1);
if($do =~ /\bstopwatch\b/) {
my $ms = int(time*1000);
readingsSingleUpdate($hash, "starttime", $ms, 0);
}
}
return undef; return;
} }
################################################################ ################################################################
@ -142,7 +211,7 @@ sub Watches_FwFn($$$$) {
my $dlink = "<a href=\"/fhem?detail=$d\">$alias</a>"; my $dlink = "<a href=\"/fhem?detail=$d\">$alias</a>";
my $ret = ""; my $ret = "";
$ret .= "<span>$dlink </span><br>" if(!AttrVal($d,"hideDisplayName",0)); $ret .= "<span>$dlink </span><br>" if(!AttrVal($d,"hideDisplayName",0));
if(IsDisabled($d)) { if(IsDisabled($d)) {
if(AttrVal($d,"hideDisplayName",0)) { if(AttrVal($d,"hideDisplayName",0)) {
$ret .= "Watch <a href=\"/fhem?detail=$d\">$d</a> is disabled"; $ret .= "Watch <a href=\"/fhem?detail=$d\">$d</a> is disabled";
@ -150,7 +219,7 @@ sub Watches_FwFn($$$$) {
$ret .= "<html>Watch is disabled</html>"; $ret .= "<html>Watch is disabled</html>";
} }
} else { } else {
$ret .= Watches_modern($d) if($hash->{MODEL} =~ /modern/i); $ret .= Watches_modern($d) if($hash->{MODEL} =~ /modern/i);
$ret .= Watches_station($d) if($hash->{MODEL} =~ /station/i); $ret .= Watches_station($d) if($hash->{MODEL} =~ /station/i);
$ret .= Watches_digital($d) if($hash->{MODEL} =~ /digital/i); $ret .= Watches_digital($d) if($hash->{MODEL} =~ /digital/i);
} }
@ -161,22 +230,43 @@ return $ret;
################################################################ ################################################################
sub Watches_digital($) { sub Watches_digital($) {
my ($d) = @_; my ($d) = @_;
my $hash = $defs{$d}; my $hash = $defs{$d};
my $hattr = AttrVal($d,"htmlattr","width='150' height='50'"); my $hattr = AttrVal($d,"htmlattr","width='150' height='50'");
my $bgc = AttrVal($d,"digitalColorBackground","C4C4C4"); my $bgc = AttrVal($d,"digitalColorBackground","C4C4C4");
my $dcd = AttrVal($d,"digitalColorDigits","000000"); my $dcd = AttrVal($d,"digitalColorDigits","000000");
my $ddp = AttrVal($d,"digitalDisplayPattern","watch"); my $addp = AttrVal($d,"digitalDisplayPattern","watch");
my $ddt = AttrVal($d,"digitalDisplayText","Play"); my $ddt = AttrVal($d,"digitalDisplayText","Play");
if($ddp eq "watch") { my $ddp = "###:##:##"; # dummy
$ddp = "##:##:##"; my $ws = "initialized";
$ddt = " "."((hours < 10) ? ' ' : '') + hours my ($h,$m,$s,$ms) = (0,0,0,0);
if($addp eq "watch") {
$ddp = "###:##:##";
$ddt = "((hours < 10) ? ' 0' : ' ') + hours
+ ':' + ((minutes < 10) ? '0' : '') + minutes + ':' + ((minutes < 10) ? '0' : '') + minutes
+ ':' + ((seconds < 10) ? '0' : '') + seconds"; + ':' + ((seconds < 10) ? '0' : '') + seconds";
} elsif($ddp eq "text") {
$ddp = "##########"; } elsif($addp eq "stopwatch") {
$ws = ReadingsVal($d, "state", "initialized");
$ddp = "###:##:##";
$ms = ReadingsVal($d, "starttime", 0);
$ddt = " "."((hours_$d < 10) ? ' 0' : ' ') + hours_$d
+ ':' + ((minutes_$d < 10) ? '0' : '') + minutes_$d
+ ':' + ((seconds_$d < 10) ? '0' : '') + seconds_$d";
} elsif($addp eq "staticwatch") {
$ddp = "###:##:##";
$h = ReadingsVal($d, "hour" , 0);
$m = ReadingsVal($d, "minute", 0);
$s = ReadingsVal($d, "second", 0);
$ddt = "((hours_$d < 10) ? ' 0' : ' ') + hours_$d
+ ':' + ((minutes_$d < 10) ? '0' : '') + minutes_$d
+ ':' + ((seconds_$d < 10) ? '0' : '') + seconds_$d";
} elsif($addp eq "text") {
my $txtc = length($ddt); my $txtc = length($ddt);
$ddp = ""; $ddp = "";
for(my $i = 0; $i <= $txtc; $i++) { for(my $i = 0; $i <= $txtc; $i++) {
$ddp .= "#"; $ddp .= "#";
} }
@ -202,7 +292,6 @@ sub Watches_digital($) {
SegmentDisplay_$d.SquaredCorner = 1; SegmentDisplay_$d.SquaredCorner = 1;
SegmentDisplay_$d.RoundedCorner = 2; SegmentDisplay_$d.RoundedCorner = 2;
function SegmentDisplay_$d(displayId_$d) { function SegmentDisplay_$d(displayId_$d) {
this.displayId_$d = displayId_$d; this.displayId_$d = displayId_$d;
this.pattern = '##:##:##'; this.pattern = '##:##:##';
@ -748,13 +837,41 @@ sub Watches_digital($) {
display_$d.colorOff = 'rgba(0, 0, 0, 0.1)'; display_$d.colorOff = 'rgba(0, 0, 0, 0.1)';
animate_$d(); animate_$d();
function animate_$d() { function animate_$d() {
var time = new Date(); var watchkind_$d = '$addp';
var hours = time.getHours();
var minutes = time.getMinutes(); if (watchkind_$d == 'watch') {
var seconds = time.getSeconds(); var time = new Date();
var value = $ddt; var hours = time.getHours();
var minutes = time.getMinutes();
var seconds = time.getSeconds();
}
if (watchkind_$d == 'staticwatch') {
var hours_$d = '$h';
var minutes_$d = '$m';
var seconds_$d = '$s';
}
if (watchkind_$d == 'stopwatch') {
var state_$d = '$ws';
startDate_$d = new Date($ms);
endDate_$d = new Date();
elapsesec_$d = ((endDate_$d.getTime() - startDate_$d.getTime()))/1000; // vergangene Millisekunden in Sekunden
var hours_$d = parseInt(elapsesec_$d / 3600);
elapsesec_$d -= hours_$d * 3600;
var minutes_$d = parseInt(elapsesec_$d / 60);
var seconds_$d = elapsesec_$d - minutes_$d * 60;
if (state_$d != 'started') {
hours_$d = 0;
minutes_$d = 0;
seconds_$d = 0;
// if (typeof seconds_$d === 'undefined') {s_$d = 0 } else {s_$d = seconds_$d};
}
}
var value = $ddt;
display_$d.setValue(value); display_$d.setValue(value);
window.setTimeout('animate_$d()', 100); window.setTimeout('animate_$d()', 100);
} }
@ -1407,16 +1524,53 @@ Die Uhren basieren auf Skripten dieser Seiten: <br>
<table> <table>
<colgroup> <col width=5%> <col width=95%> </colgroup> <colgroup> <col width=5%> <col width=95%> </colgroup>
<tr><td> <b>Modern</b> </td><td>: erstellt eine analoge Uhr im modernen Design </td></tr> <tr><td> <b>Modern</b> </td><td>: erstellt eine analoge Uhr im modernen Design </td></tr>
<tr><td> <b>Station</b> </td><td>: erstellt eine Bahnhofsuhr </td></tr> <tr><td> <b>Station</b> </td><td>: erstellt eine Bahnhofsuhr </td></tr>
<tr><td> <b>Digital</b> </td><td>: erstellt eine Digitalanzeige (Uhr oder Text) </td></tr> <tr><td> <b>Digital</b> </td><td>: erstellt eine Digitalanzeige (Uhr, Stoppuhr, statische Zeitanzeige oder Text) </td></tr>
</table> </table>
<br> <br>
<br> <br>
</ul> </ul>
<a name="WatchesSet"></a> <a name="WatchesSet"></a>
<b>Set</b> <ul>N/A</ul><br> <b>Set</b>
<ul>
<ul>
<a name="start"></a>
<li><b>start</b><br>
Startet die Stoppuhr. <br>
Dieses Set-Kommando ist nur bei einer Uhr vom Modell "digital" mit gesetztem Attribut
<b>digitalDisplayPattern = stopwatch</b> vorhanden.
</li>
<br>
<a name="stop"></a>
<li><b>stop</b><br>
Stoppt die Stoppuhr. <br>
Dieses Set-Kommando ist nur bei einer Uhr vom Modell "digital" mit gesetztem Attribut
<b>digitalDisplayPattern = stopwatch</b> vorhanden.
</li>
<br>
<a name="time"></a>
<li><b>time &lt;hh&gt; &lt;mm&gt; &lt;ss&gt; </b><br>
Setzt eine statische Zeitanzeige mit hh-Stunden(24), mm-Minuten und ss-Sekunden. <br>
Dieses Set-Kommando ist nur bei einer Uhr vom Modell "digital" mit gesetztem Attribut
<b>digitalDisplayPattern = staticwatch</b> vorhanden. <br><br>
<ul>
<b>Beispiel</b> <br>
set &lt;name&gt; time 8 15 3
</ul>
</li>
<br>
</ul>
</ul>
<br>
<a name="WatchesGet"></a> <a name="WatchesGet"></a>
<b>Get</b> <ul>N/A</ul><br> <b>Get</b> <ul>N/A</ul><br>
@ -1563,31 +1717,34 @@ Die Uhren basieren auf Skripten dieser Seiten: <br>
Farbe der Balkenanzeige in einer Digitaluhr. Farbe der Balkenanzeige in einer Digitaluhr.
</li> </li>
<br> <br>
<a name="digitalDisplayPattern"></a> <a name="digitalDisplayPattern"></a>
<li><b>digitalDisplayPattern [text | watch]</b><br> <li><b>digitalDisplayPattern [staticwatch | stopwatch | text | watch]</b><br>
Umschaltung der Digitalanzeige zwischen Uhrenmodus (default) und Textanzeige. Der anzuzeigende Text Umschaltung der Digitalanzeige zwischen einer Uhr (default), einer Stoppuhr, statischen Zeitanzeige oder Textanzeige.
kann mit dem Attribut "digitalDisplayText" definiert werden. <br><br> Der anzuzeigende Text im Modus Textanzeige kann mit dem Attribut <b>digitalDisplayText</b> definiert werden. <br><br>
<ul> <ul>
<table> <table>
<colgroup> <col width=5%> <col width=95%> </colgroup> <colgroup> <col width=5%> <col width=95%> </colgroup>
<tr><td> <b>watch</b> </td><td>: Anzeige einer Uhr </td></tr> <tr><td> <b>staticwatch</b> </td><td>: statische Zeitanzeige </td></tr>
<tr><td> <b>text</b> </td><td>: Anzeige eines definierbaren Textes </td></tr> <tr><td> <b>stopwatch</b> </td><td>: Stoppuhr </td></tr>
<tr><td> <b>text</b> </td><td>: Anzeige eines definierbaren Textes </td></tr>
<tr><td> <b>watch</b> </td><td>: Uhr </td></tr>
</table> </table>
</ul> </ul>
<br> <br>
<br>
</li> </li>
<a name="digitalDisplayText"></a> <a name="digitalDisplayText"></a>
<li><b>digitalDisplayText</b><br> <li><b>digitalDisplayText</b><br>
Ist das Attribut "digitalDisplayPattern = text" gesetzt, kann mit "digitalDisplayText" der Ist das Attribut "digitalDisplayPattern = text" gesetzt, kann mit "digitalDisplayText" der
anzuzeigende Text eingestellt werden. Im Default wird "Play" anzgezeigt. <br> anzuzeigende Text eingestellt werden. Per Default ist "Play" eingestellt. <br>
Mit der Siebensegmentanzeige können Ziffern, Bindestrich, Unterstrich und die Buchstaben Mit der Siebensegmentanzeige können Ziffern, Bindestrich, Unterstrich und die Buchstaben
A, b, C, d, E, F, H, L, n, o, P, r, t, U und Y angezeigt werden. A, b, C, d, E, F, H, L, n, o, P, r, t, U und Y angezeigt werden.
So lassen sich außer Zahlen auch kurze Texte wie Error, HELP, run oder PLAY anzeigen. So lassen sich außer Zahlen auch kurze Texte wie Error, HELP, run oder PLAY anzeigen.
</li> </li>
<br> <br>
</ul> </ul>
</ul> </ul>
@ -1621,14 +1778,51 @@ Die Uhren basieren auf Skripten dieser Seiten: <br>
<colgroup> <col width=5%> <col width=95%> </colgroup> <colgroup> <col width=5%> <col width=95%> </colgroup>
<tr><td> <b>Modern</b> </td><td>: erstellt eine analoge Uhr im modernen Design </td></tr> <tr><td> <b>Modern</b> </td><td>: erstellt eine analoge Uhr im modernen Design </td></tr>
<tr><td> <b>Station</b> </td><td>: erstellt eine Bahnhofsuhr </td></tr> <tr><td> <b>Station</b> </td><td>: erstellt eine Bahnhofsuhr </td></tr>
<tr><td> <b>Digital</b> </td><td>: erstellt eine Digitalanzeige (Uhr oder Text) </td></tr> <tr><td> <b>Digital</b> </td><td>: erstellt eine Digitalanzeige (Uhr, Stoppuhr, statische Zeitanzeige oder Text) </td></tr>
</table> </table>
<br> <br>
<br> <br>
</ul> </ul>
<a name="WatchesSet"></a> <a name="WatchesSet"></a>
<b>Set</b> <ul>N/A</ul><br> <b>Set</b>
<ul>
<ul>
<a name="start"></a>
<li><b>start</b><br>
Startet die Stoppuhr. <br>
Dieses Set-Kommando ist nur bei einer Uhr vom Modell "digital" mit gesetztem Attribut
<b>digitalDisplayPattern = stopwatch</b> vorhanden.
</li>
<br>
<a name="stop"></a>
<li><b>stop</b><br>
Stoppt die Stoppuhr. <br>
Dieses Set-Kommando ist nur bei einer Uhr vom Modell "digital" mit gesetztem Attribut
<b>digitalDisplayPattern = stopwatch</b> vorhanden.
</li>
<br>
<a name="time"></a>
<li><b>time &lt;hh&gt; &lt;mm&gt; &lt;ss&gt; </b><br>
Setzt eine statische Zeitanzeige mit hh-Stunden(24), mm-Minuten und ss-Sekunden. <br>
Dieses Set-Kommando ist nur bei einer Uhr vom Modell "digital" mit gesetztem Attribut
<b>digitalDisplayPattern = staticwatch</b> vorhanden. <br><br>
<ul>
<b>Beispiel</b> <br>
set &lt;name&gt; time 8 15 3
</ul>
</li>
<br>
</ul>
</ul>
<br>
<a name="WatchesGet"></a> <a name="WatchesGet"></a>
<b>Get</b> <ul>N/A</ul><br> <b>Get</b> <ul>N/A</ul><br>
@ -1777,23 +1971,26 @@ Die Uhren basieren auf Skripten dieser Seiten: <br>
<br> <br>
<a name="digitalDisplayPattern"></a> <a name="digitalDisplayPattern"></a>
<li><b>digitalDisplayPattern [text | watch]</b><br> <li><b>digitalDisplayPattern [staticwatch | stopwatch | text | watch]</b><br>
Umschaltung der Digitalanzeige zwischen Uhrenmodus (default) und Textanzeige. Der anzuzeigende Text Umschaltung der Digitalanzeige zwischen einer Uhr (default), einer Stoppuhr, statischen Zeitanzeige oder Textanzeige.
kann mit dem Attribut "digitalDisplayText" definiert werden. <br><br> Der anzuzeigende Text im Modus Textanzeige kann mit dem Attribut <b>digitalDisplayText</b> definiert werden. <br><br>
<ul> <ul>
<table> <table>
<colgroup> <col width=5%> <col width=95%> </colgroup> <colgroup> <col width=5%> <col width=95%> </colgroup>
<tr><td> <b>watch</b> </td><td>: Anzeige einer Uhr </td></tr> <tr><td> <b>staticwatch</b> </td><td>: statische Zeitanzeige </td></tr>
<tr><td> <b>text</b> </td><td>: Anzeige eines definierbaren Textes </td></tr> <tr><td> <b>stopwatch</b> </td><td>: Stoppuhr </td></tr>
<tr><td> <b>text</b> </td><td>: Anzeige eines definierbaren Textes </td></tr>
<tr><td> <b>watch</b> </td><td>: Uhr </td></tr>
</table> </table>
</ul> </ul>
<br> <br>
<br>
</li> </li>
<a name="digitalDisplayText"></a> <a name="digitalDisplayText"></a>
<li><b>digitalDisplayText</b><br> <li><b>digitalDisplayText</b><br>
Ist das Attribut "digitalDisplayPattern = text" gesetzt, kann mit "digitalDisplayText" der Ist das Attribut "digitalDisplayPattern = text" gesetzt, kann mit "digitalDisplayText" der
anzuzeigende Text eingestellt werden. Im Default wird "Play" anzgezeigt. <br> anzuzeigende Text eingestellt werden. Per Default ist "Play" eingestellt. <br>
Mit der Siebensegmentanzeige können Ziffern, Bindestrich, Unterstrich und die Buchstaben Mit der Siebensegmentanzeige können Ziffern, Bindestrich, Unterstrich und die Buchstaben
A, b, C, d, E, F, H, L, n, o, P, r, t, U und Y angezeigt werden. A, b, C, d, E, F, H, L, n, o, P, r, t, U und Y angezeigt werden.
So lassen sich außer Zahlen auch kurze Texte wie Error, HELP, run oder PLAY anzeigen. So lassen sich außer Zahlen auch kurze Texte wie Error, HELP, run oder PLAY anzeigen.