feat: Default-Transition, Weckschalter und farbfreier Ausschaltfade

Zwei neue Einstellungen, beide wie fade_in/fade_out ueber
POST /api/v1/device/state les- und schreibbar und sofort wirksam:

- transition_default (Voreinstellung 300 ms) fuellt die Transition fuer
  Farb-, Weiss- und Helligkeitswechsel bei eingeschalteter Lampe, wenn der
  Aufruf kein eigenes "transition" mitbringt. Beim Ein- und Ausschalten
  behalten fade_in/fade_out weiterhin Vorrang.
- wake_on_change (Voreinstellung aus) schaltet die Lampe bei einer Farb-,
  Weiss- oder Helligkeitsaenderung ein, wenn sie aus war. Ein
  ausdrueckliches "on": false im selben Aufruf gewinnt immer.

Beide Felder haengen am Ende von nl_settings_t, damit bestehende Lampen
ueber die Laengentoleranz von read_rec() ihre echten Voreinstellungen
bekommen statt Nullen. nl_ctrl_set_fades() heisst jetzt
nl_ctrl_set_options().

Dazu ein Treiberfehler, der erst an der migrierten GU10 RGB auffiel: der
WY-Zweig von nl_sm2135eh_set() schrieb nur Header und WY-Daten, nie die
RGB-Datenregister. Der Chip behielt also die zuletzt gesetzte Farbe, und
bei einem direkten Wechsel Farbe -> Weiss (ohne Zwischenschritt ueber
dunkel) schaelte sie sich beim Ausblenden wieder frei. Der Header sendet
jetzt die - in Weiss immer nullwertigen - RGB-Daten mit.

Die Bruno-Collection zeigt Transition jetzt zusammen mit einem Farb- und
einem Weisswechsel im selben Aufruf und hat einen Request fuer die
beiden neuen Einstellungen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Michael Sauer
2026-09-13 02:56:56 +02:00
co-authored by Claude Opus 5
parent 62a2b43175
commit 00d5a4c532
13 changed files with 256 additions and 19 deletions
+16
View File
@@ -42,6 +42,8 @@ static void test_defaults(void)
TEST_ASSERT_EQUAL_UINT8(NL_POB_LAST, s.power_on_behaviour);
TEST_ASSERT_EQUAL_UINT16(500, s.fade_in_ms);
TEST_ASSERT_EQUAL_UINT16(500, s.fade_out_ms);
TEST_ASSERT_EQUAL_UINT16(300, s.transition_ms);
TEST_ASSERT_EQUAL_UINT8(0, s.wake_on_change);
}
static void test_save_and_load(void)
@@ -108,6 +110,19 @@ static void test_load_accepts_shorter_record(void)
TEST_ASSERT_EQUAL_UINT16(500, out.fade_in_ms);
TEST_ASSERT_EQUAL_UINT16(500, out.fade_out_ms);
TEST_ASSERT_EQUAL_UINT8(0, out.ota_pending);
TEST_ASSERT_EQUAL_UINT16(300, out.transition_ms);
TEST_ASSERT_EQUAL_UINT8(0, out.wake_on_change);
}
static void test_transition_and_wake_roundtrip(void)
{
nl_settings_t in = sample("neu"), out;
in.transition_ms = 1500;
in.wake_on_change = 1;
TEST_ASSERT_EQUAL_INT(0, nl_settings_save(&in));
TEST_ASSERT_TRUE(nl_settings_load(&out));
TEST_ASSERT_EQUAL_UINT16(1500, out.transition_ms);
TEST_ASSERT_EQUAL_UINT8(1, out.wake_on_change);
}
static void test_load_rejects_longer_record(void)
@@ -171,6 +186,7 @@ int main(void)
{
UNITY_BEGIN();
RUN_TEST(test_defaults);
RUN_TEST(test_transition_and_wake_roundtrip);
RUN_TEST(test_save_and_load);
RUN_TEST(test_alternates_slots);
RUN_TEST(test_power_loss_keeps_previous);