Reference for building/editing ESPHome configs on the Guition JC3636K718C round knob display (ESP32-S3, 1.8" 360x360 ST77916, CST816 touch, rotary knob, PCM5100A DAC, PDM mic, WS2812 LED ring).

MITAuto-check passedDevelopment

Install Guition Jc3636k718c

skills CLI
$ npx skills add MichalZaniewicz/esphome-guition-jc3636k718c-va --skill guition-jc3636k718c -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install MichalZaniewicz/esphome-guition-jc3636k718c-va guition-jc3636k718c --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skill/guition-jc3636k718c .claude/skills/guition-jc3636k718c && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
guition-jc3636k718c
GitHub stars
167
Token cost
~3k tokens
SKILL.md length
1,455 words
Files
1
Skills in repo
1
Repo updated
First seen
Licence
MIT

At a glance

Reference for building/editing ESPHome configs on the Guition JC3636K718C round knob display (ESP32-S3, 1.8" 360x360 ST77916, CST816 touch, rotary knob, PCM5100A DAC, PDM mic, WS2812 LED ring).

  • Works in 12 steps: The knob is NOT a quadrature encoder. A… → Strapping-pin warnings are expected and… → 16 MB partitions → first flash MUST be… → …
  • Working on this board (or the base/core.yaml in this repo): correct pinout
  • SKILL.md covers Board, Pinout (authoritative), ESPHome component choices that… and Gotchas / lessons learned (the…, plus 1 more section
  • Calls python

What it does

Guition Jc3636k718c is an agent skill from MichalZaniewicz/esphome-guition-jc3636k718c-va. Reference for building/editing ESPHome configs on the Guition JC3636K718C round knob display (ESP32-S3, 1.8" 360x360 ST77916, CST816 touch, rotary knob, PCM5100A DAC, PDM mic, WS2812 LED ring). Use whenever working on this board (or the base/core.yaml in this repo): correct pinout, ESPHome component choices, and the hard-won gotchas (knob isn't quadrature, GPIO0 ring strapping, 16 MB partitions need USB flash, LVGL performance limits, lambda/string pitfalls, battery is heuristic).

Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Embedded systems and File uploads and storage. It works with ESP32 and Home Assistant. The repository describes itself as: Full Home Assistant voice assistant on the Guition JC3636K718C round knob display, in pure ESPHome: on-device wake word, music player, timers, addressable LED ring, device… The licence is MIT.

When your agent uses it

  • Working on this board (or the base/core.yaml in this repo): correct pinout
  • ESPHome component choices
  • The hard-won gotchas (knob isnt quadrature
  • GPIO0 ring strapping

Example prompts

  • “/guition-jc3636k718c”

Requirements

  • Python 3

Workflow steps

12 steps, taken from the first numbered list in SKILL.md.

  1. The knob is NOT a quadrature encoder. A PCNT rotary_encoder reads zero.
  2. Strapping-pin warnings are expected and harmless. GPIO0 (WS2812 ring), GPIO3
  3. 16 MB partitions → first flash MUST be over USB. partitions.csv uses big app
  4. LVGL performance is tight on this S3 + QSPI panel.
  5. Lambda string/symbol pitfalls (LVGL labels)
  6. Album art (online_image) decodes fine but the LVGL widget **won't redraw by
  7. Fonts, icons and game sprites are fetched at compile time (Google Fonts +
  8. Battery is a heuristic. ADC on GPIO6 (×2), 64-sample oversampling + moving
  9. Voice timers: use voice_assistant: `on_timer_started/updated/finished/
  10. Wake word (micro_wake_word) only runs while connected to HA. Start/stop it in
  11. Debugging: API has no encryption here → stream logs with
  12. Timezone resets to UTC at runtime. The homeassistant time platform syncs the epoch

What it can do on your machine

Read from SKILL.md and the folder at commit 5746d09. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • python

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Guition Jc3636k718c loads about 3k tokens when it runs. Until then it costs about 126 tokens; SKILL.md has 1,455 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~126
When it runs · the whole SKILL.md, loaded when a task matches
~3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from MichalZaniewicz/esphome-guition-jc3636k718c-va at commit 5746d09, republished under its MIT licence (© MichalZaniewicz). 1,455 words, ~2,994 tokens.

Download SKILL.mdSave it as .claude/skills/guition-jc3636k718c/SKILL.md (or your agent's skills folder).
name
guition-jc3636k718c
description
Reference for building/editing ESPHome configs on the Guition JC3636K718C round knob display (ESP32-S3, 1.8" 360x360 ST77916, CST816 touch, rotary knob, PCM5100A DAC, PDM mic, WS2812 LED ring). Use whenever working on this board (or the base/core.yaml in this repo): correct pinout, ESPHome component choices, and the hard-won gotchas (knob isn't quadrature, GPIO0 ring strapping, 16 MB partitions need USB flash, LVGL performance limits, lambda/string pitfalls, battery is heuristic).

Guition JC3636K718C - ESPHome working notes

This is the K / Knob series board. Its pinout is different from the JC3636W518

  • do NOT reuse W518 pins (display, backlight, touch all differ). The values below come from the official manufacturer demo JC3636K718_knob_EN (pincfg.h + scr_st77916.h) and from making this device actually work.

Board

  • ESP32-S3 (240 MHz), 8 MB octal PSRAM @ 80 MHz, 16 MB flash.
  • 1.8" round 360×360, driver ST77916 (QSPI), RGB565, colors inverted.
  • Touch CST816 (I²C). Rotary knob (rotation only - not pressable).
  • Audio out PCM5100A I²S DAC + speaker. Mic = I²S PDM.
  • WS2812 LED ring, 13 LEDs, GRB.
  • Radios: Wi-Fi 2.4 GHz b/g/n + Bluetooth LE 5.0 (ESP32-S3 has no Bluetooth Classic / BR-EDR → no A2DP; the speaker/mic are I²S, not Bluetooth audio). One shared 2.4 GHz antenna for both.
  • microSD (SD_MMC). USB-C; some units have Li-ion + wireless charging.

Pinout (authoritative)

Display QSPI (ST77916):  SCK=11  CS=12  D0=13 D1=14 D2=15 D3=16  RST=17  BLK=21(PWM)
Touch CST816 (I2C):      SDA=9   SCL=10  INT=7  RST=8   (internal SDA/SCL pull-ups)
Knob:                    A=GPIO2  B=GPIO1   (see gotcha - NOT quadrature)
DAC PCM5100A (I2S):      BCK=3  WS/LRCK=45  DO=42   MUTE=46 (LOW=mute, hold HIGH)  no MCK
Microphone (I2S PDM):    SD/data=4  SCK/clk=5
LED ring WS2812:         DATA=0   (13 LEDs, GRB)  -- GPIO0 = BOOT/strapping
Battery ADC:             GPIO6  (~10k/10k divider -> x2)
microSD (SD_MMC):        CLK=39 CMD=38 D0=40 D1=41 D2=48 D3=47

ESPHome component choices that work

  • Display: display: platform: mipi_spi, model: CUSTOM, bus_mode: quad, data_rate: 80MHz, invert_colors: true, color_order: rgb, with the full init_sequence from base/core.yaml (ends with 3A=55 for RGB565, 21 invert, 11 sleep-out, 120 ms delay, 29 display-on). The native ST77916 model was dev-only; CUSTOM + manual init runs on stable ESPHome. (qspi_dbi was the platform before v2.2.9; it's deprecated upstream, no predefined ST77916 model exists on mipi_spi either.)
  • SPI: type: quad, clk_pin: 11, data_pins: [13,14,15,16]. CS/RST go on the display: block (cs_pin: 12, reset_pin: GPIO17), not on spi:.
  • Touch: touchscreen: platform: cst816, interrupt_pin: 7, reset_pin: 8, on the i2c bus sda: 9 / scl: 10.
  • Backlight: output: ledc on GPIO21 → light: monochromatic.
  • Audio: i2s_audio (out: bclk=3, lrclk=45; in: lrclk=5), speaker: i2s_audio (dout=42, dac_type: external), microphone: i2s_audio (din=4, pdm: true, 16 kHz). DAC MUTE on GPIO46 must be held HIGH → a switch: gpio with restore_mode: ALWAYS_ON.
  • LED ring: light: esp32_rmt_led_strip, pin: GPIO0, num_leds: 13, channel_colors: GRB (ESPHome 2026.8.0+; older uses rgb_order: GRB), chipset: WS2812, rmt_symbols: 64.
  • Knob: two binary_sensor: gpio (GPIO2 and GPIO1), inverted: true + pullup, act on on_press. See gotcha.
  • esp32: flash_size: 16MB, partitions: partitions.csv, framework esp-idf. psram: mode: octal, speed: 80MHz.

Gotchas / lessons learned (the important part)

  1. The knob is NOT a quadrature encoder. A PCNT rotary_encoder reads zero. Direction is encoded by which pin pulses: left → GPIO2, right → GPIO1, one clean LOW pulse per detent. Read two independent binary_sensor on_press instead. The knob can't be pressed (GPIO0 is BOOT) - trigger actions with a screen tap.

  2. Strapping-pin warnings are expected and harmless. GPIO0 (WS2812 ring), GPIO3 (DAC BCK), GPIO45 (DAC WS/LRCK) and GPIO46 (DAC MUTE) are all ESP32-S3 strapping pins used per the vendor pinout - they work fine after boot. There IS a per-pin suppress (ignore_strapping_warning: true, needs the extended pin: {number: ..., ignore_strapping_warning: true} form, not the short pin: GPIOxx) - the config uses it on all four since 2.2.9, so the warnings no longer print. Separately, silence gfonts "missing glyphs" warnings with ignore_missing_glyphs: true (GF_Latin_Core lists combining accents the static Roboto face lacks), or list exact glyphs: for pixel/icon fonts.

  3. 16 MB partitions → first flash MUST be over USB. partitions.csv uses big app slots (~7.9 MB). A partition-table change can't be applied via OTA; flash once over USB, then OTA works.

  4. LVGL performance is tight on this S3 + QSPI panel.

    • Keep lvgl: buffer_size: 24% (puts the draw buffer in fast internal RAM instead of slow PSRAM at the default 100%).
    • Keep display: data_rate: 80MHz.
    • A rotating full-screen HUD image and an animated radial equalizer were both tried and removed as too laggy. Add heavy full-screen redraws only very carefully.
    • logger: level: INFO - DEBUG is very noisy during voice and adds overhead.
  5. Lambda string/symbol pitfalls (LVGL labels):

    • For MDI/Unicode glyphs in C++ lambdas use the actual UTF-8 bytes or chr(0xF....) style - declare each glyph in the font: glyphs: list or it renders as tofu.
    • \n inside a lambda works inline ('...\n...'); inside a block scalar (|-) a literal newline breaks YAML. Keep multi-line label text on one quoted line.
    • Montserrat has no -; guard "no data yet" cases with an empty string, not a dash.
  6. Album art (online_image) decodes fine but the LVGL widget won't redraw by itself - you must call lvgl.image.update in on_download_finished. Use http_request: verify_ssl: false for self-signed HA. Skip reloading the same URL to cut flicker. Cover URL comes from the player entity's entity_picture.

  7. Fonts, icons and game sprites are fetched at compile time (Google Fonts + MaterialDesign TTF, plus the PNGs under assets/sprites/cool-cars/ and space-wars/ from the GitHub repo), so the build host needs internet. They are baked into the firmware, so at runtime nothing depends on any server.

  8. Battery is a heuristic. ADC on GPIO6 (×2), 64-sample oversampling + moving average to fight ETA6003 ripple (no cap on BAT_ADC). Voltage→% is a calibrated lookup (vt[]/st[]) - start ~4.10 V, brownout ~3.20 V - not finished, tune per unit. No STAT pin, so charging detection is "voltage rising or ≥4.13 V".

  9. Voice timers: use voice_assistant: on_timer_started/updated/finished/ cancelled. There is no on_timer_tick - do smooth local countdown in an interval and let HA fire finished.

  10. Wake word (micro_wake_word) only runs while connected to HA. Start/stop it in on_client_connected/on_client_disconnected and around the VA lifecycle.

  11. Debugging: API has no encryption here → stream logs with python scripts/esplog.py <seconds> (set the device host in the script). Don't reflash blind - check logs / HA state first.

  12. Timezone resets to UTC at runtime. The homeassistant time platform syncs the epoch but not the zone, so set timezone: explicitly (IANA, e.g. Europe/Warsaw). Worse, ESPHome can reset the device TZ back to UTC mid-run (on a menu restart, or when a log/API client reconnects), so the clock reads UTC until the next sync. Self-heal: capture the resolved POSIX zone at boot via getenv("TZ") into a global, then re-apply it every second with setenv("TZ", g.c_str(), 1); tzset();. Note RealTimeClock has set_timezone() but no get_timezone(), and passing the IANA name at runtime won't work (newlib needs the POSIX string) - which is why you read it back from the env.

  13. OTA rollback reverts to the OLD firmware after a quick restart. On esp-idf the bootloader keeps a freshly-OTA'd image only once the boot is marked "good" (safe_mode, default ~1 min). Restarting (e.g. from the on-screen menu) before that rolls back to the previous build - which looks exactly like "my changes didn't stick". Fix: add a safe_mode: block and call safe_mode.mark_successful once the device is clearly up (this repo does it when the boot splash ends), and/or lower boot_is_good_after.

  14. ${substitution} inside a flow-mapping { } breaks the YAML parse. The } that closes ${...} is read as the end of the flow map, e.g. image: { id: x, src: avatar${n} } fails with "expected ',' or '}'". Use block style for any line whose value contains a ${...}.

  15. Bluetooth is BLE-only and competes hard with voice/LVGL. The S3 has Bluetooth LE 5.0 and no Classic - so no Bluetooth audio (A2DP needs Classic; playback stays on the I²S DAC). What ESPHome can do here is BLE: bluetooth_proxy (relay BLE devices to Home Assistant) or esp32_ble_tracker (beacons / BLE sensors), optionally esp32_improv (BLE Wi-Fi provisioning). It is not enabled in this repo, and it is not free: the BLE stack + Wi-Fi/BLE coexistence share the single 2.4 GHz radio and CPU with micro_wake_word, the voice pipeline and the QSPI/LVGL redraws, and the BLE stack wants internal RAM that is already squeezed (LVGL draw buffer at 24% internal). Expect audio/display hitches, higher heap pressure and possible OOM/brownouts. If you add it: prefer passive scanning, keep active connections to a minimum (bluetooth_proxy raises the BLE connection slots), test heap headroom (logger + free-heap sensor), and consider dropping heavy screens. Treat it as untested on this exact build - validate on-device before relying on it.

Show full SKILL.md (205 more words)Show less

Architecture of this repo (for edits)

  • Modular. base/core.yaml is the always-on core (clock, control tiles, settings, LED ring, voice). Optional screens are separate packages under base/screens/*.yaml, pulled via a remote packages: block in the thin user config (guition-va.yaml). A screen self-registers into the carousel (g_present[id]) and declares its own settings (the g_wgrp_*/g_wopt_* Widgets registry), so adding one does not touch the core.
  • UI is LVGL pages (not a top_layer overlay for modes): page_boot (startup splash), page_home, page_player, page_mode (menu/timer/alarm/settings sub-screens), page_settings, page_timer, page_controls, plus one page per optional screen.
  • A mode state machine in g_mode drives page_mode; gestures are classified in touchscreen.on_release (swipe/tap/hold) and routed by a snapshot g_mode0.
  • A base carousel g_base (clock / player / timer / games / weather / thermostat / sensors / demo, in screen_order) on horizontal swipes; the knob drives per-screen actions when a screen captures it (g_knob_capture).
  • The LED ring is one HA light + reaction effects (Listen/Think/Speak/ Volume/Alarm/Timer) chosen by ring_update with priority alarm > assistant > volume > timer > HA, snapshotting/restoring HA state.
  • Per-user things to change live in substitutions: (HA URL, entity IDs) and a few hard-coded control-tile entities - see the Configuration wiki page.

When editing, change UI strings/labels only (not IDs or pin numbers), keep the performance settings above, and validate the YAML before flashing.

© MichalZaniewicz, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skill/guition-jc3636k718c of MichalZaniewicz/esphome-guition-jc3636k718c-va.

Open the folder on GitHubat commit 5746d09

Compare with similar skills

Guition Jc3636k718c next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Guition Jc3636k718c compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Guition Jc3636k718c this skillMichalZaniewicz/esphome-guition-jc3636k718c-va167—~3kAutomated safety check: PassMIT
Implement Next Taskrvdbreemen/OTGW-firmware207—~2.1kAutomated safety check: PassGPL-3.0
Flash Esp32s3RomanLut/hx_espnow_rc129—~794Automated safety check: PassMIT
Flash Devicesjtenniswood/esphome-media-player234—~1.1kAutomated safety check: PassCustom licence
Flash Displaysjtenniswood/espcontrol1.1k—~2.8kAutomated safety check: PassCustom licence
Auroratonylofgren/aurora-smart-home106—~11kAutomated safety check: NotesMIT

Similar skills

  • Implement Next Task

    rvdbreemen/OTGW-firmware

    Drive the autonomous 2.0.0 ESP32-S3-only async + FreeRTOS migration (epic TASK-865).

    207 GitHub stars~2.1k tokensUpdated 4 days ago
    DevelopmentAuto-check passed
  • Flash Esp32s3

    RomanLut/hx_espnow_rc

    Build, flash, recover, and verify the ESP32-S3 Super Mini MAVLink/ESP-NOW USB receiver in examples/rxesp32s3mavlinkrcusb.

    129 GitHub stars~794 tokensUpdated 1 mo ago
    DevelopmentAuto-check passed
  • Flash Devices

    jtenniswood/esphome-media-player

    Flash ESPHome firmware to physical EspControl devices. An agent skill from jtenniswood/esphome-media-player.

    234 GitHub stars~1.1k tokensUpdated 1 mo ago
    DevelopmentAuto-check passed
  • Flash Displays

    jtenniswood/espcontrol

    Flash EspControl display firmware from this repository using ESPHome.

    1.1k GitHub stars~2.8k tokensUpdated today
    Backend & APIsAuto-check passed
  • Aurora

    tonylofgren/aurora-smart-home

    Aurora Smart Home orchestrator — routing layer for all smart home skills.

    106 GitHub stars~11k tokensUpdated 6 days ago
    DevelopmentAuto-check: notes
  • Iterating Esp32 Amoled UI

    niclasvestlund-YT/vibepulse

    A skill your agent uses when making any Torget AMOLED app visual change, exact-size mockup, simulator capture, or physical review.

    208 GitHub stars~927 tokensUpdated 10 days ago
    DevelopmentAuto-check passed

Questions about Guition Jc3636k718c

What does Guition Jc3636k718c do?

Reference for building/editing ESPHome configs on the Guition JC3636K718C round knob display (ESP32-S3, 1.8" 360x360 ST77916, CST816 touch, rotary knob, PCM5100A DAC, PDM mic, WS2812 LED ring). Guition Jc3636k718c is an agent skill from MichalZaniewicz/esphome-guition-jc3636k718c-va.8" 360x360 ST77916, CST816 touch, rotary knob, PCM5100A DAC, PDM mic, WS2812 LED ring).

When should I use Guition Jc3636k718c?

Guition Jc3636k718c fits situations like: working on this board (or the base/core.yaml in this repo): correct pinout; ESPHome component choices; the hard-won gotchas (knob isnt quadrature; GPIO0 ring strapping.

How do I install Guition Jc3636k718c in Claude Code?

Run `npx skills add MichalZaniewicz/esphome-guition-jc3636k718c-va --skill guition-jc3636k718c -a claude-code`. Or copy the skill folder (skill/guition-jc3636k718c in MichalZaniewicz/esphome-guition-jc3636k718c-va) into .claude/skills/guition-jc3636k718c in your project. Claude Code loads it when a task matches its description.

How do I install Guition Jc3636k718c in Codex?

Run `npx skills add MichalZaniewicz/esphome-guition-jc3636k718c-va --skill guition-jc3636k718c -a codex`. Or copy the skill folder (skill/guition-jc3636k718c in MichalZaniewicz/esphome-guition-jc3636k718c-va) into .agents/skills/guition-jc3636k718c in your project. Codex loads it when a task matches its description.

Can I use Guition Jc3636k718c in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add MichalZaniewicz/esphome-guition-jc3636k718c-va --skill guition-jc3636k718c -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/guition-jc3636k718c, .gemini/skills/guition-jc3636k718c, .github/skills/guition-jc3636k718c and .opencode/skills/guition-jc3636k718c in your project.

What does Guition Jc3636k718c need to run?

Going by SKILL.md and its folder, Guition Jc3636k718c needs the command-line tools its instructions call (python). Our summary lists: Python 3.

Does Guition Jc3636k718c access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Guition Jc3636k718c safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Guition Jc3636k718c use?

Guition Jc3636k718c is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Guition Jc3636k718c use?

About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Guition Jc3636k718c?

Skills that share tags, products or a category with Guition Jc3636k718c: Implement Next Task (rvdbreemen/OTGW-firmware, 207 stars), Flash Esp32s3 (RomanLut/hx_espnow_rc, 129 stars), Flash Devices (jtenniswood/esphome-media-player, 234 stars) and Flash Displays (jtenniswood/espcontrol, 1.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Guition Jc3636k718c?

MichalZaniewicz (a GitHub user) maintains it in MichalZaniewicz/esphome-guition-jc3636k718c-va, which has 167 GitHub stars. The repository was last updated on October 8, 2026.

Source: MichalZaniewicz/esphome-guition-jc3636k718c-va on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.