Syntax --- Script nur 1x im Monat starten

Begonnen von hinrich2001, 04 Mai 2013, 22:45:07

Vorheriges Thema - Nächstes Thema

hinrich2001

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?

fritz

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>

hinrich2001

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

fritz

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>

hinrich2001

Hi,

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

Gruß

hinrich2001

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.

fritz

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>

hinrich2001

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