Bitte Hilfe bei kaputtem DOIF

Begonnen von The Grue, 22 Oktober 2023, 20:19:57

Vorheriges Thema - Nächstes Thema

The Grue

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

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

The Grue

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:

betateilchen

#3
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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Damian

[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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

The Grue

"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 :)