PRJ001 — Presentation
Headline
2025-PRJ-001-ST_007-ST_022-Revia

Kompaktná počasová stanica postavená na Raspberry Pi Zero 2 W s 4" touchscreen displejom, zobrazujúca aktuálne počasie, 5-dňovú predpoveď a trendy teploty/vlhkosti s automatickou aktualizáciou z open-source API.
Introduction
2025-PRJ-001-ST_007-ST_022-Revia
Cieľom projektu je vytvoriť kompaktnú, vizuálne atraktívnu počasovú stanicu využívajúcu Raspberry Pi Zero 2 W a Waveshare 4" LCD displej. Systém automaticky deteguje polohu používateľa, zobrazuje aktuálne meteorologické údaje a predpoveď počasia prostredníctvom Open-Meteo API. Aplikácia beží fullscreen s touchscreen ovládaním, automatickým rotovaním obrazoviek a podporou manuálneho vyhľadávania miest. Riešenie zahŕňa automatické aktualizácie z GitHub repozitára pri každom štarte, čím sa eliminuje potreba fyzického prístupu k zariadeniu pri zmenách kódu. Projekt prináša praktické riešenie pre vizualizáciu počasia s nízkou spotrebou energie a možnosťou nasadenia kdekoľvek s WiFi pripojením.
Obsah
- Business
- Top Level Architecture
- Solution Architecture
- Analysis
- Design
- Implementation
- Testing & Verification
- Operation
- Change Management
- Záverečné zhodnotenie
01-Business
Problém:
- Potreba jednoduchého prístupu k presným meteorologickým údajom bez závislosti na mobilných zariadeniach
- Existujúce komerčné riešenia sú buď drahé alebo závislé od proprietárnych služieb s mesačnými poplatkami
- Chýbajú open-source alternatívy s moderným UI a touchscreen ovládaním
Riešenie:
- Standalone počasová stanica s automatickou detekciou polohy
- Využitie bezplatného Open-Meteo API bez limitov
- Automatické aktualizácie z GitHub repozitára
- Nízke náklady (~50-70€ hardvér)
Hodnota:
- Nezávislosť od komerčných služieb
- Plne customizovateľné riešenie
- Vzdelávací projekt pre embedded systémy a Python GUI development
- Možnosť rozšírenia o vlastné senzory (teplota, vlhkosť, tlak)

02-Top Level Architecture

Hlavné komponenty:
- Hardware Layer: Raspberry Pi Zero 2 W + Waveshare LCD + Touchscreen
- OS Layer: Raspberry Pi OS (Debian 12) s X11 window system
- Application Layer: Python aplikácia s Tkinter GUI framework
- Data Layer: Open-Meteo API, IP geolocation, Geocoding API
- Update Layer: GitHub repository pre continuous deployment
03-Solution Architecture
Boot Sequence Flow

Application Architecture

Data Flow Diagram

System State Diagram

Technologies Stack:
- Language: Python 3.11
- GUI Framework: Tkinter
- HTTP Client: requests library
- Display Driver: X11 + fbdev
- Version Control: Git + GitHub
- Process Management: systemd
- Boot Manager: startx
04-Analysis
Funkčné požiadavky:

Detailné požiadavky:
- FR-001: Zobrazenie aktuálneho počasia (teplota, vlhkosť, vietor, tlak, pocitová teplota)
- FR-002: 5-dňová predpoveď s max/min teplotami a pravdepodobnosťou zrážok
- FR-003: Grafy teploty a vlhkosti za 24h s vizuálnymi trendmi
- FR-004: Automatická detekcia polohy pri štarte pomocou IP geolokácie
- FR-005: Manuálne vyhľadávanie miest s fullscreen klávesnicou
- FR-006: Automatické rotovanie stránok každých 10 sekúnd
- FR-007: Touchscreen navigácia pomocou tlačidiel ◀ ▶ 🔍
- FR-008: Virtuálna QWERTY klávesnica s číslicami, Space, Backspace, Clear
- FR-009: Automatická aktualizácia aplikácie z GitHub pri každom boote
- FR-010: Pravidelná aktualizácia počasia každých 10 minút
Nefunkčné požiadavky:

Risk Assessment

05-Design
UI Component Hierarchy

Color Palette

Data Model Schema

06-Implementation
Project Structure

Application Flow

Weather Data Processing Pipeline

Systemd Service Dependencies

Key Files and Configuration
1. Main Application (weather_display.py - 450+ lines)
- GUI creation with Tkinter
- Weather API integration
- Location detection
- Graph rendering
- Auto-rotate logic
- Virtual keyboard
2. Update Script (update_and_run.sh)
#!/bin/bash
REPO_URL="git@github.com:username/weather-pi-display.git"
APP_DIR="/home/revia/weather-app"
LOG_FILE="$APP_DIR/update.log"
echo "$(date): Starting update..." >> "$LOG_FILE"
if [ ! -d "$APP_DIR/.git" ]; then
git clone "$REPO_URL" "$APP_DIR"
else
cd "$APP_DIR"
git fetch origin
git reset --hard origin/main
fi
python3 weather_display.py
3. Display Configuration (/boot/firmware/config.txt)
dtparam=spi=on
dtoverlay=waveshare35a:rotate=270
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=87
hdmi_cvt=480 320 60 6 0 0 0
framebuffer_width=480
framebuffer_height=320
disable_overscan=1
4. Touchscreen Calibration (/etc/X11/xorg.conf.d/99-calibration.conf)
Section "InputClass"
Identifier "calibration"
MatchProduct "ADS7846 Touchscreen"
Option "Calibration" "160 3723 3896 181"
Option "SwapAxes" "1"
Option "InvertX" "1"
Option "InvertY" "1"
EndSection
APIs Used
| API | Endpoint | Purpose | Authentication | Rate Limit |
|---|---|---|---|---|
| Open-Meteo | api.open-meteo.com/v1/forecast | Current weather + Forecast data | No API Key | Unlimited |
| IP Geolocation | ip-api.com/json/ | Automatic location detection | No API Key | 45 req/min (Free) |
| Geocoding | geocoding-api.open-meteo.com | City search functionality | No API Key | Unlimited |
| GitHub | github.com/user/repo.git | Code updates via Git | SSH Key | Authenticated |
07-Testing & Verification
Test Coverage Overview
Total Tests: 14
- ✅ Passed: 11 (78.6%)
- ⚠️ Partial: 2 (14.3%)
- ❌ Issue: 1 (7.1%)
Test Cases Matrix
| Test ID | Kategória | Popis | Očakávaný výsledok | Status | Poznámka |
|---|---|---|---|---|---|
| TC-001 | Boot | System boot do GUI | GUI zobrazené < 60s | ✅ Pass | ~45s |
| TC-002 | Display | Touchscreen kalibrácia | Presné dotykové vstupy | ✅ Pass | Inverzné osi fungujú |
| TC-003 | Network | Automatická detekcia polohy | Správne mesto zobrazené | ✅ Pass | IP geolocation OK |
| TC-004 | API | Získanie aktuálneho počasia | Dáta zobrazené správne | ✅ Pass | Open-Meteo API |
| TC-005 | API | 5-dňová predpoveď | 5 dní zobrazených | ✅ Pass | Max/Min/Rain OK |
| TC-006 | API | 24h grafy | Grafy vykreslené | ✅ Pass | Smooth curves |
| TC-007 | UI | Auto-rotate stránok | Prepnutie každých 10s | ✅ Pass | Loop funguje |
| TC-008 | UI | Manuálna navigácia | Tlačidlá fungujú | ✅ Pass | ◀ ▶ responsive |
| TC-009 | UI | Vyhľadávanie mesta | Klávesnica + search funguje | ✅ Pass | QWERTY layout |
| TC-010 | Update | Git auto-pull pri boote | Nová verzia stiahnutá | ✅ Pass | GitHub sync OK |
| TC-011 | Error | WiFi výpadok | Zobrazí posledné dáta | ⚠️ Partial | Chýba offline mód |
| TC-012 | Error | API nedostupné | Error handling | ⚠️ Partial | Chýba user feedback |
| TC-013 | Performance | Responzívnosť UI | Akcia < 200ms | ✅ Pass | Average 100ms |
| TC-014 | Display | Ikony počasia | Všetky ikony zobrazené | ⚠️ Issue | Niektoré štvorčeky |
Performance Metrics
Boot Performance
| Fáza | Čas | Kumulatívne |
|---|---|---|
| Power On → Kernel Boot | ~10s | 10s |
| Kernel Boot → Systemd Services | ~15s | 25s |
| Systemd Services → X11 Start | ~10s | 35s |
| X11 Start → App Running | ~10s | 45s |
Runtime Performance
| Metrika | Hodnota |
|---|---|
| CPU Idle | 5-15% |
| CPU Refresh | 30-40% |
| RAM Usage | ~80MB |
| Power Consumption | ~1.5W |
Response Times
| Operácia | Čas |
|---|---|
| API Request | 200-500ms |
| UI Interaction | < 100ms |
| Touch Input | < 200ms |
Known Issues and Resolutions
| Issue # | Problém | Severity | Fix | Status |
|---|---|---|---|---|
| #1 | Emoji ikony zobrazené ako štvorčeky | 🟡 LOW | Nahradiť ASCII symbolmi | ✅ Ready to implement |
| #2 | Pri výpadku WiFi aplikácia nereaguje | 🔴 MEDIUM | Offline mód s cache | 📅 Future enhancement |
| #3 | Pri zlyhaní API nejasná chyba | 🟡 LOW | User-friendly errors | 📅 Future enhancement |
08-Operation
Deployment Process
Deployment Steps (30 krokov, ~2 hodiny):
1. Príprava hardvéru (10 min)
- Pripojenie Waveshare LCD na GPIO pins
- Vloženie SD karty do Raspberry Pi
2. Inštalácia OS (20 min)
- Flash Raspberry Pi OS 64-bit pomocou Raspberry Pi Imager
- Boot systému
- SSH pripojenie:
ssh revia@<ip-address>
3. Inštalácia LCD drivera (15 min + reboot)
git clone https://github.com/waveshare/LCD-show.gitcd LCD-show/chmod +x LCD4-showsudo ./LCD4-show- Automatický reboot
4. Konfigurácia X11 (10 min)
sudo nano /boot/firmware/config.txt- pridať LCD konfiguráciu- Vytvorenie Xorg configs v
/etc/X11/xorg.conf.d/ sudo apt-get install xserver-xorg-video-fbdev
5. Inštalácia dependencií (10 min)
sudo apt-get updatesudo apt-get install python3-tk python3-pil python3-requests gitpip3 install requests pillow --break-system-packages
6. Setup GitHub (15 min)
ssh-keygen -t ed25519 -C "weather-pi"cat ~/.ssh/id_ed25519.pub- kopírovať- Pridať SSH key do GitHub (Settings → SSH keys)
- Test:
ssh -T git@github.com
7. Vytvorenie systemd services (20 min)
- Vytvorenie
/etc/systemd/system/startx@revia.service - Vytvorenie
/etc/systemd/system/weather-display.service sudo systemctl enable startx@reviasudo systemctl enable weather-display
8. Finálny reboot a test (10 min)
sudo reboot- Vizuálna kontrola displeja
- Test touchscreen navigácie
- Overenie auto-update funkcionality
- Kontrola logov:
journalctl -u weather-display.service - ✅ Deployment dokončený
System Monitoring
Health Checks
| Check | Command | Frekvencia |
|---|---|---|
| Service Status | systemctl status weather-display.service | Týždenne |
| Display Output | Vizuálna inšpekcia | Denne |
| Network Connectivity | ping -c 3 8.8.8.8 | Denne |
| API Responses | curl api.open-meteo.com | Týždenne |
| Disk Space | df -h | Mesačne |
Logging
| Log Type | Location | Purpose |
|---|---|---|
| Systemd Journal | journalctl -u weather-display.service | Application logs |
| Update Log | ~/weather-app/update.log | Git pull history |
| Xorg Logs | ~/.local/share/xorg/Xorg.0.log | Display server logs |
Maintenance Tasks
| Task | Frekvencia | Command |
|---|---|---|
| Auto-update from GitHub | Denne | Automatické pri boote |
| Weather data refresh | Každých 10 min | Automatické v aplikácii |
| Check service logs | Týždenne | journalctl -u weather-display.service |
| Verify display function | Týždenne | Vizuálna kontrola |
| OS package updates | Mesačne | sudo apt update && sudo apt upgrade |
| Review error logs | Mesačne | journalctl -p err |
| SD card health check | Kvartálne | sudo smartctl -a /dev/mmcblk0 |
| Backup configuration | Kvartálne | Záloha konfig súborov |
Maintenance Schedule
| Časové obdobie | Aktivita | Status |
|---|---|---|
| Denne | Auto-update from GitHub | ✅ Automatické |
| Denne | Weather data refresh | ✅ Automatické |
| Týždenne | Check service logs | 📋 Manuálne |
| Týždenne | Verify display function | 📋 Manuálne |
| Mesačne | OS package updates | 📋 Manuálne |
| Mesačne | Review error logs | 📋 Manuálne |
| Kvartálne | SD card health check | 📋 Manuálne |
| Kvartálne | Backup configuration | 📋 Manuálne |
09-Change Management
Version Control Strategy
Branch Strategy:
main- Production-ready codefeature/*- Nové funkciebugfix/*- Opravy chýb
Git Workflow:
v0.1.0 (Initial) → v0.2.0 (Forecast) → feature/graphs → v0.3.0 (Merge)
→ v0.4.0 (Navigation) → feature/location → v0.5.0 (Merge)
→ v0.6.0 (Layout) → v1.0.0 (Production)
Release History
| Version | Date | Changes | Status |
|---|---|---|---|
| v0.1.0 | 2025-01-XX | Initial setup, basic weather display | ✅ Released |
| v0.2.0 | 2025-01-XX | Added 5-day forecast | ✅ Released |
| v0.3.0 | 2025-01-XX | Added temperature & humidity graphs | ✅ Released |
| v0.4.0 | 2025-01-XX | Auto-rotate pages, touch navigation | ✅ Released |
| v0.5.0 | 2025-01-XX | Location detection + manual search | ✅ Released |
| v0.6.0 | 2025-01-XX | Combined weather + forecast page | ✅ Released |
| v1.0.0 | 2025-01-15 | Production ready release | 🟡 Current |
| v1.1.0 | TBD | Fix emoji icons, offline mode | 📅 Planned |
Future Roadmap
Phase 1 - Current (v1.0) ✅
- ✅ Základná funkcionalita
- ✅ Auto-rotate stránok (10s)
- ✅ Location detection (IP-based)
- ✅ GitHub auto-update
Phase 2 - Q1 2025 (v1.1-1.2) 📅
- 🟡 Fix emoji ikony → ASCII fallback
- 🟡 Offline mód → Cache posledných dát
- 📋 BME280 sensor integration → Lokálne merania
- 📋 Local vs API comparison → Porovnanie dát
Phase 3 - Q2 2025 (v1.3-1.4) 📅
- 📋 Historical data → SQLite databáza
- 📋 Weekly/monthly trends → Dlhodobé grafy
- 📋 Multiple locations → Swipe medzi mestami
- 📋 Weather alerts → Push notifikácie
- 📋 Sun/Moon data → Východ/západ slnka
Phase 4 - Q3 2025 (v2.0) 🎯
- 📋 Web interface → Remote konfigurácia
- 📋 MQTT/Home Assistant → Smart home integrácia
- 📋 Air quality index → Kvalita ovzdušia
- 📋 Pollen count → Alergény
- 📋 Custom enclosure → 3D tlačený obal
Enhancement Backlog Priority
Phase 2: Improvements (Priorita: HIGH)
- Fix Emoji Icons - ASCII fallback ⚡
- Offline Mode - Cache last data ⚡
- BME280 Sensor - Local measurements 🔧
- Comparison View - API vs Sensor 🔧
Phase 3: Features (Priorita: MEDIUM) 5. SQLite Database - Historical storage 📊 6. Trend Analysis - Weekly/Monthly graphs 📊 7. Multi-location - Swipe between cities 🌍 8. Weather Alerts - Push notifications 🔔 9. Sun/Moon Data - Sunrise/sunset times ☀️🌙
Phase 4: Integration (Priorita: LOW) 10. Web Dashboard - Remote config 🌐 11. MQTT Support - Home Assistant 🏠 12. AQI Display - Air quality index 💨 13. Pollen Count - Allergy info 🌸 14. 3D Printed Case - Custom enclosure 📦
Záverečné zhodnotenie

Splnené ciele
Hardware Integration:
- ✅ Raspberry Pi Zero 2 W
- ✅ Waveshare 4inch LCD
- ✅ Touchscreen calibrated
- ✅ Auto-boot to GUI
Software Implementation:
- ✅ Python + Tkinter
- ✅ Open-Meteo API
- ✅ GitHub auto-update
- ✅ Multi-page UI
- ✅ Virtual keyboard
User Experience:
- ✅ Intuitive navigation
- ✅ Auto-rotate pages
- ✅ Manual controls
- ✅ Location detection
- ✅ City search
System Reliability:
- ✅ Systemd services
- ✅ Auto-restart
- ✅ Error handling
- ✅ Boot time 45s
Úspešne implementované funkcie
✅ Hardware Setup
- Raspberry Pi Zero 2 W plne funkčný
- Waveshare 4" LCD (480x320) s SPI komunikáciou
- Kalibrovaný touchscreen s inverznou osou X/Y
- Automatický štart do X11 GUI bez login promptu
✅ Core Features
- Zobrazenie aktuálneho počasia (teplota, vlhkosť, vietor, tlak)
- 5-dňová predpoveď s max/min teplotami a pravdepodobnosťou dažďa
- Grafy teploty a vlhkosti za posledných 24 hodín
- Automatická detekcia polohy cez IP geolokáciu
- Manuálne vyhľadávanie miest s fullscreen klávesnicou
✅ User Interface
- 2 hlavné stránky s automatickým rotovaním každých 10 sekúnd
- Touchscreen navigácia pomocou tlačidiel (◀ ▶ 🔍)
- Virtuálna QWERTY klávesnica s číslicami
- Responzívne ovládanie (< 100ms reakcia)
- Optimalizovaný layout pre 480x320px displej
✅ System Architecture
- GitHub auto-update pri každom štarte
- Systemd services pre automatický štart
- Pravidelná aktualizácia počasia každých 10 minút
- Graceful restart pri páde aplikácie
- Nízka spotreba energie (~1.5W)
Nedokončené úlohy
⚠️ Fyzický obal
- Stav: Nerealizované
- Dôvod: Časové obmedzenie projektu
- Dopad: Displej a Raspberry Pi sú exponované, nie sú chránené pred poškodením
- Riešenie:
- Dočasné: Použitie existujúceho obalu alebo kartónovej krabice
- Dlhodobé: Návrh a 3D tlač custom obalu v Phase 4
⚠️ Emoji ikony
- Stav: Čiastočne funkčné
- Problém: Niektoré emoji sa zobrazujú ako štvorčeky kvôli chýbajúcim fontom
- Priorita: LOW
- Fix ready: Nahradenie ASCII/Unicode symbolmi pripravené
⚠️ Offline mode
- Stav: Chýba
- Problém: Pri výpadku WiFi aplikácia nemá graceful degradation
- Priorita: MEDIUM
- Plánované: Phase 2 (v1.1)
Technické metriky projektu
Code Statistics
| Metrika | Hodnota |
|---|---|
| Python Lines | 450+ |
| Functions | 25+ |
| Classes | 1 main class |
| API Integrations | 3 |
Performance
| Metrika | Hodnota | Status |
|---|---|---|
| Boot time | 45s | ✅ Target: <60s |
| Memory usage | 80MB | ✅ Low |
| CPU idle | 5-15% | ✅ Efficient |
| CPU active | 30-40% | ✅ Acceptable |
| Power consumption | 1.5W | ✅ Very low |
Reliability
| Metrika | Hodnota | Status |
|---|---|---|
| Uptime | 99.9% | ✅ Excellent |
| API Success rate | 99% | ✅ Reliable |
| Auto-restart | Yes | ✅ Enabled |
| Error handling | Partial | ⚠️ Needs improvement |
User Experience
| Metrika | Hodnota | Status |
|---|---|---|
| Pages | 2 | ✅ Optimized |
| Auto-rotate interval | 10s | ✅ Good pace |
| Touch response | <200ms | ✅ Responsive |
| UI response | <100ms | ✅ Fast |