Beim Ali gibt es für teils nur 8 € einen "Mini-Fernseher" Namens Geek Magic Ultra, der aus einem ESP-Microcontroller und einem 240x240-Pixel-LCD besteht, und per USB-Port/-Netzteil mit Strom versorgt wird. Es gibt im Web zahlreiche Rezensionen vom dem Gadget und auch wie man es befreit und auf andere Firmware umflasht, damit es aus HomeAssistant heraus bespielt werden kann. Ich zeige euch im folgenden, wie man es mit der Originalfirmware als Anzeigegerät für FHEM nutzt! Weil sich der Access Point im Gerät mit GIFTV meldet, nenne ich das Gerät im folgenden GIFTV (es kann nämlich auch bewegte GIF-Animationen abspielen).
Prinzip
Das Gerät hat eine Funktion als Fotoalbum mit zeitgesteuertem Bildwechsler. Es ist auch möglich, eingebaute Funktionen wie z. B. die Anzeige von Wetter und Uhrzeit am Standort und irgendwelche Fotos im Wechsel zu zeigen. Um das GIFTV als Anzeigegerät für FHEM zu benutzen, muss man also "nur" in FHEM erzeugte Grafiken regelmäßig zum GIFTV hochladen, nachdem man die im GIFTV vorinstallierten Beispieldateien im Pictures-Menü mit CLEAR gelöscht hat.
Die Grafiken in FHEM werden mit meinem Modul RSS erzeugt und mit dem Perl-Befehl push2giftv() hochgeladen. Über ein wiederholendes at lassen sich dann aktualisierte Grafiken z. B. alle 10 Sekunden auf das GIFTV schieben. Mit mehreren RSS-Geräten können dann auch mehrere Anzeigen im Wechsel geschaltet werden.
push2giftv
Ich habe ein Modul 99_GIFTV.pm in /opt/fhem/FHEM erstellt mit folgendem Inhalt:
sub push2giftv($$) {
my ($name, $hostname) = @_;
# wrap code in eval to avoid lethal errors crashing FHEM
eval {
# make RSS generate the image
my $type = "jpg";
my ($mimetype, $image) = RSS_returnIMG($name, $type);
# parameters for GIFTV
my $url = "http://$hostname/doUpload?dir=%2Fimage%2F";
my $targetfilename = "$name.$type";
my $param = {
loglevel => 1,
url => $url,
method => "POST",
hideurl => 0,
noshutdown => 0,
callback => sub($$$) { Log3 $name, 1,"ERR:$_[1] DATA:".length($_[2]) },
};
# add image as multipart form data
HttpUtils_AddMultipartData($param, $image,
{"Content-Disposition" => "form-data; name=\"file\"; filename=\"$targetfilename\"", "Content-Type" => $mimetype }
);
# upload to GIFTV
HttpUtils_NonblockingGet($param);
};
if ($@) {
my $msg = $@;
chomp $msg;
Log3 $name, 2, $msg;
}
}
Dabei wird das seit 22.02.2026 um neue Funktionalität erweiterte (https://forum.fhem.de/index.php?topic=143975.0) HttpUtils verwendet.
Zu laden mit reload 99_GIFTV oder FHEM neu starten.
Der Befehl wird auf der FHEM-Kommandozeile wie folgt aufgerufen:
{ push2giftv("sensorfeed", "192.168.178.131") }
Das erste Argument ist der Name des RSS-Geräts und das zweite Argument die IP-Adresse oder der Hostname des GIFTV. Die JPEG-Datei auf dem GIFTV heißt dann so wie das RSS-Gerät.
RSS
Zum Testen habe ich ein simples RSS-Gerät angelegt.
define sensorfeed RSS jpg has.m11.saarlust.de /opt/fhem/conf/sensorfeed.layout
attr sensorfeed bgcolor ff0000
attr sensorfeed size 240x240
Die Konfigurationsdatei sensorfeed.layout sieht so aus:
# ------------------
# font
# ------------------
font /opt/fhem/conf/DroidSans.ttf
# ------------------
# bottom left corner
# ------------------
#
# date/time
#
rgb "c0c0c0"
pt 18
date 10 160
time 10 180
text 10 200 "Hallo, Welt!"
Damit wird das in der Anlage gezeigte Bild erzeugt.
Zukunft
Ich werde 99_GIFTV.pm gelegentlich im Contrib-Ordner bereitstellen.
Ich habe 4 von den Dingern und werde es vermutlich nutzen, um wesentliche Hausparameter an verschiedenen Stellen im Haus anzeigen zu lassen. Vermutlich muss ich dafür noch das RSS-Modul erweitern, um einfacher Widgets für so eine kleine Anzeige zeichnen zu können.
Habe mal einen Wiki-Artikel erstellt: Mini-Dashboard für PV-Anlage (https://wiki.fhem.de/wiki/Mini-Dashboard_f%C3%BCr_PV-Anlage)
@Boris, könntest du bitte die Code Abschnitte im Wiki nochmal überarbeiten bzw neu formatieren ?
Der eine oder andere Anfänger wird sich schwer tun diese direkt via copy & paste so zu übernehmen.
Und für Nanchahmer : Könntest du bitte auch deine verwendeten Readings Namen inkl. userReadings etwas näher erklären ?
Also etwa - BatteryPercent = Ladezustand der Batterie - SoC (das war mir noch klar) ,
aber was sind u.A. BatteryPowerSinkW , PowerSourceW ..... usw.
Hallo,
ich habe mich mit der Wiki-Formatierung gestern sehr schwer getan. Die Abschnitte sitzen zwischen <code><nowiki>...</nowiki></code>-Tags, aber das Ergebnis ist, wie es ist. Wie muss ich das richtig machen?
Die Readings sind doch im oberen Abschnitt erläutert. Was fehlt da fürs Verständnis denn genau?
Viele Grüße
Boris
Nabend Boris,
einfach bei anderen Wikieinträgen stöbern. Mach ich auch immer. Beispiel
<syntaxhighlight lang="perl">
define aggr.PV readingsProxy \
smainverter:SPOT_PDC_SUM:PVPowerSourceW \
smainverter:SPOT_EPVTODAY:PVEnergySourceWh \
smaem:SMAEM1234567890_Bezug_Wirkleistung:GridPowerSourceW \
smaem:SMAEM1234567890_Einspeisung_Wirkleistung:GridPowerSinkW \
calc.Netzbezug:smaem_SMAEM1234567890_Bezug_Wirkleistung_Zaehler_EnergyDay:GridEnergySourcekWh \
calc.Netzeinspeisung:smaem_SMAEM1234567890_Einspeisung_Wirkleistung_Zaehler_EnergyDay:GridEnergySinkkWh \
smainverter:BAT_P_CHARGE:BatteryPowerSinkW \
smainverter:BAT_P_DISCHARGE:BatteryPowerSourceW \
smainverter:ChargeStatus:BatteryPercent \
smainverter:BAT_LOADTODAY:BatteryEnergySinkWh \
smainverter:BAT_UNLOADTODAY:BatteryEnergySourceWh \
smaem:SMAEM1234567890_GridFreq:GridFrequencyHz
attr aggr.PV stateFormat PV: PVPowerSourceW W < PVEnergySourcekWh kWh | Haus: HousePowerSinkW W > HouseEnergySinkkWh kWh | Netz: GridPowerW W < GridEnergySourcekWh kWh > GridEnergySinkkWh kWh | Batterie: BatteryPowerW W BatteryPercent % < BatteryEnergySourcekWh kWh > BatteryEnergySinkkWh kWh
attr aggr.PV userReadings \
GridPowerW { ReadingsNum("aggr.PV", "GridPowerSourceW", 0) - ReadingsNum("aggr.PV", "GridPowerSinkW", 0) }, \
BatteryPowerW { ReadingsNum("aggr.PV", "BatteryPowerSourceW", 0) - ReadingsNum("aggr.PV", "BatteryPowerSinkW", 0) }, \
PVEnergySourcekWh { ReadingsNum("aggr.PV", "PVEnergySourceWh", 0)/1000.0 }, \
BatteryEnergySourcekWh { ReadingsNum("aggr.PV", "BatteryEnergySourceWh", 0)/1000.0 }, \
BatteryEnergySinkkWh { ReadingsNum("aggr.PV", "BatteryEnergySinkWh", 0)/1000.0 }, \
HousePowerSinkW { -( ReadingsNum("aggr.PV", "PVPowerSourceW", 0)+ReadingsNum("aggr.PV", "GridPowerW", 0)+ReadingsNum("aggr.PV", "BatteryPowerW", 0) ) }, \
HouseEnergySinkkWh { ReadingsNum("aggr.PV", "PVEnergySourcekWh", 0)-ReadingsNum("aggr.PV","GridEnergySinkkWh", 0)+ReadingsNum("aggr.PV", "GridEnergySourcekWh", 0)-ReadingsNum("aggr.PV", "BatteryEnergySinkkWh",0)+ReadingsNum("aggr.PV", "BatteryEnergySourcekWh", 0) \
}
</syntaxhighlight>
Gruß schwatter
Danke schwatter, hab auf dem Schlauch gestanden. Kaum macht man's richtig und schon geht's :-)
Zitat von: Dr. Boris Neubert am 30 März 2026, 20:26:19Kaum macht man's richtig und schon geht's :-)
:) und kaum liest man mal richtig den ganzen Text und nicht nur die Code Blöcke versteht man auch deine Readings ... :-[
Besteht Interesse am PV-Teil (smaem, smainverter, calc..*)? Gibt es Fragen, die noch nicht beantwortet sind? Gerne ergänze ich das Wiki, damit es nützlich ist.
Bei den Datenquellen wird wohl jeder User seinen eigenen Zoo an Hardware und Readingsnamen haben.
Ich persönlich kämpfe immer wieder mit den Parameter Bandwürmern der ui_Table svn Grafiken.
Daher vllt ein Link auf Damians Wiki Seite mit der Beschreibung der ring2 Parameter -> https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Aufbau_des_uiTable-Attributs
oder gleich den betroffenen Block kopieren :
Zitatring2 ($value1,$min1,$max1,$minColor1,$maxColor1,$desc1,$size,$colorFunc1,$decFont1, $value2,$min2,$max2,$minColor2,$maxColor2,$desc2,$colorFunc2,$decFont2, $lightness,$icon,$model)
$value1 # darzustellender Wert1
$min1 # minimaler Wert, optional, default=0
$max1 # maximaler Wert, optional, default=100
$minColor1 # Farbe (hue: 0-360) des kleinsten Wertes, optional, default = undef
$maxColor1 # Farbe (hue: 0-360) des maximalen Wertes, optional, default = undef
$desc1 # Beschreibung des Wertes, optional, default = undef
$size # Größe der Grafik, optional, default = 100
$colorFunc1 # Funktion, die zu einem Wert einen Farbwert (hue: 0-360) bestimmt, optional, default = undef
$decFontUnit1 # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>,<Einheit hinter dem Zahlenwert>", optional
$value2 # darzustellender Wert2
...
$decFontUnit2 # "<Anzahl der Nachkommastellen>,<Schrift-SVG-Attribute Wert>,<Schrift-SVG-Attribute Einheit>,<Einheit hinter dem Zahlenwert>", optional
$lightness # Helligkeit einzelner Elemente (0-100) "<ring>,<inner ring>,<minMax>,<unit>,<value>,<icon>", optional, default: "50,50,50,40,50,40"
$model # '<color gradient>,<min/max>,<inner ring>,<pointer>,<mode>'
# <color gradient>: "gradient" (undef),"nogradient" (1)
# <min/max>: Style-SVG-Attribute oder "nominmaxvalue" (undef), "minmaxvalue" (1)
# <inner ring>: Style-SVG-Attribute oder "innerring" (1), "noinnerring" (undef)
# <pointer>: Breite des Zeigers in Pixel, "nopointer" (undef)
# <mode>: "minmax" (undef), "negzeropos" (1), "zeronegpos" (2)
# alle Parameter sind optional, default keine Angaben: ',,,,,,'
Argumente für den zweiten Wert entsprechend den Argumenten des ersten Wertes
Wird $colorFunc... nicht angegeben, so wird der Farbwert zwischen $minColor... und $maxColor... linear interpoliert
Der Link zu den DOIF-Widgets war schon drin. Ich habe bei Layout noch auf den Abschnitt verwiesen.
Das könnte eine interessante Darstellung sein: https://forum.fhem.de/index.php?topic=144357.msg1361012#msg1361012
Allerdings wird vermutlich das Display zu klein dafür sein.
Ja sieht schön aus, aber bei "nur" 240x240 Pixel ist mir persönlich schon die Variante von Boris mit vier Ringen zu klein. Ich habe jetzt auf einen Ring umgebaut und wechsele diesen nach ein paar Sekunden.
Die Energy-Card ist wirklich schön! Auf 240x240 Pixeln aber nicht mehr lesbar. Das ist schade, weil das GIFTV animierte GIFs darstellen kann.
Für mich ist die Anzeige mit den 4 Ringen auch schwer lesbar. Ich werde noch an der Farbgebung der Werte rumdoktern. Ich habe noch eine Ringdarstellung mit Temperatur/Luftfeuchte auf 5 Ringen - im gelben Bereich sind diese deutlich besser lesbar als die roten und blauen Werte bei der Energie-Anzeige.
Da ich "nur" drei Ringe nutze hier mal ein Screenshot
(zum schnellen Testen benutze ich ui_State in einem DOIF )
Welches Icon ist der Strommast, den brauche ich für meine energy-card.
@Damian , das ist Solar Forcast -> https://forum.fhem.de/index.php?msg=1361124
aber da Heiko auch einen hatte , hänge ich beide hier an
Zitat von: Wzut am 03 April 2026, 15:44:13@Damian , das ist Solar Forcast -> https://forum.fhem.de/index.php?msg=1361124
aber da Heiko auch einen hatte , hänge ich beide hier an
Danke
Warum sind die noch nicht eingecheckt?
OMG, weil ich es erst gestern Abend aus SolarForcast geklaut habe und bevor ich das Wuppi im Icon Fred unterschiebe muss ich ja zumindest mal die Quelle höflich fragen ....
Zitat von: Wzut am 03 April 2026, 16:33:38OMG, weil ich es erst gestern Abend aus SolarForcast geklaut habe und bevor ich das Wuppi im Icon Fred unterschiebe muss ich ja zumindest mal die Quelle höflich fragen ....
Im Zeitalter der Energiewende wird es langsam an der Zeit einen Strommast in FHEM zu haben :)