platformio.ini: hardcoded upload_port is niet portable #11

Closed
opened 2026-08-02 20:34:35 +02:00 by eddy · 2 comments
Owner

Probleem

In platformio.ini staat een hardcoded upload_port per environment:

[env:s3lite-server]
upload_port = /dev/serial/by-id/usb-Espressif_USB_JTAG_serial_debug_unit_44:1B:F6:F4:CF:14-if00

[env:s3lite-client]
upload_port = /dev/ttyACM2

Problemen:

  • Machine-specifiek — werkt niet op een andere computer of met een andere ESP32
  • /dev/ttyACM* kan wisselen als andere USB-apparaten worden aangesloten
  • De AGENTS.md zegt expliciet "NOOIT /dev/ttyACM0" (Atreus toetsenbord), maar /dev/ttyACM2 is even onbetrouwbaar

Oplossing

Verwijder upload_port uit platformio.ini en laat PlatformIO de juiste poort automatisch detecteren, óf gebruik een platformio.local.ini (gitignored) met machine-specifieke instellingen.

Optie A: Auto-detectie (aanbevolen)

Verwijder upload_port uit beide environments. PlatformIO kan automatisch de ESP32 vinden als er maar één verbonden is. Bij meerdere ESP32s kan de gebruiker pio run -e s3lite-server --target upload --upload-port /dev/... gebruiken.

Optie B: platformio.local.ini

  1. Voeg platformio.local.ini toe aan .gitignore
  2. Verplaats upload_port naar platformio.local.ini:
    [env:s3lite-server]
    upload_port = /dev/serial/by-id/usb-Espressif_...
    
    [env:s3lite-client]
    upload_port = /dev/serial/by-id/usb-Espressif_...
    
  3. PlatformIO merget platformio.local.ini automatisch met platformio.ini

Optie B geeft het gemak van hardcoded poorten zonder de machine-specifieke paden in git te committen.

## Probleem In `platformio.ini` staat een hardcoded upload_port per environment: ```ini [env:s3lite-server] upload_port = /dev/serial/by-id/usb-Espressif_USB_JTAG_serial_debug_unit_44:1B:F6:F4:CF:14-if00 [env:s3lite-client] upload_port = /dev/ttyACM2 ``` Problemen: - Machine-specifiek — werkt niet op een andere computer of met een andere ESP32 - `/dev/ttyACM*` kan wisselen als andere USB-apparaten worden aangesloten - De AGENTS.md zegt expliciet "NOOIT `/dev/ttyACM0`" (Atreus toetsenbord), maar `/dev/ttyACM2` is even onbetrouwbaar ## Oplossing Verwijder `upload_port` uit `platformio.ini` en laat PlatformIO de juiste poort automatisch detecteren, óf gebruik een `platformio.local.ini` (gitignored) met machine-specifieke instellingen. ### Optie A: Auto-detectie (aanbevolen) Verwijder `upload_port` uit beide environments. PlatformIO kan automatisch de ESP32 vinden als er maar één verbonden is. Bij meerdere ESP32s kan de gebruiker `pio run -e s3lite-server --target upload --upload-port /dev/...` gebruiken. ### Optie B: platformio.local.ini 1. Voeg `platformio.local.ini` toe aan `.gitignore` 2. Verplaats `upload_port` naar `platformio.local.ini`: ```ini [env:s3lite-server] upload_port = /dev/serial/by-id/usb-Espressif_... [env:s3lite-client] upload_port = /dev/serial/by-id/usb-Espressif_... ``` 3. PlatformIO merget `platformio.local.ini` automatisch met `platformio.ini` Optie B geeft het gemak van hardcoded poorten zonder de machine-specifieke paden in git te committen.
Author
Owner

Oplossing

Verwijder upload_port uit platformio.ini en vervang door een POST-script dat automatisch de juiste ESP32 detecteert via een nieuw ID? serial commando.

1. Firmware: ID? commando

Beide firmwares krijgen een nieuw serial commando:

  • main.cpp: ID? → antwoordt SylDa_Server
  • client.cpp: ID? → antwoordt SylDa_Client

Dit past in de bestaande serial command chain naast KEY?, VERSION?, etc.

2. Script: tools/pio_upload_port.py (POST)

Gebaseerd op PlatformIO docs (geverifieerd):

  • env.AddPreAction("upload", callback) — hook vlak vóór upload
  • env["UPLOAD_PORT"] — dynamisch poort instellen
  • env.IsIntegrationDump() — overslaan tijdens IDE queries
  • input() — gebruiker prompt (officieel gedocumenteerd)

Logic:

  1. Registreer pre-upload hook
  2. In de hook: scan /dev/serial/by-id/usb-Espressif_* voor ESP32 poorten
  3. 1 poort → direct gebruiken (snel pad)
  4. 2+ poorten → stuur ID?\n naar elke poort, match met verwachte ID (s3lite-serverSylDa_Server, s3lite-clientSylDa_Client)
  5. Geen match (bijv. eerste flash) → prompt gebruiker om poort te kiezen

3. platformio.ini

extra_scripts =
    pre:tools/pio_version_pre.py
    post:tools/pio_upload_port.py

Geen upload_port meer. Poort wordt dynamisch bepaald per upload.

Beperking

Bij eerste-flash (lege ESP32) kan geen ID? query beantwoord worden → gebruiker kiest handmatig uit beschikbare poorten.

## Oplossing Verwijder `upload_port` uit `platformio.ini` en vervang door een POST-script dat automatisch de juiste ESP32 detecteert via een nieuw `ID?` serial commando. ### 1. Firmware: `ID?` commando Beide firmwares krijgen een nieuw serial commando: - **main.cpp**: `ID?` → antwoordt `SylDa_Server` - **client.cpp**: `ID?` → antwoordt `SylDa_Client` Dit past in de bestaande serial command chain naast `KEY?`, `VERSION?`, etc. ### 2. Script: `tools/pio_upload_port.py` (POST) Gebaseerd op PlatformIO docs (geverifieerd): - `env.AddPreAction("upload", callback)` — hook vlak vóór upload - `env["UPLOAD_PORT"]` — dynamisch poort instellen - `env.IsIntegrationDump()` — overslaan tijdens IDE queries - `input()` — gebruiker prompt (officieel gedocumenteerd) **Logic:** 1. Registreer pre-upload hook 2. In de hook: scan `/dev/serial/by-id/usb-Espressif_*` voor ESP32 poorten 3. **1 poort** → direct gebruiken (snel pad) 4. **2+ poorten** → stuur `ID?\n` naar elke poort, match met verwachte ID (`s3lite-server` → `SylDa_Server`, `s3lite-client` → `SylDa_Client`) 5. **Geen match** (bijv. eerste flash) → prompt gebruiker om poort te kiezen ### 3. `platformio.ini` ```ini extra_scripts = pre:tools/pio_version_pre.py post:tools/pio_upload_port.py ``` Geen `upload_port` meer. Poort wordt dynamisch bepaald per upload. ### Beperking Bij eerste-flash (lege ESP32) kan geen `ID?` query beantwoord worden → gebruiker kiest handmatig uit beschikbare poorten.
Author
Owner

Geïmplementeerd in PR #13.

Wat is er gedaan

  • ID? serial commando toegevoegd aan beide firmwares (server antwoordt SylDa_Server, client SylDa_Client)
  • tools/pio_upload_port.py POST-script gemaakt dat:
    • ESP32 poorten scant via /dev/serial/by-id/usb-Espressif_*
    • Bij 1 poort: direct gebruiken
    • Bij 2+ poorten: ID? query sturen en matchen met verwachte identiteit
    • Bij geen match: gebruiker prompt om poort te kiezen (eerste-flash scenario)
  • upload_port verwijderd uit platformio.ini
  • extra_scripts uitgebreid met post:tools/pio_upload_port.py
  • Vereist pyserial (graceful fallback als niet geïnstalleerd)
  • PlatformIO API geverifieerd tegen officiële docs: env.AddPreAction("upload", ...), env["UPLOAD_PORT"], env.IsIntegrationDump(), input()
Geïmplementeerd in PR #13. ### Wat is er gedaan - `ID?` serial commando toegevoegd aan beide firmwares (server antwoordt `SylDa_Server`, client `SylDa_Client`) - `tools/pio_upload_port.py` POST-script gemaakt dat: - ESP32 poorten scant via `/dev/serial/by-id/usb-Espressif_*` - Bij 1 poort: direct gebruiken - Bij 2+ poorten: `ID?` query sturen en matchen met verwachte identiteit - Bij geen match: gebruiker prompt om poort te kiezen (eerste-flash scenario) - `upload_port` verwijderd uit `platformio.ini` - `extra_scripts` uitgebreid met `post:tools/pio_upload_port.py` - Vereist `pyserial` (graceful fallback als niet geïnstalleerd) - PlatformIO API geverifieerd tegen officiële docs: `env.AddPreAction("upload", ...)`, `env["UPLOAD_PORT"]`, `env.IsIntegrationDump()`, `input()`
eddy closed this issue 2026-08-02 21:19:05 +02:00
Sign in to join this conversation.
No description provided.