Skip to content

Add Skywalker V2 (Cyberroaster) TC4-over-BLE device - #2202

Open
neuralldev wants to merge 38 commits into
artisan-roaster-scope:masterfrom
neuralldev:feature/skywalker-cyberroaster
Open

Add Skywalker V2 (Cyberroaster) TC4-over-BLE device#2202
neuralldev wants to merge 38 commits into
artisan-roaster-scope:masterfrom
neuralldev:feature/skywalker-cyberroaster

Conversation

@neuralldev

Copy link
Copy Markdown

Summary

Adds support for the Skywalker V2 "Cyberroaster" (ITOP FIR/NIR radiant electric drum
roaster) as a new Artisan device, over a TC4-over-BLE transport.

The change is strictly additive and guarded: no existing Artisan behavior changes when
the device is not selected. All device-specific logic lives in a new self-contained module
src/artisanlib/skywalker.py; the edits to core files are append-only and confined to
wiring the new device into Artisan's hardcoded device list. I tried to respect the actual artisan architecture regarding device addition.

This version also assumes that there is only 1 device broadcasting at the same time over BLE.

What's added

Two device entries are registered (ids must match their position in devicefunctionlist). I assumed that the actual list is the one :

  • 207 — Skywalker BT/ET: main device, reads Bean Temp / Env Temp over BLE.
  • 208 — +Skywalker Burner/Air: extra device, echoes the OT1/OT2 duty values
    (burner / airflow) as percentages.

Both are nonserial (BLE, no serial-port plumbing). The skywalker(OTn, val) alarm command
lets roast events drive burner/airflow.

Files touched

File Change
src/artisanlib/skywalker.py New — self-contained TC4-over-BLE device class
src/artisanlib/comm.py SKYWALKER_BTET (207) + SKYWALKER_PF (208), appended to devicefunctionlist
src/artisanlib/canvas.py Device-list entries, nonserial flag, BLE connect/disconnect
src/artisanlib/devices.py Main-device selection for device 207
src/artisanlib/main.py aw.skywalker attribute, settings load/save, skywalker(OTn,val) alarm command
src/help/eventbuttons_help.py, src/help/eventsliders_help.py skywalker() command documentation
src/artisan.pro Register the new source file

Design notes / things to review

  • Device indices (207/208): these must equal their position in
    serialport.devicefunctionlist. They are correct against the current master (last native
    entry being +MQTT 1112 at 206). If other devices have landed since, the indices and the
    matching entries in canvas.py / devices.py / comm.py need to be shifted together.
  • Temperature units: the Skywalker reports Celsius; values are converted with
    fromCtoFstrict only when qmc.mode == 'F'.
  • Hardware behavior (FIR/NIR specifics): unlike classical roasters, ET < BT is normal
    on this machine (BT rises faster than ET right after the turning point). RoR_BT/RoR_ET
    ratios are not meaningful here. AirWave airflow above ~30% cools the drum.
  • Transport choice: Bluetooth SPP is not viable on this firmware (it forces a PIN re-pair
    after every disconnect), so TC4-over-BLE is used as the reliable transport.
  • Every fork-specific line in core files is marked with a ## CYBER ## comment for easy

neuralldev and others added 12 commits June 28, 2026 08:11
Add self-contained TC4-over-BLE driver in artisanlib/skywalker.py and
register it in the Qt build sources (artisan.pro). New file: no overlap
with upstream Artisan, so it never conflicts on rebase.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Append-only, ## CYBER ##-marked edits wiring the Cyberroaster into
Artisan's hardcoded device list:
- comm.py: SKYWALKER_BTET (207) + SKYWALKER_PF (208) + devicefunctionlist
- canvas.py: device entries, nonserial flag, BLE connect/disconnect
- devices.py: main-device selection for device 207
- main.py: aw.skywalker attrs, skywalker(OTn,val) alarm command
- help/: skywalker() command documentation

Index 207/208 must equal position in devicefunctionlist. If upstream
adds a device, shift these and resync canvas.py/devices.py/comm.py.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Keep fork-only working docs (CLAUDE.md, HANDOFF.md) and the .claude
directory out of version control. Isolated from device code so an
upstream .gitignore change conflicts here only, not in the hooks.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add tools/check_cyber_indices.py: verifies the Skywalker device-id
invariant that a rebase can break silently. devicefunctionlist[device]()
indexes by id at runtime, so SKYWALKER_BTET's position in comm.py must
equal the id assigned in devices.py and the position in canvas.devices
(which uses a different, id-1, offset). The script derives the truth from
comm.py and checks all sites align; exit 1 on drift (CI / pre-push ready).

Run after every `git rebase upstream/master`.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Keep the fork rebase runbook (REBASE.md) local like CLAUDE.md and
HANDOFF.md -- it documents our process, not Artisan, so it is not pushed
upstream.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Make the existing AppVeyor pipeline buildable on the fork account:
- Remove Marko's account-bound `secure: ARTISAN_KEY` blob from
  .appveyor.yml; the fork sets ARTISAN_KEY (its own Ed25519 signing key)
  and GITHUB_TOKEN as secure variables in the AppVeyor project settings.
- Ignore CI-SETUP.md, the local doc describing that one-time setup.

No build changes were needed: bleak/CoreBluetooth are already in
requirements.txt, the PyInstaller specs already bundle bleak, and
skywalker.py is pulled in via the import graph. The .ci/upload.sh deploy
is repo-relative ($APPVEYOR_REPO_NAME) so it publishes to the fork's own
'continuous' GitHub release.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add self-contained TC4-over-BLE driver in artisanlib/skywalker.py and
register it in the Qt build sources (artisan.pro). New file: no overlap
with upstream Artisan, so it never conflicts on rebase.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Append-only, ## CYBER ##-marked edits wiring the Cyberroaster into
Artisan's hardcoded device list:
- comm.py: SKYWALKER_BTET (207) + SKYWALKER_PF (208) + devicefunctionlist
- canvas.py: device entries, nonserial flag, BLE connect/disconnect
- devices.py: main-device selection for device 207
- main.py: aw.skywalker attrs, skywalker(OTn,val) alarm command
- help/: skywalker() command documentation

Index 207/208 must equal position in devicefunctionlist. If upstream
adds a device, shift these and resync canvas.py/devices.py/comm.py.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@neuralldev
neuralldev force-pushed the feature/skywalker-cyberroaster branch from d359620 to 46597d4 Compare July 13, 2026 06:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant