ich bin neu hier, zumindest in diesem Forum.
habe eine NSLU2 mit einer FHZ1000 und fhz1000 for Linux laufen.
Erstmal muss ich sagen, das das eine super Geschichte ist, die Ihr da
auf die Beine gestellt habt.
Aber wie soll es sein, bin ich grad mal an meine Grenzen gestoßen.
Habe folgendes Problem, vielleicht kann mir hier ja jemand weiter
helfen:
benutze derzeit fhem in der Version 4 & pgm3 Version 0.8.0
möchte mit einem FS20 Handsender, der mir ein toggle ausgibt (weil pro
Taste eine Funktion) ein shell command, welches in einer seperaten
Datei steht ausführen, aber nur wenn eine Bedingung erfüllt ist (und
zwar wenn dieser toggle einen device auf "on" setzt) sollte die
bedingung nicht erfüllt sein, dann soll eine andere Datei augeführt
werden. habe das ganz mit eine if/else abfrage und einem dummydevice
versucht zu reallisieren. klappt auch eigentlich alles soweit, bis auf
das das ausführen der seperaten Datei nicht klappt, weiß auch nicht
weiter, wie der richtige syntax dafür in perl lautet, anbei mal
auszüge aus den Dateien:
.fhem:
define j5 at *21:30:00 set LT.Beet1 on
define j6 at +*{sunset_rel()} set LT.Beet1 off
//// das ab hier funktioniert soweit ohne probleme ///////
# Demo LT.Beet1
# =============
# wenn es nach 12 uhr ist, dann soll der Flur.Schalter.2 den Job j6
loeschen,
# damit das licht beet1 dann solange anbleibt, bis man es manuell
ausschaltet.
define a4 notify FB.Schalter.2 "/home/bjoern/fhem/
lt_beet1_sunset_off.sh"
////wenn ich diese Variante jetzt nehme, führt er die seperate Datei
nicht aus (inhalt dieser steht unten)///////////
# Demo 2 LT.Beet1
# ===============
# die gleiche funktion wie zuvor, nur mit der abfrage, ob
Flur.Schalter.2 on oder
# off gesetzt ist und danach dann die entscheidung, ob LT.beet1 mit
sunset oder
# ohne sunset läuft...
define a5 notify FB.Schalter.2 {\
if($defs{"LT.Party.1"}{STATE} eq "off") {\
fhem "set LT.Party.1 on";;\
} else {\
fhem "set LT.Party.1 off";;\
}\
}
define a6 notify LT.Party.1 {\
if($defs{"LT.Party.1"}{STATE} eq "off") {\
"/home/bjoern/fhem/lt_beet1_sunset_on.sh"\
} else {\
"/home/bjoern/fhem/lt_beet1_sunset_off.sh"\
} \
}
lt_beet1_sunset_off.sh:
//// hier jetzt der inhalt der datei, die eigentlich ausgeführt werden
soll ////
#!/bin/bash
FHZ="/usr/local/bin/fhem.pl 7072"
order="delete j6"
DATESTRING=`date +"%H"`
[[ $DATESTRING > 12 ]] && $FHZ "$order"
lt_beet1_sunset_on.sh:
/// hier dann nochmal die zweite datei.. ////
#!/bin/bash
FHZ="/usr/local/bin/fhem.pl 7072"
order="define j6 at +*{sunset_rel()} set LT.Beet1 off"
DATESTRING=`date +"%H"`
[[ $DATESTRING > 12 ]] && $FHZ "$order"
wenn ich allerdings die datei unter der normalen shell mit ./
lt_beet1_sunset_on.sh ausführe, dann klappt das alles, also ist die
Datei doch richtig geschreiben, nur die fhem führt die irgendwie nicht
aus, den toggle erkennt er und setzt dann je nach status dann auch den
LT.Party.1 richtig, nur der letzte poend fehlt dann leider.
Hier nochmal die ausgabe von der fhem.log:
History 2007.06.11 22:28:18 2: FS20 FB.Schalter.2 toggle
History 2007.06.11 22:28:18 2: FS20 set LT.Party.1 on
History 2007.06.11 22:28:18 1: /home/bjoern/fhem/
lt_beet1_sunset_off.sh
hat jemand ne idee, wie das aussehen muss??
danke schonmal für eure Hilfe.
gruß Björn
folgendes ist mir aufgefallen:
1) Verwende nicht "date +%H", da es bei den einstelligen Stunden eine
führende Null hat. Das ist bis 07 (fast) ok. Aber bei 08 und 09
bekommst Du einen Syntax-Fehler, da die BASH (durch die führende Null)
dies als Oktalzahl betrachtet. Besser ist %k - allerdings ist dann ein
Leerzeichen dabei...
2) Ich vermeide die verwendung von > bzw. < als "größer" bzw.
"kleiner" (auch wenn es bei "[[ ]]" ok ist, da diese auch für die Ein-
bzw. Ausgabeumleitung verwendet werden.
3) Läuft fhem.pl evtl. unter einem User der nicht an das Script
herankommt (durch den gesamten Pfad)?
4) Ich bin zwar nicht "perl-fest", aber ich denke im perl-anteil fehlt
um die beiden Script-Aufrufe: system ("/pfad...");
Falls es das nicht war, würde ich folgendes machen: In der er 2. Zeile
der Scripte die Ausgabe umlenken und jeden Befehl anzeigen:
exec >/tmp/bla 2>&1
set -x
Dann Taste drücken und /tmp/bla ansehen.
Gruß
Peter
Peter hat recht, externe Progrramme (und damit shell-Skripte) startet
man z.Bsp mit system("programm"). Dieser Call ist blockierend, d.h.
solange es laeuft, nimmt fhem.pl keine Befehle entgegen (auch nicht
von diesem gestarteten Programm :-), ueblicherweise startet man das
Programm also im Hintergrund: system("/pfad...&");
Fuer detaillierte Dokumentation siehe perldoc -f system.
Gruss,
Rudi
so erstmal rechtherzlichen Dank für eure Mühen und sehr hilfreichen
Antworten, habe es ausprobiert und es funktioniert einwandfrei, jetzt
kann endlich weiter geschrieben werden ;-)
Auch danke für die Hinweise, was den inhalt des Scriptes angeht, werde
dann mal sehen, das ich die ein bisschen beherzige, wenn ich weiter
mache, damit sich dann nicht noch extra fehler einschleichen!
zum Schluß noch einen Respekt an dies Forum und die schnellen
kompetenten Antworten.
linux und FHZ => UNSCHLAGBAR!!
frohes Schaffen..bis denne
Björn.