#!/usr/bin/env python3 import sys import datetime import signal import math import paho.mqtt.client as mqtt import urllib.request as request import json from signal import * from time import sleep from PIL import Image, ImageDraw, ImageFont from displayhatmini import DisplayHATMini, ST7789 MQTT_SERVER = "removed" MQTT_PORT = removed MQTT_TOPIC = "displaypi/data/#" MQTT_STATUS = "displaypi/state" MQTT_CONTROL = "displaypi/control" MQTT_RESPONSE = "displaypi/response" MQTT_PRESENCE = "displaypi/presence" MQTT_MONITOR = "monitor/data/#" MQTT_NEWS = "news/headlines" MQTT_WEATHER_DAILY = "metweather/daily" MQTT_WEATHER_CURRENT = "metweather/current" # Set these to use authorisation MQTT_USER = "removed" MQTT_PASS = "removed" rotation = 180 #disp = ST7789( # height=240, # width=320, # rotation=rotation, # port=0, # cs=1, # dc=9, # backlight=13, # spi_speed_hz=60 * 1000 * 1000, # offset_left=0, # offset_top=0 #) #disp.begin() WIDTH = DisplayHATMini.WIDTH HEIGHT = DisplayHATMini.HEIGHT RP0_IP = "removed" RP1_IP = "removed" RP2_IP = "removed" font30 = ImageFont.truetype('orbitron.ttf', 30) font28 = ImageFont.truetype('orbitron.ttf', 28) font24 = ImageFont.truetype('orbitron.ttf', 24) font20 = ImageFont.truetype('orbitron.ttf', 20) font18 = ImageFont.truetype('orbitron.ttf', 18) font14 = ImageFont.truetype('orbitron.ttf', 14) clockfont = ImageFont.truetype('dig-m.ttf', 64) tagfont = ImageFont.truetype('FontAwesome6-Free-Solid.otf', 20) brandfont = ImageFont.truetype('FontAwesome6-Free-Brands.otf', 20) DISPLAYSCREEN = "clock" OLDSCREEN = "" status = "stop" people = ["removed","removed","removed","removed"] presence = ["init","init","init","init"] monitorname = ["removed1", "removed2", "removed3", "removed4", "removed5", "removed6", "removed7", "removed8", "removed9", "Internet"] monitordevice = ["removed1", "removed2", "removed3", "removed4", "removed5", "removed6", "removed7", "removed8", "removed9", "Internet"] monitorstatus = ["Pending", "Pending", "Pending", "Pending", "Pending", "Pending", "Pending", "Pending", "Pending", "Pending"] piname = ["removed1", "removed2", "removed3", "removed4", "removed5", "removed6", "removed7", "removed8", "removed9", "removed0"] pidevice = ["removed1", "removed2", "removed3", "removed4", "removed5", "removed6", "removed7", "removed8", "removed9", "removed0"] pistatus = ["Pending", "Pending", "Pending", "Pending", "Pending", "Pending", "Pending", "Pending", "Pending", "Pending"] newsptr = 0 newslist = ["", "", "", "", "", "", "", "", "", ""] newswidth = 22 weather = {} weatherd = {} def ordinal_suffix(day): if 3 < day < 21 or 23 < day < 31: return 'th' else: return {1: 'st', 2: 'nd', 3: 'rd'}[day % 10] def draw_centred_text(image, text, ypos, font, r, g, b): indent = int((WIDTH - int(font.getlength(text)))/2) draw = ImageDraw.Draw(image) bbox = draw.textbbox((0,0), text, font=font) width = bbox[2] - bbox[0] height = bbox[3] - bbox[1] textimage = Image.new('RGBA', (width, height), (0, 0, 0, 0)) textdraw = ImageDraw.Draw(textimage) textdraw.text((0, 0), text, font=font, fill=(r, g, b)) rotated = textimage.rotate(0, expand=1) position = tuple((indent, ypos)) image.paste(rotated, position, rotated) return def draw_text(image, text, xpos, ypos, font, r, g, b): draw = ImageDraw.Draw(image) bbox = draw.textbbox((0,0), text, font=font) width = bbox[2] - bbox[0] height = bbox[3] - bbox[1] textimage = Image.new('RGBA', (width, height), (0, 0, 0, 0)) textdraw = ImageDraw.Draw(textimage) textdraw.text((0, 0), text, font=font, fill=(r, g, b)) rotated = textimage.rotate(0, expand=1) position = tuple((xpos, ypos)) image.paste(rotated, position, rotated) return def clear_display(): global img, draw, disp, WIDTH, HEIGHT img = Image.new('RGB', (WIDTH, HEIGHT), color=(0, 0, 0)) draw = ImageDraw.Draw(img) return def button_callback(pin): global DISPLAYSCREEN, RP0_IP, RP1_IP, RP2_IP, newsptr, newslist, newswidth, rotation if rotation == 0: btn_TL=display_hat.BUTTON_Y btn_TR=display_hat.BUTTON_B btn_BL=display_hat.BUTTON_X btn_BR=display_hat.BUTTON_A elif rotation == 180: btn_TL=display_hat.BUTTON_A btn_TR=display_hat.BUTTON_X btn_BL=display_hat.BUTTON_B btn_BR=display_hat.BUTTON_Y if not display_hat.read_button(pin): return if DISPLAYSCREEN == "clock": if pin == btn_TL: DISPLAYSCREEN = "weather" return elif pin == btn_TR: DISPLAYSCREEN = "clock_2" return elif pin == btn_BL: DISPLAYSCREEN = "radio_0" return elif pin == btn_BR: DISPLAYSCREEN = "blank" return return if DISPLAYSCREEN == "clock_2": if pin == btn_TL: DISPLAYSCREEN = "news" return elif pin == btn_TR: DISPLAYSCREEN = "clock" return elif pin == btn_BL: DISPLAYSCREEN = "people" return elif pin == btn_BR: DISPLAYSCREEN = "monitor" return return if DISPLAYSCREEN == "weather": if pin == btn_TL: DISPLAYSCREEN = "clock" elif pin == btn_BL: DISPLAYSCREEN = "weatherd" return return if DISPLAYSCREEN == "weatherd": if pin == btn_TL: DISPLAYSCREEN = "clock" elif pin == btn_BL: DISPLAYSCREEN = "weather" return return if DISPLAYSCREEN == "news": if pin == btn_TL: DISPLAYSCREEN = "clock_2" return elif pin == btn_BL: newswidth = newswidth + 1 if newswidth > 26: newswidth = 18 DISPLAYSCREEN = "news_redraw" return elif pin == btn_TR: newsptr = newsptr -1 if newsptr < 0: newsptr = len(newslist) - 1 DISPLAYSCREEN = "news_redraw" return elif pin == btn_BR: newsptr = newsptr + 1 if newsptr >= len(newslist): newsptr = 0 DISPLAYSCREEN = "news_redraw" return return if DISPLAYSCREEN == "radio_0": if pin == btn_TL: DISPLAYSCREEN = "clock" return elif pin == btn_BL: DISPLAYSCREEN = "radio_1" return elif pin == btn_TR: request.urlopen('http://' + RP0_IP + '/api/v1/commands/?cmd=toggle') return elif pin == btn_BR: request.urlopen('http://' + RP0_IP + '/api/v1/commands/?cmd=next') return return if DISPLAYSCREEN == "radio_1": if pin == btn_TL: DISPLAYSCREEN = "clock" return elif pin == btn_BL: DISPLAYSCREEN = "radio_2" return elif pin == btn_TR: request.urlopen('http://' + RP1_IP + '/api/v1/commands/?cmd=toggle') return elif pin == btn_BR: request.urlopen('http://' + RP1_IP + '/api/v1/commands/?cmd=next') return return if DISPLAYSCREEN == "radio_2": if pin == btn_TL: DISPLAYSCREEN = "clock" return elif pin == btn_BL: DISPLAYSCREEN = "radio_0" return elif pin == btn_TR: request.urlopen('http://' + RP2_IP + '/api/v1/commands/?cmd=toggle') return elif pin == btn_BR: request.urlopen('http://' + RP2_IP + '/api/v1/commands/?cmd=next') return return if DISPLAYSCREEN == "people": if pin == btn_TL: DISPLAYSCREEN = "clock_2" return elif pin == btn_BL: DISPLAYSCREEN = "people_refresh" return return if DISPLAYSCREEN == "monitor": if pin == btn_TL: DISPLAYSCREEN = "clock_2" return # elif pin == btn_BL: # return elif pin == btn_TR: DISPLAYSCREEN = "monitor_2" return # elif pin == btn_BR: # return return if DISPLAYSCREEN == "monitor_2": if pin == btn_TL: DISPLAYSCREEN = "clock_2" return # elif pin == btn_BL: # return elif pin == btn_TR: DISPLAYSCREEN = "monitor" return # elif pin == btn_BR: # return return if DISPLAYSCREEN == "blank": DISPLAYSCREEN = "clock" return return def draw_tags(): global DISPLAYSCREEN, status if DISPLAYSCREEN == "clock": draw_tag(img, u"\uf743", "Y", font=tagfont) # Weather draw_tag(img, u"\uf13a", "B", font=tagfont) # Circle Chevron Down draw_tag(img, u"\uf001", "X", font=tagfont) # Radio draw_tag(img, u"\uf00d", "A", font=tagfont) # Blank return if DISPLAYSCREEN == "clock_2": draw_tag(img, u"\uf1ea", "Y", font=tagfont) # News draw_tag(img, u"\uf139", "B", font=tagfont) # Circle Chevron Up draw_tag(img, u"\uf0c0", "X", font=tagfont) # People draw_tag(img, u"\uf06e", "A", font=tagfont) # Eye return elif DISPLAYSCREEN == "weather": draw_tag(img, u"\uf017", "Y", font=tagfont) # Clock draw_tag(img, u"\uf185", "X", font=tagfont) # Sun (Weatherd) return elif DISPLAYSCREEN == "weatherd": draw_tag(img, u"\uf017", "Y", font=tagfont) # Clock draw_tag(img, u"\uf743", "X", font=tagfont) # Weather return elif DISPLAYSCREEN == "news": draw_tag(img, u"\uf017", "Y", font=tagfont) # Clock draw_tag(img, u"\uf139", "B", font=tagfont) # Circle Chevron Up draw_tag(img, u"\uf035", "X", font=tagfont) # Text Width draw_tag(img, u"\uf13a", "A", font=tagfont) # Circle Chevron Down return elif DISPLAYSCREEN == "people": draw_tag(img, u"\uf017", "Y", font=tagfont) # Clock draw_tag(img, u"\uf2f1", "X", font=tagfont) # Refresh (rotate arrows) return elif DISPLAYSCREEN == "monitor": draw_tag(img, u"\uf017", "Y", font=tagfont) # Clock draw_tag(img, u"\uf7bb", "B", font=brandfont) # Robot (RasPi doesn't work!) return elif DISPLAYSCREEN == "monitor_2": draw_tag(img, u"\uf017", "Y", font=tagfont) # Clock draw_tag(img, u"\uf06e", "B", font=tagfont) # Eye return elif DISPLAYSCREEN == "radio_0": draw_tag(img, u"\uf017", "Y", font=tagfont) # Clock if status == "play": draw_tag(img, u"\uf04c", "B", font=tagfont) # Pause else: draw_tag(img, u"\uf04b", "B", font=tagfont) # Play draw_tag(img, u"\u0031", "X", font=tagfont) # One draw_tag(img, u"\uf04e", "A", font=tagfont) # Forward return elif DISPLAYSCREEN == "radio_1": draw_tag(img, u"\uf017", "Y", font=tagfont) # Clock if status == "play": draw_tag(img, u"\uf04c", "B", font=tagfont) # Pause else: draw_tag(img, u"\uf04b", "B", font=tagfont) # Play draw_tag(img, u"\u0032", "X", font=tagfont) # Two draw_tag(img, u"\uf04e", "A", font=tagfont) # Forward return elif DISPLAYSCREEN == "radio_2": draw_tag(img, u"\uf017", "Y", font=tagfont) # Clock if status == "play": draw_tag(img, u"\uf04c", "B", font=tagfont) # Pause else: draw_tag(img, u"\uf04b", "B", font=tagfont) # Play draw_tag(img, u"\u0030", "X", font=tagfont) # Zero draw_tag(img, u"\uf04e", "A", font=tagfont) # Forward return return def draw_tag(image, text, btn, font): if btn == "A": position = tuple((295, 160)) elif btn == "B": position = tuple((295, 65)) elif btn == "X": position = tuple((5, 160)) elif btn == "Y": position = tuple((5, 65)) draw = ImageDraw.Draw(image) bbox = draw.textbbox((0,0), text, font=font) width = bbox[2] - bbox[0] height = bbox[3] - bbox[1] textimage = Image.new('RGBA', (width, height), (0, 0, 0, 0)) textdraw = ImageDraw.Draw(textimage) textdraw.text((0, 0), text, font=font, fill=(255, 255, 255)) rotated = textimage.rotate(0, expand=1) image.paste(rotated, position, rotated) return def read_radio(ip): global DISPLAYSCREEN, img, status try: with request.urlopen('http://' + ip + '/api/v1/getState') as response: source = response.read() data = json.loads(source) status = data['status'] title = data['title'].strip() uri = data['uri'] except: status = "offline" title = "" uri = "" station = "" if status == "stop": song = "Idle" artist = "" elif status == "offline": song = "Offline" artist = "" elif status == "play" and len(title) > 3: try: song, artist = title.split(' - ',2) except: song = "" artist = "" else: song = "Unknown" artist = "Unknown" if uri != "": if uri.count("absolute80s") > 0: station = "Absolute 80s" elif uri.count("absoluteclassicrock") > 0: station = "Absolute Classic Rock" elif uri.count("absoluteradio") > 0: station = "Absolute Radio" elif uri.count("absolutecountry") > 0: station = "Absolute Country" elif uri.count("Heart80s") > 0: station = "Heart 80s" else: station = "Internet Radio" else: station = "" if len(song) < 17: draw_centred_text(img, song, 65, font20, 255, 255, 255) else: if(song.count(" ")) > 0: song = song.strip()[:32] song1 = "" song2 = "" songspace = True songlist = song.split() songlen = len(songlist) count = 0 while count < songlen: next = songlist[count] if songspace == True and ((len(next) + len(song1)) < 16): song1 = song1 + " " + songlist[count] song1 = song1.strip() count = count + 1 else: songspace = False song2 = song2 + " " + songlist[count] song2 = song2.strip() count = count + 1 draw_centred_text(img, song1, 50, font20, 255, 255, 255) draw_centred_text(img, song2, 80, font20, 255, 255, 255) else: div = math.floor(len(song)/2) draw_centred_text(img, song[:16], 50, font20, 255, 255, 255) draw_centred_text(img, song[16:32], 80, font20, 255, 255, 255) if len(artist) < 17: draw_centred_text(img, artist, 135, font20, 255, 255, 255) else: if(artist.count(" ")) > 0: artist = artist.strip()[:32] art1 = "" art2 = "" artspace = True artlist = artist.split() artlen = len(artlist) count = 0 while count < artlen: next = artlist[count] if artspace == True and ((len(next) + len(art1)) < 16): art1 = art1 + " " + artlist[count] art1 = art1.strip() count = count + 1 else: artspace = False art2 = art2 + " " + artlist[count] art2 = art2.strip() count = count + 1 draw_centred_text(img, art1, 120, font20, 255, 255, 255) draw_centred_text(img, art2, 150, font20, 255, 255, 255) else: div = math.floor(len(artist)/2) draw_centred_text(img, artist[:16], 120, font20, 255, 255, 255) draw_centred_text(img, artist[16:32], 150, font20, 255, 255, 255) draw_centred_text(img, station, 190, font20, 255, 0, 255) return def show_news(): global newsptr, newslist, newswidth, img draw_centred_text(img, "News - " + str(newsptr + 1), 10, font24, 255, 0, 0) news_lines = ["", "", "", "", "", ""] headline = newslist[newsptr] headsplit = headline.split() headlen = len(headsplit) line = 0 x = 0 if len(headsplit) > 1: while x < len(headsplit): if ( len(headsplit[x]) + len(news_lines[line]) ) < newswidth: news_lines[line] = (news_lines[line] + " " + headsplit[x]).strip() x = x + 1 elif len(headsplit[x]) > (newswidth - 1): if line < len(news_lines): line = line + 1 news_lines[line] = headsplit[x] x = x + 1 else: line = line + 1 x = 0 while x < len(news_lines): draw_centred_text(img, news_lines[x], (80 + (x * 20)), font18, 255, 255, 255) x = x + 1 draw_centred_text(img, str(newswidth), 190, font14, 255, 0, 255) return def show_weather(): # the current one global weather draw_centred_text(img, "Current Weather", 10, font24, 255, 0, 0) draw_centred_text(img, str(weather['state']), 60, font20, 255, 255, 255) draw_centred_text(img, "Temp - " + str(round(weather['temperature'],1)) + " (" + str(round(weather['feels_like'],1)) + ") C", 90, font20, 255, 255, 255) draw_centred_text(img, "Wind - " + str(round(weather['wind_speed'],1)) + " m/s ("+ str(weather['wind_dir']) + ")", 120, font20, 255, 255, 255) draw_centred_text(img, "Hum - " + str(round(weather['humidity'])) + " %", 150, font20, 255, 255, 255) draw_centred_text(img, "UV - " + str(weather['uv_index']), 180, font20, 255, 255, 255) draw_centred_text(img, "Rain - " + str(round(weather['prob_precipitation'])) + " % / " + str(weather['precipitation_rate']), 210, font20, 255, 255, 255) return def show_weatherd(): # the daily summary global weatherd draw_centred_text(img, "Daily Weather", 10, font24, 255, 0, 0) draw_centred_text(img, str(weatherd['weather']), 60, font20, 255, 255, 255) draw_centred_text(img, "Temp - " + str(weatherd['temperature']) + " (" + str(weatherd['feels_like']) + ") C", 90, font20, 255, 255, 255) draw_centred_text(img, "Wind - " + str(weatherd['wind_speed']) + " m/s ("+ str(weatherd['wind_dir']) + ")", 120, font20, 255, 255, 255) draw_centred_text(img, "Hum - " + str(weatherd['humidity']) + " %", 150, font20, 255, 255, 255) draw_centred_text(img, "UV - " + str(weatherd['uv_index']), 180, font20, 255, 255, 255) draw_centred_text(img, "Rain - " + str(weatherd['prob_precipitation']), 210, font20, 255, 255, 255) return def show_monitor(): global monitordevice, monitorstatus, monitorname draw_centred_text(img, "Monitor", 10, font24, 255, 255, 255) x=0 col1 = 40 col2 = 170 width = 10 while x < 5: if monitorstatus[x] == "Online": draw_text(img, monitorname[x].center(width), col1, 80 + (x * 20), font20, 0, 255, 0) elif monitorstatus[x] == "Offline": draw_text(img, monitorname[x].center(width), col1, 80 + (x * 20), font20, 255, 0, 0) elif monitorstatus[x] == "Play": draw_text(img, monitorname[x].center(width), col1, 80 + (x * 20), font20, 255, 0, 255) elif monitorstatus[x] == "Idle": draw_text(img, monitorname[x].center(width), col1, 80 + (x * 20), font20, 0, 0, 255) x = x +1 x=5 while x < 10: if monitorstatus[x] == "Online": draw_text(img, monitorname[x].center(width), col2, 80 + ((x - 5) * 20), font20, 0, 255, 0) elif monitorstatus[x] == "Offline": draw_text(img, monitorname[x].center(width), col2, 80 + ((x - 5) * 20), font20, 255, 0, 0) elif monitorstatus[x] == "Play": draw_text(img, monitorname[x].center(width), col2, 80 + ((x - 5) * 20), font20, 255, 0, 255) elif monitorstatus[x] == "Idle": draw_text(img, monitorname[x].center(width), col2, 80 + ((x - 5) * 20), font20, 0, 0, 255) x = x +1 return def show_monitor_2(): global pidevice, pistatus, piname draw_centred_text(img, "Pi Monitor", 10, font24, 255, 255, 255) x=0 col1 = 40 col2 = 170 width = 10 while x < 5: if pistatus[x] == "Online": draw_text(img, piname[x].center(width), col1, 80 + (x * 20), font20, 0, 255, 0) elif pistatus[x] == "Offline": draw_text(img, piname[x].center(width), col1, 80 + (x * 20), font20, 255, 0, 0) x = x +1 x=5 while x < 10: if pistatus[x] == "Online": draw_text(img, piname[x].center(width), col2, 80 + ((x - 5) * 20), font20, 0, 255, 0) elif pistatus[x] == "Offline": draw_text(img, piname[x].center(width), col2, 80 + ((x - 5) * 20), font20, 255, 0, 0) x = x +1 return def clean(*args): clear_display() display_hat.set_backlight(False) display_hat.display(img) sys.exit(0) def on_connect(client, userdata, flags, rc): if rc == 0: DISPLAYSCREEN = "clock" ret = client.publish(MQTT_RESPONSE,"MQTT Connected") ret = client.publish(MQTT_STATUS,"clock", qos=0, retain = True) client.subscribe(MQTT_TOPIC) client.subscribe(MQTT_CONTROL) client.subscribe(MQTT_PRESENCE) client.subscribe(MQTT_NEWS) client.subscribe(MQTT_WEATHER_DAILY) client.subscribe(MQTT_WEATHER_CURRENT) client.subscribe(MQTT_MONITOR) display_hat.set_led(0, 0, 0) else: display_hat.set_led(0.05, 0, 0) return def on_disconnect(client, userdata, rc): display_hat.set_led(0.05, 0, 0) return def on_subscribe(client, userdata, mid, granted_qos): ret = client.publish(MQTT_RESPONSE,"MQTT Subscribed") return def on_message(client, userdata, msg): global DISPLAYSCREEN, people, presence, newslist, RP0_STATION, RP1_STATION, RP2_STATION, weather, weatherd global monitordevice, monitorstatus, pidevice, pistatus screenlist = ["clock", "clock_2", "weather", "weatherd", "news", "people", "radio_0", "radio_1", "radio_2", "monitor", "monitor_2", "blank"] if msg.topic == MQTT_CONTROL: data = msg.payload.decode("utf-8").lower() if data in screenlist: ret = client.publish(MQTT_RESPONSE, data + " displayed", qos=0, retain = True) DISPLAYSCREEN = data return else: ret = client.publish(MQTT_RESPONSE, "Unknown screen - " + data, qos=0, retain = True) return if msg.topic.find("monitor/data/") == 0 and msg.topic != "monitor/data/control": jdata = json.loads(msg.payload.decode('utf-8')) device = jdata['device'] status = jdata['status'] if device in monitordevice: x = monitordevice.index(device) monitorstatus[x] = status if device in pidevice: x = pidevice.index(device) pistatus[x] = status return if msg.topic == MQTT_PRESENCE: jdata = json.loads(msg.payload.decode('utf-8')) person = jdata['person'].lower() status = jdata['status'].lower() try: loc = people.index(person) presence[loc] = status except: ret = client.publish(MQTT_RESPONSE,"Person not found - " + person) print("Person not found - " + person) return if msg.topic == MQTT_NEWS: newslist = json.loads(msg.payload.decode('utf-8')) return if msg.topic == MQTT_WEATHER_CURRENT: weather = json.loads(msg.payload.decode('utf-8')) return if msg.topic == msg.topic == MQTT_WEATHER_DAILY: weatherd = json.loads(msg.payload.decode('utf-8')) return return for sig in (SIGABRT, SIGILL, SIGINT, SIGSEGV, SIGTERM): signal(sig, clean) display_hat = DisplayHATMini(buffer=None, backlight_pwm=True) display_hat.on_button_pressed(button_callback) client = mqtt.Client() client.on_connect = on_connect client.on_disconnect = on_disconnect client.on_message = on_message client.on_subscribe = on_subscribe if MQTT_USER is not None and MQTT_PASS is not None: client.username_pw_set(username=MQTT_USER, password=MQTT_PASS) client.connect(MQTT_SERVER, MQTT_PORT, 60) client.loop_start() while True: while DISPLAYSCREEN == "clock": clear_display() display_hat.set_backlight(True) x = datetime.datetime.now() today = datetime.date.today() date_string = today.strftime('%-d{suffix} %B') if (x.second / 2) == int(x.second / 2): draw_centred_text(img, x.strftime("%H:%M:%S"), 48, clockfont, 255, 255, 255) else: draw_centred_text(img, x.strftime("%H %M %S"), 48, clockfont, 255, 255, 255) draw_centred_text(img, x.strftime('%A'), 144, font28, 255, 255, 255) draw_centred_text(img, date_string.format(suffix=ordinal_suffix(today.day)), 192, font28, 255, 255, 255) draw_tags() display_hat.display(img) if OLDSCREEN != "clock": ret = client.publish(MQTT_STATUS,"clock", qos=0, retain = True) OLDSCREEN = "clock" sleep(0.1) while DISPLAYSCREEN == "clock_2": clear_display() display_hat.set_backlight(True) x = datetime.datetime.now() today = datetime.date.today() date_string = today.strftime('%-d{suffix} %B') if (x.second / 2) == int(x.second / 2): draw_centred_text(img, x.strftime("%H:%M:%S"), 48, clockfont, 255, 255, 255) else: draw_centred_text(img, x.strftime("%H %M %S"), 48, clockfont, 255, 255, 255) draw_centred_text(img, x.strftime('%A'), 144, font28, 255, 255, 255) draw_centred_text(img, date_string.format(suffix=ordinal_suffix(today.day)), 192, font28, 255, 255, 255) draw_tags() display_hat.display(img) if OLDSCREEN != "clock_2": ret = client.publish(MQTT_STATUS,"clock_2", qos=0, retain = True) OLDSCREEN = "clock_2" sleep(0.1) while DISPLAYSCREEN == "people": clear_display() display_hat.set_backlight(True) draw_tags() offset = 0 for x in people: loc = people.index(x) if presence[loc] == "home": draw_centred_text(img, x.capitalize(), ((loc * 40) + 50), font30, 0, 255, 0) elif presence[loc] == "not_home": draw_centred_text(img, x.capitalize(), ((loc * 40) + 50), font30, 0, 0, 255) else: draw_centred_text(img, x.capitalize(), ((loc * 40) + 50), font30, 255, 0, 0) display_hat.display(img) if OLDSCREEN != "people": ret = client.publish(MQTT_STATUS,"people", qos=0, retain = True) OLDSCREEN = "people" sleep(0.1) while DISPLAYSCREEN =="people_refresh": clear_display() display_hat.display(img) if OLDSCREEN != "people_refresh": ret = client.publish(MQTT_STATUS,"people_refresh", qos=0, retain = True) OLDSCREEN = "people_refresh" DISPLAYSCREEN = "people" while DISPLAYSCREEN == "radio_0": clear_display() display_hat.set_backlight(True) draw_centred_text(img, "Radio Pi Zero", 10, font24, 255, 0, 0) read_radio(RP0_IP) draw_tags() display_hat.display(img) if OLDSCREEN != "radio_0": ret = client.publish(MQTT_STATUS,"radio_0", qos=0, retain = True) OLDSCREEN = "radio_0" sleep(0.1) while DISPLAYSCREEN == "radio_1": clear_display() display_hat.set_backlight(True) draw_centred_text(img, "Radio Pi One", 10, font24, 0, 255, 0) read_radio(RP1_IP) draw_tags() display_hat.display(img) if OLDSCREEN != "radio_1": ret = client.publish(MQTT_STATUS,"radio_1", qos=0, retain = True) OLDSCREEN = "radio_1" sleep(0.1) while DISPLAYSCREEN == "radio_2": clear_display() display_hat.set_backlight(True) draw_centred_text(img, "Radio Pi Two", 10, font24, 0, 0, 255) read_radio(RP2_IP) draw_tags() display_hat.display(img) if OLDSCREEN != "radio_2": ret = client.publish(MQTT_STATUS,"radio_2", qos=0, retain = True) OLDSCREEN = "radio_2" sleep(0.1) while DISPLAYSCREEN == "weather": clear_display() display_hat.set_backlight(True) show_weather() draw_tags() display_hat.display(img) if OLDSCREEN != "weather": ret = client.publish(MQTT_STATUS,"weather", qos=0, retain = True) OLDSCREEN = "weather" sleep(0.1) while DISPLAYSCREEN =="weatherd": clear_display() display_hat.set_backlight(True) show_weatherd() draw_tags() display_hat.display(img) if OLDSCREEN != "weatherd": ret = client.publish(MQTT_STATUS,"weatherd", qos=0, retain = True) OLDSCREEN = "weatherd" sleep(0.1) while DISPLAYSCREEN == "news": clear_display() display_hat.set_backlight(True) show_news() draw_tags() display_hat.display(img) if OLDSCREEN != "news": ret = client.publish(MQTT_STATUS,"news", qos=0, retain = True) OLDSCREEN = "news" sleep(0.1) while DISPLAYSCREEN =="news_redraw": clear_display() display_hat.display(img) if OLDSCREEN != "news_redraw": ret = client.publish(MQTT_STATUS,"news_redraw", qos=0, retain = True) OLDSCREEN = "news_redraw" DISPLAYSCREEN = "news" while DISPLAYSCREEN == "monitor": clear_display() display_hat.set_backlight(True) show_monitor() draw_tags() display_hat.display(img) if OLDSCREEN != "monitor": ret = client.publish(MQTT_STATUS,"monitor", qos=0, retain = True) OLDSCREEN = "monitor" sleep(0.1) while DISPLAYSCREEN == "monitor_2": clear_display() display_hat.set_backlight(True) show_monitor_2() draw_tags() display_hat.display(img) if OLDSCREEN != "monitor_2": ret = client.publish(MQTT_STATUS,"monitor_2", qos=0, retain = True) OLDSCREEN = "monitor_2" sleep(0.1) while DISPLAYSCREEN =="blank": clear_display() display_hat.set_backlight(False) display_hat.display(img) if OLDSCREEN != "blank": ret = client.publish(MQTT_STATUS,"blank", qos=0, retain = True) OLDSCREEN = "blank" sleep(0.1) sleep(0.1)