Digitaler Bilderrahmen mit lcd4linux: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
Zeile 2: | Zeile 2: | ||
Auf der Seite [[Digitaler Bilderrahmen]] wird ein Ansatz beschrieben, der mit komplexeren DPF arbeitet. | Auf der Seite [[Digitaler Bilderrahmen]] wird ein Ansatz beschrieben, der mit komplexeren DPF arbeitet. | ||
=Voraussetzungen= | |||
*Digitaler Bilderrahmen, der über lcd4linux ansteuerbar ist, z.B. Samsung SPF85H. | |||
*Raspberry Pi mit LAN oder WLAN Interface. | |||
'''Achtung: Prinzipiell ließe sich das lcd4linux auch auf FHEM-Rechner installieren - allerdings sind Performance-Probleme auf den hier verwendeten Kleinstrechnern nicht ausgeschlossen.''' | |||
=Installation= | |||
Auf dem Raspberry Pi sind die Anwendungen ''socat'', ''ImageMagick'' und ''lcd4linux'' zu installieren. ''lcd4linux'' sollte beim Hochfahren des Raspberry Pi automatisch starten. | |||
==Werte holen von FHEM== | |||
Zunächst wird (z.B. im Verzeichnis /opt/fhem) eine Skriptdatei ''getFHEM.sh'' angelegt. | |||
#!/bin/bash | |||
# | |||
# script to read FHEM values | |||
# | |||
# Prof.Dr. Peter A. Henning, July 2014 | |||
# | |||
round() | |||
{ | |||
echo $(LANG=C printf %.$2f $(echo "scale=$2;(((10^$2)*$1)+0.5)/(10^$2)" | bc)) | |||
}; | |||
# | |||
arg=$1 | |||
# | |||
#-- get FHEM values | |||
alarm='{Value("WZ.SPF.alarm")."|"}' | |||
warn='{Value("WZ.SPF.warn")."|"}' | |||
scharf='{AttrVal("AAA","level6xec","")}' | |||
aowb='{Value("A.OWB")}' | |||
aowbt='{Value("A.OWB.T")}' | |||
wzowm='{Value("WZ.OWM")}' | |||
nt5000a='{$defs{"nt5000"}{"STATE"}}' | |||
nt5000b='{$defs{"nt5000"}{"READINGS"}{"Wd"}{"VAL"}}' | |||
everb='{Value("E.Verb")}' | |||
gverb='{Value("G.Verb")}' | |||
FHEM=`echo -e "$alarm;$warn;$scharf;$aowb;$aowbt;$wzowm;$everb;$gverb;$nt5000b;$nt5000a" | socat -t50 - TCP:<IP-Adresse von FHEM> | |||
# | |||
#--isolate separate values | |||
alarm=`echo $FHEM | cut -d '|' -f1` | |||
warn=`echo $FHEM | cut -d '|' -f2 | sed 's/^ *//'` | |||
FHEM3=`echo $FHEM | cut -d '|' -f3` | |||
scharf=`echo $FHEM3 | awk '{print $1}' | sed 's/sharp/scharf/'` | |||
rHa=$(round `echo $FHEM3 | awk '{print $3}'` 0) | |||
Ta=$(round `echo $FHEM3 | awk '{print $15}'` 1) | |||
pa=$(round `echo $FHEM3 | awk '{print $12}'` 0) | |||
rHi=$(round `echo $FHEM3 | awk '{print $18}'` 0) | |||
Ti=$(round `echo $FHEM3 | awk '{print $21}'` 1) | |||
evp=$(round `echo $FHEM3 | awk '{print $27}'` 2) | |||
evw=$(round `echo $FHEM3 | awk '{print $24}'` 1) | |||
gvp=$(round `echo $FHEM3 | awk '{print $36}'` 2) | |||
gvw=$(round `echo $FHEM3 | awk '{print $33}'` 2) | |||
pvpraw=`echo $FHEM3 | awk '{print $42}'` | |||
pvp=$(round $pvpraw 2) | |||
pvw=$(round `echo $FHEM3 | awk '{print $41}'` 1) | |||
# | |||
if [ "$arg" == "show" ]; then | |||
echo "alarm=$alarm warn=$warn => $scharf; Climate=>$rHa $Ta $pa $rHi $Ti; PV=> $pvpraw $pvp $pvw; EV=> $evp $evw; GV=>$gvp $gvw" | |||
fi | |||
# | |||
#--create bar graphs | |||
./createAlarm.sh "$alarm" "$warn" $scharf & | |||
./createBar.sh $pvw 35 kWh $pvp kW 200x150 green PV solar.png & | |||
./createBar.sh $evw 35 kWh $evp kW 200x150 blue EV strom.png & | |||
./createBar.sh $gvw 20 m³ $gvp m³/h 200x150 red GV gas.png & | |||
./createTemp.sh $Ti $rHi $Ta $rHa $pa & | |||
./createDate.sh & | |||
Diese Datei wird nun mit ''crontab -e'' in die Tabelle des ''cron''-Dämons eingetragen. Mit der folgenden Zeile wird das Skript automatisch jede Minute ausgeführt. | |||
* * * * * /opt/fhem/getFHEM.sh | |||
==Erzeugen von Balkendiagrammen== | |||
Hierzu wird (z.B. im Verzeichnis /opt/fhem) eine Skriptdatei ''createBar.sh'' angelegt: | |||
!/bin/bash | |||
# | |||
# script to produce a bar graph PNG file using ImageMagick convert | |||
# | |||
# Prof.Dr. Peter A. Henning, July 2014 | |||
# | |||
# parameters for bar graph | |||
value=$1 | |||
maxim=$2 | |||
unita=$3 | |||
# parameters for top number | |||
numbr=$4 | |||
unitb=$5 | |||
# picture size, color scheme, label and filename | |||
picsz=$6 | |||
color=$7 | |||
label=$8 | |||
fname=$9 | |||
# color scheme | |||
case $color in | |||
"green" ) | |||
gradient1="gradient:chartreuse-green" | |||
gradient2="gradient:chartreuse1-chartreuse3" | |||
labcol1="springgreen4" | |||
labcol2="darkolivegreen" | |||
labcol3="darkslategray" | |||
labcol4="white" | |||
;; | |||
"red" ) | |||
gradient1="gradient:lightsalmon-red" | |||
gradient2="gradient:lightsalmon1-lightsalmon3" | |||
labcol1="firebrick4" | |||
labcol2="lightsalmon3" | |||
labcol3="indianred4" | |||
labcol4="white" | |||
;; | |||
"blue" ) | |||
gradient1="gradient:cyan-blue" | |||
gradient2="gradient:cyan1-cyan3" | |||
labcol1="blue" | |||
labcol2="slateblue4" | |||
labcol3="darkslateblue" | |||
labcol4="white" | |||
;; | |||
esac | |||
# | |||
#-- bar graph | |||
bvalue="$1 $3" | |||
xvalue=`echo "($1*248)/$2+36" | bc` | |||
lvalue=`echo "$xvalue-20" | bc` | |||
rvalue=`echo "$xvalue+20" | bc` | |||
# | |||
#-- position and color bar graph number | |||
if [ $xvalue -lt 160 ]; then | |||
labx="0x0+160+35" | |||
labcolf=$labcol1 | |||
labcols=$labcol2 | |||
else | |||
labx="0x0+40+35" | |||
labcolf=$labcol3 | |||
labcols=$labcol4 | |||
fi | |||
# | |||
#-- formatted top value | |||
tvalue="$4 $5" | |||
# | |||
convert -size 320x90 canvas:none -stroke snow4 -size 1x90 -tile gradient:white-snow4 \ | |||
-draw "roundrectangle 16, 5, 304, 85 20,40" +tile -fill snow \ | |||
-draw "roundrectangle 264, 5, 304, 85 20,40" -tile $gradient1 \ | |||
-draw "roundrectangle 16, 5, $rvalue, 85 20,40" -tile $gradient2 \ | |||
-draw "roundrectangle $lvalue, 5, $rvalue, 85 20,40" +tile -fill none \ | |||
-draw "roundrectangle 264, 5, 304, 85 20,40" -strokewidth 2 \ | |||
-draw "roundrectangle 16, 5, 304, 85 20,40" \ | |||
\( +clone -background snow4 \ | |||
-shadow 80x3+3+3 \) \ | |||
+swap -background none -layers merge \ | |||
\( +size -font Helvetica \ | |||
-pointsize 25 -strokewidth 1 -fill $labcolf label:"$bvalue" -trim -repage $labx \ | |||
\( +clone -background $labcols -shadow 80x1+2+2 \) \ | |||
+swap -background none -layers merge \) \ | |||
-insert 1 -layers merge \ | |||
\( +size -font Helvetica \ | |||
-pointsize 25 -strokewidth 1 -fill black label:"$label" -trim -repage 0x0+20+92 \ | |||
\( +clone -background gray40 -shadow 80x1+2+2 \) \ | |||
+swap -background none -layers merge \) \ | |||
-insert 1 -layers merge \ | |||
\( +size -font Helvetica \ | |||
-pointsize 65 -strokewidth 1 -fill red label:"$tvalue" -trim +repage \ | |||
\( +clone -background firebrick3 -shadow 80x3+3+3 \) \ | |||
+swap -background none -layers merge \) \ | |||
-insert 0 -gravity center -append -background white -gravity center -extent 320x240 \ | |||
b_$fname | |||
# | |||
#-- correct the size | |||
convert b_$fname -resize $6 $fname | |||
[[Kategorie:HOWTOS]] | [[Kategorie:HOWTOS]] |
Version vom 9. September 2014, 12:43 Uhr
Diese Seite beschreibt die Verwendung eines Digitalen Bilderrahmens (DPF) als Display für FHEM. Die Anbindung erfolgt dabei an einen separaten Raspberry Pi, auf welchem lcd4linux läuft. Dies ermöglicht die Verwendung einer Vielzahl von verschiedenen preiswerten Displays, die keine großartigen Fähigkeiten aufweisen müssen.
Auf der Seite Digitaler Bilderrahmen wird ein Ansatz beschrieben, der mit komplexeren DPF arbeitet.
Voraussetzungen
- Digitaler Bilderrahmen, der über lcd4linux ansteuerbar ist, z.B. Samsung SPF85H.
- Raspberry Pi mit LAN oder WLAN Interface.
Achtung: Prinzipiell ließe sich das lcd4linux auch auf FHEM-Rechner installieren - allerdings sind Performance-Probleme auf den hier verwendeten Kleinstrechnern nicht ausgeschlossen.
Installation
Auf dem Raspberry Pi sind die Anwendungen socat, ImageMagick und lcd4linux zu installieren. lcd4linux sollte beim Hochfahren des Raspberry Pi automatisch starten.
Werte holen von FHEM
Zunächst wird (z.B. im Verzeichnis /opt/fhem) eine Skriptdatei getFHEM.sh angelegt.
#!/bin/bash # # script to read FHEM values # # Prof.Dr. Peter A. Henning, July 2014 # round() { echo $(LANG=C printf %.$2f $(echo "scale=$2;(((10^$2)*$1)+0.5)/(10^$2)" | bc)) }; # arg=$1 # #-- get FHEM values alarm='{Value("WZ.SPF.alarm")."|"}' warn='{Value("WZ.SPF.warn")."|"}' scharf='{AttrVal("AAA","level6xec","")}' aowb='{Value("A.OWB")}' aowbt='{Value("A.OWB.T")}' wzowm='{Value("WZ.OWM")}' nt5000a='{$defs{"nt5000"}{"STATE"}}' nt5000b='{$defs{"nt5000"}{"READINGS"}{"Wd"}{"VAL"}}' everb='{Value("E.Verb")}' gverb='{Value("G.Verb")}' FHEM=`echo -e "$alarm;$warn;$scharf;$aowb;$aowbt;$wzowm;$everb;$gverb;$nt5000b;$nt5000a" | socat -t50 - TCP:<IP-Adresse von FHEM> # #--isolate separate values alarm=`echo $FHEM | cut -d '|' -f1` warn=`echo $FHEM | cut -d '|' -f2 | sed 's/^ *//'` FHEM3=`echo $FHEM | cut -d '|' -f3` scharf=`echo $FHEM3 | awk '{print $1}' | sed 's/sharp/scharf/'` rHa=$(round `echo $FHEM3 | awk '{print $3}'` 0) Ta=$(round `echo $FHEM3 | awk '{print $15}'` 1) pa=$(round `echo $FHEM3 | awk '{print $12}'` 0) rHi=$(round `echo $FHEM3 | awk '{print $18}'` 0) Ti=$(round `echo $FHEM3 | awk '{print $21}'` 1) evp=$(round `echo $FHEM3 | awk '{print $27}'` 2) evw=$(round `echo $FHEM3 | awk '{print $24}'` 1) gvp=$(round `echo $FHEM3 | awk '{print $36}'` 2) gvw=$(round `echo $FHEM3 | awk '{print $33}'` 2) pvpraw=`echo $FHEM3 | awk '{print $42}'` pvp=$(round $pvpraw 2) pvw=$(round `echo $FHEM3 | awk '{print $41}'` 1) # if [ "$arg" == "show" ]; then echo "alarm=$alarm warn=$warn => $scharf; Climate=>$rHa $Ta $pa $rHi $Ti; PV=> $pvpraw $pvp $pvw; EV=> $evp $evw; GV=>$gvp $gvw" fi # #--create bar graphs ./createAlarm.sh "$alarm" "$warn" $scharf & ./createBar.sh $pvw 35 kWh $pvp kW 200x150 green PV solar.png & ./createBar.sh $evw 35 kWh $evp kW 200x150 blue EV strom.png & ./createBar.sh $gvw 20 m³ $gvp m³/h 200x150 red GV gas.png & ./createTemp.sh $Ti $rHi $Ta $rHa $pa & ./createDate.sh &
Diese Datei wird nun mit crontab -e in die Tabelle des cron-Dämons eingetragen. Mit der folgenden Zeile wird das Skript automatisch jede Minute ausgeführt.
- * * * * /opt/fhem/getFHEM.sh
Erzeugen von Balkendiagrammen
Hierzu wird (z.B. im Verzeichnis /opt/fhem) eine Skriptdatei createBar.sh angelegt:
!/bin/bash # # script to produce a bar graph PNG file using ImageMagick convert # # Prof.Dr. Peter A. Henning, July 2014 # # parameters for bar graph value=$1 maxim=$2 unita=$3 # parameters for top number numbr=$4 unitb=$5 # picture size, color scheme, label and filename picsz=$6 color=$7 label=$8 fname=$9
# color scheme case $color in "green" ) gradient1="gradient:chartreuse-green" gradient2="gradient:chartreuse1-chartreuse3" labcol1="springgreen4" labcol2="darkolivegreen" labcol3="darkslategray" labcol4="white" ;; "red" ) gradient1="gradient:lightsalmon-red" gradient2="gradient:lightsalmon1-lightsalmon3" labcol1="firebrick4" labcol2="lightsalmon3" labcol3="indianred4" labcol4="white" ;; "blue" ) gradient1="gradient:cyan-blue" gradient2="gradient:cyan1-cyan3" labcol1="blue" labcol2="slateblue4" labcol3="darkslateblue" labcol4="white" ;; esac # #-- bar graph bvalue="$1 $3" xvalue=`echo "($1*248)/$2+36" | bc` lvalue=`echo "$xvalue-20" | bc` rvalue=`echo "$xvalue+20" | bc` # #-- position and color bar graph number if [ $xvalue -lt 160 ]; then labx="0x0+160+35" labcolf=$labcol1 labcols=$labcol2 else labx="0x0+40+35" labcolf=$labcol3 labcols=$labcol4 fi # #-- formatted top value tvalue="$4 $5" # convert -size 320x90 canvas:none -stroke snow4 -size 1x90 -tile gradient:white-snow4 \ -draw "roundrectangle 16, 5, 304, 85 20,40" +tile -fill snow \ -draw "roundrectangle 264, 5, 304, 85 20,40" -tile $gradient1 \ -draw "roundrectangle 16, 5, $rvalue, 85 20,40" -tile $gradient2 \ -draw "roundrectangle $lvalue, 5, $rvalue, 85 20,40" +tile -fill none \ -draw "roundrectangle 264, 5, 304, 85 20,40" -strokewidth 2 \ -draw "roundrectangle 16, 5, 304, 85 20,40" \ \( +clone -background snow4 \ -shadow 80x3+3+3 \) \ +swap -background none -layers merge \ \( +size -font Helvetica \ -pointsize 25 -strokewidth 1 -fill $labcolf label:"$bvalue" -trim -repage $labx \ \( +clone -background $labcols -shadow 80x1+2+2 \) \ +swap -background none -layers merge \) \ -insert 1 -layers merge \ \( +size -font Helvetica \ -pointsize 25 -strokewidth 1 -fill black label:"$label" -trim -repage 0x0+20+92 \ \( +clone -background gray40 -shadow 80x1+2+2 \) \ +swap -background none -layers merge \) \ -insert 1 -layers merge \ \( +size -font Helvetica \ -pointsize 65 -strokewidth 1 -fill red label:"$tvalue" -trim +repage \ \( +clone -background firebrick3 -shadow 80x3+3+3 \) \ +swap -background none -layers merge \) \ -insert 0 -gravity center -append -background white -gravity center -extent 320x240 \ b_$fname # #-- correct the size convert b_$fname -resize $6 $fname