Syntax --- Script nur 1x im Monat starten

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

Vorheriges Thema - Nächstes Thema

hinrich2001

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

MisterEltako

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

MfG, MisterEltako
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

hinrich2001

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

fritz

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>

hinrich2001

cron kenne ich aber die "normale" 7390 kann das nicht, dachte ich bislang jedenfalls.

fritz

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>

Markus Bloch

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
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

MisterEltako

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.
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

hinrich2001

Vielen Dank, MisterEltako, so funktioniert's!

Danke auch an die anderen Ratgeber.

hinrich2001

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


fritz

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>

hinrich2001

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"

fritz

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>



Mark

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"}
}

hinrich2001

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