[gelöst] HTTPMOD: welche Parameter in set01Replacement01Value?

Begonnen von gestein, 11 Dezember 2021, 00:43:07

Vorheriges Thema - Nächstes Thema

gestein

Hallo,

Mit einigen Anlaufschwierigkeiten kann ich nun endlich ein dynamisches "set"-Command an mein Gerät schicken.
Dazu habe ich folgende Attribute verwendet:
attr Twinkly_icicle_144 replacement01Mode expression
attr Twinkly_icicle_144 replacement01Regex %%effect%%
attr Twinkly_icicle_144 set01Data {"mode":"$val"%%effect%%}
attr Twinkly_icicle_144 set01Hint off,color,demo,effect,movie,playlist,rt
attr Twinkly_icicle_144 set01Name mode
attr Twinkly_icicle_144 set01Replacement01Value {",\"effect_id\":".ReadingsVal("Twinkly_icicle_144","preset_id","0")}
attr Twinkly_icicle_144 set01TextArg 1
attr Twinkly_icicle_144 set01URL http://192.168.0.144/xled/v1/led/mode


Nun meine Fragen:
1) Je nach Modus (off,color,demo,effect,movie,playlist,rt) sollen im Datenfeld zusätzliche Parameter mitgegeben werden.
   Das klappt mit dem "set01Replacement01Value" schon mal ansatzweise.
   Aber wie komme ich im Perl-Ausdruck an den Wert $val?

2) Gibt es beim "set01Replacement01Value" irgendwelche vordefinierten Variablen wie z.B. $name?
   Oder muss man wirklich die eigenen Readings des Devices hart kodiert eintragen?

3) Könnte man nicht ein Attribut einführen, damit set01Data gleich als Perl-Ausdruck behandelt wird?
   Rückgabewert wäre dann halt das Datenfeld.

Danke im Voraus
Lg, Gerhard

gestein

Hallo,

ich denke, ich habe die Lösung für (1) gefunden.
Der Wert der Auswahl steht im Internal value.

Daher kann ich mein Beispiel so abändern:
attr Twinkly_icicle_144 replacement01Mode expression
attr Twinkly_icicle_144 replacement01Regex %%effect%%
attr Twinkly_icicle_144 set01Data {"mode":"$val"%%effect%%}
attr Twinkly_icicle_144 set01Hint off,color,demo,effect,movie,playlist,rt
attr Twinkly_icicle_144 set01Name mode
attr Twinkly_icicle_144 set01Replacement01Value {my $value = InternalVal("Twinkly_icicle_144", "value", "");;\
my $ret = "";;\
\
if ($value eq "effect") {\
$ret = ",\"effect_id\":".ReadingsVal("Twinkly_icicle_144","preset_id","0");;\
}\
return $ret;;\
}
attr Twinkly_icicle_144 set01TextArg 1
attr Twinkly_icicle_144 set01URL http://192.168.0.144/xled/v1/led/mode


Nun wird schon mal der Datastring richtig zusammengebaut.
Umständlich ist es dennoch.
Wäre toll, wenn man zumindest den Device-Namen übergeben bekommen würde.
Dann könnte man die Funktion auslagern.
So muss ich das in jedes Device kopieren und den Namen anpassen.

lg, Gerhard

StefanStrobel

Hallo Gerhard,

$name sollte eigentlich direkt verfügbar sein. Ohne InternalVal:


elsif ($mode eq 'expression') {
    $value = 'package main; ' . ($value // '');       # contains the expression
    local $SIG{__WARN__} = sub { Log3 $name, 3, "$name: Replacement $rNum with expression $value and regex $regex created warning: @_"; };
    # if expression calls other fhem functions, creates readings or other, then the warning handler will create misleading messages!
    $match = eval { $string =~ s/$regex/$value/gee };
    if ($@) {
        Log3 $name, 3, "$name: Replace: invalid regex / expression: /$regex/$value/gee - $@";
    }
}


Gruss
   Stefan

gestein

#3
Hallo Stefan,

[Edit] habe gerade gesehn, dass Du im großen Thread geantwortet hast.
Vergiss das hier also. Danke!

vielen Dank. Das klappt wirklich. Toll.
Der Einstieg ist ganz schön hart, aber schön langsam geht.
Dein Modul ist ja auch ganz schön mächtig.

Man kann zwar nicht direkt den Datenstring als Perl-Funktion zurückgeben, aber immerhin auch komplett ersetzen.

Eine Frage hätte ich noch.
Passt zwar nicht zum Titel des Threads, aber ich möchte keinen neuen aufmachen.

In meinem Device wird das Reading mode zyklich upgedatet.
Wenn das Device offline ist, soll dort "offline" stehen.
Also habe ich folgendes definiert:
attr Twinkly_icicle_144 reading01MaxAge 120
attr Twinkly_icicle_144 reading01MaxAgeReplacement offline
attr Twinkly_icicle_144 reading01MaxAgeReplacementMode text
attr Twinkly_icicle_144 reading01Name mode


Aber das klappt nicht.
Aus den Beispielen werde ich aber nicht schlau.

Danke im Voraus
lg, Gerhard