Ich wollte ein paar Dateien öfters mal mit FHEM herunterladen und per FHEMWEB Webserver verteilen. Dazu habe ich mir ein Snippet erstellt.
Will man zum Beispiel einige Tasmota Dateien herunterladen und speichern:
- set MyDownloader job Filepath="/opt/fhem/www/webhook/tasmota.bin"https://ota.tasmota.com/tasmota/release/tasmota.bin
- set MyDownloader job Filepath="/opt/fhem/www/webhook/tasmota.bin.gz"https://ota.tasmota.com/tasmota/release/tasmota.bin.gz
- set MyDownloader job Filepath="/opt/fhem/www/webhook/tasmota-minimal.bin.gz"https://ota.tasmota.com/tasmota/release/tasmota-minimal.bin.gz
- set MyDownloader job Filepath="/opt/fhem/www/webhook/tasmota32-zbbrdgpro.bin"https://ota.tasmota.com/tasmota32/release/tasmota32-zbbrdgpro.bin
defmod MyDownloader dummy
attr MyDownloader userattr FilePath
attr MyDownloader readingList job
attr MyDownloader setList job
attr MyDownloader userReadings result:job:.* {\
my $hash = $defs{$name};;\
my $job = ReadingsVal($name, "job", 'https://fhem.de/www/images/default/fhemicon.png');;\
my $path = AttrVal($name, "Filepath", "/opt/fhem/www/download.bin");;\
\
if ($job =~ s/(?:Filepath|Dateipfad)="(.*?)"//) {\
$path = $1;;\
}\
\
my $fnFct = sub {\
my ($param, $err, $data) = @_;;\
\
my $len = $data ? length($data) : 0;;\
my $error = $err ? $err : FileWrite($path, $data);;\
\
readingsBeginUpdate($hash);;\
readingsBulkUpdate($hash, "busy", 0, 1);;\
readingsBulkUpdate($hash, "result", "saved $len Bytes", 1) if !$error;;\
readingsBulkUpdate($hash, "result", "error ($error, $err)", 1) if $error;;\
readingsEndUpdate($hash, 1);;\
};;\
\
if ( ReadingsVal($name, "busy", 0) == 0 ) {\
readingsBulkUpdate($hash, "busy", 1, 1);;\
my $param = {\
url => $job,\
timeout => 10,\
hash => $hash,\
method => "GET",\
callback => $fnFct\
};;\
HttpUtils_NonblockingGet($param);;\
return "download job started";;\
}\
\
return;;\
}
Viel Spaß!