4 Commits
Author SHA1 Message Date
mangavalkandClaude Opus 5.5 06b259cb1b Restart when the MCU stops reporting
After about 2.5 days the chip stopped receiving MCU replies while writes still
went out, so switches looked stuck. Restart after 5 quiet minutes, but only if
the link worked earlier in that boot.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 01:17:11 +01:00
mangavalkandClaude Opus 5.5 a355f64d1a Name the alarm sounds
Replace Sound 1 to 7 with the names identified by ear on this lamp.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 19:19:54 +01:00
mangavalkandClaude Opus 5.5 5c29cdd52f Note the first alarm sound name
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 18:43:31 +01:00
mangavalkandClaude Opus 5.5 e772c1a351 Note confirmed ring duration and silent sound 0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 18:28:30 +01:00
4 changed files with 36 additions and 21 deletions

No files matched your search

+5 -1
View File
@@ -8,6 +8,7 @@ ESPHome firmware for a Moes Wake Up Light II (Tuya PID `ya39qahrcdhvxowz`), runn
- `alarm_block.yaml`: controls for one alarm, included 4 times. - `alarm_block.yaml`: controls for one alarm, included 4 times.
- `alarm_day.yaml`: one weekday switch, included 7 times per alarm. - `alarm_day.yaml`: one weekday switch, included 7 times per alarm.
- `components/uart`: ESPHome 2026.10.2's UART component with `patches/wbr3-pa13-pa14-uart.patch` applied. Recheck it when ESPHome updates. - `components/uart`: ESPHome 2026.10.2's UART component with `patches/wbr3-pa13-pa14-uart.patch` applied. Recheck it when ESPHome updates.
- `server-example.yaml`: the short YAML that goes on an ESPHome server. - `server-example.yaml`: the short YAML that goes on an ESPHome server.
- `secrets.yaml`: local only, ignored by git. Needs `wifi_ssid`, `wifi_password`, `ap_password`, `api_encryption_key`. - `secrets.yaml`: local only, ignored by git. Needs `wifi_ssid`, `wifi_password`, `ap_password`, `api_encryption_key`.
@@ -62,11 +63,14 @@ From Tuya's definition for a sibling product (tuya-local issue #3821). See the R
- Byte 8 isn't per alarm. Every DP127 write sets all 4 to the current radio station, so there's no per-alarm station control. - Byte 8 isn't per alarm. Every DP127 write sets all 4 to the current radio station, so there's no per-alarm station control.
- Byte 10 is forced to 0 without the light bit, and writing 0 clears the light bit. - Byte 10 is forced to 0 without the light bit, and writing 0 clears the light bit.
- Byte 11: above 1 becomes 1. - Byte 11: above 1 becomes 1.
- What byte 4 actually does to ring length isn't confirmed. A test ring wasn't observed stopping. - Byte 4 is the ring length in minutes: set to 10, a ring ran from 18:16 to 18:26 and the owner saw it stop.
- Sound 0 is silent. In Sound + Light mode, the light still came on and no sound played.
- Alarm sounds, identified by ear: 1 birds chirping, 2 beach (water and birds), 3 galaxy twinkles, 4 piano and birds, 5 happy harp or high piano, 6 old mechanical alarm clock, 7 old digital alarm clock. Names are in `alarm_block.yaml`. Sunset's sounds 1 to 4 haven't been checked, so they keep their numbers.
- Radio Volume and station writes are ignored with the radio off. With it on, both work, and the station stays selected after turning it off. - Radio Volume and station writes are ignored with the radio off. With it on, both work, and the station stays selected after turning it off.
- Keep `default_transition_length` at 0. A transition sends about 50 MCU writes a second. - Keep `default_transition_length` at 0. A transition sends about 50 MCU writes a second.
- LibreTiny before v1.14.0 can hang after a software restart or OTA until powered off for about 30 seconds (LibreTiny issue #396). The config pins v1.14.0. Drop the pin once ESPHome defaults to it or newer. - LibreTiny before v1.14.0 can hang after a software restart or OTA until powered off for about 30 seconds (LibreTiny issue #396). The config pins v1.14.0. Drop the pin once ESPHome defaults to it or newer.
- "Last Restart Reason" reports Power-On even after software restarts. - "Last Restart Reason" reports Power-On even after software restarts.
- On 2026-11-08, after about 2.5 days of uptime, the chip stopped receiving anything from the MCU while its own writes still went out. The owner saw Ambient Light turn on but not off, and MCU Link was OFF. A software restart fixed it. Since v1.0.4 the firmware restarts itself after 5 minutes without an MCU report, but only if the link worked earlier in that boot. The cause isn't known; suspects are the patched UART0 on PA13/PA14 or a LibreTiny serial issue.
## Status ## Status
+18 -17
View File
@@ -117,13 +117,13 @@ select:
name: "Alarm ${n} Sound" name: "Alarm ${n} Sound"
options: options:
- "Off" - "Off"
- "Sound 1" - "Birds"
- "Sound 2" - "Beach"
- "Sound 3" - "Galaxy Twinkles"
- "Sound 4" - "Piano and Birds"
- "Sound 5" - "Happy Harp"
- "Sound 6" - "Mechanical Alarm Clock"
- "Sound 7" - "Digital Alarm Clock"
update_interval: 2s update_interval: 2s
web_server: web_server:
sorting_group_id: group_alarm_${n} sorting_group_id: group_alarm_${n}
@@ -131,20 +131,21 @@ select:
lambda: |- lambda: |-
if (!id(alarm_raw_valid)) return {}; if (!id(alarm_raw_valid)) return {};
uint8_t s = id(alarm_raw)[${o} + 6]; uint8_t s = id(alarm_raw)[${o} + 6];
if (s == 0) return std::string("Off"); static const char *const names[8] = {"Off", "Birds", "Beach", "Galaxy Twinkles", "Piano and Birds",
if (s >= 1 && s <= 7) return std::string("Sound ") + std::to_string(s); "Happy Harp", "Mechanical Alarm Clock", "Digital Alarm Clock"};
return {}; if (s > 7) return {};
return std::string(names[s]);
set_action: set_action:
- lambda: |- - lambda: |-
if (!id(alarm_raw_valid)) return; if (!id(alarm_raw_valid)) return;
uint8_t value = 0; uint8_t value = 0;
if (x == "Sound 1") value = 1; if (x == "Birds") value = 1;
else if (x == "Sound 2") value = 2; else if (x == "Beach") value = 2;
else if (x == "Sound 3") value = 3; else if (x == "Galaxy Twinkles") value = 3;
else if (x == "Sound 4") value = 4; else if (x == "Piano and Birds") value = 4;
else if (x == "Sound 5") value = 5; else if (x == "Happy Harp") value = 5;
else if (x == "Sound 6") value = 6; else if (x == "Mechanical Alarm Clock") value = 6;
else if (x == "Sound 7") value = 7; else if (x == "Digital Alarm Clock") value = 7;
id(alarm_raw)[${o} + 6] = value; id(alarm_raw)[${o} + 6] = value;
- script.execute: send_alarm_settings - script.execute: send_alarm_settings
+1 -1
View File
@@ -7,6 +7,6 @@ substitutions:
packages: packages:
lamp: lamp:
url: https://mangavalk.com/mangavalk/esphome-wake-up-light-ii.git url: https://mangavalk.com/mangavalk/esphome-wake-up-light-ii.git
ref: v1.0.2 ref: v1.0.4
files: [wake-up-light-ii.yaml] files: [wake-up-light-ii.yaml]
refresh: 1d refresh: 1d
+12 -2
View File
@@ -22,7 +22,7 @@ external_components:
- source: - source:
type: git type: git
url: https://mangavalk.com/mangavalk/esphome-wake-up-light-ii.git url: https://mangavalk.com/mangavalk/esphome-wake-up-light-ii.git
ref: v1.0.2 ref: v1.0.4
components: [uart] components: [uart]
refresh: 1d refresh: 1d
@@ -187,6 +187,15 @@ interval:
- interval: 60s - interval: 60s
then: then:
- script.execute: apply_display_schedule - script.execute: apply_display_schedule
# After about 2.5 days the chip once stopped receiving the MCU's replies,
# while sending still worked. A restart fixed it, so restart after 5 quiet
# minutes. Only if the link worked earlier this boot, to avoid a restart loop.
- lambda: |-
uint32_t last = id(last_mcu_report);
if (last != 0 && millis() - last > 300000) {
ESP_LOGW("mcu", "No report from the MCU for %u s, restarting", (unsigned) ((millis() - last) / 1000));
App.safe_reboot();
}
############################################################################### ###############################################################################
# Tuya MCU # Tuya MCU
@@ -268,7 +277,8 @@ tuya:
# [03] repeat days: bit 0 = Monday ... bit 6 = Sunday, 0 = one time # [03] repeat days: bit 0 = Monday ... bit 6 = Sunday, 0 = one time
# [04] ring duration (Tuya says 10-20, this lamp reports 30; any value is kept) # [04] ring duration (Tuya says 10-20, this lamp reports 30; any value is kept)
# [05] mode bits: bit 0=light, bit 1=radio. Values above 3 are ignored. # [05] mode bits: bit 0=light, bit 1=radio. Values above 3 are ignored.
# [06] sound 0..7. Writing 8 or more turns on the radio bit and resets it to 1. # [06] sound 0..7, named in alarm_block.yaml. Writing 8 or more turns on the
# radio bit and resets it to 1.
# Locked at 1 in radio modes. # Locked at 1 in radio modes.
# [07] volume 1..16 (any value is kept) # [07] volume 1..16 (any value is kept)
# [08] radio station. Not per alarm: every write sets all 4 to the current # [08] radio station. Not per alarm: every write sets all 4 to the current