Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 0 additions & 1 deletion docs/components.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,6 @@ Shows filename, file contents and uploadfile (from file system). Used in FileMan
Arguments

* path: file or folder to edit
* showEditor: collapsed or not
* newItem
* isFile: or folder

Expand Down
2 changes: 1 addition & 1 deletion docs/gettingstarted/installer.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ After a successful install, go to **Logs & Console**, press **Reset Device**, an
| esp32-s3-atoms3r | ![esp32-s3-atoms3r](../firmware/installer/images/esp32-s3-atoms3r.jpg){: style="width:100px"} | <esp-web-install-button manifest="https://moonmodules.org/MoonLight/firmware/installer/manifest_esp32-s3-atoms3r.json"></esp-web-install-button> | <esp-web-install-button manifest="https://moonmodules.org/MoonLight/firmware/installer/manifest_esp32-s3-atoms3r-nightly.json"></esp-web-install-button> | [M5Stack store](https://shop.m5stack.com/products/atoms3r-dev-kit){:target="_blank"} |
| esp32-s3-zero-n4r2 | ![esp32-s3-zero-n4r2](../firmware/installer/images/esp32-s3-zero-n4r2.jpg){: style="width:100px"} | <esp-web-install-button manifest="https://moonmodules.org/MoonLight/firmware/installer/manifest_esp32-s3-zero-n4r2.json"></esp-web-install-button> | <esp-web-install-button manifest="https://moonmodules.org/MoonLight/firmware/installer/manifest_esp32-s3-zero-n4r2-nightly.json"></esp-web-install-button> | [Ali*](https://s.click.aliexpress.com/e/_EukjHX8){:target="_blank"} |
| esp32-d0-wrover | ![esp32-d0-wrover](../firmware/installer/images/esp32-d0-wrover.jpg){: style="width:100px"} | <esp-web-install-button manifest="https://moonmodules.org/MoonLight/firmware/installer/manifest_esp32-d0-wrover.json"></esp-web-install-button> | <esp-web-install-button manifest="https://moonmodules.org/MoonLight/firmware/installer/manifest_esp32-d0-wrover-nightly.json"></esp-web-install-button> | [Ali*](https://a.aliexpress.com/_EzhPi6g){:target="_blank"} |
| esp32-p4-olimex | ![esp32-p4-olimex](../firmware/installer/images/esp32-p4-olimex.jpg){: style="width:100px"} | <esp-web-install-button manifest="https://moonmodules.org/MoonLight/firmware/installer/manifest_esp32-p4-olimex.json"></esp-web-install-button> | <esp-web-install-button manifest="https://moonmodules.org/MoonLight/firmware/installer/manifest_esp32-p4-olimex-nightly.json"></esp-web-install-button> | [Olimex](https://www.olimex.com/Products/IoT/ESP32-P4/ESP32-P4-DevKit/open-source-hardware){:target="_blank"} |
| esp32-p4-eth | ![esp32-p4-eth](../firmware/installer/images/esp32-p4-eth.png){: style="width:100px"} | <esp-web-install-button manifest="https://moonmodules.org/MoonLight/firmware/installer/manifest_esp32-p4-eth.json"></esp-web-install-button> | <esp-web-install-button manifest="https://moonmodules.org/MoonLight/firmware/installer/manifest_esp32-p4-eth-nightly.json"></esp-web-install-button> | [Waveshare](https://www.waveshare.com/product/arduino/boards-kits/esp32-p4/esp32-p4-eth.htm){:target="_blank"}<br>[Olimex](https://www.olimex.com/Products/IoT/ESP32-P4/ESP32-P4-DevKit/open-source-hardware){:target="_blank"} |
| esp32-c3 | ![esp32-c3](../firmware/installer/images/esp32-c3.jpg){: style="width:100px"} | <esp-web-install-button manifest="https://moonmodules.org/MoonLight/firmware/installer/manifest_esp32-c3.json"></esp-web-install-button> | <esp-web-install-button manifest="https://moonmodules.org/MoonLight/firmware/installer/manifest_esp32-c3-nightly.json"></esp-web-install-button> | [Ali*](https://s.click.aliexpress.com/e/_EIl7NKw){:target="_blank"} |
| esp32-c3-supermini | ![esp32-c3-supermini](../firmware/installer/images/esp32-c3-supermini.jpg){: style="width:100px"} | <esp-web-install-button manifest="https://moonmodules.org/MoonLight/firmware/installer/manifest_esp32-c3-supermini.json"></esp-web-install-button> | <esp-web-install-button manifest="https://moonmodules.org/MoonLight/firmware/installer/manifest_esp32-c3-supermini-nightly.json"></esp-web-install-button> | [Ali*](https://s.click.aliexpress.com/e/_EIl7NKw){:target="_blank"} |
| esp32-d0-moonbase | ![esp32-d0-moonbase](../firmware/installer/images/esp32-d0.jpg){: style="width:100px"} | <esp-web-install-button manifest="https://moonmodules.org/MoonLight/firmware/installer/manifest_esp32-d0-moonbase.json"></esp-web-install-button> | <esp-web-install-button manifest="https://moonmodules.org/MoonLight/firmware/installer/manifest_esp32-d0-moonbase-nightly.json"></esp-web-install-button> | |
Expand Down
2 changes: 1 addition & 1 deletion docs/moonlight/drivers.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ The Drivers module defines layers and drivers.

* Layout 🚥: A layout (🚥) defines the positions of the lights to control. See [Layouts](../../moonlight/layouts)
* Driver ☸️: A driver is a link between MoonLight to hardware or the network. Drivers can both input data or output data. Examples:
* LED drivers (FastLED, Parallel LED Drivers, hub75 panels)
* LED drivers (FastLED, Parallel LED Drivers)
* Light driver (Art-Net / DMX)
* Audio driver
* Sensor drivers (microphone, gyro, MIDI controller)
Expand Down
10 changes: 5 additions & 5 deletions docs/moonlight/effects.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,17 +42,17 @@ These effects have first been created in MoonLight:
| Name | Preview | Controls | Remarks
| ---- | ----- | ---- | ---- |
| Solid | ![](https://raw.githubusercontent.com/scottrbailey/WLED-Utils/master/gifs/FX_000.gif) | <img width="320" src="https://github.com/user-attachments/assets/844bdbf1-b42b-4b5c-94f9-d1334bce2b10" /> | Can be used as background to other effects when ordered before other effects |
| Lines | ![lines](../../media/moonlight/effects/lines.gif) | <img width="320" alt="Speed" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | To test a layout, Red = x, Green = y, Blue = z |
| Lines | ![lines](../../media/moonlight/effects/lines.gif) | <img width="320" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | To test a layout, Red = x, Green = y, Blue = z |
| Frequency Saws ♫ | ![FreqSaws](https://github.com/user-attachments/assets/9e0f1f22-eba9-470e-850e-bd0e2f7c787f) | <img width="320" src="https://github.com/user-attachments/assets/78828181-c1b3-4d0f-85dc-356ced10fcd9"/> | |
| Moon Man | <img width="100" alt="MoonMan" src="https://github.com/user-attachments/assets/cd3acd08-2725-4d2c-b809-37a61314d620" /> | No controls | only on devices supporting M5 library, e.g. AtomS3R |
| Particles 🧊 | ![Particles](https://github.com/user-attachments/assets/c2df7f6b-3b5a-4836-8e21-127de3eb3364) | <img width="320" alt="Particles" src="https://github.com/user-attachments/assets/415d746a-5b9d-4936-9cf7-343661ac86b5" /> | Supports gyro, see [IMU driver](../../moonlight/drivers/#driver-nodes) |
| Rainbow | ![Rainbow](https://github.com/user-attachments/assets/d74832fa-0e77-481c-9823-588042751f87) | <img width="320" alt="Rainbow" src="https://github.com/user-attachments/assets/ca28f78f-dc54-4999-a0ee-700390b24f97" /> | |
| Random | ![Random](https://github.com/user-attachments/assets/b7874741-7a30-4ad1-9a8b-db0093da1297) | <img width="320" alt="Speed" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | |
| Random | ![Random](https://github.com/user-attachments/assets/b7874741-7a30-4ad1-9a8b-db0093da1297) | <img width="320" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | |
| Ripples 🧊 | ![Ripples](https://github.com/user-attachments/assets/ad1d96d9-60fc-4301-8f17-239e45de8d38) | <img width="320" alt="Ripples" src="https://github.com/user-attachments/assets/d9c83988-d60a-4eed-9e04-ea7ddbfc37ab" /> | |
| Rubiks Cube 🧊 | ![Rubik](https://github.com/user-attachments/assets/a9f9b0f7-d9e9-48a2-8b02-e602593e21f6) | <img width="320" alt="Rubik" src="https://github.com/user-attachments/assets/a1b2ee8d-3445-408c-bd53-1721eb6bc249" /> | |
| Rubik's Cube 🧊 | ![Rubik](https://github.com/user-attachments/assets/a9f9b0f7-d9e9-48a2-8b02-e602593e21f6) | <img width="320" alt="Rubik" src="https://github.com/user-attachments/assets/a1b2ee8d-3445-408c-bd53-1721eb6bc249" /> | |
| Scrolling Text | ![ScrollingText](https://github.com/user-attachments/assets/9ebcc5eb-2b4a-4eff-993c-7836fc07dcea) | <img width="320" alt="ScrollingText" src="https://github.com/user-attachments/assets/b32c2b4b-2774-42a9-8174-77602d1bc547" /> | Preset: Auto, IP (.ddd), FPS (ddds), Time (HHMM), Uptime (s/m/h), Status (AP/STA), Clients (dC), Connected (dCC), Active (dAC) |
| Sinus | ![Sinus](https://github.com/user-attachments/assets/ad42f5f1-3670-4238-a9e7-d9d1388760d4) | <img width="320" alt="Speed" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | |
| Sphere Move 🧊 | ![SphereMove](https://github.com/user-attachments/assets/f02013a4-9aca-4831-9bae-79db8e421008) | <img width="320" alt="Speed" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | |
| Sinus | ![Sinus](https://github.com/user-attachments/assets/ad42f5f1-3670-4238-a9e7-d9d1388760d4) | <img width="320" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | |
| Sphere Move 🧊 | ![SphereMove](https://github.com/user-attachments/assets/f02013a4-9aca-4831-9bae-79db8e421008) | <img width="320" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | |
Comment on lines +45 to +55
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Missing alt text on images reduces accessibility.

Several images in this table are missing alt attributes (Lines 45, 50, 54, 55). Screen readers rely on alt text to describe images for visually impaired users.

Additionally, Line 52 has "Rubiks Cube" which should be "Rubik's Cube" (possessive form).

📝 Proposed fix for alt text and typo
-| Lines | ![lines](../../media/moonlight/effects/lines.gif) | <img width="320" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | To test a layout, Red = x, Green = y, Blue = z |
+| Lines | ![lines](../../media/moonlight/effects/lines.gif) | <img width="320" alt="Lines controls" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | To test a layout, Red = x, Green = y, Blue = z |
-| Random | ![Random](https://github.com/user-attachments/assets/b7874741-7a30-4ad1-9a8b-db0093da1297) | <img width="320" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | |
+| Random | ![Random](https://github.com/user-attachments/assets/b7874741-7a30-4ad1-9a8b-db0093da1297) | <img width="320" alt="Random controls" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | |
-| Rubiks Cube 🧊 | ...
+| Rubik's Cube 🧊 | ...
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
| Lines | ![lines](../../media/moonlight/effects/lines.gif) | <img width="320" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | To test a layout, Red = x, Green = y, Blue = z |
| Frequency Saws ♫ | ![FreqSaws](https://github.com/user-attachments/assets/9e0f1f22-eba9-470e-850e-bd0e2f7c787f) | <img width="320" src="https://github.com/user-attachments/assets/78828181-c1b3-4d0f-85dc-356ced10fcd9"/> | |
| Moon Man | <img width="100" alt="MoonMan" src="https://github.com/user-attachments/assets/cd3acd08-2725-4d2c-b809-37a61314d620" /> | No controls | only on devices supporting M5 library, e.g. AtomS3R |
| Particles 🧊 | ![Particles](https://github.com/user-attachments/assets/c2df7f6b-3b5a-4836-8e21-127de3eb3364) | <img width="320" alt="Particles" src="https://github.com/user-attachments/assets/415d746a-5b9d-4936-9cf7-343661ac86b5" /> | Supports gyro, see [IMU driver](../../moonlight/drivers/#driver-nodes) |
| Rainbow | ![Rainbow](https://github.com/user-attachments/assets/d74832fa-0e77-481c-9823-588042751f87) | <img width="320" alt="Rainbow" src="https://github.com/user-attachments/assets/ca28f78f-dc54-4999-a0ee-700390b24f97" /> | |
| Random | ![Random](https://github.com/user-attachments/assets/b7874741-7a30-4ad1-9a8b-db0093da1297) | <img width="320" alt="Speed" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | |
| Random | ![Random](https://github.com/user-attachments/assets/b7874741-7a30-4ad1-9a8b-db0093da1297) | <img width="320" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | |
| Ripples 🧊 | ![Ripples](https://github.com/user-attachments/assets/ad1d96d9-60fc-4301-8f17-239e45de8d38) | <img width="320" alt="Ripples" src="https://github.com/user-attachments/assets/d9c83988-d60a-4eed-9e04-ea7ddbfc37ab" /> | |
| Rubiks Cube 🧊 | ![Rubik](https://github.com/user-attachments/assets/a9f9b0f7-d9e9-48a2-8b02-e602593e21f6) | <img width="320" alt="Rubik" src="https://github.com/user-attachments/assets/a1b2ee8d-3445-408c-bd53-1721eb6bc249" /> | |
| Scrolling Text | ![ScrollingText](https://github.com/user-attachments/assets/9ebcc5eb-2b4a-4eff-993c-7836fc07dcea) | <img width="320" alt="ScrollingText" src="https://github.com/user-attachments/assets/b32c2b4b-2774-42a9-8174-77602d1bc547" /> | Preset: Auto, IP (.ddd), FPS (ddds), Time (HHMM), Uptime (s/m/h), Status (AP/STA), Clients (dC), Connected (dCC), Active (dAC) |
| Sinus | ![Sinus](https://github.com/user-attachments/assets/ad42f5f1-3670-4238-a9e7-d9d1388760d4) | <img width="320" alt="Speed" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | |
| Sphere Move 🧊 | ![SphereMove](https://github.com/user-attachments/assets/f02013a4-9aca-4831-9bae-79db8e421008) | <img width="320" alt="Speed" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | |
| Sinus | ![Sinus](https://github.com/user-attachments/assets/ad42f5f1-3670-4238-a9e7-d9d1388760d4) | <img width="320" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | |
| Sphere Move 🧊 | ![SphereMove](https://github.com/user-attachments/assets/f02013a4-9aca-4831-9bae-79db8e421008) | <img width="320" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | |
| Lines | ![lines](../../media/moonlight/effects/lines.gif) | <img width="320" alt="Lines controls" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | To test a layout, Red = x, Green = y, Blue = z |
| Frequency Saws ♫ | ![FreqSaws](https://github.com/user-attachments/assets/9e0f1f22-eba9-470e-850e-bd0e2f7c787f) | <img width="320" src="https://github.com/user-attachments/assets/78828181-c1b3-4d0f-85dc-356ced10fcd9"/> | |
| Moon Man | <img width="100" alt="MoonMan" src="https://github.com/user-attachments/assets/cd3acd08-2725-4d2c-b809-37a61314d620" /> | No controls | only on devices supporting M5 library, e.g. AtomS3R |
| Particles 🧊 | ![Particles](https://github.com/user-attachments/assets/c2df7f6b-3b5a-4836-8e21-127de3eb3364) | <img width="320" alt="Particles" src="https://github.com/user-attachments/assets/415d746a-5b9d-4936-9cf7-343661ac86b5" /> | Supports gyro, see [IMU driver](../../moonlight/drivers/#driver-nodes) |
| Rainbow | ![Rainbow](https://github.com/user-attachments/assets/d74832fa-0e77-481c-9823-588042751f87) | <img width="320" alt="Rainbow" src="https://github.com/user-attachments/assets/ca28f78f-dc54-4999-a0ee-700390b24f97" /> | |
| Random | ![Random](https://github.com/user-attachments/assets/b7874741-7a30-4ad1-9a8b-db0093da1297) | <img width="320" alt="Random controls" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | |
| Ripples 🧊 | ![Ripples](https://github.com/user-attachments/assets/ad1d96d9-60fc-4301-8f17-239e45de8d38) | <img width="320" alt="Ripples" src="https://github.com/user-attachments/assets/d9c83988-d60a-4eed-9e04-ea7ddbfc37ab" /> | |
| Rubik's Cube 🧊 | ![Rubik](https://github.com/user-attachments/assets/a9f9b0f7-d9e9-48a2-8b02-e602593e21f6) | <img width="320" alt="Rubik" src="https://github.com/user-attachments/assets/a1b2ee8d-3445-408c-bd53-1721eb6bc249" /> | |
| Scrolling Text | ![ScrollingText](https://github.com/user-attachments/assets/9ebcc5eb-2b4a-4eff-993c-7836fc07dcea) | <img width="320" alt="ScrollingText" src="https://github.com/user-attachments/assets/b32c2b4b-2774-42a9-8174-77602d1bc547" /> | Preset: Auto, IP (.ddd), FPS (ddds), Time (HHMM), Uptime (s/m/h), Status (AP/STA), Clients (dC), Connected (dCC), Active (dAC) |
| Sinus | ![Sinus](https://github.com/user-attachments/assets/ad42f5f1-3670-4238-a9e7-d9d1388760d4) | <img width="320" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | |
| Sphere Move 🧊 | ![SphereMove](https://github.com/user-attachments/assets/f02013a4-9aca-4831-9bae-79db8e421008) | <img width="320" src="https://github.com/user-attachments/assets/b99aa9cb-161f-4ade-8d93-bc5343214ac7" /> | |
🧰 Tools
🪛 LanguageTool

[uncategorized] ~52-~52: Did you mean “Rubik's Cube”?
Context: ...8-d60a-4eed-9e04-ea7ddbfc37ab" /> | | | Rubiks Cube 🧊 | ![Rubik](https://github.com/user-a...

(RUBIKS_CUBE)

🪛 markdownlint-cli2 (0.21.0)

[warning] 45-45: Images should have alternate text (alt text)

(MD045, no-alt-text)


[warning] 45-45: Table pipe style
Expected: leading_only; Actual: leading_and_trailing; Unexpected trailing pipe

(MD055, table-pipe-style)


[warning] 46-46: Images should have alternate text (alt text)

(MD045, no-alt-text)


[warning] 46-46: Table pipe style
Expected: leading_only; Actual: leading_and_trailing; Unexpected trailing pipe

(MD055, table-pipe-style)


[warning] 47-47: Table pipe style
Expected: leading_only; Actual: leading_and_trailing; Unexpected trailing pipe

(MD055, table-pipe-style)


[warning] 48-48: Table pipe style
Expected: leading_only; Actual: leading_and_trailing; Unexpected trailing pipe

(MD055, table-pipe-style)


[warning] 49-49: Table pipe style
Expected: leading_only; Actual: leading_and_trailing; Unexpected trailing pipe

(MD055, table-pipe-style)


[warning] 50-50: Images should have alternate text (alt text)

(MD045, no-alt-text)


[warning] 50-50: Table pipe style
Expected: leading_only; Actual: leading_and_trailing; Unexpected trailing pipe

(MD055, table-pipe-style)


[warning] 51-51: Table pipe style
Expected: leading_only; Actual: leading_and_trailing; Unexpected trailing pipe

(MD055, table-pipe-style)


[warning] 52-52: Table pipe style
Expected: leading_only; Actual: leading_and_trailing; Unexpected trailing pipe

(MD055, table-pipe-style)


[warning] 53-53: Table pipe style
Expected: leading_only; Actual: leading_and_trailing; Unexpected trailing pipe

(MD055, table-pipe-style)


[warning] 54-54: Images should have alternate text (alt text)

(MD045, no-alt-text)


[warning] 54-54: Table pipe style
Expected: leading_only; Actual: leading_and_trailing; Unexpected trailing pipe

(MD055, table-pipe-style)


[warning] 55-55: Images should have alternate text (alt text)

(MD045, no-alt-text)


[warning] 55-55: Table pipe style
Expected: leading_only; Actual: leading_and_trailing; Unexpected trailing pipe

(MD055, table-pipe-style)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/moonlight/effects.md` around lines 45 - 55, Several table image tags for
the effects "Lines", "Random", "Sinus" and "Sphere Move" are missing alt
attributes and should receive concise, descriptive alt text (e.g., "Lines effect
preview", "Random effect preview", etc.) — locate the image tags in the table
rows for the effects named Lines, Random, Sinus, and Sphere Move and add
appropriate alt="…" attributes; also correct the typo in the effect name "Rubiks
Cube" to "Rubik's Cube" (update the table cell text for that row).

| StarField | ![StarField](https://github.com/user-attachments/assets/a5fcc733-0365-4109-bdcf-f353aa2cf3c0) | <img width="320" alt="StarField" src="https://github.com/user-attachments/assets/20afd6a8-df4c-4532-b640-92e84c1c6849" /> | |
| Praxis | ![Praxis](https://github.com/user-attachments/assets/f9271d1c-bcd1-4a79-bc1a-cac951758195) | <img width="320" alt="Praxis" src="https://github.com/user-attachments/assets/536ab4c8-5c90-4b76-9f80-2aaed4170901" />| |
| Wave | ![Wave](https://github.com/user-attachments/assets/a699f3a6-c981-4159-a96e-85d43c9a853c) | <img width="320" alt="Wave" src="https://github.com/user-attachments/assets/2e8408e8-4610-45dd-af36-8560fe5ec024" /> | Type: Saw, Triangle, Sinus, Square, Sin3, Noise |
Expand Down
147 changes: 124 additions & 23 deletions docs/moonlight/lightscontrol.md
Original file line number Diff line number Diff line change
@@ -1,23 +1,124 @@
# Lights Control module

<img width="320" src="https://github.com/user-attachments/assets/8ca3e8a4-8025-43a4-8746-336ef72fa81d" />

Controls:

* On: lights on or off
* Brightness: brightness of the LEDs when on
* RGB Sliders: control each color separately.
* Palette: Global palette setting used in Effects. See [WLED-MM palettes](https://mm.kno.wled.ge/features/palettes/) for the WLED-MM palettes used.
* Presets: Store the current effects and modifiers or retrieve earlier saved presets. 64 slots available:
* Blue: Empty preset
* Green: Saved preset
* Hover with the mouse to see effects and modifiers in the preset
* Double click on a saved preset to delete the preset.
* Red: Selected preset
* 🚨: Save (💾) or cancel (↻) Save effects first, before storing them as a preset!
* Note: Presets only stores Effects and Modifiers, not Layers and Drivers.
* Preset loop: loop over presets (seconds per presets)
* Monitor On: sends LED output to the monitor.

Light Controls is the interface to control lights for the UI, but also for all protocols eg. HA, DMX, Hardware buttons, displays etc
e.g. a DMX controller, can control presets, but not individual preset details.
# Lights Control

<img width="320" src="../lightscontrol.png" />

Lights Control is the **central command panel** for your LEDs. It is also the integration point for every external controller — Home Assistant, DMX, IR remotes, hardware buttons, displays — all talk to the same module.

---

## Power & Brightness

| Control | Type | Description |
|---|---|---|
| **On** | Toggle | Master switch — turns all lights on or off. Also driven by hardware buttons and PIR sensor (see [Hardware pins](#hardware-pins)). |
| **Brightness** | Slider | Global brightness of the LEDs when on (0–255, default 20). |

When lights are turned off the brightness is set to 0 in the LED driver; the stored brightness value is kept so it is restored when switched back on.

---

## Colour

Three sliders set a global colour multiplier applied to every pixel:

- 🔴 **Red** — red channel (0–255)
- 🟢 **Green** — green channel (0–255)
- 🔵 **Blue** — blue channel (0–255)

Setting all three to 255 (default) leaves effect colours unchanged. Reducing a channel tints the entire output away from that colour.

---

## Palette

A searchable dropdown listing all available palettes, grouped by origin:

| Category | Tag |
|---|---|
| FastLED built-ins | ⚡️ |
| MoonModules palettes | 🌙 |
| MoonLight palettes | 💫 |
| WLED palettes | *(no tag)* |

The selected palette is the **global palette** used by effects that reference `layerP.palette`. See [WLED-MM palettes](https://mm.kno.wled.ge/features/palettes/) for the full WLED-MM palette reference.

> **Tip:** LiveScript palette files (`P_*.sc`) stored on the filesystem appear automatically under the *LiveScript* category.

---

## BPM & Intensity

Two global override sliders that broadcast a value to **all currently active effect nodes**:

| Control | Default | What it pushes |
|---|---|---|
| **BPM** | 60 | Writes to each active node's `speed` and `BPM` controls |
| **Intensity** | 128 | Writes to each active node's `intensity` control |

These give you a single knob to speed up or calm down all running effects simultaneously, without opening the Effects panel. Effects that expose a `speed`, `BPM`, or `intensity` control will react; others are unaffected.

---

## Presets

A 64-slot grid for saving and loading complete effect configurations.

### Slot colours

| Colour | Meaning |
|---|---|
| 🔵 Blue | Empty slot |
| 🟢 Green | Saved preset — the label shows the first effect name |
| 🔴 Red | Currently active preset |

### Interactions

| Action | Result |
|---|---|
| **Click** an empty (blue) slot | Saves the current effects & modifiers to that slot |
| **Click** a saved (green) slot | Loads that preset |
| **Long-press** a saved slot | Deletes the preset |
| **Hover** over a saved slot | Shows a popup listing the effects and modifiers stored inside |

> **Note:** Presets store **Effects and Modifiers only** — not Layouts or Drivers. Configure those separately.

---

## Preset Loop

Automatically cycles through saved presets on a timer.

| Control | Range | Description |
|---|---|---|
| **Preset loop** | 0–255 s | Seconds between automatic preset advances. Set to **0** to disable. |
| **First preset** | 1–64 | First slot included in the loop |
| **Last preset** | 1–64 | Last slot included in the loop |

The loop skips empty slots and wraps around when it reaches *Last preset*.

---

## Monitor

**Monitor On** — when enabled, the current LED frame is streamed to the [Monitor](../moonbase/monitor.md) view in the UI. Disable to reduce WebSocket traffic when monitoring is not needed.

---

## Hardware Pins

Pin assignments are configured in [IO](../moonbase/io.md). Lights Control reacts to the following pin types:

| Pin type | Behaviour |
|---|---|
| **Relay — Lights On** | Output: driven HIGH when lights are on, LOW when off |
| **Push button — Lights On** | Momentary press toggles lights on/off (debounced, active-low) |
| **Toggle button — Lights On** | Any state change (rising or falling) toggles lights on/off |
| **PIR sensor** | HIGH = lights on, LOW = lights off |

---

## Home Assistant / MQTT

When MQTT is enabled, Lights Control auto-registers as a **Home Assistant light entity** via MQTT discovery. HA can then control **On/Off** and **Brightness**; the device appears under the hostname of the ESP32.

The integration activates and deactivates automatically when MQTT is enabled or disabled in the [MQTT settings](../moonbase/mqtt.md) — no restart required.
Binary file added docs/moonlight/lightscontrol.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
75 changes: 27 additions & 48 deletions firmware/esp32-p4.ini
Original file line number Diff line number Diff line change
Expand Up @@ -32,55 +32,34 @@ lib_deps = ${esp32-p4-base.lib_deps}
; Flash: [======== ] 82.3% (used 1726193 bytes from 2097152 bytes)



;https://www.olimex.com/Products/IoT/ESP32-P4/ESP32-P4-DevKit
;https://github.com/CreoKinetics/Olimex-ESP32-P4-Test
; compiling but crashing (firmware.elf': No such file, H_SDIO_DRV: sdio card init failed)
; see https://github.com/MoonModules/MoonLight/issues/3
[env:esp32-p4-olimex]
; platform = https://github.com/pioarduino/platform-espressif32/releases/download/53.03.11/platform-espressif32.zip
;platform = https://github.com/pioarduino/platform-espressif32/releases/download/54.03.20/platform-espressif32.zip
board = olimex-esp32-p4
framework = arduino
board_build.partitions = default_16MB.csv
monitor_speed = 115200
board_dir = boards
; https://www.waveshare.com/esp32-p4-eth.htm
; https://www.waveshare.com/wiki/ESP32-P4-ETH
; Ethernet only (no WiFi coprocessor), 100M RJ45, 32MB flash, 32MB PSRAM
; Also works for https://www.olimex.com/Products/IoT/ESP32-P4/ESP32-P4-DevKit
[env:esp32-p4-eth]
board = esp32-p4-evboard
board_build.partitions = default_16MB.csv
upload_speed = 921600
build_flags = ${esp32-p4-base.build_flags}
-DARDUINO_USB_CDC_ON_BOOT=1
-DARDUINO_USB_MODE=1
-D FT_WIFI=0 ; no WiFi coprocessor on this board
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Check env flags and feature defaults =="
rg -n '^\[env:esp32-p4-eth\]|FT_WIFI|FT_ETHERNET' firmware/esp32-p4.ini lib/framework/Features.h platformio.ini

echo
echo "== Check WiFi API usage vs FT_WIFI guards in framework services =="
for f in $(fd -t f 'WiFiSettingsService.cpp|APSettingsService.cpp|WiFiScanner.cpp|WiFiStatus.cpp' lib/framework); do
  echo "---- $f"
  echo "WiFi API call sites:"
  rg -n 'WiFi\.' "$f" || true
  echo "FT_WIFI compile guards:"
  rg -n 'FT_ENABLED\(FT_WIFI\)|#if.*FT_WIFI|#ifdef.*FT_WIFI' "$f" || true
  echo
done

Repository: MoonModules/MoonLight

Length of output: 6053


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Check if WiFi .cpp files are conditionally compiled in platformio/CMake =="
rg -n 'lib/framework/(WiFiSettingsService|APSettingsService|WiFiScanner|WiFiStatus)\.cpp' platformio.ini CMakeLists.txt src_cpp.txt || echo "No conditional exclusion found"

echo
echo "== Check main.cpp or service initialization for FT_WIFI guards =="
for f in $(fd -t f 'main.cpp|App.cpp|service.*\.cpp' | head -20); do
  if rg -l 'WiFiSettingsService|APSettingsService|WiFiScanner|WiFiStatus' "$f" >/dev/null 2>&1; then
    echo "---- $f"
    rg -B2 -A2 'new.*WiFi(SettingsService|Scanner|Status)|APSettings' "$f" | head -30 || true
    rg -B2 -A2 '#if.*FT_WIFI|FT_ENABLED.*FT_WIFI' "$f" | head -20 || true
    echo
  fi
done

echo "== Check header files for conditional class definitions =="
for hdr in lib/framework/WiFiSettingsService.h lib/framework/APSettingsService.h lib/framework/WiFiScanner.h lib/framework/WiFiStatus.h; do
  if [ -f "$hdr" ]; then
    echo "---- $hdr"
    rg -n '#if.*FT_WIFI|#ifdef.*FT_WIFI|FT_ENABLED.*FT_WIFI' "$hdr" || echo "No FT_WIFI guards"
    echo
  fi
done

Repository: MoonModules/MoonLight

Length of output: 1442


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Search for WiFiSettingsService/APSettingsService instantiation in main/app code =="
rg -n 'new.*WiFiSettingsService|make_shared.*WiFiSettingsService|new.*APSettingsService|addService.*WiFi|addService.*AP' --type cpp | head -40

echo
echo "== Check app initialization pattern for conditional service setup =="
rg -B5 -A5 'WiFiSettingsService|APSettingsService' src/main.cpp | head -80

echo
echo "== Look for `#if` FT_ENABLED or `#ifdef` FT_WIFI wrapping service init =="
rg -B3 -A3 '#if.*FT_ENABLED|#ifdef.*FT_WIFI' src/main.cpp | head -60

Repository: MoonModules/MoonLight

Length of output: 4858


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Search for WiFi service global object declarations =="
rg -n 'WiFiSettingsService\s+\w+|APSettingsService\s+\w+|WiFiScanner\s+\w+|WiFiStatus\s+\w+' --type cpp --type h | grep -v 'sizeof\|class\|typedef\|//.*class\|\\*' | head -30

echo
echo "== Check ESP32SvelteKit.cpp for WiFi service initialization =="
fd -t f 'ESP32SvelteKit.cpp' && rg -B5 -A5 'WiFiSettings|APSettings|beginWiFi' lib/framework/ESP32SvelteKit.cpp | head -100

echo
echo "== Check if WiFi services are created conditionally in framework =="
rg -B3 -A3 'new.*WiFiSettingsService|new.*APSettingsService|FT_WIFI' lib/framework/ESP32SvelteKit.cpp

Repository: MoonModules/MoonLight

Length of output: 121


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Check ESP32SvelteKit.h for WiFi service member variables =="
if fd -t f 'ESP32SvelteKit.h' lib/framework; then
  cat lib/framework/ESP32SvelteKit.h | head -200
fi

echo
echo "== Search broadly for WiFiSettingsService instantiation in .h files =="
rg -l 'WiFiSettingsService' lib/framework --type h

echo
echo "== Look at WiFiSettingsService.h for class definition context =="
head -100 lib/framework/WiFiSettingsService.h

echo
echo "== Search for service pointers or references in framework =="
rg 'WiFiSettingsService\s*\*|APSettingsService\s*\*' lib/framework --type h | head -20

Repository: MoonModules/MoonLight

Length of output: 7956


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Get full ESP32SvelteKit.h to see private members =="
wc -l lib/framework/ESP32SvelteKit.h
tail -200 lib/framework/ESP32SvelteKit.h | grep -A100 'private:'

echo
echo "== Search ESP32SvelteKit.cpp for WiFi service member initialization =="
fd -t f 'ESP32SvelteKit.cpp' lib/framework && wc -l lib/framework/ESP32SvelteKit.cpp

echo
echo "== Check for _wifiSettingsService and _apSettingsService initialization in .cpp =="
rg -n '_wifiSettingsService|_apSettingsService' lib/framework/ESP32SvelteKit.cpp | head -30

Repository: MoonModules/MoonLight

Length of output: 2889


FT_WIFI=0 breaks the build because WiFi services are unconditionally instantiated and called.

The esp32-p4-eth environment sets -D FT_WIFI=0 at line 44, but ESP32SvelteKit unconditionally declares and initializes WiFi service members (_wifiSettingsService, _wifiScanner, _wifiStatus, _apSettingsService, _apStatus). These services call unguarded WiFi.* APIs in lib/framework/WiFiSettingsService.cpp, lib/framework/APSettingsService.cpp, lib/framework/WiFiScanner.cpp, and lib/framework/WiFiStatus.cpp, causing linker/runtime errors.

The Ethernet services follow the correct pattern with #if FT_ENABLED(FT_ETHERNET) guards—WiFi services must use the same approach.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@firmware/esp32-p4.ini` at line 44, ESP32SvelteKit currently declares and
initializes WiFi members unconditionally while firmware/esp32-p4.ini sets -D
FT_WIFI=0; wrap the declarations and initializations of _wifiSettingsService,
_wifiScanner, _wifiStatus, _apSettingsService and _apStatus in the same
FT_ENABLED(FT_WIFI) compile guards used for Ethernet, and add matching
`#if/`#endif guards around the WiFi-specific source code that calls WiFi.* (in
WiFiSettingsService.cpp, APSettingsService.cpp, WiFiScanner.cpp, WiFiStatus.cpp)
so no WiFi APIs are referenced when FT_WIFI is disabled. Ensure headers,
constructors/destructors, and any instantiation sites in ESP32SvelteKit are
similarly guarded.

lib_deps = ${esp32-p4-base.lib_deps}
; RAM: [= ] 7.0% (used 36580 bytes from 524288 bytes)
; Flash: [=== ] 26.3% (used 1726203 bytes from 6553600 bytes). !!!???


; running fine on https://github.com/CreoKinetics/Olimex-ESP32-P4-Test :

; [Boot] ESP32-P4 Async Web Server Test
; [Flash] Init 0
; ✅ SPIFFS mounted 0 - 1061117952
; 📖 Content: Hello from P4 @ 5160
; [PSRAM] 32.00 MB
; [SD] begin… E (5375) sdmmc_common: sdmmc_init_ocr: send_op_cond (1) returned 0x107
; E (5375) vfs_fat_sdmmc: sdmmc_card_init failed (0x107).
; [ 5391][E][SD_MMC.cpp:295] begin(): Failed to initialize the card (0x107). Make sure SD card lines have pull-up resistors in place.
; ❌ Failed
; [ETH] init…
; [HTTP] AsyncWebServer started
; [SPI] bus initialized
; [Display] initialized
; [ETH] IP: 192.168.1.231 Gateway: 192.168.1.1
; [ETH] Speed : 100 Mbps, Duplex: FULL


; We have:

; ============ Before Setup End ============
; [ 172][I][esp32-hal-periman.c:141] perimanSetPinBus(): Pin 24 already has type USB_DM (45) with bus 0x4ff14ccc
; [ 172][I][esp32-hal-periman.c:141] perimanSetPinBus(): Pin 25 already has type USB_DP (46) with bus 0x4ff14ccc
; sdio_mempool_create free:34092740 min-free:34092740 lfb-def:33030132 lfb-8bit:33030132

; E (1352) sdmmc_common: sdmmc_init_ocr: send_op_cond (1) returned 0x107
; E (1352) sdio_wrapper: sdmmc_card_init failed
; E (3783) H_SDIO_DRV: sdio card init failed

; FreeRTOS: FreeRTOS Task "sdio_read" should not return, Aborting now!
; ;https://www.olimex.com/Products/IoT/ESP32-P4/ESP32-P4-DevKit
; ;https://github.com/CreoKinetics/Olimex-ESP32-P4-Test
; ; compiling but crashing (firmware.elf': No such file, H_SDIO_DRV: sdio card init failed)
; ; see https://github.com/MoonModules/MoonLight/issues/3
; [env:esp32-p4-olimex]
; ; platform = https://github.com/pioarduino/platform-espressif32/releases/download/53.03.11/platform-espressif32.zip
; ;platform = https://github.com/pioarduino/platform-espressif32/releases/download/54.03.20/platform-espressif32.zip
; board = olimex-esp32-p4
; framework = arduino
; board_build.partitions = default_16MB.csv
; monitor_speed = 115200
; board_dir = boards
; build_flags = ${esp32-p4-base.build_flags}
; -DARDUINO_USB_CDC_ON_BOOT=1
; -DARDUINO_USB_MODE=1
; lib_deps = ${esp32-p4-base.lib_deps}
; ; RAM: [= ] 7.0% (used 36580 bytes from 524288 bytes)
; ; Flash: [=== ] 26.3% (used 1726203 bytes from 6553600 bytes). !!!???
Binary file added firmware/installer/images/esp32-p4-eth.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "MoonLight nightly on esp32-p4-olimex",
"name": "MoonLight nightly on esp32-p4-eth",
"version": "0.9.1",
"home_assistant_domain": "esphome",
"funding_url": "https://esphome.io/guides/supporters.html",
Expand All @@ -8,10 +8,10 @@
"builds": [
{
"chipFamily": "ESP32-P4",
"name": "esp32-p4-olimex",
"image": "./images/olimex-esp32-p4.jpg",
"name": "esp32-p4-eth",
"image": "./images/esp32-p4-eth.png",
"parts": [
{ "path": "https://proxy.corsfix.com/?https://github.com/MoonModules/MoonLight/releases/download/v0.9.1/MoonLight_esp32-p4-olimex_0-9-1_webflash.bin", "offset": 0 }
{ "path": "https://proxy.corsfix.com/?https://github.com/MoonModules/MoonLight/releases/download/v0.9.1/MoonLight_esp32-p4-eth_0-9-1_webflash.bin", "offset": 0 }
]
}
]
Expand Down
Loading
Loading