Lichtwecker - modify cancel_wulCK cancel_wulCK AS cancel slwu…

Begonnen von erdnar, 10 Januar 2026, 12:01:52

Vorheriges Thema - Nächstes Thema

erdnar

Hallo und allen noch ein gesundes neues Jahr,
ich hatte mir einen Lichtwecker nachgebaut (Wecker, Lichtwecker). Ist in 2 Varianten bei uns erfolgreich im Einsatz.
Allerdings habe ich immer, wenn ein Wecker benutzt wurde, eine Änderung der Fhem-Config. modify cancel_wulCK cancel_wulCK AS cancel slwu...Der einzige Unterschied, zwischen der gespeicherten und der ungespeicherten Version von cancel_wulCK, ist ein zusätzliches Leerzeichen hinter # PARAM.
Wie kann ich das abstellen?
Danke vorab
ErdnaR

define cancel_wulCK cmdalias cancel_wulCK AS cancel slwul_1 quiet;;cancel slwul_2 quiet;;cancel slwul_3 quiet;;cancel slwul_4 quiet;;cancel slwul_5 quiet;;cancel slwul_6 quiet;;cancel slwul_7 quiet;;cancel slwul_8 quiet;;cancel slwul_9 quiet;;cancel slwul_10 quiet;;cancel slwul_11 quiet;;cancel slwul_12 quiet;;cancel slwul_13 quiet;;cancel slwul_14 quiet;;cancel slwul_15 quiet;;cancel slwul_16 quiet;;cancel slwul_17 quiet;;cancel slwul_18 quiet;;cancel slwul_19 quiet;;cancel slwul_20 quiet;;cancel slwul_21 quiet;;cancel slwul_22 quiet;;cancel slwul_23 quiet;;cancel slwul_24 quiet;;cancel slwul_25 quiet;;cancel slwul_26 quiet;;cancel slwul_27 quiet;;cancel slwul_28 quiet;;cancel slwul_29 quiet;;cancel slwul_30 quiet;;cancel slwul_31 quiet;;cancel slwul_32 quiet;;cancel slwul_33 quiet;;cancel slwul_34 quiet;;cancel slwul_35 quiet;;cancel slwul_36 quiet;;cancel slwul_37 quiet;;cancel slwul_38 quiet;;cancel slwul_39 quiet;;cancel slwul_40 quiet;;cancel slwul_41 quiet;;cancel slwul_42 quiet;;cancel slwul_43 quiet;;cancel slwul_44 quiet;;cancel slwul_45 quiet;;cancel slwul_46 quiet;;cancel slwul_47 quiet;;cancel slwul_48 quiet;;set HUEDevice65541 off;;
attr cancel_wulCK group Wecker CK
attr cancel_wulCK room Wecker
#   ALIAS      cancel_wulck
#   DEF        cancel_wulCK AS cancel slwul_1 quiet;cancel slwul_2 quiet;cancel slwul_3 quiet;cancel slwul_4 quiet;cancel slwul_5 quiet;cancel slwul_6 quiet;cancel slwul_7 quiet;cancel slwul_8 quiet;cancel slwul_9 quiet;cancel slwul_10 quiet;cancel slwul_11 quiet;cancel slwul_12 quiet;cancel slwul_13 quiet;cancel slwul_14 quiet;cancel slwul_15 quiet;cancel slwul_16 quiet;cancel slwul_17 quiet;cancel slwul_18 quiet;cancel slwul_19 quiet;cancel slwul_20 quiet;cancel slwul_21 quiet;cancel slwul_22 quiet;cancel slwul_23 quiet;cancel slwul_24 quiet;cancel slwul_25 quiet;cancel slwul_26 quiet;cancel slwul_27 quiet;cancel slwul_28 quiet;cancel slwul_29 quiet;cancel slwul_30 quiet;cancel slwul_31 quiet;cancel slwul_32 quiet;cancel slwul_33 quiet;cancel slwul_34 quiet;cancel slwul_35 quiet;cancel slwul_36 quiet;cancel slwul_37 quiet;cancel slwul_38 quiet;cancel slwul_39 quiet;cancel slwul_40 quiet;cancel slwul_41 quiet;cancel slwul_42 quiet;cancel slwul_43 quiet;cancel slwul_44 quiet;cancel slwul_45 quiet;cancel slwul_46 quiet;cancel slwul_47 quiet;cancel slwul_48 quiet;set HUEDevice65541 off;
#   FUUID      68d661c8-f33f-cc74-c481-95e1822ccf2a201d
#   NAME       cancel_wulCK
#   NEWCMD     cancel slwul_1 quiet;cancel slwul_2 quiet;cancel slwul_3 quiet;cancel slwul_4 quiet;cancel slwul_5 quiet;cancel slwul_6 quiet;cancel slwul_7 quiet;cancel slwul_8 quiet;cancel slwul_9 quiet;cancel slwul_10 quiet;cancel slwul_11 quiet;cancel slwul_12 quiet;cancel slwul_13 quiet;cancel slwul_14 quiet;cancel slwul_15 quiet;cancel slwul_16 quiet;cancel slwul_17 quiet;cancel slwul_18 quiet;cancel slwul_19 quiet;cancel slwul_20 quiet;cancel slwul_21 quiet;cancel slwul_22 quiet;cancel slwul_23 quiet;cancel slwul_24 quiet;cancel slwul_25 quiet;cancel slwul_26 quiet;cancel slwul_27 quiet;cancel slwul_28 quiet;cancel slwul_29 quiet;cancel slwul_30 quiet;cancel slwul_31 quiet;cancel slwul_32 quiet;cancel slwul_33 quiet;cancel slwul_34 quiet;cancel slwul_35 quiet;cancel slwul_36 quiet;cancel slwul_37 quiet;cancel slwul_38 quiet;cancel slwul_39 quiet;cancel slwul_40 quiet;cancel slwul_41 quiet;cancel slwul_42 quiet;cancel slwul_43 quiet;cancel slwul_44 quiet;cancel slwul_45 quiet;cancel slwul_46 quiet;cancel slwul_47 quiet;cancel slwul_48 quiet;set HUEDevice65541 off;
#   NR         511
#   PARAM     
#   STATE      defined
#   TYPE       cmdalias
#
setstate cancel_wulCK defined

tgv_boost

Servus,
da ich mich eh gerade unbeliebt mache mit KI, hier mal ein Versuch mit Deiner Aufgabe. K. A ob das für Dich Sinn macht, aber nachdem es sonst zur Lösung Deines Problemes ruhig bleibt, hier mal eine gemini.com Antwort. Bin gespannt ob es Dich der Lösung näher bringt.

> Das ist ein klassisches FHEM-Problem, das viele User in den Wahnsinn treibt: Das rote Fragezeichen (Save config) erscheint, obwohl man gefühlt gar nichts geändert hat.

Die Analyse
Das Problem liegt hier beim Modul cmdalias. ErdnaR nutzt einen extrem langen Alias, um 48 Einzelbefehle (cancel slwul_...) abzuarbeiten.

Das von ihm beobachtete Leerzeichen bei # PARAM deutet darauf hin, dass FHEM bei der Ausführung des cmdalias oder durch ein internes modify die Definition im Speicher minimal verändert (z.B. durch das Parsen der Argumente). Da cmdalias die Befehlskette quasi "neu schreibt", erkennt FHEM eine Differenz zur fhem.cfg und markiert die Konfiguration als geändert.

Die Lösung: Weg vom cmdalias – hin zur 99_myUtils.pm
Einen cmdalias für 48 identische Befehle zu missbrauchen, ist extrem ineffizient und fehleranfällig (wie man hier sieht). Die sauberste Lösung ist eine kleine Schleife in Perl. Das löst das Speicher-Problem und macht den Code lesbar.

Schritt 1: Die Funktion in die 99_myUtils.pm einfügen Statt 48 Zeilen schreiben wir eine kleine Schleife:

Perl

sub lichtwecker_cancel($) {
    my ($hue_device) = @_;
    # Schleife von 1 bis 48
    for my $i (1..48) {
        fhem("cancel slwul_$i quiet");
    }
    # Das HUE Device ausschalten
    fhem("set $hue_device off");
    return;
}
Schritt 2: Den cmdalias (oder das auslösende Device) anpassen ErdnaR kann jetzt den riesigen Block durch einen einzigen Aufruf ersetzen. Den cmdalias kann er behalten, wenn er den Befehl cancel_wulCK im Interface behalten will, aber die Definition wird winzig:

Code-Snippet

defmod cancel_wulCK cmdalias cancel_wulCK AS { lichtwecker_cancel("HUEDevice65541") }
Warum das das Problem löst:
Statische Definition: Die Definition des cmdalias ändert sich nicht mehr, da keine langen Befehlsketten mehr geparst werden müssen.

Kein Overhead: FHEM muss nicht 48-mal prüfen, ob sich ein Parameter geändert hat.

Wartbarkeit: Wenn du mal 60 Stufen für den Wecker braucht, änderts du in der Perl-Datei einfach die 48 in eine 60.

Zusatz-Tipp für ErdnaR: Falls Du den cmdalias gar nicht unbedingt braucht, könntest Du die Funktion auch direkt aus einem notify oder at aufrufen. Das vermeidet den cmdalias-Mechanismus komplett und das rote Fragezeichen bleibt weg.

erdnar

Hallo tgv_boost,
ich denke nicht, dass du dich in der anderen Diskussion wegen KI unbeliebt gemacht hast. Es lag wohl eher der Verdacht im Raum, dass du eine KI bist.
Wie auch immer, wir werden damit leben müssen.

Zum Thema, vielen Dank.
Ich hatte ja geschrieben, dass ich den Wecker nachgebaut hatte. Leider bedeutet das bei mir nicht unbedingt, dass ich das Ganze auch immer verstehe.
Ich habe deine Gemini-Idee mal umgesetzt und zumindest mein Problem damit behoben. Ob es die Lösung ist oder irgendetwas anderes zum Erfolg geführt hat werde ich sehen.
Nochmals Danke
ErdnaR