Nome stabile della seriale via udev e note sull'indicatore di cattura

- udev/99-ambilight.rules: symlink /dev/ambilight ancorato alla porta USB fisica
  (il CH340 clone non ha iSerial, quindi by-id non e' univoco), ID_MM_DEVICE_IGNORE,
  TAG+=uaccess
- setup-udev.sh: rileva VID/PID/porta, installa la regola, verifica il symlink
- backend: fallback di porta (config -> /dev/ambilight -> /dev/ttyUSB0) e campo 'dev'
  nello stato D-Bus
- README: tabella dei percorsi, prove sull'indicatore di condivisione schermo e le
  tre alternative (portal, KWin ScreenShot2, kmsgrab)
This commit is contained in:
enne2
2026-11-01 13:16:08 +01:00
parent a3b6bc66c9
commit db47640846
5 changed files with 154 additions and 2 deletions
+55
View File
@@ -75,6 +75,61 @@ systemctl --user status ambilight.service
- 47 LED, Adalight a 115200: ~**78 fps** (limite teorico della seriale per 147 byte/frame).
- Cattura: portal + PipeWire, pipeline ridotta a `47×4 × 72` px RGB → costo CPU trascurabile.
## Nome stabile del dispositivo seriale
La scheda (CH340, `1a86:7523`) **non espone un iSerial**: verificato con
`cat /sys/bus/usb/devices/1-2/serial` → vuoto. Di conseguenza:
| percorso | valore su questa macchina | unico? |
|---|---|---|
| `/dev/ttyUSB0` | assegnato in ordine di enumerazione | no |
| `/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0` | derivato da `ID_SERIAL=1a86_USB_Serial` | **no** (due cloni identici collidono) |
| `/dev/serial/by-path/pci-0000:65:00.3-usb-0:2:1.0-port0` | legato alla porta USB fisica | sì |
| `/dev/ambilight` (regola udev) | symlink creato da noi | sì |
Installa la regola (richiede sudo, una volta):
```sh
sudo ./setup-udev.sh /dev/ttyUSB0 # rileva la porta fisica e scrive /etc/udev/rules.d/99-ambilight.rules
ambilight-ctl set port /dev/ambilight
systemctl --user restart ambilight.service
```
La regola aggancia `KERNELS=="<porta>"` + VID/PID (non il numero `ttyUSB`), crea
`/dev/ambilight`, aggiunge `ID_MM_DEVICE_IGNORE` (ModemManager smette di sondare la
porta) e `TAG+="uaccess"` (accesso ACL all'utente attivo). Se sposti la scheda su
un'altra porta USB il nome non segue: rilancia `setup-udev.sh`.
Il demone comunque ripiega su `/dev/ambilight` e poi `/dev/ttyUSB0` se il percorso
configurato non esiste, e riporta il dispositivo realmente aperto nel campo `dev`
di `ambilight-ctl state`.
## L'indicatore di condivisione schermo nel vassoio
Con la cattura via **portal ScreenCast**, KDE mostra nel vassoio un **pallino rosso**
finché la sessione di condivisione è attiva. Verificato su questa macchina:
- compare/scompare insieme allo streaming (diff di due screenshot: cambia solo quella
regione del vassoio, ~1.500 px in 172x22);
- **non** è un plasmoide di sistema (`/usr/share/plasma/plasmoids` non contiene nulla
di simile) e **non** compare in `knownItems`/`extraItems` del vassoio, quindi non
esiste la voce "Configure System Tray → Entries" per nasconderlo: è un indicatore
di stato del shell, per scelta di KDE.
Le alternative per non averlo:
1. **KWin ScreenShot2** (nessun portal, nessun indicatore): KWin autorizza solo i
processi con un `.desktop` che dichiara `X-KDE-DBUS-Restricted-Interfaces=org.kde.KWin.ScreenShot2`.
Provato con un `.desktop` utente (`Exec=/usr/bin/python3` e `python3.14`) + `kbuildsycoca6`:
risponde ancora `org.kde.KWin.ScreenShot2.Error.NoAuthorized`. Non provato l'entry
in `/usr/local/share/applications` (richiede sudo). Se funziona, la cattura è un
`CaptureArea` della sola fascia (nessun indicatore, ma costo CPU per frame).
2. **kmsgrab** (`ffmpeg -f kmsgrab`) da un servizio privilegiato con `CAP_SYS_ADMIN`:
nessun portal e nessun indicatore, ma cattura DRM grezza (piano/format legati alla
GPU) e un servizio di sistema: più fragile.
3. Tenere il portal: costo GPU minimo, ~78 fps, indicatore visibile.
## Note
- Il firmware Adalight manda `Ada\n` una volta al secondo quando non riceve frame: è