FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: hinrich2001 am 04 Mai 2013, 22:45:07

Titel: Syntax --- Script nur 1x im Monat starten
Beitrag von: hinrich2001 am 04 Mai 2013, 22:45:07
Hallo zusammen,

ich habe ein Script geschrieben, welches die Logfiles des Vormonats von der Fritzbox auf einen USB Stick archiviert (kopiert und komprimiert).

Das klappt auch soweit mit folgendem Eintrag in der fhem.cfg.

define Backup_Logfiles at *21:17:00 "/var/media/ftp/fhem/script/backup_script.sh"

Im Event Log taucht folgendes auf:

2013-05-04 21:17:00 Global global DELETED Backup_Logfiles
2013-05-04 21:17:00 Global global DEFINED Backup_Logfiles


Es macht natürlich keinen Sinn, dass das Script jeden Tag läuft; es soll nur einmal im Monat gestartet werden.

Gesagt, getan.

define Backup_Logfiles at *21:38:00 if ($mday == 4) "/var/media/ftp/fhem/script/backup_script.sh"

Das klappt so nicht, d.h. das Script wird nicht gestartet.
Geschweifte Klammern habe ich an (fast) allen Positionen probiert.

Kontrolle des Monatstages:

{ "Value: $mday" }
4

Heute ist der 4. Mai.

Im Event Log stehen jedesmal auch die o.a. zwei Zeilen.

Wo ist der Denk- bzw. Syntaxfehler?

Bin für Hinweise dankbar.

Danke,
hinrich
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: MisterEltako am 04 Mai 2013, 23:02:02
define Backup_Logfiles at *21:38:00 Rollo_Gruppe {if ($mday == 4) {system ("/var/media/ftp/fhem/script/backup_script.sh")}}

MfG, MisterEltako
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: hinrich2001 am 04 Mai 2013, 23:55:39
Danke für die schnelle Antwort!
Werde ich morgen ausprobieren.

define Backup_Logfiles at *21:38:00 Rollo_Gruppe {if ($mday == 4) {system ("/var/media/ftp/fhem/script/backup_script.sh")}}

Was macht das "Rollo_Gruppe" nach der Uhrzeit?

Gruß,
hinrich
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: fritz am 05 Mai 2013, 02:06:16
Zitat von: hinrich2001 schrieb am Sa, 04 Mai 2013 22:45Es macht natürlich keinen Sinn, dass das Script jeden Tag läuft; es soll nur einmal im Monat gestartet werden. ...
Bin für Hinweise dankbar.
Es hat aber auch wenig Sinn, FHEM (ein Programm speziell für unsere Einsatzzwecke) etwas machen zu lassen, was das Betriebssystem von Haus aus kann. Sieh dir mal cron näher an! (ist nur ein Hinweis, wie gewünscht - TIMTOWTDI)
<F>
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: hinrich2001 am 05 Mai 2013, 07:16:24
cron kenne ich aber die "normale" 7390 kann das nicht, dachte ich bislang jedenfalls.
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: fritz am 05 Mai 2013, 11:17:50
a) habe zwar eine 7390 - aber da bei mir mehrere Linuxe eh' 24/7 laufen, mir das dortige noch nicht näher angesehen. Kann deshalb (noch) nicht wissen, ob ein cron drin ist oder nicht (würde aber denken, es gehört dazu)
b) wenn nicht, müsste man es doch nachinstallieren können, oder?
c) aber in der Frage stand gar nix von 7390 (oder hab' ich da was übersehen)?
d) Wie auch immer: Vielleicht hat ja in Zukunft jemand ein ähnliches Problem und stößt auf diesen Thread, dann weiss er jetzt, dass es mehr als einen Weg gibt, das Problem zu lösen. :-)

Du hast natürlich recht: Haste kein cron, musste 'ne andere Lösung suchen - und die über FHEM wäre dann sinnvoll.
<F>
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: Markus Bloch am 05 Mai 2013, 13:02:36
Generell ist auf jeder FritzBox kein cron vorhanden, daher ist dieser Weg durchaus der richtige ;-)

Und nachinstallieren ist auf einer FritzBox ein kompliziertes Unterfangen, da so etwas von AVM nicht vorgesehen ist.

Viele Grüße

Markus
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: MisterEltako am 05 Mai 2013, 16:17:14
define Backup_Logfiles at *21:38:00 Rollo_Gruppe {if ($mday == 4) {system ("/var/media/ftp/fhem/script/backup_script.sh")}}


Sorry, "Rollo_Gruppe " ist zuviel. Es stammt von meinem Test, bei dem ich zum schnellen ausprobieren das"at" gegen ein notify austauschte.
Richtig ist also:

define Backup_Logfiles at *21:38:00 {if ($mday == 4) {system ("/var/media/ftp/fhem/script/backup_script.sh")}}

Prüft also täglich um 21:38 Uhr ob es der 4. Kalendertag eines Monats ist und führt, wenn dem so ist das Script aus....

MfG, MisterEltako.
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: hinrich2001 am 05 Mai 2013, 21:53:26
Vielen Dank, MisterEltako, so funktioniert's!

Danke auch an die anderen Ratgeber.
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: hinrich2001 am 10 Juni 2013, 22:19:06
Guten Tag zusammen,

ich muss den Faden leider noch mal aufnehmen.
Das damalige Problem war und ist erledigt; das o.a. Backup-Script ist auch am 4.6. ausgeführt. Alles super.

Mit dem nun vorhandenen Wissen wollte ich mich an die nächste Aufgabe begeben.

Ich habe ein Shell-Script geschrieben, welches die Logfiles aller Bewegungsmelder durchsucht und die Zeit des letzten Eintrags "on-old-for-timer" mit der aktuellen Zeit vergleicht. Ist die Differenz > x, dann wird ein "Hilfsschalter" auf on gesetzt. Damit wird die Abwesenheit festgestellt und es können Aktionen ausgeführt werden, bspw. die Umwälzpumpe wird abgeschaltet.

Script siehe ganz unten.

Wenn man es direkt in der Shell (Fritzbox 7390) ausführt, macht es genau das, was es machen soll.

# date
Mon Jun 10 21:19:53 CEST 2013
# ./abwesenheit.sh
1149
abwesend


Events:
2013-06-10 21:19:59 FS20 hilfsschalter_abwesenheit on


Nun geht's in die fhem.cfg und ich möchte es regelmäßig ausführen (1 Minute nur zum Testzweck).

define Abwesenheit_Kontrolle at +*00:01:00 "/var/media/ftp/fhem/script/abwesenheit.sh"

Event-Log:
2013-06-10 21:28:01 Global global DELETED Abwesenheit_Kontrolle
2013-06-10 21:28:01 Global global DEFINED Abwesenheit_Kontrolle
2013-06-10 21:28:02 FS20 hilfsschalter_abwesenheit on
.
2013-06-10 21:29:02 FS20 hilfsschalter_abwesenheit on
.
2013-06-10 21:30:01 Global global DELETED Abwesenheit_Kontrolle
2013-06-10 21:30:01 Global global DEFINED Abwesenheit_Kontrolle
2013-06-10 21:30:02 FS20 hilfsschalter_abwesenheit on

--> das Script wird jede Minute ausgeführt und der hilfsschalter_abwesenheit geht auf on.

Nun kommts:
Auch hier würde ich gerne Bedingungen einbauen.

define Abwesenheit_Kontrolle at +*00:01:00 {if (($hour >= 8) && ($hour < 23)) {system ("/var/media/ftp/fhem/script/abwesenheit.sh")}}

Nur wenn Uhrzeit zwischen 8 und 23 Uhr, führe Script aus und setze hilfsschalter_abwesenheit auf on.

 

2013-06-10 21:39:05 Global global DELETED Abwesenheit_Kontrolle
2013-06-10 21:39:05 Global global DEFINED Abwesenheit_Kontrolle
2013-06-10 21:39:17 FHT hzg_wz actuator: 0%
2013-06-10 21:39:45 FHT hzg_flur_1og actuator: 0%
2013-06-10 21:40:04 FHT FHT_4f10 actuator: 0%
2013-06-10 21:40:05 Global global DELETED Abwesenheit_Kontrolle
2013-06-10 21:40:05 Global global DEFINED Abwesenheit_Kontrolle
2013-06-10 21:40:19 FHT hzg_kz1 actuator: 0%


Im Event Log ist nun zu sehen, dass zwar das Script ausgeführt wird aber der Schalter wird nicht auf on gesetzt. WARUM?

Weiterer Versuch:

define Abwesenheit_Kontrolle at +*00:01:00 {if ($mday == 10) {system ("/var/media/ftp/fhem/script/abwesenheit.sh")}}

Gleiches Ergebnis:

2013-06-10 21:47:25 Global global DELETED Abwesenheit_Kontrolle
2013-06-10 21:47:25 Global global DEFINED Abwesenheit_Kontrolle
2013-06-10 21:47:33 FHT hzg_flur_1og actuator: 0%
2013-06-10 21:47:44 FHT FHT_4f10 actuator: 0%
2013-06-10 21:47:59 FHT hzg_kz1 actuator: 0%
2013-06-10 21:48:16 FHT hzg_kueche actuator: 0%
2013-06-10 21:48:25 Global global DELETED Abwesenheit_Kontrolle
2013-06-10 21:48:25 Global global DEFINED Abwesenheit_Kontrolle
2013-06-10 21:48:27 FHT hzg_sz actuator: 0%
2013-06-10 21:48:31 FHT hzg_bz actuator: 0%



Jetzt bin ich auf die Idee gekommen, es mal mit einem anderen Script zu versuchen.

define Abwesenheit_Kontrolle at +*00:01:00 {if ($mday == 10) {system ("/var/media/ftp/fhem/script/Mail.sh")}}

Und siehe da, es klappt, es wurde jede Minute eine Mail versendet.


Nun weiß ich es zumindest, dass es etwas mit dem Script zu tun haben muss.
Verstehen tue ich es aber nicht.

Wieso funktioniert es ohne Bedingungen, mit den Bedingungen jedoch nicht!?

Für sachdienliche Hinweise wäre ich sehr, sehr dankbar :-)



########################abwesenheit.sh########################

#!/bin/sh
aktueller_Tag=`date +%Y-%m-%d`
aktuelles_Jahr=`date +%Y`
aktueller_Monat=`date +%m`
aktuelle_Zeit_Unix=`date +%s`
Zeit_letzter_Messwert=`cat /var/media/ftp/fhem/log/FS20_BM_*-"$aktuelles_Jahr"-"$aktueller_Monat".log | grep $aktueller_Tag | grep on-old-for-timer | cut -d " " -f 1 | sed "s/_/ /g" | sort -n | tail -1`
Zeit_letzter_Messwert_Unix=`date -d "$Zeit_letzter_Messwert" +%s`
Differenz=`expr $aktuelle_Zeit_Unix - $Zeit_letzter_Messwert_Unix`
echo $Differenz

home=/var/InternerSpeicher/fhem

cd $home

PATH=$home:$PATH
export PATH

export LD_LIBRARY_PATH=$home/lib
export PERL5LIB=$home/lib/perl5/site_perl/5.12.2/mips-linux:$home/lib/perl5/site_perl/5.12.2:$home/lib/perl5/5.12.2/mips-linux:$home/lib/perl5/5.12.2

if [ $Differenz -gt 48 ]
then echo "abwesend"
perl fhem.pl localhost:7072 "set hilfsschalter_abwesenheit on"
exit 1
else echo "anwesend"
exit 1
fi

Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: fritz am 11 Juni 2013, 02:40:06
Zwei Fragen:

a) Was geben denn Deine echo-Befehle aus?
b) ...und ist es das, was Du erwartest (in 8 Sekunden eine Differenz von 9300?):

02:35:20 fritz@jupiter:~> aktuelle_Zeit_Unix=`date +%s`
02:35:28 fritz@jupiter:~> Zeit_letzter_Messwert_Unix=`date -d "$Zeit_letzter_Messwert" +%s`
02:35:33 fritz@jupiter:~> Differenz=`expr $aktuelle_Zeit_Unix - $Zeit_letzter_Messwert_Unix`
02:35:39 fritz@jupiter:~> echo "$Differenz = $aktuelle_Zeit_Unix - $Zeit_letzter_Messwert_Unix ???"
9328 = 1370910928 - 1370901600 ???

<F>
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: hinrich2001 am 11 Juni 2013, 08:24:00
Besten Dank für die Antwort!

Zu a) Die echo Befehle habe ich nur eingebaut, um zu sehen, dass das Script durchläuft.
Siehe auch den Output aus meinem gestrigen Beitrag.

# ./abwesenheit.sh
1149
abwesend

Hier ist also vor 1149 Sekunden zuletzt jemand am Bewegungsmelder vorbeigelaufen.
Das ist mehr als die im Script hardcodierten 48 s (nur für die Tests, später natürlich eine längere Zeitspanne),
so dass ,,abwesend" ausgegeben wird und der Hilfsschalter auf on gesetzt wird.

Zu b) Hmm, verstehe die Anmerkung nicht so ganz. Die Differenz soll natürlich genau die Zeit in Sekunden sein, die zwischen der aktuellen Zeit (also Ausführungszeit
des Scripts) und der Zeit des letzten ,,on-old-for-timer"  über alle BM  liegt. Funktioniert meiner Meinung nach auch.
Ich kann heute abend mal hinter jeder Variablen ein echo setzen, dann sieht man besser, was passiert bzw. berechnet wird.

Dass die echos keinen Sinn machen, wenn das Script über fhem gesteuert im Hintergrund läuft, ist mir klar.
Die Tatsache, dass es funktioniert (genauer: der hilfsschalter_abwesenheit wird gesetzt), wenn es über ein ,,at" ohne jede Bedingung ausgeführt wird,
lässt mich glauben, dass die echo-Befehle nicht das Problem sind.
Aber vielleicht irre ich hier.

Noch mal der Widerspruch:

Ausführung mit ,,at" ohne Bedingungen: ok, d.h. hilfsschalter_abwesenheit geht auf ,,on"
Ausführung mit ,,at" und Bedingungen (die im Test immer ,,wahr" waren): nok, d.h. hilfsschalter_abwesenheit geht NICHT auf ,,on"
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: fritz am 11 Juni 2013, 11:16:33
Zitat von: hinrich2001 schrieb am Di, 11 Juni 2013 08:24Zu a) Die echo Befehle habe ich nur eingebaut, um zu sehen, dass das Script durchläuft.
Siehe auch den Output aus meinem gestrigen Beitrag.
Sorry, das war aber nicht die Frage, mir ist schon klar, *warum* die echos da drin sind. Die Frage ist: WAS haben sie ausgegeben bei Deinem Test oben? Ich sehe keine Ausgabe. Entweder hast Du ein anderes Skript ausgeführt, oder die Ausgaben kamen an eine andere Stelle...

Zitat# ./abwesenheit.sh
1149
abwesend

Hier ist also vor 1149 Sekunden zuletzt jemand am Bewegungsmelder vorbeigelaufen.
OK. Das sind also Sekunden...

ZitatZu b) Hmm, verstehe die Anmerkung nicht so ganz.
Ich habe lediglich die Werte gepostet, die ich auf meinem Linux-System erhalte, und das scheinen Millisekunden zu sein. (Was natürlich erst recht dazu führen müsste, dass Deine Variable on gesetzt wird)

Interessant wäre noch die Antwort auf die Frage: Warum muss das ein Shell-Skript sein, wo eine Perl-Funktion das wesentlich einfacher erledigen könnte? (Aber ich glaube, das wurde im ersten Teil des Threads schon diskutiert, oder?)

Ich würd's so machen: dem Hilfsschalter (dummy?) ein User-Attribut z.B. "letzte_Messung" verpassen, mit set den Unix-Zeit-Wert der letzten Messung darauf speichern (das Initialisieren beim Programmstart erfordert etwas Grips, da musst Du einmalig Deine Logs durchsuchen) und dann in der aufgerufenen Perl-Funktion die aktuelle Zeit bestimmen, die Differenz berechnen und tun, was zu tun ist... Außer der Initialisierung dürften das nicht mehr als fünf/sechs Zeilen sein. - Naja, und immer dem Wert für "letzte_Messung" aktuell halten.

<F>


Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: Mark am 11 Juni 2013, 11:53:05
Hallo,

warum erstellst Du nicht einfach eine structure mit allen Bewegungsmeldern und wertest diese dann mit einem notify aus?
Ich mache das so mit meinen Netzwerkgeraeten
#### Structure
define online.str structure PC1 PC2 PC3 iPhone
attr online.str clientstate_behavior relative
attr online.str clientstate_priority on|on off|off

### Notify
define online.str.n notify online.str {
if ("%" eq "on") {fhem "set Lampe1 on"} else {fhem "set Lampe1 off"}
}
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: hinrich2001 am 11 Juni 2013, 22:35:16
Habe noch ein bißchen rumprobiert, verstehe es aber immer noch nicht.

Ausführung des Shell Scripts mit ,,at" ohne Bedingungen: ok, d.h. hilfsschalter_abwesenheit geht auf ,,on"
Ausführung des Shell Scripts mit ,,at" und Bedingungen (die im Test immer ,,wahr" waren): nok, d.h. hilfsschalter_abwesenheit geht NICHT auf ,,on"

Hat noch jemand eine Idee?


Zu der Frage von gestern:

Zitat von: Fritz schrieb am Di, 11 Juni 2013 11:16Interessant wäre noch die Antwort auf die Frage: Warum muss das ein Shell-Skript sein, wo eine Perl-Funktion das wesentlich einfacher erledigen könnte? (Aber ich glaube, das wurde im ersten Teil des Threads schon diskutiert, oder?)

Ich würd's so machen: dem Hilfsschalter (dummy?) ein User-Attribut z.B. "letzte_Messung" verpassen, mit set den Unix-Zeit-Wert der letzten Messung darauf speichern (das Initialisieren beim Programmstart erfordert etwas Grips, da musst Du einmalig Deine Logs durchsuchen) und dann in der aufgerufenen Perl-Funktion die aktuelle Zeit bestimmen, die Differenz berechnen und tun, was zu tun ist... Außer der Initialisierung dürften das nicht mehr als fünf/sechs Zeilen sein. - Naja, und immer dem Wert für "letzte_Messung" aktuell halten.



Würde ich gerne so lösen, nur fehlt mir das notwendige Perl-Know-How.

Habe ich das richtig verstanden:
Immer wenn ein on-old-for-timer kommt, wird der Zeitstempel mitgeloggt / abgespeichert. Das wird über ein notify realisiert.

Über ein "at", welches alle x Minuten ausgeführt wird, wird die aktuelle Zeit mit der Zeit des letzten on-old-for-timer verglichen.
Wenn die Differenz > 90 Minuten (als Beispiel) ist, "set hilfsschalter_abwesenheit on".

Kann mir jemand Hilfestellung bei der Syntax von notify und at geben?

Mit einer Antwort wie ...Lies dich selbst ein... kann ich leben. Anders wäre natürlich besser ;-)

Auszug aus Logfile:

2013-06-11_21:54:54 FS20_BM_Flur_EG_Kanal_1 on-old-for-timer 60
2013-06-11_21:55:54 FS20_BM_Flur_EG_Kanal_1 off
2013-06-11_21:55:59 FS20_BM_Flur_EG_Kanal_1 on-old-for-timer 60
2013-06-11_21:56:59 FS20_BM_Flur_EG_Kanal_1 off
2013-06-11_21:58:46 FS20_BM_Flur_EG_Kanal_1 on-old-for-timer 60
2013-06-11_21:59:45 FS20_BM_Flur_EG_Kanal_1 off
2013-06-11_22:05:01 FS20_BM_Flur_EG_Kanal_1 on-old-for-timer 60
2013-06-11_22:06:00 FS20_BM_Flur_EG_Kanal_1 off



Auszug aus fhem.cfg

# Flur EG
define FS20_BM_Flur_EG_Kanal_1 FS20 1de6 00
attr FS20_BM_Flur_EG_Kanal_1 follow-on-for-timer 300
attr FS20_BM_Flur_EG_Kanal_1 room FS20
define FileLog_FS20_BM_Flur_EG_Kanal_1 FileLog ./log/FS20_BM_Flur_EG_Kanal_1-%Y-%m.log FS20_BM_Flur_EG_Kanal_1
attr FileLog_FS20_BM_Flur_EG_Kanal_1 logtype text
attr FileLog_FS20_BM_Flur_EG_Kanal_1 room FS20


# Flur 2. OG
define FS20_BM_Flur_2OG_Kanal_1 FS20 7795 00
attr FS20_BM_Flur_2OG_Kanal_1 follow-on-for-timer 300
attr FS20_BM_Flur_2OG_Kanal_1 room FS20
define FileLog_FS20_BM_Flur_2OG_Kanal_1 FileLog ./log/FS20_BM_Flur_2OG_Kanal_1-%Y-%m.log FS20_BM_Flur_2OG_Kanal_1
attr FileLog_FS20_BM_Flur_2OG_Kanal_1 logtype text
attr FileLog_FS20_BM_Flur_2OG_Kanal_1 room FS20

# Hilfsschalter / Dummy
define hilfsschalter_abwesenheit FS20 21212121 1a
attr hilfsschalter_abwesenheit dummy 1

define FileLog_hilfsschalter_abwesenheit FileLog ./log/hilfsschalter_abwesenheit-%Y-%m.log hilfsschalter_abwesenheit
attr FileLog_hilfsschalter_abwesenheit logtype text
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: hinrich2001 am 11 Juni 2013, 22:55:04
Blöd, aber jetzt erst bin ich auf den Gedanken gekommen, im fhem.log nachzusehen.



2013.06.11 22:49:32 5: hzg_flur_1og trigger: Checking FHEMWEB:192.168.178.54:58069 for notify
2013.06.11 22:49:32 4: Connection accepted from FHEMWEB:192.168.178.54:58070
2013.06.11 22:49:32 4: HTTP FHEMWEB:192.168.178.54:58070 GET /fhem?XHR=1&inform=console
2013.06.11 22:49:36 5: exec at command Abwesenheit_Kontrolle
2013.06.11 22:49:36 5: Cmd: >{if ($mday == 11) {system ("/var/media/ftp/fhem/script/abwesenheit.sh")}}<
2013.06.11 22:49:36 3: -1
2013.06.11 22:49:36 5: Triggering global (1 changes)
2013.06.11 22:49:36 5: global trigger: Checking FileLog_CUL_FHTTK_20aed4 for notify
2013.06.11 22:49:36 5: global trigger: Checking FileLog_CUL_FHTTK_a0bfc3 for notify
2013.06.11 22:49:36 5: global trigger: Checking FileLog_CUL_FHTTK_d4a233 for notify


Die -1 ist bestimmt ein Hinweis.
Eine Lösung kann ich daraus allerdings nicht ableiten.

Any idea?
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: fritz am 12 Juni 2013, 02:56:18
Also ausprobieren. Zum Testen:
define xxx notify xxx {system ("/home/fritz/fhem/fhem-5.4/home/script")}
trigger xxx liefert...
...im fhem.log:
2013.06.12 02:38:44 5: Cmd: >{system ("/home/fritz/fhem/fhem-5.4/home/script")}<
2013.06.12 02:38:44 3: xxx return value: -1
...auf der Seite, von der fhem gestartet wurde:
Can't exec "/home/fritz/fhem/fhem-5.4/home/script": Datei oder Verzeichnis nicht gefunden at (eval 24159) line 1.                                                                                                              
Weiter: die Datei angelegt, aber keine Ausführungsrechte vergeben ergibt:
2013.06.12 02:38:44 5: Cmd: >{system ("/home/fritz/fhem/fhem-5.4/home/script")}<
2013.06.12 02:38:44 3: xxx return value: -1
...und auf der Startseite
Can't exec "/home/fritz/fhem/fhem-5.4/home/script": Keine Berechtigung at (eval 24160) line 1.

Erst wenn dem Script auch die Ausführungsrechte mit (chmod +x scriptname) gegeben wurde, funktioniert es. Daher würde ich mal vermuten, dass dein Script im angegebenen Pfad nicht existiert oder nicht die erforderlichen Rechte hat. Gib' mal im Terminal ein: ls -l /var/media/ftp/fhem/script/abwesenheit.sh                                                

Hoffe, geholfen zu haben

<F>
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: hinrich2001 am 12 Juni 2013, 06:49:47
Oh mann, ich hätte geschrien, wenn es so einfach gewesen wäre.
Aber das gleiche Script läuft ja, wenn man die if Bedingung weglässt.


# ls -la /var/media/ftp/fhem/script/abwesenheit.sh
-rwxr-xr-x    1 root     root           883 Jun 11 21:37 /var/media/ftp/fhem/script/abwesenheit.sh

# chmod 777 /var/media/ftp/fhem/script/abwesenheit.sh

# ls -la /var/media/ftp/fhem/script/abwesenheit.sh
-rwxrwxrwx    1 root     root           883 Jun 11 21:37 /var/media/ftp/fhem/script/abwesenheit.sh

Erneuter Test MIT if

define Abwesenheit_Kontrolle at +*00:01:00 {if ($mday == 12) {system ("/var/media/ftp/fhem/script/abwesenheit.sh")}}

2013.06.12 06:35:36 5: hzg_kueche trigger: Checking initialUsbCheck for notify
2013.06.12 06:35:43 5: exec at command Abwesenheit_Kontrolle
2013.06.12 06:35:43 5: Cmd: >{if ($mday == 12) {system ("/var/media/ftp/fhem/script/abwesenheit.sh")}}<
2013.06.12 06:35:43 3: -1
2013.06.12 06:35:43 5: Triggering global (1 changes)
2013.06.12 06:35:43 5: global trigger: Checking FileLog_CUL_FHTTK_20aed4 for notify

--> nok


Test OHNE if

define Abwesenheit_Kontrolle at +*00:01:00 "/var/media/ftp/fhem/script/abwesenheit.sh"

2013.06.12 06:41:00 5: global trigger: Checking initialUsbCheck for notify
2013.06.12 06:41:02 4: Connection accepted from telnet:127.0.0.1:43992
2013.06.12 06:41:02 5: Cmd: >set hilfsschalter_abwesenheit on<
2013.06.12 06:41:02 2: FS20 set hilfsschalter_abwesenheit on
2013.06.12 06:41:02 5: Triggering hilfsschalter_abwesenheit (1 changes)
2013.06.12 06:41:02 5: hilfsschalter_abwesenheit trigger: Checking FileLog_CUL_FHTTK_20aed4 for notify

--> ok
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: fritz am 12 Juni 2013, 11:09:09
Zitat von: hinrich2001 schrieb am Mi, 12 Juni 2013 06:49Oh mann, ich hätte geschrien, wenn es so einfach gewesen wäre.
Aber das gleiche Script läuft ja, wenn man die if Bedingung weglässt.

Gut, gleich weiter probiert: Zuerst mit notify und Bedingung ==> läuft
Dann mit at und Bedingung... was soll ich dir sagen? Das Log enthält jetzt regelmäßig die von Dir geposteten Zeilen:

2013.06.12 10:46:11 5: exec at command xxx
2013.06.12 10:46:11 5: Cmd: >{if ($mday==12) {system ("/home/fritz/fhem/fhem-5.4/home/script")}}<
2013.06.12 10:46:11 3: -1
2013.06.12 10:46:11 5: Triggering global (1 changes)
2013.06.12 10:46:11 5: Notify loop for global DELETED xxx
2013.06.12 10:46:11 5: redefine at command xxx as +*00:01:00 {if ($mday==12) {system ("/home/fritz/fhem/fhem-5.4/home/script")}}
2013.06.12 10:46:11 5: Triggering global (1 changes)
2013.06.12 10:46:11 5: Notify loop for global DEFINED xxx

[/font]aber - das Output-Terminal von fhem.pl zeigt, dass das Script läuft (wie man sieht, habe ich es zwischenzeitlich sogar geändert):
hallo script
hallo script
hallo script
Mi 12. Jun 10:44:11 CEST 2013 : hallo script
Mi 12. Jun 10:45:11 CEST 2013 : hallo script
Mi 12. Jun 10:46:11 CEST 2013 : hallo script
Mi 12. Jun 10:47:11 CEST 2013 : hallo script
Mi 12. Jun 10:48:11 CEST 2013 : hallo script

Ich würde nun den Fehler im Script suchen. Dafür wäre es aber schön, könnte man die Scriptausgaben sehen. Falls du kein Terminal-Fenster hast in dem die fhem-Ausgaben landen, stoppe fhem mal und starte es mit
./fhem.pl home/fhem-new.cfg >>home/log/fhem.output.log 2>&1
(Namen der Config-Datei, Namen und Ort des Log-Files sind frei wählbar) neu.
2>&1 bewirkt unter Linux-Systemen, dass Informationen, die nach STDERR gehen, wie z.B. Perl-Fehlermeldungen, in die gleiche Datei geschrieben werden wie der "normale" Output des Programms, also das, was z.B. die echo-Anweisungen schreiben. Ob das auch unter Win-Systemen so funktioniert, kann ich im Moment nicht sagen.

Zurück zu Deinem Script: Da Du bisher nur feststellen kannst, ob der fhem-Aufruf aus deinem Script ausgeführt wurde, vermute ich, dass das Script zwar arbeitet, aber die Testbedingung aus irgendeinem Grund nicht erfüllt wird. Daher wäre es jetzt notwendig, mal zu sehen, was Deine echos eigentlich schreiben.

(Reich's mal rüber :-)

<F>
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: hinrich2001 am 12 Juni 2013, 22:10:03
Hi,

danke für die Hilfe. Morgen begebe ich mich dran, heute brauche ich mal ne Pause ;o)

Gruß
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: hinrich2001 am 13 Juni 2013, 21:32:42
So, ich bin wie vorgeschlagen vorgegangen.

shutdown
Letzte Zeile im startfhem-Script geändert in

perl fhem.pl /var/media/ftp/fhem/fhem_new.cfg >> /var/media/ftp/fhem/log/fhem_new_log.log 2>&1



# cat fhem_new_log.log
4032
abwesend


Das ist der Output der echos.
Passt, würde ich sagen.
Vor 4032 Sekunden das letzte on-old-for-timer.
Daraus folgt "abwesend".

Mehr kommt nicht. Es hängt sich auf.



# ps | grep fhem
30171 root     10320 S    perl fhem.pl /var/media/ftp/fhem/fhem_new.cfg
30178 root      1428 S    /bin/sh /var/media/ftp/fhem/script/abwesenheit.sh
30193 root      5856 S    perl fhem.pl localhost:7072 set hilfsschalter_abwesenheit on


Letzte Zeilen in fhem log

2013.06.13 20:40:24 5: HMLAN1 trigger: Checking telnetPort for notify
2013.06.13 20:40:24 5: SW: K
2013.06.13 20:40:24 5: exec at command Abwesenheit_Kontrolle
2013.06.13 20:40:24 5: Cmd: >{if ($mday == 13) {system ("/var/media/ftp/fhem/script/abwesenheit.sh")}}<


Die Bedingung ist wahr, das Script wird ausgeführt.
Nur das
perl fhem.pl localhost:7072 "set hilfsschalter_abwesenheit on"
wird offenbar nicht mehr korrekt ausgeführt.
Rechteproblem?

Bei dem at ohne Bedindungen wird es ausgeführt.
define Abwesenheit_Kontrolle at +*00:01:00 "/var/media/ftp/fhem/script/abwesenheit.sh"
Hatte ich ja vorher schon "nachgewiesen".

Was hier jetzt merkwürdig ist: Kein Output in
fhem_new_log.log

Ich raff es nicht.
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: fritz am 14 Juni 2013, 00:48:35
Zitat von: hinrich2001 schrieb am Do, 13 Juni 2013 21:32Ich raff es nicht.
Hey, hier wird nicht aufgegeben, und ob du es "raffst" oder nicht solltest du andere einschätzen lassen.
Wie es aussieht, hast du da ein paar Aktionen zusammengestellt, auf die noch keiner der übergeordneten (Betriebssystem, FHEM) Entwickler gekommen ist: dein funktionierender Aufruf arbeitet so, dass FHEM direkt eine Systemfunktion zur Abarbeitung aufruft, die dann wieder fhem aufruft; der zweite, nicht funktionierende Aufruf bewirkt, dass FHEM Perl-Code evaluieren lässt, der wiederum eine Systemfunktion aufruft in der ein Script gestartet wird das wiederum FHEM aufruft.
Der Fehler kann also:
- im Betriebssystem
- im Perl-Interpreter
- in FHEM (auf zwei Ebenen!)
- oder bei Dir liegen

Ich will das jetzt gar nicht analysieren...

Was bleibt? Wenn Du Dein Shell-Skript nicht in Perl schreiben magst (da ich mich in Deinen Log-File-Auswerte-Befehl nicht hineinvertiefen mag, kann ich Dir auch kein Perl-Script auf die Schnelle geben) hätte ich einen Vorschlag als Work-Around für Dich: Versuche doch, das if (($hour >= 8) && ($hour < 23)) im Script auszuführen, so dass Du im at-Befehl beim Script-Aufruf bleiben kannst. Damit schließt Du schon mal Perl+eval als mögliche Fehlerquelle aus.
(Wenn Du so ein Scripter bist wie es scheint, sollte dir die Parameterübergabe und die Formulierung der Tests einfacher fallen als mir :-)

Gut, das würde den Fehler nicht beheben, aber das ist ja nicht Dein Ziel. Dein Ziel ist ja, dass Deine Anlage tut was sie soll - unabhängig davon, wo Betriebssystem, Perl oder FHEM noch Fehler haben :-)

Nebenbei: Vielleicht liegt es auch irgendwie am fhem-Aufruf im Script, aber um dessen Korrektheit zu testen fehlt mir noch ein wenig Erfahrung mit fhem... Wobei... Da fällt mir ein: vielleicht hat die durch das eval indirekt erzeugte Systeminstanz nicht mehr alle Pfade intus. Und Du könntest das Problem schon damit lösen, dass Du im Script sowohl den kompletten Pfad zu Perl als auch den zu fhem.pl angibst (allerdings deutet nix darauf hin, dass das die Ursache sein könnte - aber bevor Du alles umscriptest wäre das einen Versuch wert.

Wirst's schon raffen :-))

<F>
Titel: Aw: Syntax --- Script nur 1x im Monat starten
Beitrag von: hinrich2001 am 22 Juni 2013, 17:05:38
Tach zusammen,

ich wollte nur kurz noch mal Feedback geben wie ich's nun gelöst habe.

# Definition des Dummy-Schlaters für die Abwesenheit.
define hilfsschalter_script_abwesenheit FS20 31313131 1a
attr hilfsschalter_script_abwesenheit dummy 1

define FileLog_hilfsschalter_script_abwesenheit FileLog ./log/hilfsschalter_script_abwesenheit-%Y-%m.log hilfsschalter_script_abwesenheit
attr FileLog_hilfsschalter_script_abwesenheit logtype text


# alle 20 Minuten wird der Dummy-Schlater kurz ein- bzw. wieder ausgeschaltet, wenn die Bedingungen erfüllt sind.
define Abwesenheit_Kontrolle at +*00:20:00 {if (($hour >= 8) && ($hour < 18)) {fhem "set hilfsschalter_script_abwesenheit on ;; set hilfsschalter_script_abwesenheit off"}}


# über das Notify wird nun das Script ausgeführt, welches die Logfiles der Bewegungsmelder auswertet. Darüber kann
# man verschiedene Aktionen triggern. Script siehe weiter oben in Thread.
define nf_Abwesenheit_Kontrolle notify hilfsschalter_script_abwesenheit:on.* "/var/media/ftp/fhem/script/abwesenheit.sh"

# Bei mir ist das aktuell nur das Abschalten der Pumpe für Warmwasser (20W).
define abwesenheit_pumpe_off notify hilfsschalter_abwesenheit:on.* set HM_Steckdose_1 off


# Das folgende Notify wird ausgelöst, wenn jemand am Bewegungsmelder vorbeigeht und schaltet wieder auf "anwesend".
# Das kann man natürlich auch für die Implementierung einer Alarmanlage nutzen.
define nf_Anwesenheit_Kontrolle notify (FS20_BM_Flur_2OG_Kanal_1:on.*|FS20_BM_Flur_EG_Kanal_1:on.*) {if (Value("hilfsschalter_abwesenheit") eq "on") {fhem ("set hilfsschalter_abwesenheit off ;; set HM_Steckdose_1 on")}}



So, besten Dank an alle Tippgeber und weiterhin frohes Schaffen.

Gruß,
Hinrich