Initial commit
This commit is contained in:
153
matrix.py
Normal file
153
matrix.py
Normal file
@@ -0,0 +1,153 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Matrix64 LED Display - Main Entry Point
|
||||
|
||||
Displays Home Assistant and Netdata data on a 64x64 LED matrix.
|
||||
"""
|
||||
from samplebase import SampleBase
|
||||
from rgbmatrix import graphics
|
||||
import time
|
||||
import datetime
|
||||
|
||||
from config import LED_ROWS, LED_COLS
|
||||
from weather_icons import draw_weather_icon
|
||||
from home_assistant import (
|
||||
get_weather, get_weather_description,
|
||||
get_interior_weather, get_brightness
|
||||
)
|
||||
from netdata import get_hdd_temps
|
||||
|
||||
|
||||
def get_temperature_color(temp):
|
||||
"""Determine color based on temperature value."""
|
||||
try:
|
||||
temp_value = float(str(temp).replace('°C', '').strip())
|
||||
if temp_value < 0:
|
||||
return graphics.Color(0, 100, 255)
|
||||
elif temp_value < 10:
|
||||
return graphics.Color(100, 180, 255)
|
||||
elif temp_value < 20:
|
||||
return graphics.Color(0, 255, 100)
|
||||
elif temp_value < 30:
|
||||
return graphics.Color(255, 200, 0)
|
||||
else:
|
||||
return graphics.Color(255, 50, 50)
|
||||
except ValueError:
|
||||
return graphics.Color(255, 255, 255)
|
||||
|
||||
|
||||
class Matrix64Display(SampleBase):
|
||||
"""Main display class for the LED matrix."""
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(Matrix64Display, self).__init__(*args, **kwargs)
|
||||
self.parser.add_argument(
|
||||
"-t", "--text",
|
||||
help="The text to scroll on the RGB LED panel",
|
||||
default="Hello world!"
|
||||
)
|
||||
self.temperature = None
|
||||
self.humidity = None
|
||||
self.interior_temperature = None
|
||||
self.interior_humidity = None
|
||||
self.last_update = time.time()
|
||||
self.weather_desc = "unknown"
|
||||
self.hdd_temps = None
|
||||
|
||||
def update_data(self):
|
||||
"""Fetch all data from APIs."""
|
||||
try:
|
||||
# Weather data
|
||||
weather = get_weather()
|
||||
if weather.get("temperature") is not None:
|
||||
self.temperature = f'{weather.get("temperature")}°C'
|
||||
self.humidity = weather.get("humidity")
|
||||
self.weather_desc = get_weather_description()
|
||||
|
||||
# Interior data
|
||||
interior = get_interior_weather()
|
||||
if interior.get("temperature") is not None:
|
||||
self.interior_temperature = f'{interior.get("temperature")}°C'
|
||||
self.interior_humidity = interior.get("humidity")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error updating data: {e}")
|
||||
|
||||
def update_brightness(self):
|
||||
"""Update LED matrix brightness."""
|
||||
try:
|
||||
brightness = get_brightness()
|
||||
if brightness:
|
||||
self.matrix.brightness = int(float(brightness)) / 10
|
||||
except Exception as e:
|
||||
self.matrix.brightness = 5
|
||||
print(f"Error updating brightness: {e}")
|
||||
|
||||
def update_hdd_temps(self):
|
||||
"""Update HDD temperatures."""
|
||||
self.hdd_temps = get_hdd_temps()
|
||||
|
||||
def run(self):
|
||||
"""Main display loop."""
|
||||
canvas = self.matrix.CreateFrameCanvas()
|
||||
|
||||
# Load fonts
|
||||
font = graphics.Font()
|
||||
font.LoadFont("../../../fonts/7x13.bdf")
|
||||
temp_font = graphics.Font()
|
||||
temp_font.LoadFont("../../../fonts/5x8.bdf")
|
||||
|
||||
text_color = graphics.Color(20, 75, 200)
|
||||
|
||||
# Initial data fetch
|
||||
self.update_brightness()
|
||||
self.update_data()
|
||||
self.update_hdd_temps()
|
||||
|
||||
while True:
|
||||
now = datetime.datetime.now()
|
||||
time_str = f"{now.hour:02d}:{now.minute:02d}:{now.second:02d}"
|
||||
current_time = time.time()
|
||||
|
||||
# Update every 60 seconds
|
||||
if current_time - self.last_update >= 60:
|
||||
self.update_data()
|
||||
self.update_brightness()
|
||||
self.update_hdd_temps()
|
||||
self.last_update = current_time
|
||||
|
||||
canvas.Clear()
|
||||
|
||||
# Time display
|
||||
graphics.DrawText(canvas, font, 4, 42, text_color, time_str)
|
||||
|
||||
# Weather icon
|
||||
draw_weather_icon(canvas, 0, 0, self.weather_desc)
|
||||
|
||||
# Outdoor temperature (right-aligned)
|
||||
if self.temperature:
|
||||
color = get_temperature_color(self.temperature)
|
||||
length = graphics.DrawText(canvas, temp_font, 0, 0, color, self.temperature)
|
||||
graphics.DrawText(canvas, temp_font, 64 - length, 8, color, self.temperature)
|
||||
|
||||
# Interior temperature (right-aligned)
|
||||
if self.interior_temperature:
|
||||
color = get_temperature_color(self.interior_temperature)
|
||||
length = graphics.DrawText(canvas, temp_font, 0, 0, color, self.interior_temperature)
|
||||
graphics.DrawText(canvas, temp_font, 64 - length, 16, color, self.interior_temperature)
|
||||
|
||||
# HDD temperatures
|
||||
if self.hdd_temps and len(self.hdd_temps) > 4:
|
||||
row1 = " ".join(str(t[0])[:2] for t in self.hdd_temps[1:4])
|
||||
row2 = " ".join(str(t[0])[:2] for t in self.hdd_temps[4:])
|
||||
graphics.DrawText(canvas, temp_font, 12, 52, text_color, row1)
|
||||
graphics.DrawText(canvas, temp_font, 12, 60, text_color, row2)
|
||||
|
||||
time.sleep(0.5)
|
||||
canvas = self.matrix.SwapOnVSync(canvas)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
display = Matrix64Display()
|
||||
if not display.process():
|
||||
display.print_help()
|
||||
Reference in New Issue
Block a user