Ein besonderes Merkmal der smartVISU sind dynamisch erzeugte SVG Dateien, die über die „icon“-Widget-Bibliothek genutzt werden können.
Eine häufige Frage dabei ist, wie sich das icon.zenith
, dass den aktuellen Sonnenstand darstellt, von SmartHomeNG aus bedaten lässt.
Zwar bietet SmartHomeNG unter lib/env/location.yaml
eine ganze Reihe Default-Items mit Werten zum Sonnenstand an, jedoch sind diese für das icon.zenith
nicht notwendig.
Dieses Kurz-Tutorial zeigt, wie sich der Wert für das Icon mit einer simplen Logik näherungsweise berechnen lässt.
SmartHomeNG
Basis ist ein einfaches numerisches Item namens weather.sun.icon
:
weather:
sun:
icon:
type: num
visu_acl: ro
Als nächstes wird unter etc/logic.yaml
eine neue Logik eingehängt, die auf den Sonnenstand reagiert:
SunPositionLogic:
filename: sun_position.py
watch_item: env.location.sun_position.azimut.degrees
Die Logik löst also bei jeder Veränderng des System-Items env.location.sun_position.azimut.degrees
aus. Dieses gibt den Sonnenstand in Grad wieder. Neben der untenstehenden Berechnung des Wertes für das <code>icon.zenith</code> könnte man in der Logik auch noch weitere Sonnenstands-abhängige Aktionen einbinden, etwa das Herunterfahren von Rollläden.
In der Logik-Datei logics/sun_position.py
selber, werden nun sehr einfache Berechnungen vorgenommen:
# Berechnungen für icon.zenith
now = datetime.datetime.utcnow().hour * 60 + datetime.datetime.utcnow().minute
sunrise = sh.sun.rise().hour * 60 + sh.sun.rise().minute
sunset = sh.sun.set().hour * 60 + sh.sun.set().minute
icon = int(round(255 * ((now - sunrise) / (sunset - sunrise)),0))
sh.weather.sun.icon(icon)
Über das Intervall vom Sonnenaufang bis zum Sonnenuntergang, wird der aktuelle Zeitpunkt auf eine Skala von 0 – 255 gemappt.
smartVISU
Dieser Wert dient nun als Basis für das icon.zenith
, welches in der smartVISU wie folgt eingebunden wird:
{{ icon.zenith('weather.sun.icon', '', 'weather.sun.icon') }}
.
Neben dem Icon kann man bspw. noch die aktuellen Daten des Sonnenwinkels anzeigen:
<table>
<tr>
<td width="55px;">
{{ icon.zenith('weather.sun.icon', '', 'weather.sun.icon') }}
</td>
<td>
H: {{ basic.print('env.location.sun_position.azimut', 'env.location.sun_position.azimut.degrees') }} °
<br/>
V: {{ basic.print('env.location.sun_position.elevation', 'env.location.sun_position.elevation.degrees') }} °
</td>
</tr>
</table>
Das fertige Ergebnis sieht nun wie folgt aus:
(Die in diesem Artikel verwendeten Screenshots wurden selber erstellt. Das Titelbild ist unter der Creative Commons Zero (CC0) Lizenz veröffentlicht und wurde von www.pexels.com bezogen.)
0 Kommentare