Initial version of the Home Assistant page

This commit is contained in:
Erik Stambaugh 2024-03-29 08:24:41 -07:00
parent a41cc89958
commit 0e8b4536e7
2 changed files with 80 additions and 5 deletions

View file

@ -22,5 +22,17 @@ Some things that are planned in the near future:
- More built-in states and examples - More built-in states and examples
- Status graphs from Home Assistant or other sources - Status graphs from Home Assistant or other sources
- Mopidy or other media players - Mopidy or other media players
- Support for more different display types
## Requirements
- Python 3 modules:
- numpy
- pillow
- rpi.gpio
- selenium
- Inky: https://github.com/pimoroni/inky
- chromium-driver for selenium

View file

@ -3,7 +3,7 @@
import sys, os, random, time, signal import sys, os, random, time, signal
import numpy as np import numpy as np
import RPi.GPIO as GPIO import RPi.GPIO as GPIO
from PIL import Image, ImageDraw, ImageFont from PIL import Image, ImageDraw, ImageFont, ImageEnhance
from inky.inky_uc8159 import Inky from inky.inky_uc8159 import Inky
@ -257,23 +257,86 @@ class PictureMode(inkybot.StateClass):
self.set_image(resizedimage) self.set_image(resizedimage)
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException as selenium_TimeoutException
from io import BytesIO
@inkybot.State('hass') @inkybot.State('hass')
class HassMode(inkybot.StateClass): class HassMode(inkybot.StateClass):
button_text = [ button_text = [
" ", " ",
"", "",
" ", " ",
" " ""
] ]
driver_path = "/usr/bin/chromedriver"
driver=None
refresh_target = 0.0
def button_b(self): def button_b(self):
self.change_state('picture') self.change_state('picture')
def button_d(self):
self.driver.refresh()
self.update()
def enter(self): def enter(self):
image = Image.new("RGB", self.parent.inky.resolution, (255,0,0)) url = "http://localhost:8123/lovelace/1"
self.set_image(image) service = Service(self.driver_path)
options = webdriver.ChromeOptions()
options.add_argument('--headless')
self.driver = webdriver.Chrome(service=service, options=options)
self.driver.get(url)
login_button = WebDriverWait(self.driver, 5).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "mwc-button")))
login_button.click()
self.update()
self.refresh_target = time.time() + 5
def update(self):
print("Updating display...")
screenshot_bytes = self.driver.get_screenshot_as_png()
screenshot_image = Image.open(BytesIO(screenshot_bytes))
resizedimage = self.parent.resize_with_letterbox(
screenshot_image,
self.parent.inky.resolution,
self.parent.average_outer_perimeter_color(screenshot_image)
)
enhancer = ImageEnhance.Contrast(resizedimage)
adjustedimage = enhancer.enhance(1.2)
self.set_image(adjustedimage)
self.refresh_target = time.time() + 60
def exit(self):
driver.quit()
def loop(self):
try:
refresh_button = WebDriverWait(self.driver, 0.5).until(
EC.visibility_of_element_located((By.XPATH, '//span[text()="Refresh"]'))
)
refresh_button.click()
self.update()
except selenium_TimeoutException:
if self.refresh_target <= time.time():
self.update()
if __name__ == "__main__": if __name__ == "__main__":
inkybot.start('picture') #inkybot.start('picture')
inkybot.start('hass')