Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
e5ae115
feat(dali): run wb-mqtt-dali against a simulated WB-DALI gateway
Aug 27, 2026
0619b62
feat(dali): boot the daemon and serve the Editor RPC the UI calls
Aug 27, 2026
56af1aa
feat(dali): mount the homeui DALI page on Pyodide in the editor
Aug 27, 2026
f815e6d
feat(dali): keep a commissioned installation across reloads
Aug 27, 2026
f7324fb
feat(dali): answer the queries a device settings form needs
Aug 27, 2026
9f4caa5
fix(dali): make the offline build, the service worker and CI work
Aug 27, 2026
46fbb32
feat(dali): talk to a real WB-DALI module over WebSerial
Aug 27, 2026
2afe2d9
refactor(dali): replace the DALI transport with a blocking driver
Aug 27, 2026
37ca0cf
fix(dali): stop the simulator wedging the page it runs in
Aug 27, 2026
9ea84f8
chore(dali): surface daemon errors, drop dead code
Aug 27, 2026
cd4ade3
fix(dali): stop leaking runtimes, and separate the two installations
Aug 27, 2026
f67b333
feat(dali): poll the bus monitor ring
Aug 27, 2026
a6ef945
feat(dali): offer the configurator only once a gateway is found
Aug 27, 2026
190b7c1
feat(dali): move homeui to master, and the bus monitor with it
Aug 28, 2026
283f3f0
docs(dali): record the new seam and re-measure
Aug 28, 2026
24b5042
fix(dali): make the driver work against a real WB-DALI
evgeny-boger Aug 28, 2026
e738306
feat(dali): fix what a UX pass against real hardware turned up, drop …
evgeny-boger Aug 28, 2026
6af9ac3
fix(wasm): stop the print dialog on load; pin the DALI console panel;…
evgeny-boger Aug 29, 2026
64f7c69
feat(dali): open fast with seeded groups, narrate the boot, keep the …
evgeny-boger Aug 29, 2026
a887104
chore(dali): keep upstream SyntaxWarnings out of the boot pane
evgeny-boger Aug 29, 2026
b9beb8d
fix(wasm): repair the settings pane after restore, and Runtime View u…
evgeny-boger Aug 29, 2026
56ff362
perf(dali): send command batches through the queue the firmware alrea…
evgeny-boger Aug 29, 2026
16b88c7
fix(dali): quick wins from the UX review — silence the warning for re…
evgeny-boger Aug 29, 2026
71b9281
fix(wasm): live language switching, and a portal root for homeui's po…
evgeny-boger Aug 29, 2026
13443a5
fix(wasm): the rest of the UX review's must-fix list
evgeny-boger Aug 29, 2026
66e7577
fix(wasm): the review's small polish items, and two analysis documents
evgeny-boger Aug 29, 2026
749af3a
chore: keep the scratch tmp/ directory (dropped-in firmware sources) …
evgeny-boger Aug 29, 2026
d0e793f
feat(dali): pick up homeui's live device controls on the DALI device …
evgeny-boger Aug 29, 2026
fa3c290
chore(dali): bump homeui — device controls label dedup
evgeny-boger Aug 29, 2026
249a155
chore(dali): bump homeui — collapsible device controls
evgeny-boger Aug 29, 2026
4efa1a7
chore(dali): bump homeui — featured-controls strip and mobile bottom …
evgeny-boger Aug 29, 2026
78ec3a2
docs(dali): hardware screenshots of the pinned-controls strip and mob…
evgeny-boger Aug 29, 2026
23e45dd
chore(dali): bump homeui — page headings and monitor error-row collapse
evgeny-boger Aug 29, 2026
0d6ceb6
perf(dali): keep the runtime alive across view switches
evgeny-boger Aug 29, 2026
b4c36be
perf(dali): remember memory-bank identity across sessions; unit tests…
evgeny-boger Aug 29, 2026
49712ad
fix(wasm): no "copied to clipboard" for cell topics — there is no bro…
evgeny-boger Aug 29, 2026
91ae175
fix(dali): four device-page issues from hardware use, plus boot robus…
evgeny-boger Aug 29, 2026
7f9ec38
chore(dali): bump homeui — page toolbar, bus/group controls, event-ri…
evgeny-boger Aug 29, 2026
31095fe
test(dali): pin down why an Instance-scheme event never lands
evgeny-boger Aug 29, 2026
49d28cb
feat(dali): remember settings answers, pace the ring by what lives on…
evgeny-boger Aug 30, 2026
69e228e
feat(dali): recover the first run, name what buttons do, and boot the…
evgeny-boger Aug 30, 2026
80f418e
fix(offline): survive an unreachable firmware bucket listing
evgeny-boger Aug 30, 2026
f76b43d
revert(offline): drop the NO_FIRMWARE build option
evgeny-boger Aug 30, 2026
739e61d
chore: pick up homeui layout-audit fixes
evgeny-boger Aug 30, 2026
51f5605
feat(dali): explain the empty monitor panel; e2e covers enabling from it
evgeny-boger Aug 30, 2026
7685a22
fix(dali): act on the review findings the stopped review still delivered
evgeny-boger Aug 30, 2026
28d79bb
fix(dali): act on the multi-aspect review across the runtime, the she…
evgeny-boger Aug 30, 2026
d97fe78
fix(dali): the interrupted-download guard must ignore content-encoded…
evgeny-boger Aug 30, 2026
011b5da
feat(dali): remember the sensor's answers too — device-side settings …
evgeny-boger Aug 30, 2026
6ce8640
fix(dali): give vitest a working Web Storage on any node
evgeny-boger Aug 30, 2026
9e77617
fix(e2e): open the type dropdown by keyboard, gate system-chrome behi…
evgeny-boger Aug 30, 2026
7e9a1ee
test(e2e): boot the offline single-file build from file:// with netwo…
evgeny-boger Aug 30, 2026
423087b
feat(dali): drop the MQTT id editor; let tests pace the simulated bus
evgeny-boger Aug 31, 2026
f216dc8
feat(dali): mirror the daemon's log to console.debug
evgeny-boger Aug 31, 2026
4fd8dd0
docs(arc42): correct ADR 3 — the broker is for the state plane, not RPC
evgeny-boger Aug 31, 2026
a51974a
feat(dali): take the simulator, the driver link and the memo from wb-…
evgeny-boger Aug 31, 2026
3c4505a
fix(port): read frames the way wb-mqtt-serial expects, not by the JS …
evgeny-boger Aug 31, 2026
9ea80dd
fix(serial): heal a dead port, bound the drain, survive a port switch
evgeny-boger Aug 31, 2026
44cf2c5
ci: keep Playwright traces when the E2E stage fails
evgeny-boger Aug 31, 2026
0ac7358
ci: stop the renderer dying on the container's 64 MB /dev/shm
evgeny-boger Aug 31, 2026
23f5181
fix(analytics): keep Metrika off localhost and the e2e runner
evgeny-boger Aug 31, 2026
c4ee4ee
fix(e2e): run without WebSerial, and stop retrying a gesture-refused …
evgeny-boger Aug 31, 2026
4f5f949
fix(port): a timed-out read throws runtime_error, not the transient type
evgeny-boger Aug 31, 2026
8987d55
fix(dev): stop throttling module.data by default
evgeny-boger Aug 31, 2026
9e4977d
fix(serial): fail fast in open() when the browser has no WebSerial API
evgeny-boger Aug 31, 2026
8b4c984
chore(dali): withdraw the memory memo pending provenance labeling (SO…
evgeny-boger Aug 31, 2026
d12d6b1
docs(dali): the memo now lives on wb-mqtt-dali's soft-dali-memory-cac…
evgeny-boger Aug 31, 2026
39e4ea2
fix(dali): show the page when the daemon is up, not after device init
evgeny-boger Sep 1, 2026
a5de563
fix(serial): take the port-layer review fixes from #98
evgeny-boger Sep 1, 2026
115d151
fix(serial): don't hand ReadChunk the previous reply on the unwind pass
evgeny-boger Sep 2, 2026
d10571f
fix(port): keep Asyncify side effects inside the async callback
evgeny-boger Sep 2, 2026
cb902d2
docs(dali): record ADR 28 on Asyncify side effects in EM_ASM bodies
evgeny-boger Sep 2, 2026
3790a5b
ci(e2e): retry a flaky spec twice on CI instead of failing the build
evgeny-boger Sep 2, 2026
0df31fb
fix(serial): one long-lived reader, no cancel() per read
evgeny-boger Sep 2, 2026
be4eccc
fix(rpc): wake the request loop on the reply, not on a 1 ms poll
evgeny-boger Sep 2, 2026
feff144
test(serial): cover the long-lived reader and the abandoned read
evgeny-boger Sep 2, 2026
a6529c0
fix(port): match TSerialPort's send-time rounding and ReadByte's time…
evgeny-boger Sep 2, 2026
0ca7e4c
docs(dali): say what the host interfaces are instead of «швы»
evgeny-boger Sep 2, 2026
c3a5f54
Merge remote-tracking branch 'origin/master' into feat/dali-pyodide
evgeny-boger Sep 3, 2026
83f8cac
test(serial): follow the whole-frame port layer from master
evgeny-boger Sep 3, 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
15 changes: 15 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,18 @@ node_modules
package-lock.json
emsdk-docker-image.tar.gz
.firmware-cache/

# python sources fetched by scripts/fetch-python-sources.sh
wasm/python/vendor/

# scratch area for the pyodide bring-up experiments
pyodide-poc/

# python bytecode
__pycache__/
*.pyc

# pyodide python bundle, built by wasm/scripts/build-python-bundle.mjs
wasm/.python-bundle/
wasm/.python-cache/
/tmp/
51 changes: 51 additions & 0 deletions Jenkinsfile
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,53 @@ pipeline {
}
}

stage('DALI runtime tests') {
when {
beforeAgent true
expression { env.SKIP_AUTO_RELEASE_BUILD != 'true' }
}
agent {
docker {
image 'python:3.13'
args '--entrypoint="" -u root:root'
reuseNode true
}
}
steps {
// The Python that runs inside Pyodide is tested under CPython:
// a failure there is a stack trace, not a stack trace inside a
// WASM interpreter inside a worker. `wasm/python/vendor` was
// already fetched by the configurator build.
dir(path: 'wasm/python') {
sh 'pip install --no-cache-dir -r requirements-dev.txt'
sh 'python -m pytest -q'
}
}
}

stage('Frontend unit tests') {
when {
beforeAgent true
expression { env.SKIP_AUTO_RELEASE_BUILD != 'true' }
}
agent {
docker {
image 'node:latest'
args '--entrypoint="" -u root:root'
reuseNode true
}
}
steps {
// vitest runs on homeui's toolchain (installed by the
// configurator build); it covers the dali-wasm TS layer —
// gateways persistence, the featured-strip heuristics, the
// mqtt client's queue and re-attach semantics.
dir(path: 'wasm') {
sh 'npm test'
}
}
}

stage('Build offline single-file') {
when {
beforeAgent true
Expand Down Expand Up @@ -136,6 +183,10 @@ pipeline {
}
steps {
dir(path: 'wasm') {
// Traces on failure: the suite passes everywhere locally
// (Playwright's own headless shell included), while this
// stage loses the browser mid-suite — the trace is the
// only witness of what killed it here.
sh '''
export PLAYWRIGHT_BROWSERS_PATH=/ms-playwright
npm run test:e2e -- --trace retain-on-failure
Expand Down
21 changes: 19 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ docker build --no-cache --tag wb-wasm-device-editor:latest wasm
docker run --rm -v $(PWD):/src -w /src/wasm node:latest npm run build:offline
```

Результат: `wasm/dist-offline/index.html` (~14 МБ). Открывается двойным кликом в Chrome/Edge 80+ — WebSerial API работает на `file://` только в Chromium-браузерах.
Результат: `wasm/dist-offline/index.html` (~25 МБ). Открывается двойным кликом в Chrome/Edge 80+ — WebSerial API работает на `file://` только в Chromium-браузерах. Внутри одного файла: приложение, WASM-модуль конфигуратора, шаблоны устройств, каталог прошивок (~8 МБ) и среда выполнения DALI-конфигуратора — интерпретатор Python (Pyodide) с бандлом wb-mqtt-dali.

При наличии сети обновление прошивок идёт с `fw-releases.wirenboard.com`, иначе используется встроенная копия. Так же приложение проверяет `https://deveditor.wirenboard.com/sw.js` и показывает баннер, если онлайн-версия новее.

Expand All @@ -62,4 +62,21 @@ cd wasm
npm run test:e2e
```

Тесты проверяют работу Service Worker: офлайн-режим, обнаружение обновлений и поведение при медленном соединении.
Тесты проверяют работу Service Worker (офлайн-режим, обнаружение обновлений, медленное соединение) и DALI-конфигуратор целиком: страница загружается против симулируемого шлюза (slave id 250) — Pyodide, демон wb-mqtt-dali и интерфейс без железа и без сети.

#### Тесты DALI-рантайма (Python)

Python-код, работающий внутри Pyodide, тестируется под обычным CPython против симулятора модуля WB-DALI:

```
cd wasm/python
pip install -r requirements-dev.txt
python3 -m pytest
```

#### Юнит-тесты TypeScript

```
cd wasm
npm test
```
Loading
Loading