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 (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
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
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
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
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
Zitatelsif...
my $ErrCounter2 = 2;
fhem("set Fritzbox ...;setReading RUL_ErrHandler_DOIF_1 ErrHandler $ErrCounter; ...
Danke dir :)
Durch das viele C&P und rumprobieren, habe ich das wohl verbockt