DOIF Perl-Definition Rückfrage

Begonnen von laufhem, 12 Oktober 2023, 15:16:15

Vorheriges Thema - Nächstes Thema

laufhem

Hallo,
ich möchte beim Öffnen/Schließen des Badfensters als Bestätigung für das Empfangen des Zustands das Licht im Bad kurz toggeln.
Eine "einfache" Definition habe ich in Betrieb, allerdings geht sporadisch ein toggle-Befehl verloren, sodass das Licht an oder ausbleibt.

([Badfenster:?closed]) (set Licht_Bad toggle; sleep 2; set Licht_Bad toggle;) DOELSE (set Licht_Bad toggle; sleep 2; set Licht_Bad toggle;)

Daher ist meine Idee, beim Öffnen den aktuellen Lichtzustand in eine Variable zu schreiben und diese dann am Ende hart zu setzen. Allerdings nutze ich die Definition offenbar falsch:

defmod BadfensterFeedbackPerl DOIF {
my $BadLichtState = ReadingsVal("Licht_Bad","state","");
my $BadFensterState = ReadingsVal("Badfenster","state","");
if($BadFensterState eq "closed")
{
fhem("set Licht_Bad toggle; sleep 2; set Licht_Bad toggle; sleep 2; set Licht_Bad ".$BadLichtState);
}
else
{
fhem("set Licht_Bad toggle; sleep 2; set Licht_Bad toggle; sleep 2; set Licht_Bad ".$BadLichtState);
}
}
gibt als Antwort
BadfensterFeedbackPerl DOIF: Perlblck: no right bracket: {  my $BadLichtState = ReadingsVal("Licht_Bad","state","")
Unknown command my, try help.
Unknown command if($BadFensterState, try help.

Wie müsste ich korrekt definieren?

Per

Ich weiß nicht, wo du das eintippst, aberirgendwie bist du nicht im richtigen Modus. Und einen Trigger kann ich auch nicht erkennen.

laufhem

Dass ich nicht im "richtigen Modus" bin, merke ich auch.
Ich möchte das in der Befehlszeile der Weboberfläche als Definition eingeben. Wegen mir, auch wo anders - dann muss man mir aber sagen, wo und wie.

Der Trigger ist, wenn der Zustand des Badfensters auf closed geht - siehe auch die erste, funktionierende Codezeile.

Damian

In der Eingabezeile definierst am besten nur das nackte Device:

defmod BadfensterFeedbackPerl DOIF {}

Dann kannst du beim angelegten Device BadfensterFeedbackPerl auf DEF klicken und den Rest mit Einrückungen eingeben, wie du möchtest.

Das Modul DOIF kennt zwei Modi abhängig von der Definition. Der FHEM-Modus ist etwas für Anfänger, der Perlmodus für Fortgeschrittene, die mehr wollen.

Deine Definition ist im Perlmodus und auch dort braust du einen Trigger, damit der Block getriggert ausgeführt werden kann, z. B.

defmod BadfensterFeedbackPerl DOIF {
my $BadLichtState = ReadingsVal("Licht_Bad","state","");
my $BadFensterState = [Badfenster:state]; ## diese Angabe triggert

if ($BadFensterState eq "closed")
{
fhem("set Licht_Bad toggle; sleep 2; set Licht_Bad toggle; sleep 2; set Licht_Bad ".$BadLichtState);
}
else
{
fhem("set Licht_Bad toggle; sleep 2; set Licht_Bad toggle; sleep 2; set Licht_Bad ".$BadLichtState);
}
}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

laufhem

Vielen Dank, super Hilfe!
wie vorgeschlagen habe ich zunächst defmod BadfensterFeedbackPerl DOIF {} ausgeführt und dann im DEF-Fenster folgendes stehen:


defmod BadfensterFeedbackPerl DOIF {
my $BadFensterState = [Badfenster:state]; ## diese Angabe triggert

if ($BadFensterState eq "closed")
{my $BadLichtState = ReadingsVal("Licht_Bad","state","");
fhem("set Licht_Bad toggle; sleep 2; set Licht_Bad toggle; sleep 2; set Licht_Bad ".$BadLichtState);
}
else
{my $BadLichtState = ReadingsVal("Licht_Bad","state","");
fhem("set Licht_Bad toggle; sleep 2; set Licht_Bad toggle; sleep 2; set Licht_Bad ".$BadLichtState);
}
}


Kleiner Hinweis: Wenn ich den BadLichtState nicht in den einzelnen Blöcken definiere, erhalte ich eine Fehlermeldung.

Noch eine Frage: Warum wird mir der Zustand des DOIF stets als initialized angezeigt? Die Funktion beim Öffnen und Schließen ist gegeben; der Code schaltet also.

Damian

Weil du im Perlmodus dich selber um den Status des Devices kümmern musst, dieser wird mit set_State gesetzt, siehe : https://wiki.fhem.de/wiki/DOIF/Perl-Modus
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Wie wäre es mit
defmod BadfensterFeedbackPerl DOIF {
[Badfenster:state]; ## diese Angabe triggert
my $BadLichtState = ReadingsVal("Licht_Bad","state","");
fhem("set Licht_Bad toggle; sleep 2; set Licht_Bad toggle; sleep 2; set Licht_Bad ".$BadLichtState);
}