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.)


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.