find Ergebnis in Variable

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

Benutzeravatar
Bernd-Joras
Beiträge: 730
Registriert: 26.03.2016, 09:33
Hat sich bedankt: 34 Mal
Danksagung erhalten: 40 Mal

find Ergebnis in Variable

Beitrag von Bernd-Joras » 02.09.2021, 18:20

Hallo,

Bin jetzt nicht der script und/oder linux Mensch und würde mich freuen wenn mir hier jemand unter die Arme greift …
Auch hatte ich das Thema schon mal .... möchte es nun aber nochmals sauber aufnehmen / anfragen.

Ich Schreibe Videofiles meiner Kameras per FTP auf meine FritzBox.
Damit es nicht überläuft lösche ich über ein Homematic Programm einmal an Tag Video-Files von meiner Fritzbox.
Das funktioniert sehr gut …

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801001:4.CMD_EXEC").State ("mount -t cifs -o username=ICH,password=PASSWORT,noserverino,vers=3.0 //192.168.5.1/js-fb1-nas/Samsung-PortableSSDT3-01/CAM-RECORDS /mnt");

dom.GetObject("CUxD.CUX2801001:9.CMD_EXEC").State("find /mnt/*/* -mtime +90 -exec rm -rf {} \;");
Nun möchte ich gerne mehrmals am Tag prüfen es Video-Files gibt, die z.B. nicht älter als 3 Stunden sind.
Ich dachte man könnte wieder mit dem FIND suchen und dann eine Datei schreiben in der aufgelistet wird, ob es Videos der letzten 3 Stunden gibt.

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801001:9.CMD_EXEC").State("find /mnt/IN-6014HD-TH -mmin -180 > /tmp/VFile.txt");
Das funzt auch bis dahin … file wird angelegt … 0 (null) kb oder größer wenn was drinsteht …

Und dann es „irgendwie“ bewerkstelligen, dass z.B. eine Variable beschrieben wird mit ja, es steht was in der Datei oder nein.
(das kann man z.B. daran erkennen, ob die Datei 0 (null) kb gros ist oder nicht)

Im Moment habe ich keine Idee wie das Gehen könnte … mag vielleicht jemand helfen …

Oder vielleicht gibt es auch noch andere Ansätze wie ich es bewerkstelligen kann ein Mail zu bekommen, wenn länger als z.B. 3 Stunden keine Dateien (Video Aufnahmen) auf das NAS meiner FritzBox geschrieben wurden.

Danke vorab, Bernd ...

PS: Ich bin wirklich kein Linuxer ... ggf. muss man bei mir etwas mehr Zeit investieren ... nur vorab als Hinweis)
2 Standorte mit je RPi3B+ RaspberryMatic 3.73.9.20240130 / RPI-RF-MOD | Externe USB-Platinen Antenne | 2x LAN_RF_GW | 1x LAN_RS485_GW | ca. 170 Geräte davon 35x IP | ca. 250 Programme |>600 Kanäle | Addons: CUX-Daemon, XML-API, hm_pdetect, E-Mail, CCU-Historian

Benutzeravatar
Bernd-Joras
Beiträge: 730
Registriert: 26.03.2016, 09:33
Hat sich bedankt: 34 Mal
Danksagung erhalten: 40 Mal

Re: find Ergebnis in Variable

Beitrag von Bernd-Joras » 04.09.2021, 06:31

Scheinbar gibt es Berührungsängste mir ggf. zu helfen … OK… *Spass* ….

Habe mir selbst geholfen …. ist vermutlich (SEHR) stümperhaft …. Jedoch kann ich es (noch) nicht besser.

Habe mir alles irgendwo kopiert und zusammengebastelt.

Ich verstehe hier nicht wirklich alles, jedoch funktioniert es ..
Ich bin trotzdem für Vereinfachungen/ Verbesserungen und/oder Tipps dankbar.

Aufgabe:
Suchen nach Dateien im entsprechenden Kamera Video Ordner die jünger 3h sind
Wenn Videos (jünger 3h) gefunden werden (somit alles OK) wird eine Datei in /tmp/Video-Test angelegt in welcher die Video-Files gelistet sind.
Diese Datei "Videos.txt" ist dann sicherlich größer null kb.
Wenn keine Videos (jünger 3h) gefunden werden, wird auch die Datei "Videos.txt" in /tmp/Video-Test angelegt, jedoch steht da nichts drin, womit diese also null kb groß ist.

Alles kommende habe ich in ein Programm gesteckt welches alle drei Stunden getriggert wird und dann werden zeitlich versetzt nachfolgende Schritte abgearbeitet.



Sicherheitshalber ein unmount
Im Programm sofort:

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801001:5.CMD_EXEC").State ("umount -f /mnt/");


Mount zum FritzBox zu den Video Files
Im Programm verzögert um 2 Sekunden:

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801001:4.CMD_EXEC").State ("mount -t cifs -o username=ICH,password=PASSWORT,noserverino,vers=3.0 //192.168.5.1/js-fb1-nas/Samsung-PortableSSDT3-01/CAM-RECORDS /mnt");


Das Verzeichnis "Video-Test" im "tmp" Ordner anlegen
Im Programm verzögert um 4 Sekunden:

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801001:9.CMD_EXEC").State("mkdir /tmp/Video-Test");


Suche auf der FB1 im Ordner der jeweiligen Kamera ob Videos (Files) vorhanden sind die nicht älter sind als 180 Min.
Lege eine Datei (Videos.txt) im /tmp/Video-Test Ordner an in dem die gefundenen Videos gelistet sind.
Wenn keine Videos gefunden werden ist die Datei Videos.txt null kb da nichts drinn steht.
Im Programm verzögert um 6 Sekunden:

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801001:9.CMD_EXEC").State("find /mnt/IN-6014HD-TH -mmin -180  > /tmp/Video-Test/Videos.txt");


Wenn die Videos.txt gleich null kb ist wird diese gelöscht.
Das Durchsuchen des Ordners (Befehl davor) dauert ca. 50 Sekunden daher im Programm verzögert um 60 Sekunden:

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801001:9.CMD_EXEC").State("find /tmp/Video-Test -type f -size 0 -delete");


Wenn die Datei "Videos.txt" größer oder gleich 1 kb ist, wird diese nicht gelöscht.
Jetzt wird geprüft, ob die Datei "Videos.txt" vorhanden ist und bei vorhanden in die Variable (SV-Videos) ein OK geschrieben.
Wenn die Datei "Videos.txt" nicht vorhanden ist, wird die Variable (SV-Videos) geleert)
(Habe es nicht geschafft es so aufzubauen, dass ein "NICHT-OK" in die Variable geschrieben wird wenn die Datei nicht vorhanden ist)
Im Programm verzögert um 62 Sekunden:

Code: Alles auswählen

string stderr;string stdout;
string svout = "SV-Videos";
string url="[ -f /tmp/Video-Test/Videos.txt ] && echo OK";
system.Exec (url, &stdout, &stderr);
if(!stdout == ""){WriteLine("Abfrage erfolgreich") if ( (dom.GetObject(ID_SYSTEM_VARIABLES)).Get(svout) ) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(svout).State(stdout);
} } 
else{WriteLine("Abfrage nicht erfolgreich");
        }
if ( (dom.GetObject(ID_SYSTEM_VARIABLES)).Get(svout) ) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(svout).State(stdout);    }


Jetzt lösche ich die Datei noch wech …
Im Programm verzögert um 64 Sekunden:

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801001:9.CMD_EXEC").State("rm -rf /tmp/Video-Test/*" );


Und sicherheitshalber ein UNMOUNT
Im Programm verzögert um 66 Sekunden:

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801001:5.CMD_EXEC").State ("umount -f /mnt/");
Die Variable "SV-Videos" verarbeite ich nun in einem zusätzlichem Programm weiter und lasse mir ggf. Mails senden.

Ziemlich krank oder .... funktioniert aber ... BG, Bernd
2 Standorte mit je RPi3B+ RaspberryMatic 3.73.9.20240130 / RPI-RF-MOD | Externe USB-Platinen Antenne | 2x LAN_RF_GW | 1x LAN_RS485_GW | ca. 170 Geräte davon 35x IP | ca. 250 Programme |>600 Kanäle | Addons: CUX-Daemon, XML-API, hm_pdetect, E-Mail, CCU-Historian

Benutzeravatar
jmaus
Beiträge: 9818
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 459 Mal
Danksagung erhalten: 1855 Mal
Kontaktdaten:

Re: find Ergebnis in Variable

Beitrag von jmaus » 04.09.2021, 18:52

Also ich würde dir empfehlen doch einfach ein reines shell skript für deine Aufgaben zu bauen und dieses unter /usr/local abzulegen und dann einfach via system.Exec() dieses Skript aufzurufen, statt hier komplexe dinge via ReGa Skriptsprache nachzubilden und dann für die einzelnen aktionen dann einzelne CUxD System aufrufe zu verwenden. Wenn deine Logik ohnehin aus vielen Shell Anweisungen besteht solltest du auch in dieser Welt weitestgehend bleiben.
RaspberryMatic 3.75.6.20240316 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

Benutzeravatar
Bernd-Joras
Beiträge: 730
Registriert: 26.03.2016, 09:33
Hat sich bedankt: 34 Mal
Danksagung erhalten: 40 Mal

Re: find Ergebnis in Variable

Beitrag von Bernd-Joras » 05.09.2021, 09:19

Hallo Jens … vielen Dank erst einmal für Deine Anregungen …

Wenn ich ein es halbwegs richtig verstanden habe, müsste ich dann aber das shell skript nach einem flashen der Karte immer wieder einspielen bzw. rauf kopieren. Richtig ?

Zudem sehe mich eher als überfordert dabei, ein funktionierenden shell script zusammen zu basteln.
Die einzelnen Linux Befehle verstehe ich noch so halbwegs, aber wenn es dann darum geht Variablen und oder Abfragen in Beziehung zu setzen und in eine notwendigen Reihenfolge zu bringen, bin ich eher überfordert.
Ich werde sicherlich in den nächsten Wochen … Monaten und Jahren dazulernen und das dann, wenn der Bedarf immer noch besteht, auch versuchen Anders (sinnvoller) umzusetzen. Im Moment kann ich das Skripten usw. zeitlich bedingt jedoch nicht erlernen.

DANKE vielmals … BG, Bernd
2 Standorte mit je RPi3B+ RaspberryMatic 3.73.9.20240130 / RPI-RF-MOD | Externe USB-Platinen Antenne | 2x LAN_RF_GW | 1x LAN_RS485_GW | ca. 170 Geräte davon 35x IP | ca. 250 Programme |>600 Kanäle | Addons: CUX-Daemon, XML-API, hm_pdetect, E-Mail, CCU-Historian

Benutzeravatar
jmaus
Beiträge: 9818
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 459 Mal
Danksagung erhalten: 1855 Mal
Kontaktdaten:

Re: find Ergebnis in Variable

Beitrag von jmaus » 05.09.2021, 10:04

Bernd-Joras hat geschrieben:
05.09.2021, 09:19
Wenn ich ein es halbwegs richtig verstanden habe, müsste ich dann aber das shell skript nach einem flashen der Karte immer wieder einspielen bzw. rauf kopieren. Richtig ?
Nein, das hast du leider nicht richtig verstanden. einfach merken: Alles (bis auf gewisse Ausnahmen) was du bzw irgendwie unter /usr/local abgelegt wird ist Teil der Systembackupdateien (.sbk) und insofern wäre dann auch ein Shell Skript den du unter /usr/local ablegen lässt eben Teil des Backups und übersteht somit auch ein Firmware-Update.
RaspberryMatic 3.75.6.20240316 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

Benutzeravatar
Bernd-Joras
Beiträge: 730
Registriert: 26.03.2016, 09:33
Hat sich bedankt: 34 Mal
Danksagung erhalten: 40 Mal

Re: find Ergebnis in Variable

Beitrag von Bernd-Joras » 01.10.2021, 18:33

Jens … oder wer Anderes bitte …

Ich versuche nun ein „shell skript „ zu erstellen …

Mit WinSCP erstelle ich unter /usr/local eine Datei „ checkVideo.sh „ mit nachfolgenden Test-Inhalt

Code: Alles auswählen

#/bin/bash

umount -f /mnt/

mount -t cifs -o username=ICH,password=PASSWORT,noserverino,vers=3.0 //192.168.5.1/js-fb1-nas/Samsung-PortableSSDT3-01/CAM-RECORDS /mnt

if [ $(($(date +%s)-$(stat -c "%Y" /mnt/IN-6014HD-TH/*))) -lt 10800 ] ; 
	then curl -k -s "http://192.168.5.110:8181/hm.exe?value=dom.GetObject(ID_SYSTEM_VARIABLES).Get('SV-Videos').State('Kamera-OK')" > /dev/null ; 
	else curl -k -s "http://192.168.5.110:8181/hm.exe?value=dom.GetObject(ID_SYSTEM_VARIABLES).Get('SV-Videos').State('Kamera-Fehler!')" > /dev/null ;
	
fi

umount -f /mnt/
Wenn ich dann aber versuche dieses shell skript mittels SSH (Putty) aufzurufen bekomme ich immer => Datei nicht gefunden …
Kann mir geholfen werden ?

Code: Alles auswählen

root@homematic-raspi:/usr/local# ls
addons         crontabs       lost+found
checkVideo.sh  etc            tmp
root@homematic-raspi:/usr/local# checkVideo.sh
-sh: checkVideo.sh: not found
root@homematic-raspi:/
Danke vorab, Bernd
2 Standorte mit je RPi3B+ RaspberryMatic 3.73.9.20240130 / RPI-RF-MOD | Externe USB-Platinen Antenne | 2x LAN_RF_GW | 1x LAN_RS485_GW | ca. 170 Geräte davon 35x IP | ca. 250 Programme |>600 Kanäle | Addons: CUX-Daemon, XML-API, hm_pdetect, E-Mail, CCU-Historian

Benutzeravatar
stan23
Beiträge: 2028
Registriert: 13.12.2016, 21:14
System: Alternative CCU (auf Basis OCCU)
Wohnort: Altmühltal
Hat sich bedankt: 576 Mal
Danksagung erhalten: 335 Mal
Kontaktdaten:

Re: find Ergebnis in Variable

Beitrag von stan23 » 01.10.2021, 18:40

Es gibt auf RaspberryMatic keine bash. Deswegen passt die erste Zeile deines Skripts nicht, denn sie besagt dass es mit der bash ausgeführt werden soll.
Versuche mal

Code: Alles auswählen

#!/bin/sh
Edit:
nein warte, ohne das ! ist die erste Zeile nur ein Kommentar.

Dann solltest du die Datei ausführbar machen:

Code: Alles auswählen

chmod u+x /usr/local# checkVideo.sh
und mit Pfadangabe (./) ausführen:

Code: Alles auswählen

root@homematic-raspi:/usr/local# ./checkVideo.sh
Zuletzt geändert von stan23 am 01.10.2021, 18:43, insgesamt 1-mal geändert.
Viele Grüße
Marco

RaspberryMatic als VM auf einem NUC mit Proxmox und USB-Funkmodul
~80 Geräte (HM, HmIP, HMW, HBW, AskSin)

Benutzeravatar
Baxxy
Beiträge: 10646
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 596 Mal
Danksagung erhalten: 2180 Mal

Re: find Ergebnis in Variable

Beitrag von Baxxy » 01.10.2021, 18:42

Bernd-Joras hat geschrieben:
01.10.2021, 18:33
Kann mir geholfen werden ?
Bestimmt... 8)
Zum einen muss die Datei ausführbar sein. Ich mache sowas über WinSCP.
RM_sh_Script_ausführbar.JPG
Zum anderen gibt es bei RM kein bash (es sei denn du hast die hm-tools installiert).
In meinen shell-Scripten steht oben immer...

Code: Alles auswählen

#!/bin/sh
Grüße, Baxxy

Benutzeravatar
stan23
Beiträge: 2028
Registriert: 13.12.2016, 21:14
System: Alternative CCU (auf Basis OCCU)
Wohnort: Altmühltal
Hat sich bedankt: 576 Mal
Danksagung erhalten: 335 Mal
Kontaktdaten:

Re: find Ergebnis in Variable

Beitrag von stan23 » 01.10.2021, 18:44

Baxxy hat geschrieben:
01.10.2021, 18:42
Zum anderen gibt es bei RM kein bash (es sei denn du hast die hm-tools installiert).
Selbst dann liegt sie nicht dort, sondern dort:

Code: Alles auswählen

root@homematic-raspi:~# which bash
/usr/local/addons/hm-tools/bin/bash
Viele Grüße
Marco

RaspberryMatic als VM auf einem NUC mit Proxmox und USB-Funkmodul
~80 Geräte (HM, HmIP, HMW, HBW, AskSin)

Benutzeravatar
Baxxy
Beiträge: 10646
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 596 Mal
Danksagung erhalten: 2180 Mal

Re: find Ergebnis in Variable

Beitrag von Baxxy » 01.10.2021, 19:00

stan23 hat geschrieben:
01.10.2021, 18:44
Selbst dann liegt sie nicht dort, sondern dort:
Stimmt. Reicht dann ein...

Code: Alles auswählen

#!/bash
?
Oder wie muss das korrekt aussehen.
Sollte ja global verfügbar sein:

Code: Alles auswählen

export PATH=${PATH}:/usr/local/addons/hm-tools/bin
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/addons/hm-tools/lib:/usr/local/addons/hm-tools/lib/expect5.45.4
export TERM=xterm
(Das ist eigentlich so gar nicht meins, aber wenn an weiß wie das korrekt aussehen muss kann das ja nicht schaden. :wink: )

Grüße, Baxxy

Antworten

Zurück zu „HomeMatic allgemein“