Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
b632db5
feat: add opt-in platform runtime facade
yvvvl Aug 27, 2026
6c31956
feat: expose platform capabilities at app bootstrap
yvvvl Aug 27, 2026
157faf8
fix: stabilize quick panel layout and tray activation
yvvvl Aug 27, 2026
93c0136
feat: support transient multi-target selection
yvvvl Aug 27, 2026
51fde27
fix: persist packaged Windows data in local appdata
yvvvl Aug 27, 2026
2b3bd9b
feat: add read-only GitHub release channel checks
yvvvl Aug 27, 2026
360db11
docs: define temporary quick panel window behavior
yvvvl Aug 27, 2026
f158d30
fix: preserve configuration in packaged Flet builds
yvvvl Aug 27, 2026
e2452fe
docs: define v1.2 release and RGBIC beta roadmap
yvvvl Aug 27, 2026
fd26e63
feat: add virtual multi-light development fixture
yvvvl Aug 28, 2026
67ea2a0
feat: add safe update notification
yvvvl Aug 28, 2026
6b806b9
fix: remove quick panel from public tray flow
yvvvl Aug 28, 2026
7775abe
fix: store packaged Windows data in local appdata
yvvvl Aug 28, 2026
12c794d
docs: record Windows AppData validation
yvvvl Aug 28, 2026
e546f6f
docs: record real Windows WiZ validation
yvvvl Aug 28, 2026
03d1d0b
docs: record Windows hotkey smoke validation
yvvvl Aug 28, 2026
0cbd277
docs: record clean Windows candidate validation
yvvvl Aug 28, 2026
a562b14
docs: close Windows release hardening phase
yvvvl Aug 28, 2026
b081e2c
release: prepare WizZ Desktop v1.2.0
yvvvl Aug 28, 2026
bc027d7
docs: record v1.2.0 release candidate artifact
yvvvl Aug 28, 2026
70dc226
feat: wire Linux beta desktop integration
yvvvl Aug 28, 2026
3c277e6
fix: use visible GNOME tray icon
yvvvl Aug 28, 2026
859fdb4
fix: run Linux tray loop independently
yvvvl Aug 28, 2026
74f3d7b
fix: disable unsafe Linux global hotkeys
yvvvl Aug 28, 2026
7e06282
feat: adapt Linux desktop messaging and storage
yvvvl Aug 28, 2026
577fb0d
fix: make Linux hotkey status non-interactive
yvvvl Aug 28, 2026
b3d1140
fix: invoke Flet CLI in Linux build script
yvvvl Aug 28, 2026
9e46fa1
fix: mark Linux build script executable
yvvvl Aug 28, 2026
29acf97
test: simulate hotkey platforms consistently
yvvvl Aug 28, 2026
d48ad72
test: simulate supported platform for hotkey panel
yvvvl Aug 28, 2026
966b1ec
fix: isolate platform detection from global os state
yvvvl Aug 28, 2026
a73b22c
test: isolate desktop platform simulations on Linux
yvvvl Aug 28, 2026
68cb67a
fix: use portable platform checks for startup
yvvvl Aug 28, 2026
9aad517
fix: preflight Linux linker dependency
yvvvl Aug 28, 2026
39bce65
fix: bundle Linux tray runtime dependencies
yvvvl Aug 28, 2026
4841547
docs: prepare v1.2 release material
yvvvl Aug 28, 2026
72656ad
fix: make Linux CI dependencies deterministic
yvvvl Aug 28, 2026
84d4b8d
Merge pull request #7 from yvvvl/feature/v1.2.0-linux-beta
yvvvl Aug 28, 2026
a376e3a
feat: add Linux desktop launcher installer
yvvvl Aug 28, 2026
90f05d0
ci: verify Linux launcher installation
yvvvl Aug 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@ jobs:
requirements.txt
requirements-dev.txt

- name: Install Linux tray build prerequisites
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
libcairo2-dev libgirepository1.0-dev \
gir1.2-ayatanaappindicator3-0.1

- name: Install dependencies
run: |
python -m pip install --upgrade pip
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/cross-platform-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ jobs:
with:
python-version: "3.13"

- name: Install test runner
run: python -m pip install "pytest>=8.0"
- name: Install platform-boundary test dependencies
run: python -m pip install "pytest>=8.0" "pystray>=0.19.5" "Pillow>=10.0.0"

- name: Compile platform boundary
run: python -m compileall -q core/platform tests/test_platform_capabilities.py tests/test_platform_linux.py
Expand Down
73 changes: 73 additions & 0 deletions .github/workflows/linux-beta-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
name: Linux beta build

on:
push:
branches:
- feature/v1.2.0-linux-beta
- "release/**"
pull_request:
paths:
- "**.py"
- "pyproject.toml"
- "requirements*.txt"
- "scripts/build_linux.sh"
- ".github/workflows/linux-beta-build.yml"

permissions:
contents: read

jobs:
package-linux:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v5
with:
# Match the embedded runtime used by the current Flet Linux build.
python-version: "3.12"

- name: Install Flet Linux prerequisites
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
binutils clang cmake llvm lld ninja-build pkg-config \
libcairo2-dev libgirepository1.0-dev \
gir1.2-ayatanaappindicator3-0.1 \
libgtk-3-dev libsecret-1-0 libsecret-1-dev libunwind-dev \
gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 \
gstreamer1.0-libav gstreamer1.0-plugins-base \
gstreamer1.0-plugins-good gstreamer1.0-tools gstreamer1.0-x

- name: Install Python dependencies
run: python -m pip install -r requirements.txt -r requirements-dev.txt -r requirements-build.txt

- name: Test and package Linux beta
run: bash scripts/build_linux.sh --output dist/linux

- name: Verify application-menu installer
shell: bash
run: |
set -euo pipefail
export XDG_DATA_HOME="$RUNNER_TEMP/wizz-xdg-data"
bash dist/linux/install.sh

desktop_file="$XDG_DATA_HOME/applications/io.github.yvvvl.wizz-controller.desktop"
installed_app="$XDG_DATA_HOME/WizZDesktop/WizZDesktop"
test -f "$desktop_file"
test -x "$installed_app"
grep -F "Exec=$installed_app" "$desktop_file"
grep -F "Icon=$XDG_DATA_HOME/WizZDesktop/assets/icon.png" "$desktop_file"

bash "$XDG_DATA_HOME/WizZDesktop/uninstall.sh"
test ! -e "$desktop_file"
test ! -e "$XDG_DATA_HOME/WizZDesktop"

- uses: actions/upload-artifact@v4
with:
name: WizZDesktop-v1.2.0-linux-x64
path: |
dist/linux
dist/release/WizZDesktop-v1.2.0-linux-x64.tar.gz
dist/release/WizZDesktop-v1.2.0-linux-x64.tar.gz.sha256
if-no-files-found: error
44 changes: 44 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,49 @@
# Changelog

## v1.2.0

### Added

- Selección temporal de una, varias o todas las ampolletas, sin necesidad de
crear ni editar grupos persistentes.
- Comprobación manual y segura de actualizaciones desde GitHub Releases.
- Fixture de desarrollo con ampolletas virtuales para validar targeting sin
necesitar hardware múltiple.
- Beta Linux para Ubuntu Desktop: paquete nativo, persistencia XDG,
AppIndicator, apertura de Datos/Logs y arranque automático por usuario.
- Instalador Linux sin `sudo`, con lanzador en el menú de aplicaciones y
desinstalación que conserva los datos personales.

### Changed

- Las builds Windows guardan configuraciones y logs en
`%LOCALAPPDATA%\\WizZDesktop` y migran datos de instalaciones Flet previas.
- Un clic en el icono de bandeja restaura directamente la ventana principal.
- El Quick Panel experimental fue retirado del flujo público de la bandeja.
- En Linux, los hotkeys globales se muestran como no disponibles: no se usa
`sudo` ni se intentan hooks inseguros sobre dispositivos de entrada.

### Fixed

- Restauración de ventana, salida real desde la bandeja e instancia única en
builds Windows.
- Persistencia de datos al reemplazar o ejecutar una copia aislada del
ejecutable.
- El paquete Linux ahora incluye las dependencias PyGObject/AppIndicator que
necesita el icono de bandeja fuera del entorno de desarrollo.

### Validation

- 368 pruebas automatizadas completadas en Windows y Ubuntu Desktop; auditoría
i18n: 608 claves en inglés y español, sin strings UI hardcodeados.
- Validación Windows real: bandeja, hotkeys, instancia única, AppData,
extracción limpia y control de una ampolleta WiZ por LAN.
- Validación Linux beta real: build nativa, archivo extraído, bandeja,
persistencia XDG y control LAN de la misma ampolleta WiZ.

> RGBIC, Screen Sync, streaming y actualización automática no forman parte de
> esta versión estable.

## v1.1.0

### Added
Expand Down
123 changes: 99 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

# WizZ Desktop

### Control local, rápido y privado para ampolletas WiZ en Windows
### Control local, rápido y privado para ampolletas WiZ

[![Release](https://img.shields.io/github/v/release/yvvvl/WizzController?label=release)](https://github.com/yvvvl/WizzController/releases/latest)
[![CI](https://github.com/yvvvl/WizzController/actions/workflows/ci.yml/badge.svg)](https://github.com/yvvvl/WizzController/actions/workflows/ci.yml)
Expand All @@ -24,22 +24,25 @@

Las acciones normales se envían por **UDP LAN nativo**, por lo que el control no depende de la nube de WiZ y mantiene una respuesta rápida incluso cuando la conexión a Internet no está disponible.

La aplicación está diseñada para Windows y combina control de iluminación, automatizaciones, hotkeys globales y una interfaz moderna en un único programa portable.
La aplicación combina control de iluminación, automatizaciones y una interfaz
moderna en un único programa portable. Windows es la plataforma estable;
Linux se entrega como beta para Ubuntu Desktop y otros escritorios compatibles.

> Versión actual: **v1.1.0 · build 1**
> Candidato de release actual: **v1.2.0 · build 2**

## Novedades v1.1.0
## Novedades v1.2.0

- Interfaz completa en español e inglés.
- Detección automática del idioma del sistema.
- Selector manual de idioma.
- Nuevo editor inteligente de favoritos:
- RGB usando Color Studio.
- Blanco mediante temperatura Kelvin.
- Escenas WiZ.
- Control dedicado de brillo.
- Mejoras de estabilidad en Windows.
- Distribución portable con licencias de terceros incluidas.
- Selección temporal de una, varias o todas las ampolletas.
- Comprobación manual y segura de actualizaciones desde GitHub Releases.
- Configuración y logs persistentes en AppData Local para builds Windows.
- Restauración más predecible de la ventana desde la bandeja.
- Validación real de control WiZ, tray, hotkeys, instancia única y ejecutable
aislado en Windows.
- Beta Linux: persistencia XDG, bandeja AppIndicator en GNOME/Wayland,
apertura de Datos/Logs y arranque automático por usuario.

> RGBIC, Screen Sync, streaming y actualización automática no están incluidos
> en esta versión estable.

---

Expand Down Expand Up @@ -84,7 +87,7 @@ La aplicación está diseñada para Windows y combina control de iluminación, a
- Hotkeys globales nativas mediante `RegisterHotKey`.
- Fallback selectivo usando `keyboard` cuando una combinación está ocupada.
- System tray con acciones rápidas.
- Doble clic en el icono de bandeja para mostrar u ocultar la ventana.
- Un clic en el icono de bandeja para restaurar la ventana principal.
- Cierre a bandeja.
- Inicio minimizado.
- Inicio automático con Windows.
Expand All @@ -104,32 +107,53 @@ La aplicación está diseñada para Windows y combina control de iluminación, a

## Instalación para usuarios

### Requisitos
### Windows estable — requisitos

- Windows 10 u 11 de 64 bits.
- Una ampolleta WiZ conectada a la misma red local que el PC.

### Pasos

1. Abre la [última release](https://github.com/yvvvl/WizzController/releases/latest).
2. Descarga `WizZDesktop-v1.1.0-windows-x64.zip`.
2. Descarga `WizZDesktop-v1.2.0-windows-x64.zip`.
3. Extrae todo el contenido del ZIP.
4. Ejecuta `WizZDesktop.exe`.

> No ejecutes el programa directamente dentro del ZIP y no separes el `.exe` de las DLL ni de la carpeta `data`.

La descarga incluye un archivo `.sha256` para comprobar la integridad del paquete.

### Linux beta — Ubuntu Desktop

La beta Linux se distribuye como `WizZDesktop-v1.2.0-linux-x64.tar.gz` con su
archivo `.sha256`. Extrae el archivo, abre una terminal dentro de la carpeta
extraída y ejecuta `./install.sh`. No requiere `sudo`: instala la app para tu
usuario, crea el acceso **WizZ Desktop** en Aplicaciones y conserva tus datos
al actualizar. Luego puedes abrirla desde Actividades y anclarla al dock.

Para retirar la aplicación instalada, ejecuta
`~/.local/share/WizZDesktop/uninstall.sh`. Esto elimina la app y su lanzador,
pero conserva tus configuraciones, ampolletas, favoritos y logs.

También puedes ejecutar `./WizZDesktop` directamente desde la carpeta
extraída si prefieres usarla en modo portable. La plataforma validada es Ubuntu
Desktop con GNOME; en Wayland, la posición de ventana la decide el compositor.

La bandeja requiere un escritorio compatible con AppIndicator. Si no está
disponible, la aplicación sigue siendo usable como ventana normal. Los hotkeys
globales están deshabilitados intencionalmente en Linux beta hasta contar con
un backend seguro basado en el portal XDG.

### Verificar SHA-256 en PowerShell

```powershell
Get-FileHash .\WizZDesktop-v1.1.0-windows-x64.zip -Algorithm SHA256
Get-FileHash .\WizZDesktop-v1.2.0-windows-x64.zip -Algorithm SHA256
```

Compara el resultado con el contenido de:

```text
WizZDesktop-v1.1.0-windows-x64.zip.sha256
WizZDesktop-v1.2.0-windows-x64.zip.sha256
```

---
Expand All @@ -152,7 +176,8 @@ Si eliminas una ampolleta, permanecerá fuera de la lista hasta que realices una

- Python `>=3.11,<3.14`.
- Flet `0.85.2`.
- Windows para tray, hotkeys nativas y build final.
- Windows para la build estable de Windows.
- Ubuntu Desktop o WSL para la build beta Linux.

### Preparar el entorno

Expand Down Expand Up @@ -208,8 +233,8 @@ WizZ Desktop utiliza `flet build windows`; no usa PyInstaller.
```text
dist/windows/WizZDesktop.exe
dist/windows/BUILD_INFO.json
dist/release/WizZDesktop-v1.0.0-windows-x64.zip
dist/release/WizZDesktop-v1.0.0-windows-x64.zip.sha256
dist/release/WizZDesktop-v1.2.0-windows-x64.zip
dist/release/WizZDesktop-v1.2.0-windows-x64.zip.sha256
```

### Smoke test
Expand All @@ -223,6 +248,44 @@ La guía completa está en

---

## Build nativa para Linux beta

En Ubuntu 22.04 instala las dependencias de compilación y AppIndicator:

```bash
sudo apt install -y clang cmake ninja-build pkg-config libgtk-3-dev \
lld-14 libcairo2-dev libgirepository1.0-dev \
gir1.2-ayatanaappindicator3-0.1
```

Luego crea el entorno Python del proyecto e instala sus dependencias:

```bash
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt -r requirements-dev.txt -r requirements-build.txt
```

Finalmente ejecuta:

```bash
source .venv/bin/activate
bash scripts/build_linux.sh --clean
```

Las salidas son:

```text
dist/linux/WizZDesktop
dist/linux/BUILD_INFO.json
dist/linux/install.sh
dist/linux/uninstall.sh
dist/release/WizZDesktop-v1.2.0-linux-x64.tar.gz
dist/release/WizZDesktop-v1.2.0-linux-x64.tar.gz.sha256
```

---

## Datos y privacidad

WizZ Desktop no necesita una cuenta propia ni una base de datos remota para controlar las luces por LAN.
Expand All @@ -233,7 +296,18 @@ En desarrollo, los archivos locales viven en:
config/json/
```

En el ejecutable, configuraciones y logs se guardan en el almacenamiento persistente asignado por Flet.
En el ejecutable Windows, configuraciones y logs se guardan en:

```text
%LOCALAPPDATA%\WizZDesktop
```

Las instalaciones Flet previas se migran automáticamente la primera vez que
se ejecuta esta versión.

En la build Linux, Flet proporciona el almacenamiento de usuario. Cuando no
existe ese directorio, WizZ usa la ruta XDG del usuario bajo
`~/.config/WizZDesktop`.

Puedes abrir las ubicaciones reales desde:

Expand Down Expand Up @@ -320,7 +394,8 @@ python tools/probe_remove_active_bulb.py --ip 192.168.1.4

## Estado del proyecto

La versión `v1.0.0` representa la primera release estable y portable para Windows x64.
La versión `v1.2.0` es el candidato actual para la siguiente release estable
portable de Windows x64.

El proyecto cuenta con pruebas automatizadas para:

Expand Down
4 changes: 2 additions & 2 deletions app_meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
APP_ARTIFACT = "WizZDesktop"
APP_ID = "WizZDesktop"
APP_REGISTRY_NAME = "WizZController"
APP_VERSION = "1.1.0"
APP_BUILD_NUMBER = 1
APP_VERSION = "1.2.0"
APP_BUILD_NUMBER = 2
APP_DESCRIPTION = "Control local de ampolletas WiZ por LAN."
APP_COMPANY = "yvvvl"
APP_COPYRIGHT = "Copyright © 2026 Ignacio"
Expand Down
Loading
Loading