Added icons for UVI, pollen and AQI

This commit is contained in:
Admar Schoonen 2023-05-28 23:15:55 +02:00
parent 47eb3acd01
commit 9e8a4561be
3 changed files with 103 additions and 22 deletions

View File

@ -2,17 +2,19 @@
A wake-up light for Raspberry Pi
# To do / ideas in no specific order:
* calendar
# To do
* better icons (especially for sun in reading light / wake-up light)
* sensors for indoor air quality
* icons for pollen, outdoor air quality and UV index
* kodi client (via webbrowser?)
* moonshine (esp32 + ledstrip + MQTT)
* bluetooth speaker: https://www.collabora.com/news-and-blog/blog/2022/09/02/using-a-raspberry-pi-as-a-bluetooth-speaker-with-pipewire-wireplumber/
* replace VLC with GStreamer
* exit / reboot buttons in settings
* start automatically and fullscreen on RPi
* read only filesystem?
# Ideas in no specific order:
* moonshine (esp32 + ledstrip + MQTT)
* calendar
* kodi client (via webbrowser?)
* bluetooth speaker: https://www.collabora.com/news-and-blog/blog/2022/09/02/using-a-raspberry-pi-as-a-bluetooth-speaker-with-pipewire-wireplumber/
* icon when media play is manually enabled?
* icon when wake up light is manually enabled?
* 2 / 3 finger tap == light on

View File

@ -33,6 +33,21 @@
size: self.size
pos: self.pos
Image:
id: icon_uvi
size: 0.9*min(root.size), 0.9*min(root.size)
pos_hint: {"center_x": 0.5, "center_y": 0.64}
Image:
id: icon_pollen
size: 0.9*min(root.size), 0.9*min(root.size)
pos_hint: {"center_x": 0.42, "center_y": 0.5}
Image:
id: icon_aqi
size: 0.9*min(root.size), 0.9*min(root.size)
pos_hint: {"center_x": 0.58, "center_y": 0.5}
FloatLayout
id: face
size_hint: None, None

View File

@ -15,6 +15,11 @@ from hsluv import hsluv_to_rgb, rgb_to_hsluv
import requests
import urllib.parse
from kivy.core.image import Image as CoreImage
from kivy.uix.image import Image as kiImage
from PIL import Image, ImageChops
from io import BytesIO
def is_arm():
if (uname()[4][:3] == 'arm') or (uname()[4][:7] == 'aarch64'):
return True
@ -606,24 +611,31 @@ class MyClockWidget(FloatLayout):
self.draw_list_curr_frame.append(["Color", reference.canvas, color[0], color[1], color[2]])
self.draw_list_curr_frame.append(["Ellipse", reference.canvas, [2 * r, 2 * r], p])
def draw_precipitation_aqi_expectation(self, x, x_thresholds, location):
def calculate_colors(self, x, x_thresholds):
colors = []
for i in range(0, len(x)):
idx = 0
for l in x_thresholds:
if l > x[i]:
break
idx = idx + 1
if idx >= len(self.aqi_colors):
idx = len(self.aqi_colors) - 1
colors.append(self.aqi_colors[idx])
return colors
def draw_precipitation_paqi_expectation(self, x, x_thresholds, location):
if len(x) == 0:
return
face_plate = self.ids["face_plate"]
with face_plate.canvas:
colors = self.calculate_colors(x[:12], x_thresholds)
for i in range(0, 12):
idx = 0
for l in x_thresholds:
if l > x[i]:
break
idx = idx + 1
if idx >= len(self.aqi_colors):
idx = len(self.aqi_colors) - 1
color = self.aqi_colors[idx]
color = colors[i]
R = face_plate.size[0] / 2
r = R / 10
tmp_x = 0.5 + location*math.sin(2 * math.pi * i/12)
@ -634,10 +646,61 @@ class MyClockWidget(FloatLayout):
def draw_precipitation_expectation(self):
self.draw_precipitation_aqi_expectation(self.precipitation, self.precipitation_thresholds, 0.45)
self.draw_precipitation_paqi_expectation(self.precipitation, self.precipitation_thresholds, 0.45)
def draw_aqi_expectation(self):
self.draw_precipitation_aqi_expectation(self.paqi, self.paqi_thresholds, 0.32)
def draw_paqi_expectation(self):
self.draw_precipitation_paqi_expectation(self.paqi, self.paqi_thresholds, 0.32)
def draw_icon_helper(self, color, img_source, label):
c = (int(256 * color[0]), int(256 * color[1]), int(256 * color[2]), int(256))
tmp = Image.new('RGBA', img_source.size, color = c)
img_modified = ImageChops.multiply(tmp, img_source)
data = BytesIO()
img_modified.save(data, format='png')
data.seek(0)
im = CoreImage(BytesIO(data.read()), ext='png')
icon = self.ids[label]
icon.texture = im.texture
def draw_icon_uvi(self):
if hasattr(self, 'image_uvi') == False:
self.image_uvi = Image.open("icons/uvi.png")
colors = self.calculate_colors(self.uvi[:1], self.uvi_thresholds)
color = colors[0]
if hasattr(self, 'uvi_color_prev') == False or self.uvi_color_prev != color:
self.uvi_color_prev = color
self.draw_icon_helper(color, self.image_uvi, "icon_uvi")
def draw_icon_pollen(self):
if hasattr(self, 'image_pollen') == False:
self.image_pollen = Image.open("icons/pollen.png")
colors = self.calculate_colors(self.pollen[:12], self.pollen_thresholds)
color = colors[self.pollen.index(max(self.pollen[:12]))]
if hasattr(self, 'pollen_color_prev') == False or self.pollen_color_prev != color:
self.pollen_color_prev = color
self.draw_icon_helper(color, self.image_pollen, "icon_pollen")
def draw_icon_aqi(self):
if hasattr(self, 'image_aqi') == False:
self.image_aqi = Image.open("icons/aqi.png")
colors = self.calculate_colors(self.aqi[:12], self.aqi_thresholds)
color = colors[self.aqi.index(max(self.aqi[:12]))]
if hasattr(self, 'aqi_color_prev') == False or self.aqi_color_prev != color:
self.aqi_color_prev = color
self.draw_icon_helper(color, self.image_aqi, "icon_aqi")
def draw_icons(self):
self.draw_icon_uvi()
self.draw_icon_pollen()
self.draw_icon_aqi()
def draw_face(self):
self.draw_numbers()
@ -660,7 +723,8 @@ class MyClockWidget(FloatLayout):
self.face_numbers[i].text = ""
self.draw_precipitation_expectation()
self.draw_aqi_expectation()
self.draw_paqi_expectation()
self.draw_icons()
else:
with face_plate.canvas:
color = self.theme.color_numbers