Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/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)
Advertisement
Add Comment
Please, Sign In to add comment