Add Skywalker V2 (Cyberroaster) TC4-over-BLE device - #2202
Open
neuralldev wants to merge 38 commits into
Open
Conversation
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
force-pushed
the
feature/skywalker-cyberroaster
branch
from
July 13, 2026 06:56
d359620 to
46597d4
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 towiring 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 :Skywalker BT/ET: main device, reads Bean Temp / Env Temp over BLE.+Skywalker Burner/Air: extra device, echoes the OT1/OT2 duty values(burner / airflow) as percentages.
Both are
nonserial(BLE, no serial-port plumbing). Theskywalker(OTn, val)alarm commandlets roast events drive burner/airflow.
Files touched
src/artisanlib/skywalker.pysrc/artisanlib/comm.pySKYWALKER_BTET(207) +SKYWALKER_PF(208), appended todevicefunctionlistsrc/artisanlib/canvas.pynonserialflag, BLE connect/disconnectsrc/artisanlib/devices.pysrc/artisanlib/main.pyaw.skywalkerattribute, settings load/save,skywalker(OTn,val)alarm commandsrc/help/eventbuttons_help.py,src/help/eventsliders_help.pyskywalker()command documentationsrc/artisan.proDesign notes / things to review
serialport.devicefunctionlist. They are correct against the currentmaster(last nativeentry being
+MQTT 1112at 206). If other devices have landed since, the indices and thematching entries in
canvas.py/devices.py/comm.pyneed to be shifted together.fromCtoFstrictonly whenqmc.mode == 'F'.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.
after every disconnect), so TC4-over-BLE is used as the reliable transport.
## CYBER ##comment for easy