FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: The Grue am 22 Oktober 2023, 20:19:57

Titel: Bitte Hilfe bei kaputtem DOIF
Beitrag von: The Grue am 22 Oktober 2023, 20:19:57
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
Titel: Aw: Bitte Hilfe bei kaputtem DOIF
Beitrag von: Damian am 23 Oktober 2023, 17:26:09
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.
Titel: Aw: Bitte Hilfe bei kaputtem DOIF
Beitrag von: The Grue am 24 Oktober 2023, 10:46:25
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:
Titel: Aw: Bitte Hilfe bei kaputtem DOIF
Beitrag von: betateilchen am 24 Oktober 2023, 11:01:37
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.
Titel: Aw: Bitte Hilfe bei kaputtem DOIF
Beitrag von: Damian am 24 Oktober 2023, 11:25:42
[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.
Titel: Aw: Bitte Hilfe bei kaputtem DOIF
Beitrag von: The Grue am 24 Oktober 2023, 12:33:21
"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 :)