2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-17 17:36:01 +00:00

49_SSCam: control parse function by the hparse hash

git-svn-id: https://svn.fhem.de/fhem/trunk@22779 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2020-09-16 21:35:28 +00:00
parent 2488ebc771
commit f6f5bcaf72

View File

@ -164,6 +164,7 @@ BEGIN {
# Versions History intern
my %vNotesIntern = (
"9.7.18" => "16.09.2020 control parse function by the hparse hash ",
"9.7.17" => "13.09.2020 optimize _oPrunliveview ",
"9.7.16" => "12.09.2020 function _oPrunliveview to execute livestream (no snap / HLS) in new camOp variant ",
"9.7.15" => "12.09.2020 changed audiolink handling to new execution variant in camOp ",
@ -467,6 +468,15 @@ my %hget = ( # Ha
versionNotes => { fn => "_getversionNotes", needcred => 1 },
);
my %hparse = ( # Hash der Opcode Parse Funktionen
Start => { fn => "_parseStart", },
Stop => { fn => "_parseStop", },
GetRec => { fn => "_parseGetRec", },
MotDetSc => { fn => "_parseMotDetSc", },
getsvslog => { fn => "_parsegetsvslog", },
SaveRec => { fn => "_parseSaveRec", },
);
my %hdt = ( # Delta Timer Hash für Zeitsteuerung der Funktionen
__camSnap => 0.2, # ab hier hohe Prio
__camStartRec => 0.3,
@ -6028,21 +6038,17 @@ sub camOp_Parse {
$verbose = 3;
}
if ($err ne "") {
# wenn ein Fehler bei der HTTP Abfrage aufgetreten ist
if ($err ne "") { # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist
Log3($name, 2, "$name - error while requesting ".$param->{url}." - $err");
readingsSingleUpdate($hash, "Error", $err, 1);
# ausgeführte Funktion ist abgebrochen, Freigabe Funktionstoken
delActiveToken($hash);
delActiveToken($hash); # ausgeführte Funktion ist abgebrochen, Freigabe Funktionstoken
return;
} elsif ($myjson ne "") {
# wenn die Abfrage erfolgreich war ($data enthält die Ergebnisdaten des HTTP Aufrufes)
# Evaluiere ob Daten im JSON-Format empfangen wurden
if($OpMode !~ /SaveRec|GetRec/x) { # "SaveRec/GetRec" liefern MP4-Daten und kein JSON
} elsif ($myjson ne "") { # wenn die Abfrage erfolgreich war
if($OpMode !~ /SaveRec|GetRec/x) { # "SaveRec/GetRec" liefern MP4-Daten und kein JSON
($success,$myjson) = evaljson($hash,$myjson);
if (!$success) {
Log3($name, 4, "$name - Data returned: ".$myjson);
delActiveToken($hash);
@ -6051,73 +6057,33 @@ sub camOp_Parse {
$data = decode_json($myjson);
# Logausgabe decodierte JSON Daten
Log3($name, 5, "$name - JSON returned: ". Dumper $data);
Log3($name, 5, "$name - JSON returned: ". Dumper $data); # Logausgabe decodierte JSON Daten
$success = $data->{'success'};
} else {
$success = 1;
}
if ($success) {
# Kameraoperation entsprechend "OpMode" war erfolgreich
if ($OpMode eq "Start") {
# Die Aufnahmezeit setzen
# wird "set <name> on [rectime]" verwendet -> dann [rectime] nutzen,
# sonst Attribut "rectime" wenn es gesetzt ist, falls nicht -> "RECTIME_DEF"
my $rectime;
if (defined($hash->{HELPER}{RECTIME_TEMP})) {
$rectime = delete $hash->{HELPER}{RECTIME_TEMP};
} else {
$rectime = AttrVal($name, "rectime", $hash->{HELPER}{RECTIME_DEF});
}
if ($rectime == 0) {
Log3($name, 3, "$name - Camera $camname endless Recording started - stop it by stop-command !");
} else {
if (ReadingsVal("$name", "Record", "Stop") eq "Start") {
# Aufnahme läuft schon und wird verlängert
Log3($name, 3, "$name - running recording renewed to $rectime s");
} else {
Log3($name, 3, "$name - Camera $camname recording with recording time $rectime s started");
}
}
readingsBeginUpdate($hash);
readingsBulkUpdate($hash,"Record","Start");
readingsBulkUpdate($hash,"state", "on");
readingsBulkUpdate($hash,"Errorcode","none");
readingsBulkUpdate($hash,"Error","none");
readingsEndUpdate($hash, 1);
if ($rectime != 0) { # Stop der Aufnahme nach Ablauf $rectime, wenn rectime = 0 -> endlose Aufnahme
my $emtxt = $hash->{HELPER}{SMTPRECMSG} // "";
my $teletxt = $hash->{HELPER}{TELERECMSG} // "";
RemoveInternalTimer($hash, "FHEM::SSCam::__camStopRec");
InternalTimer(gettimeofday()+$rectime, "FHEM::SSCam::__camStopRec", $hash);
}
roomRefresh($hash,0,0,1); # kein Room-Refresh, kein SSCam-state-Event, SSCamSTRM-Event
} elsif ($OpMode eq "Stop") {
readingsBeginUpdate($hash);
readingsBulkUpdate ($hash, "Record", "Stop");
readingsBulkUpdate ($hash, "state", "off" );
readingsBulkUpdate ($hash, "Errorcode", "none");
readingsBulkUpdate ($hash, "Error" , "none");
readingsEndUpdate ($hash, 1);
Log3($name, 3, "$name - Camera $camname Recording stopped");
roomRefresh($hash,0,0,1); # kein Room-Refresh, kein SSCam-state-Event, SSCamSTRM-Event
# Aktualisierung Eventlist der letzten Aufnahme
__getEventList($hash);
} elsif ($OpMode eq "ExpMode") {
if ($success) { # Kameraoperation entsprechend "OpMode" war erfolgreich
my $params = {
hash => $hash,
name => $name,
camname => $camname,
OpMode => $OpMode,
myjson => $myjson,
data => $data,
};
no strict "refs"; ## no critic 'NoStrict'
if($hparse{$OpMode} && defined &{$hparse{$OpMode}{fn}}) {
my $ret = q{};
$ret = &{$hparse{$OpMode}{fn}} ($params);
}
use strict "refs";
if ($OpMode eq "ExpMode") {
setReadingErrorNone( $hash, 1 );
Log3 ( $name, 3, qq{$name - Camera $camname exposure mode is set to "$hash->{HELPER}{EXPMODE}"} );
@ -6131,74 +6097,6 @@ sub camOp_Parse {
setReadingErrorNone( $hash, 1 );
Log3 ( $name, 3, qq{$name - External Event "$hash->{HELPER}{EVENTID}" successfully triggered} );
} elsif ($OpMode eq "GetRec") {
my $recid = ReadingsVal("$name", "CamLastRecId", "");
my $createdTm = ReadingsVal("$name", "CamLastRecTime", "");
my $lrec = ReadingsVal("$name", "CamLastRec", "");
my ($tdir,$fileName) = split("/",$lrec);
my $sn = 0;
my $tac = openOrgetTrans($hash); # Transaktion starten
my $cache;
if($hash->{HELPER}{CANSENDREC} || $hash->{HELPER}{CANTELEREC} || $hash->{HELPER}{CANCHATREC}) {
$cache = cache($name, "c_init"); # Cache initialisieren für Versandhash
Log3($name, 1, "$name - Fall back to internal Cache due to preceding failure.") if(!$cache);
if(!$cache || $cache eq "internal" ) {
$data{SSCam}{$name}{SENDRECS}{$tac}{$sn}{recid} = $recid;
$data{SSCam}{$name}{SENDRECS}{$tac}{$sn}{createdTm} = $createdTm;
$data{SSCam}{$name}{SENDRECS}{$tac}{$sn}{fileName} = $fileName;
$data{SSCam}{$name}{SENDRECS}{$tac}{$sn}{tdir} = $tdir;
$data{SSCam}{$name}{SENDRECS}{$tac}{$sn}{imageData} = $myjson;
} else {
cache($name, "c_write", "{SENDRECS}{$tac}{$sn}{recid}" ,$recid);
cache($name, "c_write", "{SENDRECS}{$tac}{$sn}{createdTm}" ,$createdTm);
cache($name, "c_write", "{SENDRECS}{$tac}{$sn}{fileName}" ,$fileName);
cache($name, "c_write", "{SENDRECS}{$tac}{$sn}{tdir}" ,$tdir);
cache($name, "c_write", "{SENDRECS}{$tac}{$sn}{imageData}" ,$myjson);
}
Log3($name, 4, "$name - Recording '$sn' added to send recording hash: ID => $recid, File => $fileName, Created => $createdTm");
}
# Recording als Email / Telegram / Chat versenden
if(!$cache || $cache eq "internal" ) {
prepareSendData ($hash, $OpMode, $data{SSCam}{$name}{SENDRECS}{$tac});
} else {
prepareSendData ($hash, $OpMode, "{SENDRECS}{$tac}");
}
closeTrans ($hash); # Transaktion beenden
readingsBeginUpdate ($hash);
readingsBulkUpdate ($hash,"Errorcode","none");
readingsBulkUpdate ($hash,"Error",$err);
readingsEndUpdate ($hash, 1);
} elsif ($OpMode eq "SaveRec") {
my $lrec = ReadingsVal("$name", "CamLastRec", "");
$lrec = (split("/",$lrec))[1];
my $sp = $hash->{HELPER}{RECSAVEPATH} // $attr{global}{modpath};
my $file = $sp."/$lrec";
delete $hash->{HELPER}{RECSAVEPATH};
open my $fh, '>', $file or do { $err = qq{Can't open file "$file": $!};
Log3($name, 2, "$name - $err");
};
if(!$err) {
binmode $fh;
print $fh $myjson;
close($fh);
$err = "none";
Log3($name, 3, qq{$name - Recording was saved to local file "$file"});
}
readingsBeginUpdate ($hash);
readingsBulkUpdate ($hash,"Errorcode","none");
readingsBulkUpdate ($hash,"Error",$err);
readingsEndUpdate ($hash, 1);
} elsif ($OpMode eq "sethomemode") {
setReadingErrorNone( $hash, 1 );
Log3 ( $name, 3, qq{$name - HomeMode was set to "$hash->{HELPER}{HOMEMODE}"} );
@ -6224,40 +6122,6 @@ sub camOp_Parse {
readingsBulkUpdate ($hash,"Error","none");
readingsEndUpdate ($hash, 1);
} elsif ($OpMode eq "getsvslog") {
my $lec = $data->{'data'}{'total'}; # abgerufene Anzahl von Log-Einträgen
my $log = '<html>';
my $log0 = "";
my $i = 0;
while ($data->{'data'}->{'log'}->[$i]) {
my $id = $data->{'data'}->{'log'}->[$i]{'id'};
my $un = $data->{'data'}->{'log'}->[$i]{'user_name'};
my $desc = $data->{'data'}->{'log'}->[$i]{'desc'};
my $level = $data->{'data'}->{'log'}->[$i]{'type'};
$level = ($level == 3)?"Error":($level == 2)?"Warning":"Information";
my $time = $data->{'data'}->{'log'}->[$i]{'time'};
$time = FmtDateTime($time);
$log0 = $time." - ".$level." - ".$desc if($i == 0);
$log .= "$time - $level - $desc<br>";
$i++;
}
$log = "<html><b>Surveillance Station Server \"$hash->{SERVERADDR}\" Log</b> ( $i/$lec entries are displayed )<br><br>$log</html>";
# asyncOutput kann normalerweise etwa 100k uebertragen (siehe fhem.pl/addToWritebuffer() fuer Details)
# bzw. https://forum.fhem.de/index.php/topic,77310.0.html
# $log = "Too much log data were selected. Please reduce amount of data by specifying all or one of 'severity', 'limit', 'match'" if (length($log) >= 102400);
readingsBeginUpdate ($hash);
readingsBulkUpdate ($hash,"LastLogEntry",$log0) if(!$hash->{HELPER}{CL}{1}); # Datenabruf im Hintergrund;
readingsBulkUpdate ($hash,"Errorcode","none");
readingsBulkUpdate ($hash,"Error","none");
readingsEndUpdate ($hash, 1);
# Ausgabe Popup der Log-Daten (nach readingsEndUpdate positionieren sonst "Connection lost, trying reconnect every 5 seconds" wenn > 102400 Zeichen)
asyncOutput($hash->{HELPER}{CL}{1},"$log");
delete($hash->{HELPER}{CL});
} elsif ($OpMode eq "getPresets") {
my %ap = ();
my $i = 0;
@ -6336,29 +6200,6 @@ sub camOp_Parse {
delActiveToken ($hash); # Token freigeben vor Abruf caminfo
__getCamInfo ($hash);
} elsif ($OpMode eq "MotDetSc") {
setReadingErrorNone( $hash, 1 );
my $sensitivity;
if ($hash->{HELPER}{MOTDETSC} eq "SVS" && keys %{$hash->{HELPER}{MOTDETOPTIONS}}) { # Optionen für "SVS" sind gesetzt
$sensitivity = ($hash->{HELPER}{MOTDETOPTIONS}{SENSITIVITY}) ? ($hash->{HELPER}{MOTDETOPTIONS}{SENSITIVITY}) : "-";
my $threshold = ($hash->{HELPER}{MOTDETOPTIONS}{THRESHOLD}) ? ($hash->{HELPER}{MOTDETOPTIONS}{THRESHOLD}) : "-";
Log3($name, 3, "$name - Camera $camname motion detection source set to \"$hash->{HELPER}{MOTDETSC}\" with options sensitivity: $sensitivity, threshold: $threshold");
} elsif ($hash->{HELPER}{MOTDETSC} eq "camera" && keys %{$hash->{HELPER}{MOTDETOPTIONS}}) { # Optionen für "camera" sind gesetzt
$sensitivity = ($hash->{HELPER}{MOTDETOPTIONS}{SENSITIVITY}) ? ($hash->{HELPER}{MOTDETOPTIONS}{SENSITIVITY}) : "-";
my $objectSize = ($hash->{HELPER}{MOTDETOPTIONS}{OBJECTSIZE}) ? ($hash->{HELPER}{MOTDETOPTIONS}{OBJECTSIZE}) : "-";
my $percentage = ($hash->{HELPER}{MOTDETOPTIONS}{PERCENTAGE}) ? ($hash->{HELPER}{MOTDETOPTIONS}{PERCENTAGE}) : "-";
Log3($name, 3, "$name - Camera $camname motion detection source set to \"$hash->{HELPER}{MOTDETSC}\" with options sensitivity: $sensitivity, objectSize: $objectSize, percentage: $percentage");
} else { # keine Optionen Bewegungserkennung wurden gesetzt
Log3($name, 3, "$name - Camera $camname motion detection source set to \"$hash->{HELPER}{MOTDETSC}\" ");
}
__getMotionEnum ($hash); # neu gesetzte Parameter abrufen
} elsif ($OpMode eq "Snap") { # ein Schnapschuß wurde aufgenommen, falls Aufnahme noch läuft -> state = on setzen
roomRefresh($hash,0,1,0); # kein Room-Refresh, SSCam-state-Event, kein SSCamSTRM-Event
@ -7358,11 +7199,264 @@ sub camOp_Parse {
undef $myjson;
}
delActiveToken($hash); # Token freigeben
delActiveToken($hash); # Token freigeben
return;
}
###############################################################################
# Parse OpMode Start
# Die Aufnahmezeit setzen
# wird "set <name> on [rectime]" verwendet -> dann [rectime] nutzen,
# sonst Attribut "rectime" wenn es gesetzt ist, falls nicht -> "RECTIME_DEF"
###############################################################################
sub _parseStart { ## no critic "not used"
my $paref = shift;
my $hash = $paref->{hash};
my $name = $paref->{name};
my $camname = $paref->{camname};
my $rectime;
if (defined($hash->{HELPER}{RECTIME_TEMP})) {
$rectime = delete $hash->{HELPER}{RECTIME_TEMP};
} else {
$rectime = AttrVal($name, "rectime", $hash->{HELPER}{RECTIME_DEF});
}
if ($rectime == 0) {
Log3($name, 3, "$name - Camera $camname endless Recording started - stop it by stop-command !");
} else {
if (ReadingsVal("$name", "Record", "Stop") eq "Start") { # Aufnahme läuft schon und wird verlängert
Log3($name, 3, "$name - running recording renewed to $rectime s");
} else {
Log3($name, 3, "$name - Camera $camname recording with recording time $rectime s started");
}
}
readingsBeginUpdate($hash);
readingsBulkUpdate ($hash, "Record", "Start");
readingsBulkUpdate ($hash, "state", "on" );
readingsBulkUpdate ($hash, "Errorcode", "none" );
readingsBulkUpdate ($hash, "Error", "none" );
readingsEndUpdate ($hash, 1);
if ($rectime != 0) { # Stop der Aufnahme nach Ablauf $rectime, wenn rectime = 0 -> endlose Aufnahme
my $emtxt = $hash->{HELPER}{SMTPRECMSG} // "";
my $teletxt = $hash->{HELPER}{TELERECMSG} // "";
RemoveInternalTimer ($hash, "FHEM::SSCam::__camStopRec");
InternalTimer (gettimeofday()+$rectime, "FHEM::SSCam::__camStopRec", $hash);
}
roomRefresh($hash,0,0,1); # kein Room-Refresh, kein SSCam-state-Event, SSCamSTRM-Event
return;
}
###############################################################################
# Parse OpMode Stop
###############################################################################
sub _parseStop { ## no critic "not used"
my $paref = shift;
my $hash = $paref->{hash};
my $name = $paref->{name};
my $camname = $paref->{camname};
readingsBeginUpdate($hash);
readingsBulkUpdate ($hash, "Record", "Stop");
readingsBulkUpdate ($hash, "state", "off" );
readingsBulkUpdate ($hash, "Errorcode", "none");
readingsBulkUpdate ($hash, "Error" , "none");
readingsEndUpdate ($hash, 1);
Log3($name, 3, "$name - Camera $camname Recording stopped");
roomRefresh($hash,0,0,1); # kein Room-Refresh, kein SSCam-state-Event, SSCamSTRM-Event
# Aktualisierung Eventlist der letzten Aufnahme
__getEventList($hash);
return;
}
###############################################################################
# Parse OpMode GetRec
###############################################################################
sub _parseGetRec { ## no critic "not used"
my $paref = shift;
my $hash = $paref->{hash};
my $name = $paref->{name};
my $camname = $paref->{camname};
my $OpMode = $paref->{OpMode};
my $myjson = $paref->{myjson};
my $recid = ReadingsVal("$name", "CamLastRecId", "");
my $createdTm = ReadingsVal("$name", "CamLastRecTime", "");
my $lrec = ReadingsVal("$name", "CamLastRec", "");
my ($tdir,$fileName) = split("/",$lrec);
my $sn = 0;
my $tac = openOrgetTrans($hash); # Transaktion starten
my $cache;
if($hash->{HELPER}{CANSENDREC} || $hash->{HELPER}{CANTELEREC} || $hash->{HELPER}{CANCHATREC}) {
$cache = cache($name, "c_init"); # Cache initialisieren für Versandhash
Log3($name, 1, "$name - Fall back to internal Cache due to preceding failure.") if(!$cache);
if(!$cache || $cache eq "internal" ) {
$data{SSCam}{$name}{SENDRECS}{$tac}{$sn}{recid} = $recid;
$data{SSCam}{$name}{SENDRECS}{$tac}{$sn}{createdTm} = $createdTm;
$data{SSCam}{$name}{SENDRECS}{$tac}{$sn}{fileName} = $fileName;
$data{SSCam}{$name}{SENDRECS}{$tac}{$sn}{tdir} = $tdir;
$data{SSCam}{$name}{SENDRECS}{$tac}{$sn}{imageData} = $myjson;
} else {
cache($name, "c_write", "{SENDRECS}{$tac}{$sn}{recid}" ,$recid);
cache($name, "c_write", "{SENDRECS}{$tac}{$sn}{createdTm}" ,$createdTm);
cache($name, "c_write", "{SENDRECS}{$tac}{$sn}{fileName}" ,$fileName);
cache($name, "c_write", "{SENDRECS}{$tac}{$sn}{tdir}" ,$tdir);
cache($name, "c_write", "{SENDRECS}{$tac}{$sn}{imageData}" ,$myjson);
}
Log3($name, 4, "$name - Recording '$sn' added to send recording hash: ID => $recid, File => $fileName, Created => $createdTm");
}
# Recording als Email / Telegram / Chat versenden
if(!$cache || $cache eq "internal" ) {
prepareSendData ($hash, $OpMode, $data{SSCam}{$name}{SENDRECS}{$tac});
} else {
prepareSendData ($hash, $OpMode, "{SENDRECS}{$tac}");
}
closeTrans ($hash); # Transaktion beenden
setReadingErrorNone( $hash, 1 );
return;
}
###############################################################################
# Parse OpMode MotDetSc
###############################################################################
sub _parseMotDetSc { ## no critic "not used"
my $paref = shift;
my $hash = $paref->{hash};
my $name = $paref->{name};
my $camname = $paref->{camname};
my $sensitivity;
if ($hash->{HELPER}{MOTDETSC} eq "SVS" && keys %{$hash->{HELPER}{MOTDETOPTIONS}}) { # Optionen für "SVS" sind gesetzt
$sensitivity = ($hash->{HELPER}{MOTDETOPTIONS}{SENSITIVITY}) ? ($hash->{HELPER}{MOTDETOPTIONS}{SENSITIVITY}) : "-";
my $threshold = ($hash->{HELPER}{MOTDETOPTIONS}{THRESHOLD}) ? ($hash->{HELPER}{MOTDETOPTIONS}{THRESHOLD}) : "-";
Log3($name, 3, "$name - Camera $camname motion detection source set to \"$hash->{HELPER}{MOTDETSC}\" with options sensitivity: $sensitivity, threshold: $threshold");
} elsif ($hash->{HELPER}{MOTDETSC} eq "camera" && keys %{$hash->{HELPER}{MOTDETOPTIONS}}) { # Optionen für "camera" sind gesetzt
$sensitivity = ($hash->{HELPER}{MOTDETOPTIONS}{SENSITIVITY}) ? ($hash->{HELPER}{MOTDETOPTIONS}{SENSITIVITY}) : "-";
my $objectSize = ($hash->{HELPER}{MOTDETOPTIONS}{OBJECTSIZE}) ? ($hash->{HELPER}{MOTDETOPTIONS}{OBJECTSIZE}) : "-";
my $percentage = ($hash->{HELPER}{MOTDETOPTIONS}{PERCENTAGE}) ? ($hash->{HELPER}{MOTDETOPTIONS}{PERCENTAGE}) : "-";
Log3($name, 3, "$name - Camera $camname motion detection source set to \"$hash->{HELPER}{MOTDETSC}\" with options sensitivity: $sensitivity, objectSize: $objectSize, percentage: $percentage");
} else { # keine Optionen Bewegungserkennung wurden gesetzt
Log3($name, 3, "$name - Camera $camname motion detection source set to \"$hash->{HELPER}{MOTDETSC}\" ");
}
setReadingErrorNone( $hash, 1 );
__getMotionEnum ($hash); # neu gesetzte Parameter abrufen
return;
}
###############################################################################
# Parse OpMode getsvslog
###############################################################################
sub _parsegetsvslog { ## no critic "not used"
my $paref = shift;
my $hash = $paref->{hash};
my $name = $paref->{name};
my $data = $paref->{data};
my $lec = $data->{'data'}{'total'}; # abgerufene Anzahl von Log-Einträgen
my $log = q{};
my $log0 = q{};
my $i = 0;
while ($data->{'data'}->{'log'}->[$i]) {
my $id = $data->{'data'}->{'log'}->[$i]{'id'};
my $un = $data->{'data'}->{'log'}->[$i]{'user_name'};
my $desc = $data->{'data'}->{'log'}->[$i]{'desc'};
my $level = $data->{'data'}->{'log'}->[$i]{'type'};
$level = ($level == 3) ? "Error" : ($level == 2) ? "Warning" : "Information";
my $time = FmtDateTime($data->{'data'}->{'log'}->[$i]{'time'});
$log0 = $time." - ".$level." - ".$desc if($i == 0);
$log .= "$time - $level - $desc<br>";
$i++;
}
$log = "<html><b>Surveillance Station Server \"$hash->{SERVERADDR}\" Log</b> ( $i/$lec entries are displayed )<br><br>$log</html>";
# asyncOutput kann normalerweise etwa 100k uebertragen (siehe fhem.pl/addToWritebuffer() fuer Details)
# bzw. https://forum.fhem.de/index.php/topic,77310.0.html
# $log = "Too much log data were selected. Please reduce amount of data by specifying all or one of 'severity', 'limit', 'match'" if (length($log) >= 102400);
readingsBeginUpdate ($hash);
readingsBulkUpdate ($hash,"LastLogEntry",$log0) if(!$hash->{HELPER}{CL}{1}); # Datenabruf im Hintergrund;
readingsBulkUpdate ($hash,"Errorcode","none");
readingsBulkUpdate ($hash,"Error","none");
readingsEndUpdate ($hash, 1);
# Ausgabe Popup der Log-Daten (nach readingsEndUpdate positionieren sonst "Connection lost, trying reconnect every 5 seconds" wenn > 102400 Zeichen)
asyncOutput($hash->{HELPER}{CL}{1},"$log");
delete($hash->{HELPER}{CL});
return;
}
###############################################################################
# Parse OpMode SaveRec
###############################################################################
sub _parseSaveRec { ## no critic "not used"
my $paref = shift;
my $hash = $paref->{hash};
my $name = $paref->{name};
my $myjson = $paref->{myjson};
my $err;
my $lrec = ReadingsVal("$name", "CamLastRec", "");
$lrec = (split("/",$lrec))[1];
my $sp = $hash->{HELPER}{RECSAVEPATH} // $attr{global}{modpath};
my $file = $sp."/$lrec";
delete $hash->{HELPER}{RECSAVEPATH};
open my $fh, '>', $file or do { $err = qq{Can't open file "$file": $!};
Log3($name, 2, "$name - $err");
};
if(!$err) {
$err = "none";
binmode $fh;
print $fh $myjson;
close($fh);
Log3($name, 3, qq{$name - Recording was saved to local file "$file"});
}
readingsBeginUpdate ($hash);
readingsBulkUpdate ($hash, "Errorcode", "none");
readingsBulkUpdate ($hash, "Error", $err );
readingsEndUpdate ($hash, 1);
return;
}
#############################################################################################
# Autocreate für Kameras
# $sn = Name der Kamera in SVS