MP90-Panel
Weather and clock display for the built-in screen on the Blackview MP90 N100 Mini PC.
What It Does
mp90_panel.py drives the MP90 front display over USB HID and continuously renders a portrait dashboard:
- current time in the
Europe/Berlintimezone - current date
- tomorrow's Mannheim forecast for 09:00 and 17:00
- temperature, weather condition, and precipitation probability
Weather data comes from the Open-Meteo forecast API for Mannheim. The script refreshes weather every 15 minutes, redraws the display once per minute, and sends a heartbeat packet to the panel between redraws.
Hardware
The code targets the MP90 front TFT exposed as a Holtek USB HID display.
Current local device path:
1-8:1.1
The display is treated as a 320x170 RGB565 framebuffer. The script switches the panel to portrait mode and sends framebuffer chunks using the panel's HID command protocol.
Requirements
- Linux with access to the MP90 HID device
- Python 3.14 as installed by Linuxbrew at
/home/linuxbrew/.linuxbrew/bin/python3 - Python packages:
hidPillowrequests
- DejaVu fonts:
/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf
The included systemd unit currently runs as root, which avoids HID permission setup. For a non-root deployment, add a udev rule for the Holtek HID device and adjust the service user.
Run Once
From this directory:
/home/linuxbrew/.linuxbrew/bin/python3 ./mp90_panel.py --once
This fetches the forecast, draws one frame, sends it to the panel, and exits.
Run Continuously
/home/linuxbrew/.linuxbrew/bin/python3 ./mp90_panel.py
The script reconnects after HID or network failures and keeps retrying until stopped.
Deploy With Systemd
Copy or link the service file:
sudo cp mp90-panel.service /etc/systemd/system/mp90-panel.service
sudo systemctl daemon-reload
sudo systemctl enable --now mp90-panel.service
Check logs:
journalctl -u mp90-panel.service -f
Restart after code changes:
sudo systemctl restart mp90-panel.service
Service Notes
mp90-panel.service expects this checkout at:
/home/acidburns/.openclaw/workspace/mp90-panel
It also sets PYTHONPATH to the local Python 3.14 package directories used on the MP90 host. Update the unit if the checkout or Python environment moves.
Configuration
Most settings are constants near the top of mp90_panel.py:
HID_PATH: USB HID interface pathMANNHEIM: latitude/longitude for weather lookupTZ: display timezoneOPEN_METEO_URL: forecast API endpointFONT_REGULAR/FONT_BOLD: font paths
Troubleshooting
OSErroron HID open: confirm the panel path withlsusb,hid.enumerate(), or/sys/bus/hid/devices, then updateHID_PATH.- Blank or stale panel: restart the service and check
journalctl -u mp90-panel.service. - Weather fetch failures: confirm network access and Open-Meteo availability.
- Text rendering errors: install DejaVu fonts or update the font constants.
