readingsGroup commands mit regex?

Begonnen von Guybrush, 26 Februar 2026, 15:35:08

Vorheriges Thema - Nächstes Thema

Guybrush

Ist es möglich für das Attribut "commands" auch regex nutzen zu können? Ich hab ein Dummy Device in dem Offlinegeräte als reading eingetragen werden. Daraus wollte ich mir nun eine readingsGroup erstellen, was soweit ja kein Problem ist. Dort soll aber dann der Wert anklickbar sein, wenn dieser noch auf "offline" steht. Das funktioniert auch ohne Regex. Nur da ich nicht weiß welche Geräte ggf. offline sind und ich die readings dort dynamisch beibehalten will, kann ich nicht für jedes erdenkliche gerät ein eigenes mapping anlegen. Wäre daher echt gut, wenn man für commands, aber auch für mapping regex nutzen könnte.

Wird das unterstützt bzw. muss man das anders maskieren, als ich das jetzt hab?

das hier funktioniert:
defmod OfflineDevices.RG readingsGroup OfflineDevices:.*
attr OfflineDevices.RG commands {\
"device-Kueche.Bugkiller.offline" => "setreading %DEVICE %READING confirmed"\
}

das hier nicht:
defmod OfflineDevices.RG readingsGroup OfflineDevices:.*
attr OfflineDevices.RG commands {\
"device.*.offline" => "setreading %DEVICE %READING confirmed"\
}

und bei der Gelegenheit: Kann man die Keys auch nur nach dem Readingnamen benennen? Derzeit steht da dann immer "<device>:<reading>" als key

Guybrush

#1
ich hab mir den Programmcode nun mal selbst angeschaut und so wie ich das sehe geht das nicht. Ich hab das nun für mich in die 33_readingsGroup.pm so angepasst, wie ich es brauchte. Dazu sollte aber besser mal justme1968 was sagen, da er die geschrieben hat.

Folgendes hab ich gemacht, damit man zumindest einfache Vergleiche anhand des Values machen und den link entsprechend dynamisch setzen kann.

In der 33_readingsGroup.pm hab ich folgende Funktion eingebaut:
sub readingsGroup_valueCheck($) {
    my ($value) = @_;

    $value =~ m/VALUE\(\s*'.*?'\s*\)/g;
    my $res = $&;

    if ($res) {

        my @str = split(/VALUE\(\s*'.+?\s*'\)/, $value);

        $res =~ s/VALUE\(\s*'//;
        $res =~ s/'\s*\)//;
        my @value = split(/','/, $res);

        return $str[0].($value[0] eq $value[1] ? $value[2] : $value[3]).$str[1] if (scalar(@value) == 4);
    }
}

dazu hab ich dann in der Datei alle Variablen "$value_prefix" ersetzt durch "readingsGroup_valueCheck($value_prefix)".

in fhem selbst habe ich dann statt des Attributs commands nun das Attribut valuePrefix gesetzt. In meinem Fall so:

attr OfflineDevices.RG valuePrefix <a style="cursor:pointer" onclick="FW_cmd('/fhem?XHR=1&cmd=setreading %DEVICE %READING VALUE('%VALUE','offline','confirmed','offline')')">

als valueSuffix muss natürlich noch "</a>" gesetzt werden, aber das sollte selbstverständlich sein.

so kann ich den Wert in der readingsGroup nun jederzeit zwischen offline und confirmed togglen ohne erst ins device gehen zu müssen. Wenn jemand eine einfachere Lösung hat, dann bitte gerne her damit. Ich finde es auch nicht so prickelnd in einer von fhem verwalteten Datei rumzufuschen, aber anders wusste ich jetzt nicht, wie es umzusetzen wäre und feedback gabs ja bislang keins  ;)

Vielleicht kann Justme1968 dazu auch mal was sagen.