Hauptmenü

Code Problem

Begonnen von Fire1990, 01 August 2013, 00:36:44

Vorheriges Thema - Nächstes Thema

Fire1990

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

Dietmar63

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
################################################################################
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Zrrronggg!

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
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL