mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-03 04:36:36 +00:00
70_ZoneMinder: fetching Event-Details via API after event received
git-svn-id: https://svn.fhem.de/fhem/trunk@18501 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
15ffbabd64
commit
ae36156690
@ -238,6 +238,8 @@ sub ZoneMinder_SimpleGet {
|
||||
$apiParam->{header} .= "Cookie: " . $hash->{HTTPCookies};
|
||||
}
|
||||
|
||||
Log3 $name, 4, "ZoneMinder ($name) SimpleGet calling $url with callback $callback";
|
||||
|
||||
HttpUtils_NonblockingGet($apiParam);
|
||||
}
|
||||
|
||||
@ -336,13 +338,13 @@ sub ZoneMinder_GetFromJson {
|
||||
# Log3 $name, 5, "json: $config";
|
||||
my $searchLength = length($searchString);
|
||||
my $startIdx = index($config, $searchString);
|
||||
Log3 $name, 5, "$searchString found at $startIdx";
|
||||
Log3 $name, 5, "ZoneMinder ($name) - $searchString found at $startIdx";
|
||||
$startIdx += $searchLength;
|
||||
my $endIdx = index($config, $endChar, $startIdx);
|
||||
my $frame = $endIdx - $startIdx;
|
||||
my $searchResult = substr $config, $startIdx, $frame;
|
||||
|
||||
Log3 $name, 5, "looking for $searchString - length: $searchLength. start: $startIdx. end: $endIdx. result: $searchResult";
|
||||
Log3 $name, 5, "ZoneMinder ($name) - looking for $searchString - length: $searchLength. start: $startIdx. end: $endIdx. result: $searchResult";
|
||||
|
||||
return $searchResult;
|
||||
}
|
||||
@ -360,7 +362,7 @@ sub ZoneMinder_API_UpdateMonitors_Callback {
|
||||
if ( $monitorId =~ /^[0-9]+$/ ) {
|
||||
ZoneMinder_UpdateMonitorAttributes($hash, $monitorData, $monitorId);
|
||||
} else {
|
||||
Log3 $name, 0, "Invalid monitorId: $monitorId" unless ('itors' eq $monitorId);
|
||||
Log3 $name, 0, "ZoneMinder ($name) - Invalid monitorId: $monitorId" unless ('itors' eq $monitorId);
|
||||
}
|
||||
}
|
||||
|
||||
@ -413,36 +415,50 @@ sub ZoneMinder_GetCookies {
|
||||
|
||||
sub ZoneMinder_Write {
|
||||
my ( $hash, $arguments) = @_;
|
||||
my $name = $hash->{NAME};
|
||||
my $method = $arguments->{method};
|
||||
|
||||
if ($method eq 'changeMonitorFunction') {
|
||||
|
||||
my $zmMonitorId = $arguments->{zmMonitorId};
|
||||
my $zmFunction = $arguments->{zmFunction};
|
||||
Log3 $hash->{NAME}, 4, "method: $method, monitorId:$zmMonitorId, Function:$zmFunction";
|
||||
Log3 $name, 4, "ZoneMinder ($name) method: $method, monitorId:$zmMonitorId, Function:$zmFunction";
|
||||
return ZoneMinder_API_ChangeMonitorState($hash, $zmMonitorId, $zmFunction, undef);
|
||||
|
||||
} elsif ($method eq 'changeMonitorEnabled') {
|
||||
|
||||
my $zmMonitorId = $arguments->{zmMonitorId};
|
||||
my $zmEnabled = $arguments->{zmEnabled};
|
||||
Log3 $hash->{NAME}, 4, "method: $method, monitorId:$zmMonitorId, Enabled:$zmEnabled";
|
||||
Log3 $name, 4, "ZoneMinder ($name) method: $method, monitorId:$zmMonitorId, Enabled:$zmEnabled";
|
||||
return ZoneMinder_API_ChangeMonitorState($hash, $zmMonitorId, undef, $zmEnabled);
|
||||
|
||||
} elsif ($method eq 'changeMonitorAlarm') {
|
||||
|
||||
my $zmMonitorId = $arguments->{zmMonitorId};
|
||||
my $zmAlarm = $arguments->{zmAlarm};
|
||||
Log3 $hash->{NAME}, 4, "method: $method, monitorId:$zmMonitorId, Alarm:$zmAlarm";
|
||||
Log3 $name, 4, "ZoneMinder ($name) method: $method, monitorId:$zmMonitorId, Alarm:$zmAlarm";
|
||||
return ZoneMinder_Trigger_ChangeAlarmState($hash, $zmMonitorId, $zmAlarm);
|
||||
|
||||
} elsif ($method eq 'changeMonitorText') {
|
||||
|
||||
my $zmMonitorId = $arguments->{zmMonitorId};
|
||||
my $zmText = $arguments->{text};
|
||||
Log3 $hash->{NAME}, 4, "method: $method, monitorId:$zmMonitorId, Text:$zmText";
|
||||
Log3 $name, 4, "ZoneMinder ($name) method: $method, monitorId:$zmMonitorId, Text:$zmText";
|
||||
return ZoneMinder_Trigger_ChangeText($hash, $zmMonitorId, $zmText);
|
||||
|
||||
} elsif ($method eq 'queryEventDetails') {
|
||||
|
||||
my $zmApiUrl = ZoneMinder_getZmApiUrl($hash);
|
||||
if ( not defined($zmApiUrl) ) {
|
||||
return undef;
|
||||
}
|
||||
|
||||
my $zmMonitorId = $arguments->{zmMonitorId};
|
||||
my $zmEventId = $arguments->{zmEventId};
|
||||
Log3 $name, 4, "ZoneMinder ($name) method: $method, monitorId:$zmMonitorId, EventId:$zmEventId";
|
||||
ZoneMinder_SimpleGet($hash, "$zmApiUrl/events/$zmEventId.json", \&ZoneMinder_API_QueryEventDetails_Callback);
|
||||
return undef;
|
||||
|
||||
}
|
||||
|
||||
return undef;
|
||||
@ -503,6 +519,35 @@ sub ZoneMinder_API_ChangeMonitorState_Callback {
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub ZoneMinder_API_QueryEventDetails_Callback {
|
||||
my ($param, $err, $data) = @_;
|
||||
my $hash = $param->{hash};
|
||||
my $name = $hash->{NAME};
|
||||
|
||||
my $zmMonitorId = ZoneMinder_GetConfigValueByKey($hash, $data, 'MonitorId');
|
||||
my $zmEventId = ZoneMinder_GetConfigValueByKey($hash, $data, 'Id');
|
||||
my $zmNotes = ZoneMinder_GetConfigValueByKey($hash, $data, 'Notes');
|
||||
|
||||
# my $logDevHash = $modules{ZM_Monitor}{defptr}{$name.'_'.$zmMonitorId};
|
||||
|
||||
Log3 $name, 4, "ZoneMinder ($name) - QueryEventDetails_Callback zmMonitorId: $zmMonitorId, zmEventId: $zmEventId, zmNotes: $zmNotes";
|
||||
|
||||
Dispatch($hash, "eventDetails:$zmMonitorId|$zmEventId|$zmNotes", undef);
|
||||
|
||||
# foreach my $monitorData (@monitors) {
|
||||
# my $monitorId = ZoneMinder_GetConfigValueByKey($hash, $monitorData, 'Id');
|
||||
|
||||
# if ( $monitorId =~ /^[0-9]+$/ ) {
|
||||
# my $dispatchResult = Dispatch($hash, "createMonitor:$monitorId", undef);
|
||||
# }
|
||||
# }
|
||||
# my $zmApiUrl = ZoneMinder_getZmApiUrl($hash);
|
||||
# ZoneMinder_SimpleGet($hash, "$zmApiUrl/monitors.json", \&ZoneMinder_API_UpdateMonitors_Callback);
|
||||
|
||||
return undef;
|
||||
}
|
||||
|
||||
|
||||
sub ZoneMinder_Trigger_ChangeAlarmState {
|
||||
my ( $hash, $zmMonitorId, $zmAlarm ) = @_;
|
||||
my $name = $hash->{NAME};
|
||||
|
@ -255,6 +255,8 @@ sub ZM_Monitor_Parse {
|
||||
my $msgType = $msg[0];
|
||||
if ($msgType eq 'event') {
|
||||
return ZM_Monitor_handleEvent($io_hash, $msg[1]);
|
||||
} elsif ($msgType eq 'eventDetails') {
|
||||
return ZM_Monitor_handleZoneUpdate($io_hash, $msg[1]);
|
||||
} elsif ($msgType eq 'createMonitor') {
|
||||
return ZM_Monitor_handleMonitorCreation($io_hash, $msg[1]);
|
||||
} elsif ($msgType eq 'monitor') {
|
||||
@ -277,10 +279,13 @@ sub ZM_Monitor_handleEvent {
|
||||
my $eventId = $msgTokens[3];
|
||||
|
||||
my $logDevAddress = $ioName.'_'.$zmMonitorId;
|
||||
Log3 $io_hash, 5, "Handling event for logical device $logDevAddress";
|
||||
Log3 $io_hash, 5, "ZM_Monitor Handling event for logical device $logDevAddress";
|
||||
# wenn bereits eine Gerätedefinition existiert (via Definition Pointer aus Define-Funktion)
|
||||
if(my $hash = $modules{ZM_Monitor}{defptr}{$logDevAddress}) {
|
||||
Log3 $hash, 5, "Logical device $logDevAddress found. Writing readings";
|
||||
my $name = $hash->{NAME};
|
||||
Log3 $hash, 5, "ZM_Monitor ($name) Logical device $logDevAddress found. Writing readings";
|
||||
|
||||
ZM_Monitor_queryEventDetails($hash, $eventId);
|
||||
|
||||
readingsBeginUpdate($hash);
|
||||
ZM_Monitor_createEventStreamUrl($hash, $eventId);
|
||||
@ -294,19 +299,54 @@ sub ZM_Monitor_handleEvent {
|
||||
readingsBulkUpdate($hash, "alert", $alertState, 1);
|
||||
readingsBulkUpdate($hash, "lastEventTimestamp", $eventTs);
|
||||
readingsBulkUpdate($hash, "lastEventId", $eventId);
|
||||
readingsBulkUpdate($hash, "lastEventNotes", '');
|
||||
readingsEndUpdate($hash, 1);
|
||||
|
||||
Log3 $hash, 5, "Writing readings done. Now returning log dev name: $hash->{NAME}";
|
||||
Log3 $hash, 5, "ZM_Monitor ($name) Writing readings done. Now returning log dev name: $hash->{NAME}";
|
||||
# Rückgabe des Gerätenamens, für welches die Nachricht bestimmt ist.
|
||||
return $hash->{NAME};
|
||||
} else {
|
||||
# Keine Gerätedefinition verfügbar. Daher Vorschlag define-Befehl: <NAME> <MODULNAME> <ADDRESSE>
|
||||
my $autocreate = "UNDEFINED ZM_Monitor_$logDevAddress ZM_Monitor $zmMonitorId";
|
||||
Log3 $io_hash, 5, "logical device with address $logDevAddress not found. returning autocreate: $autocreate";
|
||||
Log3 $io_hash, 5, "ZM_Monitor logical device with address $logDevAddress not found. returning autocreate: $autocreate";
|
||||
return $autocreate;
|
||||
}
|
||||
}
|
||||
|
||||
sub ZM_Monitor_queryEventDetails {
|
||||
my ( $hash, $eventId ) = @_;
|
||||
|
||||
my $arguments = {
|
||||
method => 'queryEventDetails',
|
||||
zmMonitorId => $hash->{helper}{ZM_MONITOR_ID},
|
||||
zmEventId => $eventId
|
||||
};
|
||||
my $result = IOWrite($hash, $arguments);
|
||||
}
|
||||
|
||||
sub ZM_Monitor_handleZoneUpdate {
|
||||
my ( $io_hash, $message ) = @_;
|
||||
|
||||
my $ioName = $io_hash->{NAME};
|
||||
my @msgTokens = split(/\|/, $message);
|
||||
my $zmMonitorId = $msgTokens[0];
|
||||
my $zmEventId = $msgTokens[1];
|
||||
my $zmNotes = $msgTokens[2];
|
||||
my $logDevAddress = $ioName.'_'.$zmMonitorId;
|
||||
|
||||
if(my $hash = $modules{ZM_Monitor}{defptr}{$logDevAddress}) {
|
||||
readingsSingleUpdate($hash, 'lastEventNotes', $zmNotes, 1);
|
||||
|
||||
return $hash->{NAME}
|
||||
} else {
|
||||
# Keine Gerätedefinition verfügbar. Daher Vorschlag define-Befehl: <NAME> <MODULNAME> <ADDRESSE>
|
||||
my $autocreate = "UNDEFINED ZM_Monitor_$logDevAddress ZM_Monitor $zmMonitorId";
|
||||
Log3 $io_hash, 5, "ZM_Monitor logical device with address $logDevAddress not found. returning autocreate: $autocreate";
|
||||
return $autocreate;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#for now, this is nearly a duplicate of writing the streamUrl reading.
|
||||
#will need some love to make better use of existing code.
|
||||
sub ZM_Monitor_createEventStreamUrl {
|
||||
|
Loading…
x
Reference in New Issue
Block a user