Hallo zusammen,
ich möchte einen Slider nutzen um die Minuten für eine temporäre Deaktivierung der Alarmanlage auszuwählen.
Der Slider hat einen Bereich zwischen 0 und 300 in 15min Schritten.
Die ausgewählten Minuten müssen dann in folgendes Format umgerechnen werden: hh:mm:ss
Ich habe nach etwas Suchen und Probieren einen Code erstellt, der in Padre wunderbar funktioniert, allerdings nicht in FHEM.
sub zeitformat{
$Minuten = shift;
$Minuten = abs($Minuten);
$Zeit = printf ("%02d:%02d:%02d",($Minuten/60)%60,$Minuten%60);
}
sub Alarmpause{
$Minuten = ReadingsVal(Alarmpause,"state","leer");
zeitformat($Minuten);
if ((ReadingsVal("Alarmpause", "state", "0") eq "0") && (ReadingsVal("Alarmanlage", "state", "closed") eq "pause")){
fhem("set Alarmanlage on");
fhem("delete Alarm_pause");
}
elsif ((ReadingsVal("Alarmpause", "state", "0") ne "0") && (ReadingsVal("Alarmanlage", "state", "closed") eq "on")){
fhem("delete Alarm_pause");
fhem("define Alarm_pause at +$Zeit {fhem(\"set Alarmanlage on\");; fhem(\"delete Alarm_pause\");; fhem(\"save\");; fhem(\"set Alarmpause 0\");;}");
}
}
Wenn ich zB 135 Min auswähle erhalte ich in Padre 02:15:00 und in FHEM 00:135:00. Wo liegt da der Fehler?
Außerdem würde ich gerne erfahren wie ich Variablen unter den beiden Subs austauschen kann ohne sie global festzulegen.
Bin immernoch in der Lernphase was Perl angeht und freue mich über jede Unterstützung.
Gruß Arek
Hallo Arek,
mir ist nicht ganz klar, wo Du Deinen Code ausführst (myutil ?), aber ich denke innerhalb von fhem bekommst Du an verschiedenen Stellen Probleme mit dem Code.
Es werden Variablen nicht deklariert (und damit global) -> $Zeit und $Minuten
Keine expliziten Übergaben gemacht (sub zeitformat) und warum überhaupt eine Sub
Printf ist mir heir auch nicht klar (denn das schreibt eine Ausgabe, gemeint ist vermutlich sprintf)
printf wird mit 3 zue rsetzenden Teilen aufgerufen aber es werden nur 2 übergeben?
Also ohne einen perl-interpreter dabei zu haben und ohne perlExperte zu sein, würde ich mal folgendes vorschlagen
sub Alarmpause{
# hole Minuten aus Alarmpause / default is 0
my $Minuten = ReadingsVal(Alarmpause,"state",0);
# wandle Minuten in Zahl um
$Minuten = abs( $Minuten);
# wandle Minuten in hh:mm:ss um
my $Zeit = sprintf( "%02d:%02d:00",($Minuten/60)%100,$Minuten%60);
if ( ( $Minuten == 0 ) && (ReadingsVal("Alarmanlage", "state", "closed") eq "pause")){
fhem("set Alarmanlage on");
fhem("delete Alarm_pause");
} elsif ( $Minuten != 0 ) && (ReadingsVal("Alarmanlage", "state", "closed") eq "on")){
fhem("delete Alarm_pause");
fhem("define Alarm_pause at +$Zeit {fhem(\"set Alarmanlage on\");; fhem(\"delete Alarm_pause\");; fhem(\"save\");; fhem(\"set Alarmpause 0\");;}");
}
}
ich bin mir aber trotzdem nicht sicher ob ich den Weg über einen eigenen device Alarm_pause
gehen würde...
Hi und danke für die Antwort.
Der Code wird in myUtils ausgeführt und natürlich hatte ich sprintf in FHEM, printf nur zur Kontrolle in Padre.
Leider funktioniert dein Code auch nicht in FHEM, es kommt zum selber Fehler:
2015.08.10 20:05:02 3: define Alarm_pause at +00:75:00 {fhem("set Alarmanlage on");;;; fhem("delete Alarm_pause");;;; fhem("save");;;;} : Wrong timespec 00:75:00: either HH:MM:SS or {perlcode}
Bei Auswahl von >59 Minuten werden diese nicht umgerechnet, wobei bei Padre die Umrechnung funktioniert.
Gruß Arek
Hey,
ich hatte einen Fehler im Notify beim Aufruf des Subs. Es funktioniert nun alles. Danke nochmals.
Gern geschehen, nur aus Neugier, hast Du jetzt meinen Code verwendet?
Johannes