Mit dem Linux Kernel-Subsystem inotify werden Veränderungen an Dateien oder Verzeichnissen überwacht und an Applikationen weiter gegeben. Das Modul, um das es hier geht, kann dazu verwendet werden, auf solche Änderungen zu reagieren. Die entsprechenden Readings und Events werden im Modul bereit gestellt. Folgende Perl Module werden benötigt:
Linux::Inotify2,Data::Dumper und File::Find
Debian Pakete:
sudo apt-get install liblinux-inotify2-perl
sudo apt-get install libdata-dump-perl
sudo apt-get install libfile-find-rule-perl
Definition:
defmod <name> inotify <Pfad> [<datei-RegEx>]
Pfad muss dabei ein absoluter Pfad sein.
Beispiel:
defmod inotify inotify /tmp test.*
erzeugt Events bei allen Änderungen an Dateien, die mit "test" beginnen und sich im Pfad /tmp befinden.
Das Modul kann durch folgendem Befehl installiert werden:
update all https://raw.githubusercontent.com/marvin78/FHEM-inotify/master/controls_inotify.txt
oder Download hier
https://github.com/marvin78/FHEM-inotify
Die Attribute "subfolders" und "mask" können verwendet werden, um das Verhalten zu steuern. Eine kleine Doku (commandref) befindet sich im Modul.
Support zu inotify gibt es woanders, zum FHEM-Modul (nicht in Echtzeit) hier im Forum. Informationen zum verwendeten Perl Modul gibt es hier (http://search.cpan.org/~mlehmann/Linux-Inotify2-1.22/Inotify2.pm).
In Version 0.4.0 kann das mask Attribut per multiselect widget befüllt werden (in FHEMWEB). Den Trenner habe ich dafür auf Komma umgestellt. Die Pipe (|) wird in vorhandenen Installationen nach einem update und restart von FHEM automatisch umgewandelt.
Ich hatte das Modul gestern abend mal installiert. Habe es heute vormittag disabled.
Zwischen Einrichtung und disable hatte ich fast jede Minute einen automatischen Neustart. Jetzt nicht mehr.
Events habe ich leider auch keine gefunden.
Vielleicht weil ich ein gemountetes Verzeichnis überwacht habe.
Bitte die Doku zu inotify lesen. Es handelt sich um ein Kernel Modul welches natürlich nicht auf remote Dateisystemen funktionieren kann.
Zu dem Problem mit dem Neustart kann ich nur raten (ein Neustart wird definitiv nicht durch das Modul ausgelöst und es hat vermutlich nichts mit dem remote Filesystem zu tun). Falls FHEM beendet wird und dein Neustart automatisch durch einen watchdog o.ä. erfolgt, kann ein Logauszug helfen, dem Problem auf die Spur zu kommen. Bitte die angepinnten Beiträge aus dem Anfängerfragen-Forum lesen. Dort steht, was benötigt wird, damit man bei Problemen nicht raten muss.
Was für ein System verwendest du?
Vorher empfehle ich aber, die aktuelle Version aus dem git zu installieren.
events sind also da - ich muss jetzt den Inhalt des Files noch parsen - und dann in Abhängigkeit davon etwas tun - (es kommen Kommandos per SMS)
list:
Internals:
CFGFN
DEF /var/spool/gammu/inbox IN*
FD 32
FILES IN*
NAME SMSReceive
NOTIFYDEV global
NR 94
NTFY_ORDER 50-SMSReceive
PATH /var/spool/gammu/inbox
STATE ???
TYPE inotify
VERSION 0.4.6
Helper:
DBLOG:
lastEventFile:
logdb:
TIME 1517647835.57428
VALUE /var/spool/gammu/inbox/IN20180123_121141_00_+xxxxxxxxxxxxxx_00.txt
lastEventMask:
logdb:
TIME 1517647835.57428
VALUE IN_CLOSE_WRITE
READINGS:
2018-02-03 09:50:35 lastEventFile /var/spool/gammu/inbox/IN20180123_121141_00_+xxxxxxxxxxx_00.txt
2018-02-03 09:50:35 lastEventMask IN_CLOSE_WRITE
helper:
dirs:
/var/spool/gammu/inbox
events:
0:
file /var/spool/gammu/inbox/IN20180123_121141_00_+xxxxxxxxxxxxxx_00.txt
mask IN_CLOSE_WRITE
time 2018-02-03 09:50:35
1:
file /var/spool/gammu/inbox/IN20180123_121141_00_+xxxxxxxxxxxxxx_00.txt
mask IN_CLOSE_WRITE
time 2018-02-03 09:44:11
2:
3:
4:
5:
6:
7:
8:
masks:
IN_CLOSE_WRITE
Attributes:
mask IN_CLOSE_WRITE
room System
Du kannst ja mit einem notify auf das Event reagieren und dort dann (ggf. über eine sub in der myUtils) dann alles weitere machen.
ja - notify schon - aber wie lautet das event? Ich hab grad nen Balken vorm Kopf - sorry
Das reading auf das du reagieren musst,ist lastEventFile. Wie das Event genau aussieht, siehst du, wie immer, im Eventmonitor. Das sind aber FHEM Grundlagen.
Edit: Beispiel:
define inotify_notify_1 notify SMSReceive:lastEventFile:.* {MACHEWAS}
Danke - habs jetzt
nen reload der 99_myUtils führt zu:
2018.02.03 11:47:08 1: ERROR: Select error -1 (9), error count= 0
2018.02.03 11:47:08 1: Found and deleted bad fileno for SMSReceive
danach bekommt fhem keine Events mehr bus zum n. Neustart
Ich brauche immer alle Infos. Ich weiß nicht was in deiner myUtils steht oder wie dein notify aussieht. Ich vermute, dass hier eine Endlosschleife wegen der Zugriffe entsteht.
Jetzt passt's - danke für die Unterstützung - coole Sache das....
Freut mich. Vielleicht schilderst du für andere trotzdem noch kurz Ursache und Lösung. Ich fürchte nämlich, dass man dieses Problem häufig haben könnte, wenn man nicht genug aufpasst. Man sollte z.B. auch nicht das FHEM log Verzeichnis auf bestimmte Art überwachen und dann das log von inotify hoch drehen. ;)
Würde ich gerne - "irgendwann" ging dann auch der reload der 99_myUtils.pm....
Ich hab mir mit dem Modul Input per SMS realisiert - vllt. als Anregung ganz interessant:
Per gammu-smsd https://www.datenreise.de/raspberry-pi-sms-per-kommandozeile-versenden/ (https://www.datenreise.de/raspberry-pi-sms-per-kommandozeile-versenden/) laufen SMS ein.
Die SMS landen im Ordner /var/spool/gammu/inbox und haben im Dateinamen die Absendernummer drin - damit lässt sich dann was anfangen:
Mit deinem Notify-Modul überwache ich das Spoolverzeichnis auf eingehende IN*.txt - Files:
define SMSReceive inotify /var/spool/gammu/inbox IN*
attr SMSReceive group SMS
attr SMSReceive mask IN_CLOSE_WRITE
attr SMSReceive room System
Per Notify-Event wird dann bei eingehenden SMS geschaut was denn so anliegt...
define SMSReceive_notify_1 notify SMSReceive:lastEventFile:./var/spool/gammu/inbox/IN.*\.txt {\
SMSReceived("$EVENT")\
}
attr SMSReceive_notify_1 group SMS
attr SMSReceive_notify_1 room System
Die Funktion SMSReceive (in 99_myUtils) sieht dann so aus:
sub SMSReceived($) {
my @ev = split(' ', shift);
my $fname = $ev[1];
Log 1, "SMS received >$fname<";
my @fn = split /_/, $fname;
my $cmd = "";
if ($#fn > 3) {
my $phonenumber = $fn[3];
foreach my $pn (@main::smsrcpts) {
if ($phonenumber eq $pn) {
#The SMS was received from one of our numbers
$cmd = ReadSMS($fname);
Log 1, "SMSReceived: $cmd";
fhem($cmd);
}
}
}
}
In $smsrcpts stehen die gültigen Absendernummern drin - ReadSMS holt das Kommando aus der SMS raus wobei ich in ReadSMS noch eine im Moment noch recht plumpe "Übersetzung" drin habe
Für meinen Zweck tut es was es soll.
Hi marvin78,
Danke für das modul... kann ich gut für meine Webcam/Ftp verwenden.
defmod inotify inotify /var/www/upload/camera *.jpg
führt zum fhem absturz.
2018.05.15 07:45:07 3: inotify (inotify): startet watching /var/www/upload/camera with the file pattern *.jpg
Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE .jpg/ at ./FHEM/98_inotify.pm line 341.
Mein Workaround für meine Webcam ...:
defmod inotify inotify /var/www/upload/camera ARC*
Gruß esk
Viele FHEM Anfaenger verwechseln globbing (das was man im Shell verwendet) mit regexp. Letzteres ist deutlich maechtiger, ist aber nicht kompatibel. * bedeutet im regexp "das letzte Zeichen beliebig oft" und nicht "irgendetwas beliebig oft". Deswegen fuehrt ein * am Anfang bei Regexp zu Fehlermeldung.
Danke für's Einspringen @Rudi.
Ich schaue mal, dass ich das an geeigneter Stelle abfange.
Die neue Version 0.4.7 kontrolliert auf einigermaßen korrekte Regex bei define und modify (kein * am Anfang). Außerdem werden im watch schon vorhandene fehlerhafte File-Regex nicht mehr verwendet. Es wird das komplette Verzeichnis überwacht. So kommt es an der Stelle nicht mehr zu FHEM Abstürzen.
Die neue Version 0.4.8 startet watch neu, wenn ein Unterordner hinzu kommt oder gelöscht wird und das Attribut subfolders auf 1 steht.
Falls jemand die Debian Pakete wissen möchte:
sudo apt-get install liblinux-inotify2-perl
sudo apt-get install libdata-dump-perl
sudo apt-get install libfile-find-rule-perl
Grüße Jörg
Die habe ich mal in den ersten Post übernommen.
Hallo,
ich habe das Modul jetzt auf meinem Testsystem (RPi, Stretch) laufen.
Internals:
DEF /tmp test.*
FD 20
FILES test.*
NAME inotify
NOTIFYDEV global
NR 65
NTFY_ORDER 50-inotify
PATH /tmp
STATE active
TYPE inotify
VERSION 0.4.8
READINGS:
2018-07-11 20:15:04 state active
helper:
dirs:
/tmp
masks:
IN_ALL_EVENTS
Attributes:
mask IN_ALL_EVENTS
room System
verbose 5
Wenn ich nun eine Datei test.txt nach /tmp kopieren erhalte ich folgende Log Infos:
2018.07.11 20:15:04 3: inotify (inotify): set Device active
2018.07.11 20:15:05 3: inotify (inotify): startet watching /tmp with the file pattern test.*
2018.07.11 20:15:33 4: inotify (inotify): path to watch /tmp
2018.07.11 20:15:33 5: inotify (inotify): Fullname /tmp/test.txt
2018.07.11 20:15:33 5: inotify (inotify): got $VAR1 = bless( {
'mask' => 256,
'w' => bless( {
'wd' => 1,
'cb' => sub { "DUMMY" },
'name' => '/tmp',
'inotify' => bless( {
'ignore' => {},
'w' => {
'1' => $VAR1->{'w'}
},
'fd' => 20
}, 'Linux::Inotify2' ),
'mask' => 4095
}, 'Linux::Inotify2::Watch' ),
'wd' => 1,
'cookie' => 0,
'name' => 'test.txt'
}, 'Linux::Inotify2::Event' );
2018.07.11 20:15:33 4: inotify (inotify): event is not matching any configured mask: IN_CREATE
2018.07.11 20:15:33 4: inotify (inotify): path to watch /tmp
2018.07.11 20:15:33 5: inotify (inotify): Fullname /tmp/test.txt
2018.07.11 20:15:33 5: inotify (inotify): got $VAR1 = bless( {
'wd' => 1,
'cookie' => 0,
'name' => 'test.txt',
'w' => bless( {
'wd' => 1,
'cb' => sub { "DUMMY" },
'name' => '/tmp',
'inotify' => bless( {
'ignore' => {},
'w' => {
'1' => $VAR1->{'w'}
},
'fd' => 20
}, 'Linux::Inotify2' ),
'mask' => 4095
}, 'Linux::Inotify2::Watch' ),
'mask' => 32
}, 'Linux::Inotify2::Event' );
2018.07.11 20:15:33 4: inotify (inotify): event is not matching any configured mask: IN_OPEN
2018.07.11 20:15:33 4: inotify (inotify): path to watch /tmp
2018.07.11 20:15:33 5: inotify (inotify): Fullname /tmp/test.txt
2018.07.11 20:15:33 5: inotify (inotify): got $VAR1 = bless( {
'w' => bless( {
'wd' => 1,
'cb' => sub { "DUMMY" },
'name' => '/tmp',
'inotify' => bless( {
'w' => {
'1' => $VAR1->{'w'}
},
'fd' => 20,
'ignore' => {}
}, 'Linux::Inotify2' ),
'mask' => 4095
}, 'Linux::Inotify2::Watch' ),
'mask' => 2,
'wd' => 1,
'name' => 'test.txt',
'cookie' => 0
}, 'Linux::Inotify2::Event' );
2018.07.11 20:15:33 4: inotify (inotify): event is not matching any configured mask: IN_MODIFY
2018.07.11 20:15:33 4: inotify (inotify): path to watch /tmp
2018.07.11 20:15:33 5: inotify (inotify): Fullname /tmp/test.txt
2018.07.11 20:15:33 5: inotify (inotify): got $VAR1 = bless( {
'w' => bless( {
'wd' => 1,
'cb' => sub { "DUMMY" },
'name' => '/tmp',
'inotify' => bless( {
'w' => {
'1' => $VAR1->{'w'}
},
'fd' => 20,
'ignore' => {}
}, 'Linux::Inotify2' ),
'mask' => 4095
}, 'Linux::Inotify2::Watch' ),
'mask' => 8,
'cookie' => 0,
'name' => 'test.txt',
'wd' => 1
}, 'Linux::Inotify2::Event' );
2018.07.11 20:15:33 4: inotify (inotify): event is not matching any configured mask: IN_CLOSE_WRITE
2018.07.11 20:15:33 4: inotify (inotify): path to watch /tmp
2018.07.11 20:15:33 5: inotify (inotify): Fullname /tmp/test.txt
2018.07.11 20:15:33 5: inotify (inotify): got $VAR1 = bless( {
'mask' => 4,
'w' => bless( {
'wd' => 1,
'cb' => sub { "DUMMY" },
'name' => '/tmp',
'inotify' => bless( {
'w' => {
'1' => $VAR1->{'w'}
},
'fd' => 20,
'ignore' => {}
}, 'Linux::Inotify2' ),
'mask' => 4095
}, 'Linux::Inotify2::Watch' ),
'wd' => 1,
'name' => 'test.txt',
'cookie' => 0
}, 'Linux::Inotify2::Event' );
2018.07.11 20:15:33 4: inotify (inotify): event is not matching any configured mask: IN_ATTRIB
2018.07.11 20:15:33 4: inotify (inotify): path to watch /tmp
2018.07.11 20:15:33 5: inotify (inotify): Fullname /tmp
2018.07.11 20:15:33 4: inotify (inotify): path to watch /tmp
Und es wird weder ein Reading gesetzt noch ein Event ausgelöst.
Grüße Jörg
Funktioniert es, wenn du andere Masks verwendest (bspw. IN_CREATE)?
Probier mal die neue Version 0.4.9. IN_ALL_EVENTS wurde bisher nicht berücksichtigt, das es das entsprechende Event nicht wirklich gibt.
Zitat von: marvin78 am 11 Juli 2018, 21:13:27
Funktioniert es, wenn du andere Masks verwendest (bspw. IN_CREATE)?
Probier mal die neue Version 0.4.9. IN_ALL_EVENTS wurde bisher nicht berücksichtigt, das es das entsprechende Event nicht wirklich gibt.
Danke, funktioniert.
Grüße Jörg
Ich habe das inotify probiert :
Internals:
DEF /opt/fhem/www/snapshots/AussenCAM EingangsCAM_snapshot.jpg
FD 122
FILES EingangsCAM_snapshot.jpg
NAME inotify
NOTIFYDEV global
NR 328
NTFY_ORDER 50-inotify
PATH /opt/fhem/www/snapshots/AussenCAM
STATE active
TYPE inotify
VERSION 0.4.9
READINGS:
2018-08-21 15:41:39 lastEventFile /opt/fhem/www/snapshots/AussenCAM/EingangsCAM_snapshot.jpg
2018-08-21 15:41:39 lastEventMask IN_CLOSE_NOWRITE
2018-08-21 15:36:51 state active
helper:
dirs:
/opt/fhem/www/snapshots/AussenCAM
events:
0:
file /opt/fhem/www/snapshots/AussenCAM/EingangsCAM_snapshot.jpg
mask IN_CLOSE_NOWRITE
time 2018-08-21 15:41:39
1:
file /opt/fhem/www/snapshots/AussenCAM/EingangsCAM_snapshot.jpg
mask IN_ACCESS
time 2018-08-21 15:41:38
2:
file /opt/fhem/www/snapshots/AussenCAM/EingangsCAM_snapshot.jpg
mask IN_ACCESS
time 2018-08-21 15:41:38
3:
file /opt/fhem/www/snapshots/AussenCAM/EingangsCAM_snapshot.jpg
mask IN_DELETE
time 2018-08-21 15:41:38
4:
file /opt/fhem/www/snapshots/AussenCAM/EingangsCAM_snapshot.jpg
mask IN_ACCESS
time 2018-08-21 15:41:37
5:
file /opt/fhem/www/snapshots/AussenCAM/EingangsCAM_snapshot.jpg
mask IN_OPEN
time 2018-08-21 15:41:37
6:
file /opt/fhem/www/snapshots/AussenCAM/EingangsCAM_snapshot.jpg
mask IN_CLOSE_NOWRITE
time 2018-08-21 15:41:37
7:
file /opt/fhem/www/snapshots/AussenCAM/EingangsCAM_snapshot.jpg
mask IN_ACCESS
time 2018-08-21 15:41:36
8:
file /opt/fhem/www/snapshots/AussenCAM/EingangsCAM_snapshot.jpg
mask IN_OPEN
time 2018-08-21 15:41:36
9:
file /opt/fhem/www/snapshots/AussenCAM/EingangsCAM_snapshot.jpg
mask IN_CLOSE_NOWRITE
time 2018-08-21 15:41:36
Notify :
Internals:
DEF inotify:lastEventFile:.* {
HowiMail ( "howi42\@lyse.net", "Snapshot", "Nichts", "'/opt/fhem/www/snapshots/AussenCAM/EingangsCAM_snapshot.jpg'");;
}
NAME AussenCAM_notify
NOTIFYDEV inotify
NR 329
NTFY_ORDER 50-AussenCAM_notify
REGEXP inotify:lastEventFile:.*
STATE 2018-08-21 15:41:39
TYPE notify
READINGS:
2018-08-21 15:21:43 state active
Attributes:
Was muss ich tun, damit das notify nur einmal getriggert wird, wenn die Datei neu geschrieben wird ?
So wie oben hoert das nie auf ...., erst, wenn ich die Datei manuell loesche.
Erledigt. Ohne 'mask' zu setzen, keine gute Idee !
Zitat von: howi42 am 21 August 2018, 20:27:33
Erledigt. Ohne 'mask' zu setzen, keine gute Idee !
Hallo howi42,
hallo marvin78,
zuerstmal vielen Dank an marvin78 für dieses Modul.
Was muss ich beim Attribut mask eintragen?
Mein Ziel ist es ein Reading (anscheinend gibt es gleich mehrere, wenn eine neue Datei geschrieben wird, ist aber im Moment nebensächlich) zu bekommen, wenn die Kamera eine neue Aufnahme macht.
Prinzipiell funktioniert da Modul.
Ich lösche einmal wöchentlich alle Aufnahmen, die älter als 1 Monat sind.
Dann gibt es auch auch Readings:
lastEventFile <Pfad/Filename> 2018-12-20 12:51:58
astEventMask IN_DELETE 2018-12-20 12:51:58
Wie muss ich ein DOIF oder notifiy gestalten, damit diese auf neue Files reagieren, nicht aber auf das Löschen von Files?
Viele Grüße Gisbert
Wenn du das Mask Attribut über das Frontend setzt, wird dir eine Auswahl angeboten. Eigentlich alles selbsterklärend. Bitte auch die Doku zu inotify lesen.
Hallo marvin78,
ahh, ich hab nur das leere Feld gesehen, und da wusste ich nicht weiter. Die commandref war an der Stelle nicht sonderlich auskunftsfreudig.
Durch Anklicken des leeren Feldes bekommt man die Auswahlliste.
Ich nehme an, dass die Auswahl "IN_CLOSE_WRITE" die richtige ist, wenn ich ein Event haben möchte, wenn ein neuer File geschrieben wurde.
Vielen Dank Gisbert
Jap. Das wird gehen. Probiere ggf. auch IN_CREATE. Und dein notify erstellst du dann einfach über den Event-Monitor.
Hallo marvin,
kannst du mir bitte bei folgendem Problem behilflich sein?
https://forum.fhem.de/index.php/topic,96551.0.html
nutzt du das Modul, um das es hier geht?
Das Tutorial ist nicht von mir. Ich supporte nur mein Modul.
Ist denn eine Lösung meines Problem mit deinem Modul möglich?
Erkennt dein Modul ein Änderungsdatum eines Verzeichnis oder nur ein schreiben einer Datei innerhalb eines Verzeichnis?
Das eine lässt sich aus dem anderen erschließen. Das Modul liefert entsprechende Events und Readings. Wenn du mit einem konkreten Beispielversuch kommst, kann ich ggf. auch konkreter helfen.
Bin auf eine Dahua Kamera umgestiegen welche für neue Dateien auf dem FTP Server ständig neue Verzeichnisse schreibt. Datum, Uhrzeit usw.
Ich muss von "Überwachen eines Verzeichnis" auf "Überwachen eines übergeordneten Stammverzeichnis" umstellen.
Das notify weckt mit hilfe dem Modul AMAD ein Tablet auf und zeigt ein Live Bild der Kamera bei Bewegung.
Die Kamera schreibt z.B. einen Screenshot in \HaustuerDahua\2019-01-27\001\jpg\11 wobei sie am nächsten Tag natürlich das Verzeichnis 2019-01-28 erstellt. Hier liegt mein Problem.
Das Modul soll ein Verzeichnis auf schreiben seiner Unterordner hin überwachen.
Das geht mit dem Modul. Mit der Mask "IN_CREATE" sollte das gehen.
defmod inotify inotify /PATH/TO/FOLDER
attr inotify mask IN_CREATE
attr inotify subfolders 1
Super. Vielen Dank und schönen Sonntag noch
Wenn es noch Fragen gibt, her damit.
Im Übrigen wird das Modul irgendwann in der kommenden Woche auch ins offizielle FHEM-SVN eingecheckt und kommt dann per FHEM update.
Mittlerweile ist das Modul per FHEM-update verfügbar und es gibt morgen per update dann auch eine neue Version, die beim define einen check auf die fehlenden Perl-Module macht und diese ausgibt.
Hallo,
ich habe gerade ein update gemacht. Folgendes erhalten ich beim Restart von Fhem:
./log/fhem.save: Please define inotify first
Please define inotify 5c436ff8-f33f-4b0e-c2dd-acab367cff057017 first
2019.01.31 17:52:22 1: configfile: Cannot load module inotify
Beim einem reload in der Commandozeile erhalte ich:
Bareword "IN_ALL_EVENTS" not allowed while "strict subs" in use at ./FHEM/98_inotify.pm line 307.
Bareword "IN_ALL_EVENTS" not allowed while "strict subs" in use at ./FHEM/98_inotify.pm line 318.
Grüße Jörg
Das ist seltsam. inotify war vorher schon bei dir im Einsatz? An der Stelle wurde nämlich nichts geändert. Seit der 1. Version nicht mehr. Hat sich sonst etwas bei dir verändert?
Zitat von: marvin78 am 31 Januar 2019, 18:57:02
Das ist seltsam. inotify war vorher schon bei dir im Einsatz? An der Stelle wurde nämlich nichts geändert. Seit der 1. Version nicht mehr. Hat sich sonst etwas bei dir verändert?
inotify war vorher schon bei dir im Einsatz? Ja, Dateidatum 12.07.2018
Hat sich sonst etwas bei dir verändert? Nein
Grüße Jörg
Ich habe einen Verdacht. Kannst du mal bitte die Version hier aus dem git testen?
https://github.com/marvin78/FHEM-inotify
Danke.
Schnurrrt, wie ein Kätzchen.
Grüße Jörg
Gut, dann geht die Version morgen ins update. Danke für den Hinweis.
Das mit dem check auf das Perl Modul "Linux::inotify2" beim define hat sich damit vorerst erledigt. Aber es sollte ja jedem klar sein, dass das hier benötigt wird.
Zitat von: marvin78 am 31 Januar 2019, 19:52:03
Das mit dem check auf das Perl Modul "Linux::inotify2" beim define hat sich damit vorerst erledigt. Aber es sollte ja jedem klar sein, dass das hier benötigt wird.
Hm. ich habe jetzt nicht mehr nachgesehen, aber in vielen Modulen wird folgendes erfolgreich genutzt
eval { require Linux::inotify2; };
unless($@)
{
Log3 $name, 5, "inotify ($name) - found Linux::inotify2";
}
else
{
Log3 $name, 5, "inotify ($name) - unable to load Linux::inotify2 module: $@. Please install with sudo apt-get install liblinux-inotify2-perl";
}
Grüße Jörg
Ja. So ähnlich mache ich das auch. Das Einbinden über eval scheint aber zu dem bareword Fehler zu führen.
Ich werde die Tage mal ein paar andere Varianten testen.
Hm, Du könntest das eval() vor Zeile 296 $inotify = new Linux::Inotify2; setzen und dann entsprechend reagieren. Im Def Bereich habe ich bisher noch nie genutzt. Beim googeln habe ich Deine Variante auf die Schnelle auch nicht gefunden.
Grüße Jörg
Ich habe gerade eine Version eingecheckt, die es richtig machen solte. Sie orientiert sich mehr an deinem Beispiel, als an meiner ersten Variante.
Manchmal macht mich Perl noch immer wahnsinnig ;)
Danke.
Ok, läuft jetzt auf dem Testsystem. Wenn ich am Wochenende Zeit habe, werde ich noch mal die intotify2 Lib löschen und testen, ob die Warnmeldung kommt.
Grüße Jörg
Hallo Marvin,
geht mit diesem Modul nur eine Instanz?
Ich habe für die Überwachung einer Datei ein entsprechendes Device angelegt. Das lief hervorragend:
DEF /opt/fhem/B29/Oelverbrauch parameter.dat
FD 28
FILES parameter.dat
MID inotify_optfhemB29Oelverbrauchparameterdat
NAME intfy_Oelverbrauch
NOTIFYDEV global
NR 1956
NTFY_ORDER 81-intfy_Oelverbrauch
PATH /opt/fhem/B29/Oelverbrauch
STATE active
TYPE inotify
VERSION 0.6.1
READINGS:
2019-02-04 00:03:50 lastEventFile /opt/fhem/B29/Oelverbrauch/parameter.dat
2019-02-04 00:03:50 lastEventMask IN_CLOSE_WRITE
2019-02-04 00:02:35 state active
helper:
dirs:
/opt/fhem/B29/Oelverbrauch
events:
0:
file /opt/fhem/B29/Oelverbrauch/parameter.dat
mask IN_CLOSE_WRITE
time 2019-02-04 00:03:50
1:
2:
3:
4:
5:
6:
7:
8:
masks:
IN_MODIFY
IN_CLOSE_WRITE
IN_CREATE
Attributes:
mask IN_MODIFY,IN_CLOSE_WRITE,IN_CREATE
room Heizung
verbose 2
Dann wollte ich eine zweite Datei überwachen und habe dafür ebenfalls ein Device angelegt:
Internals:
CFGFN
DEF /opt/fhem/B29 wlan.cfg
FD 26
FILES wlan.cfg
MID inotify_optfhemB29wlancfg
NAME intfy_GaesteWLAN
NOTIFYDEV global
NR 32690
NTFY_ORDER 81-intfy_GaesteWLAN
PATH /opt/fhem/B29
STATE active
TYPE inotify
VERSION 0.6.1
READINGS:
2019-02-03 23:28:21 lastEventFile /opt/fhem/B29/wlan.cfg
2019-02-03 23:28:21 lastEventMask IN_CLOSE_WRITE
2019-02-04 00:02:14 state active
helper:
dirs:
/opt/fhem/B29
masks:
IN_MODIFY
IN_CLOSE_WRITE
IN_CREATE
Attributes:
mask IN_MODIFY,IN_CLOSE_WRITE,IN_CREATE
room Maschinenraum
verbose 2
Das lief dann auch super. Bis ich dann aber merkte, dass das erste inotify-Device nicht mehr lief. Ein defmod auf das erste Device führte wieder dazu, dass es lief; dafür war dann das zweite ohne Reaktion.
Kann es vielleicht daran liegen, dass beide zu überwachenden Dateien im gleichen Verzeichnis /opt/fhem/B29 liegen?
Danke und Gruß
Christoph
Das inotify Modul ist ursprünglich als Ordnerüberwachung konzipiert worden (und das ist auch das Grundkonzept von Linux::Inotify2). Fileüberwachung über Regex kam später auf Wunsch dazu. Meine Empfehlung ist, vorerst den gesamten Ordner zu überwachen und das entsprechende Event für die Dateien auszuwerten.
Ich schaue mir das aber an, sobald ich Zeit habe.
Danke.
Das war auch meine Vermutung und Idee, das "Problem" zu lösen.
Hallo,
kann mir wer bitte einen Tipp geben, was mir diese Meldungen mit verbose 5 sagen wollen.
Hatte bisher keine Probleme mit inotify.
Es ist ein neu aufgesetztes RasPiOS System, die Bibliotheken sind vorhanden:
pi@FHEMPIOS:/opt/fhem $ sudo apt-get install liblinux-inotify2-perl
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
liblinux-inotify2-perl ist schon die neueste Version (1:2.1-1).
0 aktualisiert, 0 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
pi@FHEMPIOS:/opt/fhem $ sudo apt-get install libdata-dump-perl
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
libdata-dump-perl ist schon die neueste Version (1.23-1).
0 aktualisiert, 0 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
defmod inot_Umsatz inotify /opt/fhem UMFHEM.csv
attr inot_Umsatz fhem_widget_channels [{"controlled_attribute":"STATE","order":2,"alias":"Umsatz","allowed_values":[]}]
attr inot_Umsatz mask IN_ATTRIB
attr inot_Umsatz room Büro,Fhem_Widget
attr inot_Umsatz stateFormat umsatzmtl €
attr inot_Umsatz verbose 5
setstate inot_Umsatz umsatzmtl €
setstate inot_Umsatz 2020-11-17 17:55:29 state active
2020.11.17 18:22:51 4: inotify (inot_Umsatz): path to watch /opt/fhem
2020.11.17 18:22:51 5: inotify (inot_Umsatz): Fullname /opt/fhem
2020.11.17 18:22:53 4: inotify (inot_Umsatz): path to watch /opt/fhem
2020.11.17 18:22:53 5: inotify (inot_Umsatz): Fullname /opt/fhem/UMFHEM.csv
2020.11.17 18:22:53 5: inotify (inot_Umsatz): got $VAR1 = bless( {
'cookie' => 0,
'w' => bless( {
'wd' => 1,
'name' => '/opt/fhem',
'mask' => 4095,
'cb' => sub { "DUMMY" },
'inotify' => bless( {
'ignore' => {},
'w' => {
'1' => $VAR1->{'w'}
},
'fd' => 70
}, 'Linux::Inotify2' )
}, 'Linux::Inotify2::Watch' ),
'mask' => 2,
'name' => 'UMFHEM.csv',
'wd' => 1
}, 'Linux::Inotify2::Event' );
2020.11.17 18:22:53 4: inotify (inot_Umsatz): event is not matching any configured mask: IN_MODIFY
2020.11.17 18:22:53 4: inotify (inot_Umsatz): path to watch /opt/fhem
2020.11.17 18:22:53 5: inotify (inot_Umsatz): Fullname /opt/fhem/UMFHEM.csv
2020.11.17 18:22:53 5: inotify (inot_Umsatz): got $VAR1 = bless( {
'name' => 'UMFHEM.csv',
'wd' => 1,
'w' => bless( {
'wd' => 1,
'name' => '/opt/fhem',
'mask' => 4095,
'cb' => sub { "DUMMY" },
'inotify' => bless( {
'ignore' => {},
'w' => {
'1' => $VAR1->{'w'}
},
'fd' => 70
}, 'Linux::Inotify2' )
}, 'Linux::Inotify2::Watch' ),
'mask' => 32,
'cookie' => 0
}, 'Linux::Inotify2::Event' );
2020.11.17 18:22:53 4: inotify (inot_Umsatz): event is not matching any configured mask: IN_OPEN
2020.11.17 18:22:53 4: inotify (inot_Umsatz): path to watch /opt/fhem
2020.11.17 18:22:53 5: inotify (inot_Umsatz): Fullname /opt/fhem/UMFHEM.csv
2020.11.17 18:22:53 5: inotify (inot_Umsatz): got $VAR1 = bless( {
'cookie' => 0,
'w' => bless( {
'wd' => 1,
'name' => '/opt/fhem',
'mask' => 4095,
'cb' => sub { "DUMMY" },
'inotify' => bless( {
'ignore' => {},
'w' => {
'1' => $VAR1->{'w'}
},
'fd' => 70
}, 'Linux::Inotify2' )
}, 'Linux::Inotify2::Watch' ),
'mask' => 2,
'name' => 'UMFHEM.csv',
'wd' => 1
}, 'Linux::Inotify2::Event' );
2020.11.17 18:22:53 4: inotify (inot_Umsatz): event is not matching any configured mask: IN_MODIFY
2020.11.17 18:22:53 4: inotify (inot_Umsatz): path to watch /opt/fhem
2020.11.17 18:22:53 5: inotify (inot_Umsatz): Fullname /opt/fhem/UMFHEM.csv
2020.11.17 18:22:53 5: inotify (inot_Umsatz): got $VAR1 = bless( {
'cookie' => 0,
'wd' => 1,
'name' => 'UMFHEM.csv',
'mask' => 8,
'w' => bless( {
'wd' => 1,
'name' => '/opt/fhem',
'mask' => 4095,
'cb' => sub { "DUMMY" },
'inotify' => bless( {
'ignore' => {},
'w' => {
'1' => $VAR1->{'w'}
},
'fd' => 70
}, 'Linux::Inotify2' )
}, 'Linux::Inotify2::Watch' )
}, 'Linux::Inotify2::Event' );
2020.11.17 18:22:53 4: inotify (inot_Umsatz): event is not matching any configured mask: IN_CLOSE_WRITE
2020.11.17 18:22:53 4: inotify (inot_Umsatz): path to watch /opt/fhem
2020.11.17 18:22:53 5: inotify (inot_Umsatz): Fullname /opt/fhem
-rw-r--r-- 1 fhem dialout 5 Nov 17 18:22 UMFHEM.csv
Gruß
Thomas
Ich sehe auf die Schnelle keine Fehler. Es gibt bloß kein Event, das der eingestellten Maske entspricht. Die Events können sich tatsächlich in ihrer Ausprägung von System zu System unterscheiden. Da muss man etwas probieren.
ZitatEs gibt bloß kein Event, das der eingestellten Maske entspricht.
Das verstehe ich erstmal nicht, die gezeigten Meldungen gibts doch nur im Log wenn ich eine Änderung an der Datei vornehme ?
Schon. Es steht aber auch klar in den Meldungen, dass Events erfasst wurden, diese aber nicht zur eingestellten Maske passen. Deshalb werden sie ignoriert.
ZitatDa muss man etwas probieren.
Hatte ich noch gestern Abend und jetzt etwas mehr verstanden.
In der Regel wird die Datei UMFHEM.csv regelmäßig aus einer Access-Datenbank nach /opt/fhem exportiert, Dank der derzeitigen Situation weniger oft. Darum hab ich manuell getestet (hätt ichs nur sein lassen).
In Erinnerung war mir das ich
damals wenn ich am Tablet mit der App QuickEdit an der Datei Änderungen vornahm und dann per FTP (ja ich weiß) hochlud, es mit der Maske IN_ATTRIB zu einem passenden Event kam.
Mittlerweile mach ich aber mehr mit dem PC/Ubuntu, hier hatte ich die Datei mit LibreOffice Calc editiert und dann hoch geladen aber auch mit nano editiert, gespeichert, mit dem Ergebnis das es wie oben beschrieben zu keinem Event mehr kam.
Wenn ich IN_MODIFY mit dazu nehme gibts auch dann ein Event.
Habs immer noch nicht mit der Datei aus Access probiert (mach ich heute Abend), gehe aber davon das es auch hier weiterhin klappt, da es mit Quickedit mit nur der Maske IN_ATTRIB weiterhin wie immer klappt.
Hab mir das nicht genauer angeschaut, aber kann ja dann nur daran gelegen haben das Access und QuickEdit Änderungen an den Meta-Daten vornehmen, LibreOffice und nano nicht.
Das wird so sein.
Naja .. es gibt ein Unterschied zwischen "neu" und "geändert". Ich weiß es bei calc nicht, aber die meisten "kleinen" Editoren ändern die Datei (z.B. vi, nano etc). Ein Export in Access macht die Datei aber neu (Überschreiben im Sinne von löschen und neu anlegen). Das ist fürs Betriebsystem (Unix) ein größer Unterschied ...
Alles in allem ist es nichts, was auf ein Problem im Modul hindeutet.
Mahlzeit,
versuche einen FTP Ordner auf Änderungen zu überwachen.
Dieser ist in lokal gemountet.
Beim define von inotify schmiert FHEM mit dieser Meldung ab:
2021.03.23 16:04:47 1: PERL WARNING: Use of uninitialized value in substitution (s///) at ./FHEM/98_inotify.pm line 440.
2021.03.23 16:04:47 3: inotify (FTP): startet watching /Q/ftp/files with the file pattern .*
Can't call method "cancel" on an undefined value at ./FHEM/98_inotify.pm line 367.
2021.03.23 16:05:49 1: Including fhem.cfg
define: defmod FTP inotify /Q/ftp/files .*
was mache ich falsch?
EDIT:
Layer 8 Problem. FHEM hatte keine Rechte. :-)
ist erledigt.
neues Problem:
setze ich das Attribut "subfolders" blockiert fhem. :-(
mein Ziel:
Einen FTP Ordner überwachen auf neue Dateien bzw Ordner.
Unterordner interessieren eigentlich nicht. Das Attribut wollte ich zum testen setzen.
erstellte Test-Dateien und Ordner haben allerdings nicht angeschlagen. Der Eventmonitor und das Device blieben stumm.
verbose 5 zeigt auch nichts.
mach ich wieder einen Layer-8 Fehler? aber welchen?
liegt es evtl daran dass der überwachte Ordner so ca 850 Elemente enthält?
Weiß nicht was/ob überhaupt das Modul per default überwacht.
Hast du eine Angabe im Attribut mask gemacht ?
Zitat
mask
set your own mask for watching. Komma seperated list. See the Linux::Inotify2 Doku for possible masks.
Wenn nicht, versuchs einfach mal mit
IN_ALL_EVENTS aus der Liste (https://metacpan.org/pod/release/MLEHMANN/Linux-Inotify2-1.22/Inotify2.pm#The-Linux::Inotify2-Class).
Gruß
Thomas
Ja, das wurde automatisch gesetzt.
Das in all kann ich auch mal testen. Aber erst morgen wieder.
Danke.
Bitte schauen, was inotify leisten kann. Gemountete (remote) Ordner können nicht überwacht werden.
Zitat von: marvin78 am 23 März 2021, 19:01:55
Bitte schauen, was inotify leisten kann. Gemountete (remote) Ordner können nicht überwacht werden.
Das erklärt natürlich meine Fehlversuche.
konnte diese Info aber nirgends finden. wo steht das?
Das Modul setzt nur auf inotify auf. Es kann nur das leisten, was inotify (ein Linux Kernel Modul) bietet und das kann eben (logischerweise) nur das interene Dateisystem überwachen. Bitte die Doku zu inotify (nicht das FHEM Modul) konsultieren, wie im Eingangspost dieses Threads empfohlen.
Zitat von: marvin78 am 24 März 2021, 08:54:12
Das Modul setzt nur auf inotify auf. Es kann nur das leisten, was inotify (ein Linux Kernel Modul) bietet und das kann eben (logischerweise) nur das interene Dateisystem überwachen. Bitte die Doku zu inotify (nicht das FHEM Modul) konsultieren, wie im Eingangspost dieses Threads empfohlen.
Hi Marvin,
das soll keine Kritik an deiner Modul Doku sein. nicht dass das falsch rüber kam.
Habe auch zu inotify im Web und Wiki gelesen.
gesehen habe ich den Hinweis dass ein Kernel Modul keine Remote Ordner überwachen kann.
Für mich als Laie war damit kein lokaler mount gemeint. weil der mount ja lokal addressiert wird.
Aber ja, mittlerweile habe ich noch einige Foren Threads gelesen, mit unter Widersprüchlich bezüblich ftp ordnern, aber am Ende ists klar.
Muss mir einen anderen Lösungsweg suchen.
Danke für die Erklärung.
Hallo Marvin
Vielen dank für das Modul. Es funktioniert sehr gut.
Es hat für mich eine schöne und schnelle Lösung zum überwachen eines Dateipfad ermöglicht.
Nur habe ich immer nach einen neustart von Fhem eine perl Warnung im log.
2021.03.29 16:53:09 1: Including fhem.cfg
2021.03.29 16:53:11 3: WEB: port 8083 opened
2021.03.29 16:53:11 2: eventTypes: loaded 25 lines from ./log/eventTypes.txt
2021.03.29 16:53:12 3: telnetForBlockingFn_1617029592: port 43509 opened
2021.03.29 16:53:12 3: telnet: port 7072 opened
2021.03.29 16:53:12 1: PERL WARNING: Use of uninitialized value in substitution (s///) at ./FHEM/98_inotify.pm line 440, <$fh> line 55.
2021.03.29 16:53:12 1: Including ./log/fhem.save
2021.03.29 16:53:12 1: Messages collected while initializing FHEM:SecurityCheck:
WEB is not password protected
telnet is not password protected
Protect this FHEM installation by defining an allowed device with define allowed allowed
You can disable this message with attr global motd none
2021.03.29 16:53:12 3: inotify (inotify): startet watching /home/Stephan/camera with the file pattern jpg.*
2021.03.29 16:53:12 0: Featurelevel: 6
2021.03.29 16:53:12 0: Server started with 14 defined entities (fhem.pl:23904/2021-03-07 perl:5.028001 os:linux user:fhem pid:9795)
2021.03.29 16:53:13 3: inotify (inotify): startet watching /home/Stephan/camera with the file pattern jpg.*
2021.03.29 16:53:13 3: inotify (inotify): startet watching /home/Stephan/camera with the file pattern jpg.*
Ich habe die Meldung auf mehreren Testsystemen. Die o.g. Meldung kommt aktuell von einem kpl. neu aufgesetzten und fast leeren Fhem.
anbei auch noch mal die Meldung mit gesetzten Stacktrace
2021.03.29 17:13:46 1: PERL WARNING: Use of uninitialized value in substitution (s///) at ./FHEM/98_inotify.pm line 440, <$fh> line 56.
2021.03.29 17:13:46 1: stacktrace:
2021.03.29 17:13:46 1: main::__ANON__ called by ./FHEM/98_inotify.pm (440)
2021.03.29 17:13:46 1: main::inotify_setMasks called by ./FHEM/98_inotify.pm (247)
2021.03.29 17:13:46 1: main::inotify_Attr called by fhem.pl (3847)
2021.03.29 17:13:46 1: main::CallFn called by fhem.pl (3078)
2021.03.29 17:13:46 1: main::CommandAttr called by ./FHEM/98_inotify.pm (134)
2021.03.29 17:13:46 1: main::inotify_Define called by fhem.pl (3847)
2021.03.29 17:13:46 1: main::CallFn called by fhem.pl (2118)
2021.03.29 17:13:46 1: main::CommandDefine called by fhem.pl (1265)
2021.03.29 17:13:46 1: main::AnalyzeCommand called by fhem.pl (1116)
2021.03.29 17:13:46 1: main::AnalyzeCommandChain called by fhem.pl (1403)
2021.03.29 17:13:46 1: main::CommandInclude called by fhem.pl (619)
Ich habe erst gedacht es liegt vieleicht an meinem [<datei-RegEx>] aber es ist egal was ich dort reinschreibe die Meldung kommt trotzdem.
hier ein list von meinem inotify
Internals:
DEF /home/Stephan/camera jpg.*
FD 4
FILES jpg.*
FUUID 6061ee4d-f33f-d873-6079-493fa1bb4182a53b
MID inotify_homeStephancamerajpg
NAME inotify
NOTIFYDEV global
NR 21
NTFY_ORDER 81-inotify
PATH /home/Stephan/camera
STATE active
TYPE inotify
VERSION 0.6.1
READINGS:
2021-03-29 17:26:20 lastEventFile /home/Stephan/camera/09.jpg
2021-03-29 17:26:20 lastEventMask IN_CREATE
2021-03-29 17:24:29 state active
helper:
dirs:
/home/Stephan/camera
events:
0:
file /home/Stephan/camera/09.jpg
mask IN_CREATE
time 2021-03-29 17:26:20
1:
file /home/Stephan/camera/08.jpg
mask IN_CREATE
time 2021-03-29 17:26:02
2:
3:
4:
5:
6:
7:
8:
masks:
IN_CREATE
Attributes:
mask IN_CREATE
Vieleicht kannst Du mir da weiterhelfen.
Viele Grüsse
Stephan
Ich schaue mir das an. Die Funktion wird es nicht beeinträchtigen.
Hallo marvin78
... ich habe mir für die Bewegungserkennung von Webcams via FTPUpload dein Modul herausgepickt.
Leider habe ich ein par Fehlerchen gefunden -> glücklicherweise aber auch behoben.
Kleinigkeiten:
1) eine Warnung wenn keine Datei im define angegeben wurde.
2) Die Aktualisierung läuft zum Startzeitpunkt mehrmals durch den Timer (für jedes Attribut)
3) sollte jemand mask während der Laufzeit löschen, dann geschieht Unheil
4) ungenutzer helper mit dem namen dirs
5) state steht nach define auf unbekannt
Problem
6) bei einem Fehler, zum Beispiel falsche Rechte auf einen Ordner ist der watcher "undef" und darf nicht in die Liste aufgenommen werden.
Neues Event
7) es kommt kein einzelnes Event, welches das inotify und den Dateinamen zur Verfügung stellt. Das wäre für die weitere Abarbeitung - z.B. weitere notifys - sehr Hilfreich.
All das habe ich für mich angepasst und möchte hier den 98_inotify_patch dafür bereitstellen. Eventuell wird es ja noch erweitert/korrigiert. Für mich wichtig wäre der Punkt6 und Punkt7.
Ich habe den Patch leicht verändert übernommen. Bitte checken, ob es so funktioniert.