Wetterstation II

Die Idee, eine sitemap aus openhab einfach als Bild auf das E-Paper Display zu schieben, hat sich als wenig praktikabel herausgestellt. Inzwischen generiert ein kleines Python-Script den Inhalt meiner Wetterstation. Im Prinzip war das einfacher als gedacht (Python ebend): wir brauchen pil und requests.

Mit requests holen wir uns die Daten aus openhab. Letzteres hat ein nettes Rest-API. Die Doku dazu kann man sich per PaperUI via Add-ons->misc installieren. Danach hat man unter seiner Root-url einen Link zum Rest API, ueber dieses kann man sich durch das API durchklicken. Ein Item kann man sich damit recht einfach holen:

curl http://openhab:8080/rest/items/Temperature_Balkon |python -m json.tool

holt den aktuellen Zustand des Temperatursensors vom Balkon bei mir.
In python nutze ich requests dafuer, das sieht dann so aus:

import requests
def getItem(item):
    url = baseURL + "/items/" + item
    r = requests.get(url, headers = {"accept" : "application/json"})
    return = r.json()

Um die damit gewonnenen Rohdaten in eine halbwegs ansprechende Form zu giessen, nutze ich pil bzw. dessen fork pillow:

from PIL import Image, ImageDraw, ImageFont
DISPLAY_SIZE = (640,384)
im = Image.new("1",DISPLAY_SIZE)
draw = ImageDraw.Draw(im)
draw.rectangle(((0,0),DISPLAY_SIZE),fill=1,outline=1)

In das so erzeugte draw-Objekt kann ich jetzt malen:

draw.text((x,y),line, font = infoFnt)
draw.line((maxW,upperLineY,maxW,maxY))

Die erste Zeile schreibt den Text text an die Position (x,y) und nutzt dafuer den Font infoFnt. Wenn man sich den Text als Rechteck vorstellt, bezeichnet (x,y) dessen linke obere Ecke. Um mehrere Zeilen unter- oder nebeneinander zu schreiben, ist es sinnvoll, die Ecke rechts unten dieses Recktecks zu kennen. Deswegen habe ich Textausgaben in eine Funktion gepackt:

def drawText(draw,x,y,text,font):
    p = font.getsize(text)
    draw.text((x,y),text, font = font)
    return x+p[0],y+p[1]

Das spart viel Schreibarbeit.

Als Fonts kann pil TrueType Fonts nutzen. Da muss man mal schauen, was so installiert ist. Auf meinem debian liegen diverse davon unter /usr/share/fonts/truetype, erzeugen kann man sich ein Font-Objekt dann einfach per:

infoFnt = ImageFont.truetype("/usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf",15)

Am Ende schreibt man das muehevoll erzeugte Bild in eine Datei:

del draw
im.save("pyimage.pbm")

Von dem pbm braucht man dann nur den Header abschneiden und schon haben wir wieder genau die Binaerdatei, welche sich der esp32 dann abholen kann.

Das Ergebnis sieht bei mir dann so aus:

Den Wetterbericht unten hole ich mir aus dem Internet. Einen Design-Preise gewinne ich damit nicht, aber immerhin durfte ich die Anzeige jetzt schon im Wohnzimmer aufstellen. Was will Mann mehr?