Hallo habe mit diesem Code ein Problem:
Es soll mir den Bewegungsmelder nur nach Sonnenuntergang und vor Sonnenaufgang einschalten
define not_KE_Bewegungsmelder notify HM.Sensor_Flur:motion.* {\
my $hm = sprintf("%%02d:%%02d", "19","45");;\
if ($hm >= sunset() || $hm <=sunrise())\
{ \
fhem "set HM.Licht_Flur on-for-timer 20";;\
}\
}
Doch irgendwie geht es nicht bzw, wenn ich manuell Zeiten setze und es teste geht es wenn ich es gegen variable ändere geht es nicht muss ich noch etwas zusätzlich eintragen??
als variabel geht es nicht oben mit fest wert geht es
define not_KE_Bewegungsmelder notify HM.Sensor_Flur:motion.* {\
my $hm = sprintf("%%02d:%%02d", $hour, $min);;\
if ($hm >= sunset() || $hm <=sunrise())\
{ \
fhem "set HM.Licht_Flur on-for-timer 20";;\
}\
}
außerdem noch eine frage für den Anfänger ich kann ja Codeteile das meine cfg nicht so groß wird in die 99_utils auslagern kann ich mir so eine Datei auch selbst erstellen in der 99utils ist ja schon einiges drinnen dort will ich nix versauen ändern
versuch mal:
define not_KE_Bewegungsmelder notify HM.Sensor_Flur:motion.* {\
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time());;\
my $hm = sprintf("%%02d:%%02d", $hour, $min);;\
if ($hm gt sunset() || $hm lt sunrise())\
{ \
fhem "set HM.Licht_Flur on-for-timer 20";;\
}\
}
Der Vergleich sollte auf gt und lt abgeändert werden, weil es sich bei
$hm gt sunset() um Stringvergleiche handelt.
Perl nutzt zwei verschiedene Vergleichsoperatoren:
<= numerischer Vergleich
lt Stringvergleich
eventuell musst du den sprintf noch ergänzen:
my $hm = sprintf("%%02d:%%02d:%%02d", $hour, $min, $sec);;\
$min,$hour sind in Funktionsblöcken des notify nicht definiert.
Im Laufzeitprotokoll von fhem müßtest du Fehler finden. Es wird nur leider nicht ausgegeben.
Ich habe meine Startprodedur von fhem folgendermaßen geändert, so dass ich ggf. immer auf Laufzeitfehler aus Perl zugreifen kann. Wenn du Linux shell script kannst, kannst du es für dich eventuell anpassen - den Code nicht einfach nur übernehmen - verstehen und an deine Bedürfnisse anpassen.:
#!/bin/sh
#set -x
# On the Fritzbox 7270 V1/V2 with missing df replace home with the hardcoded
# path.
root=`df | sed -n -e '/ftp\//s/.*ftp\///p'`
#echo $root
home=/var/InternerSpeicher/$root/fhem
#home=/var/InternerSpeicher/USBDISK2-0-01/fhem
cd $home
trap "" SIGHUP
modprobe kernel/cdc_acm
modprobe ftdi_sio
#sleep 2
ln -sf $home/FHEM/fhemcmd.sh /var/fhemcmd
PATH=$home:$PATH
export PATH
export LD_LIBRARY_PATH=$home/lib
export PERL5LIB=$home/lib/perl:$home/lib/perl/arch
#export PERL5LIB=$home/lib/perl5/5.10
#stty -echo -echok -echoke -echoe -echonl < /dev/ttyACM0
# ==============================================================================
date="`date +"%d.%m.%Y %H:%M:%S %a"`"
jahr=${date:06:04}
mon=${date:03:02}
tag=${date:0:02}
hour=${date:11:02}
min=${date:14:02}
sec=${date:17:02}
################################################################################
#set -x
ps >/tmp/test
grep "perl fhem.pl fhem.cfg" /tmp/test >/dev/null
if [ $? == 0 ]
then
echo "fhem bereits gestartet"
else
# fhem starten
perl fhem.pl fhem.cfg >"$home/log/day/fhem$jahr$mon$tag $hour$min$sec.log" 2>&1 &
fi
################################################################################
grep "perl performanceCheck.pl" /tmp/test >/dev/null
if [ $? == 0 ]
then
echo "performanceCheck bereits gestartet"
else
perl performanceCheck.pl &
fi
################################################################################
Wenn du tatsächlich nur auf Sunrise und Sunset abhebst, kannst du auch "isday" verwenden.
Mir ist so, als habe ich dir das in einem anderen Thread schon mal gesagt.
define not_KE_Bewegungsmelder notify HM.Sensor_Flur:motion.* {if (!isday()) {fhem("set HM.Licht_Flur on-for-timer 20")}}
(Aus dem Kopf und ungetestet)
Auch hier kannst du Argumente in die Klammern hinter isday einsetzen, Commandref sagt:
The first specifies an offset (in seconds), which will be added to the event.
The second and third specify min and max values (format: "HH:MM").
Ansonsten: einen Punkt in Devicenamen (HM.Licht_Flur) zu verwenden ist gefährlich, da der in PERL eine Bedeutung hat. Würd ich nicht machen