Servus!
Was ich gerne machen würde: ein universelles DOIF, das je nach Zustand einer structure ein Thermostat abschaltet oder auf dessen letzten Zustand zurückstellt. Das zugehörige Thermostat ist dabei als Reading in der structure hinterlegt.
Ich habe schon eine funktionierende Variante im DOIF-Perl-Modus. Leider scheint es im DOIF-Perl-Modus kein 'waitsame' zu geben. Das brauche ich, damit das Thermostat nicht bei jeder Türöffnung sofort aus und gleich wieder an geht. Drum habe ich eine Kombination aus "DOIF" (mit waitsame) und Perl-Modus versucht, aber so haut das nicht hin:
defmod Livingroom.Open_DOIF_1 DOIF ([Livingroom.Open:"^AnyOpen$"]) ({\
my $thermostat = ReadingsVal("$DEVICE", "Thermostat", "");; \
fhem_set($thermostat ." tmOff") ;; \
})\
DOELSEIF ([Livingroom.Open:"^AllClosed$"]) ({ \
my $thermostat = ReadingsVal("$DEVICE", "Thermostat", "");; \
my $old=OldReadingsVal("$DEVICE", "thermostatMode", "heating");; \
fhem_set($thermostat ." tm" . ucfirst($old) );; \
}) DOELSE ()
Wie greife ich den, mit der Indirektion über $DEVICE auf das Reading "Thermostat" zu? `[$DEVICE:Thermostat]` geht schon mal nicht...
Vielen Dank für Eure Hilfe,
Markus
Im FHEM-Modus wird [$DEVICE:reading] gegen den Wert selbst ersetzt, im Perl-Modus wird eine Perlfunktion an der Stelle ersetzt.
Du bist im FHEM-Modus, aber mit Perlcode, hier musst du den Inhalt in die "richtigen" Anführungszeichen setzen:
my $thermostat = '[$DEVICE:Thermostat,""]';; \
Du kannst aber ruhig bei der ReadingsVal-Variante bleiben.
Servus Damian,
Vielen Dank für die Hilfe!
Zitat von: Damian am 23 Oktober 2023, 17:26:09Du kannst aber ruhig bei der ReadingsVal-Variante bleiben.
Leider gibt's da aber noch ein Problem: $DEVICE ist leer und $device ist nicht definiert :'( Dann bekomme ich natürlich auch kein $thermostat...
defmod Livingroom.Open_DOIF_1 DOIF ([Livingroom.Open:"^AnyOpen$"]) ({\
my $thermostat = ReadingsVal("$DEVICE", "Thermostat", "");; \
Log 1, "DEVICE: $DEVICE";; \
Log 1, "thermostat: $thermostat";; \
fhem("set $thermostat tmOff") ;; \
})\
DOELSEIF ([Livingroom.Open:"^AllClosed$"]) ({ \
my $thermostat = ReadingsVal("$DEVICE", "Thermostat", "");; \
my $old=OldReadingsVal("$DEVICE", "thermostatMode", "heating");; \
fhem("set $thermostat tm" . ucfirst($old) );; \
}) \
DOELSE ()
2023.10.24 10:29:23.511 1: DEVICE:
2023.10.24 10:29:23.511 1: thermostat:
Abgesehen davon, dass bei "$DEVICE" die Anführungszeichen unsinnig sind, frage ich mich, was Du denn als Inhalt von $DEVICE an dieser Stelle erwartest?
Verwende doch stattdessen einfach den Namen der structure.
Wobei ich grundsätzlich vermute, dass das, was Du da tun möchtest, viel einfacher zu lösen ist.
[quote author=The Grue link=msg=1290411 date=1698137185
Leider gibt's da aber noch ein Problem: $DEVICE ist leer und $device ist nicht definiert :'( Dann bekomme ich natürlich auch kein $thermostat...
[/quote]
Also bei einem Trigger ausgelöst durch ein Device sollte $DEVICE immer gefüllt sein. Wenn $DEVICE leer ist, dann wird dir die DOIF-Schreibweise auch nicht helfen.
"bei einem Trigger ausgelöst" hat mich getriggert ;) Ich hab das DOIF via `set ... cmd_1` ausgelöst, weil ich zu faul war einen Stock tiefer zu laufen ...
Kaum macht man diesen Unsinn nicht, funktioniert's :)