[GELÖST] Perl-DOIF: Code wird mit zusätzlichem elsif nicht mehr ausgeführt

Begonnen von Brian171, 13 Oktober 2020, 22:12:50

Vorheriges Thema - Nächstes Thema

Brian171

Hallo liebe Mitglieder,

bin gerade dabei über HOMEMODE per Abwesenheitserkennung die Rufumleitung an einer Fritzbox über diversity 1 zu (de)aktivieren, soweit so gut. Leider stecke ich mit Perl noch in den Kinderschuhen und habe Probleme bei einem Perl-DOIF ein einfaches elsif einzubinden. Ich bin schon mehre Tage dabei und komme nicht aus die Lösung, eventuell könnte mal jemand über meinen Code schauen?
Der Code funktioniert soweit bis ich den elsif-Teil einfüge.
Habe ich diesem Topic entnommen: https://forum.fhem.de/index.php?topic=10871.0 Reply#3

Edit - hier ein bischen übersichtlicher @ Joachim, danke für deine Antwort, war aber glaube ich nicht das Problem

Ich fasse nochmal zusammen:

Das funktioniert:


([RUL_ErrHandler:"^on$"]) {
my $RefState = ReadingsVal("RUL_Check","state","");
if (ReadingsVal("Fritzbox","diversity1_state","") ne "$RefState"){
my $ErrCounter = ReadingsVal("RUL_ErrHandler_DOIF_1","ErrHandler","0")+1;
fhem("");
}
}





Diese 3 Varianten funktionieren nicht:

A. nur else - ohne Bedingung

([RUL_ErrHandler:"^on$"]) {
my $RefState = ReadingsVal("RUL_Check","state","");
if (ReadingsVal("Fritzbox","diversity1_state","") ne "$RefState"){
my $ErrCounter = ReadingsVal("RUL_ErrHandler_DOIF_1","ErrHandler","0")+1;
fhem("");
}
else{
my $ErrCounter2 = 2;
fhem("");
}
}



B. elsif - normal

([RUL_ErrHandler:"^on$"]) {
my $RefState = ReadingsVal("RUL_Check","state","");
if (ReadingsVal("Fritzbox","diversity1_state","") ne "$RefState"){
my $ErrCounter = ReadingsVal("RUL_ErrHandler_DOIF_1","ErrHandler","0")+1;
fhem("");
}
elsif (ReadingsVal("Fritzbox","diversity1_state","") eq "$RefState"){
my $ErrCounter2 = 2;
fhem("");
}
}


C. elsif-if

([RUL_ErrHandler:"^on$"]) {
my $RefState = ReadingsVal("RUL_Check","state","");
if (ReadingsVal("Fritzbox","diversity1_state","") ne "$RefState"){
my $ErrCounter = ReadingsVal("RUL_ErrHandler_DOIF_1","ErrHandler","0")+1;
fhem("");
}
elsif{
if (ReadingsVal("Fritzbox","diversity1_state","") eq "$RefState"){
my $ErrCounter2 = 2;
fhem("");
}
}}



PS:
Da das mein erster Beitrag ist, wollte ich mich noch bei allen vor allem den aktiven Entwicklern für das alles hier bedanken! Ich hatte FHEM schon vor mehreren Jahren entdeckt. Nachdem ich damals nur 3 Rollos eingebunden hatte, habe ich in den letzten Monaten vom Shelly-Switch bis zur Wärmepumpe schon ziemlich viel Hardware eingebunden. Jetzt bin ich dabei mich in das Programmieren mehr reinzufuchsen :)

Vielen Dank und viele Grüße

Brian

MadMax-FHEM

#1
Also ich hab nicht alles "durch"...

ABER:
elsif also da steckt ein if drin, also brauchst du eine Bedingung!

Wenn du einfach einen "Ausweich-Pfad" ohne weitere Bedingung willst: else (ohne if)...

EDIT: oder die Bedingung des nächsten if "unterhalb" des elsif als Bedingung "in" das elsif... ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Brian171

Hallo Joachim,

danke für deine Antwort, habe oben nochmal übersichtlich gepostet, wo das Problem ist.

Das mit dem:
elsif { if(Bedingung){auszuführender Teil}} habe ich aus obigem verlinktem Topic, warum das nur so kompliziert gehen soll weiß ich auch nicht genau, tut es bei mir aber auch nicht..

Danke & Grüße


amenomade

Syntax:
- C ist definitiv falsch
- A & B sind ok, aber was wird damit gemacht? Du setzt eine oder andere Variable, und dann? Wie und wann werden sie benutzt?

In anderen Worten: wie stellst Du fest, dass (bei A oder B) der Code nicht ausgeführt wird? Das kann man mit deiner undvollständigen Definition nicht sehen
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Brian171

Hallo,

danke für deine Antwort

der auszuführende Teil ist bei if/ elsif zur Überprüfung fast gleich bis auf den Wert des letzten "sleep x" zwischen "set RUL_ErrHandler on/off" am Schluss, der das entsprechende Dummy-device mal kurz mal lang schaltet


([RUL_ErrHandler:"^on$"]) {
my $RefState = ReadingsVal("RUL_Check","state","");
if (ReadingsVal("Fritzbox","diversity1_state","") ne "$RefState"){
my $ErrCounter = ReadingsVal("RUL_ErrHandler_DOIF_1","ErrHandler","0")+1;
fhem("set Fritzbox diversity 1 off;sleep 4;setReading RUL_ErrHandler_DOIF_1 ErrHandler $ErrCounter; set RUL_ErrHandler on;sleep 2;set RUL_ErrHandler off");
}
elsif (ReadingsVal("Fritzbox","diversity1_state","") eq "$RefState"){
my $ErrCounter2 = 2;
fhem("set Fritzbox diversity 1 off;sleep 4;setReading RUL_ErrHandler_DOIF_1 ErrHandler $ErrCounter; set RUL_ErrHandler on;sleep 4;set RUL_ErrHandler off");
}
}


Das funktioniert auch wenn ich im DOIF nur den If-Teil habe, also das Dummy Err_Handler wird in einer Endlosschleife an und ausgeschaltet. Nehme ich noch einen elsif-Teil dazu, dann wird gar nichts mehr ausgeführt, obwohl die Bedingung gleich sind und zumindest dann doch noch das if schalten müsste.


zur Funktion des DOIF:
in der finalen Lösung wird ein dummy-device RUL_check in einem present/absent-attribut des Homemode-devices gleichzeitig mit der Rufumleitung (diversity 1 on/off) geschaltet.
Das obige DOIF soll wenn der State des dummys und der Rufumleitung nicht gleich sind nach einem "sleep" ein anderes dummy RUL_ErrHandler kurz anknipsen und somit sich selbst wieder triggern und den Rufumelitungsstate erneut prüfen.
Also eine Schleife solange der Rufumelitungs-state nicht dem des RUL_check-dummys entspricht.
Aktuell ist das aber noch nicht im Code. Dieser setzt zur Prüfung die states genau auf das Gegenteil.

Wie gesagt nur mit den if-Teil funktioniert es einwandfrei.

Danke & Grüße

amenomade

Zitatelsif...
my $ErrCounter2 = 2;
fhem("set Fritzbox ...;setReading RUL_ErrHandler_DOIF_1 ErrHandler  $ErrCounter; ...
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Brian171

Danke dir :)
Durch das viele C&P und rumprobieren, habe ich das wohl verbockt