[gelöst] Variablen und Log-Ausgabe beim at

Begonnen von Shadow3561, 13 November 2019, 10:15:08

Vorheriges Thema - Nächstes Thema

Shadow3561

Hallo,

Ich bekomme es einfach nicht hin in einem "at" Variablen für die Logausgabe einzuarbeiten.

Mein at sieht so aus:
+*00:05 IF ([Heizung:Betriebsart] eq "Nur_Warmwasser (01)" && Value("HeizungVentile") > Value("Schwelle2Therme") && ($hour > 4 && $hour < 20)) (set Heizung Betriebsart Heizen_und_Warmwasser)

Habe es auf verschieden Weisen versucht aber FHEM meckert immer.
U.a. so


+*00:05 IF {
my $Ventil = (ReadingsVal("PidESSTISCH","actuation",""));;
my $Temp = (ReadingsVal("PidESSTISCH","measured",""));;
my $Heizung = (ReadingsVal("Heizung","Betriebsart",""));;
{ ($Heizung) eq "Nur_Warmwasser (01)" && Value("HeizungVentile") > Value("Schwelle2Therme") && ($hour > 4 && $hour < 20)) (set Heizung Betriebsart Heizen_und_Warmwasser)};;
{Log 1, "Heizung wurde eingeschaltet. Ventilstellung=$Ventil und Temperatur=$Temp"};;
};


Kann mir jemand helfen?

Beta-User

Du mischst da alle möglichen Schreibweisen. Würde empfehlen, das in "Perl-only" zu machen.

Versuch's mal damit (Bitte noch Zahl der ";" checken):

+*00:05 {
my $Ventil = (ReadingsVal("PidESSTISCH","actuation",""));;
my $Temp = (ReadingsVal("PidESSTISCH","measured",""));;
my $Heizung = (ReadingsVal("Heizung","Betriebsart",""));;
if ($Heizung eq "Nur_Warmwasser (01)" && Value("HeizungVentile") > Value("Schwelle2Therme") && $hour > 4 && $hour < 20) { fhem "set Heizung Betriebsart Heizen_und_Warmwasser";;
Log 1, "Heizung wurde eingeschaltet. Ventilstellung=$Ventil und Temperatur=$Temp";;
}
};
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Shadow3561

Danke, es funktioniert.

Ich versuche mich ja ständig weiter zu bilden aber das hat wohl bisher noch nicht gefruchtet.
Dass das IF von FHEM ein anderes ist als das if von Perl habe ich ja verstanden.
Wenn ich mich jetzt nicht verschaut habe, hast du das if hinter die Variablen gesetzt, was ja auch Sinn macht.
Nach der if Bedingung rufst du fhem auf Perlebene auf mit { fhem "set ...
Soweit ist es mir auch klar. Nur habe ich bis heute noch nicht verstanden was es mit den ";" auf sich hat.

Warum mal eins oder zwei oder 3 davon?

Könntest du mir das bitte kurz und für Laien verständlich erklären?

Danke,
Daniel

Beta-User

Also das mit den ";" steht eigentlich recht klar in den "Perl specials": https://fhem.de/commandref_modular.html#perl und in Command types: https://fhem.de/commandref_modular.html#command (Empfehlung: Als FHEM-User sollte man sich mal ausgiebig mit dem "Rahmen" der Commandref befasst haben; da steht unglaublich viel drin, was aber leider untergeht, wenn man die commandref in der Vollversion aufruft. Daher die Links zur "modular"-Variante, da sind die Grundlagen leichter als solche zu erkennen...)

Auf der reinen Perl-Ebene wird für jede Anweisung am Ende ein ";" benötigt. Diese Schreibweise findet sich in den Modulen und myUtils.

Nutzt man die in Definitionen in der cfg, muß FHEM das nach Perl "übersetzen", weil für FHEM ein einfaches Semicolon nur zur Trennung von FHEM-Befehlen dient. Dazu werden die "escaped", also (für jede weitere Ebene) verdoppelt. Wenn dich der programmiertechnische Teil interessiert: Siehe z.B. https://svn.fhem.de/trac/browser/trunk/fhem/fhem.pl#L1087: "$cmd =~ s/;;/SeMiCoLoN/g;" in
AnalyzeCommandChain().
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors