Intrusion Events
Overview
Intrusion events cover all perimeter and zone-based detections: someone entering a defined zone, crossing a tripwire, loitering in an area, or parking illegally. All intrusion events have category === 'intrusion'.
Events arrive through ViewtronServer's 'event' emitter like any other category. The parseEvent() factory returns a ViewtronEvent object with the same interface regardless of whether the source is an IPC camera or NVR.
Event Types
IPC cameras (v1.x firmware) and NVRs (v2.0 firmware) use different smartType values. The SDK normalizes both into the same ViewtronEvent object.
IPC v1.x Event Types
| eventType | eventDescription | Description |
|---|---|---|
PEA | 'Line Crossing / Intrusion' | Perimeter intrusion or tripwire crossing |
AOIENTRY | 'Intrusion Zone Entry' | Entry into a defined zone |
AOILEAVE | 'Intrusion Zone Exit' | Exit from a defined zone |
LOITER | 'Loitering Detection' | Loitering beyond a time threshold |
PVD | 'Illegal Parking' | Parking violation detection |
PEA handles both zone intrusion and tripwire line crossing on IPC cameras. The raw XML contains either a \<perimeter> block (zone) or a \<tripwire> block (line crossing), but the SDK returns the same event type for both.
NVR v2.0 Event Types
| eventType | eventDescription | Description |
|---|---|---|
regionIntrusion | 'Perimeter Intrusion' | Zone / perimeter intrusion |
lineCrossing | 'Line Crossing' | Tripwire / line crossing |
NVR v2.0 separates intrusion and line crossing into distinct event types. IPC uses PEA for both.
Properties
Every intrusion event includes the common ViewtronEvent properties (source, category, cameraName, timestamp, etc.) plus these intrusion-specific fields.
eventType
The raw smartType value from the camera XML.
Type: string
event.eventType // 'PEA', 'AOIENTRY', 'regionIntrusion', 'lineCrossing', etc.
eventDescription
Human-readable label for the event type.
Type: string
event.eventDescription // 'Line Crossing / Intrusion', 'Perimeter Intrusion', etc.
Full mapping:
| eventType | eventDescription |
|---|---|
PEA | 'Line Crossing / Intrusion' |
AOIENTRY | 'Intrusion Zone Entry' |
AOILEAVE | 'Intrusion Zone Exit' |
LOITER | 'Loitering Detection' |
PVD | 'Illegal Parking' |
regionIntrusion | 'Perimeter Intrusion' |
lineCrossing | 'Line Crossing' |
targetType
What the camera detected. IPC cameras send numeric IDs that the SDK maps to strings. NVR sends strings directly.
Type: string
| Value | Meaning |
|---|---|
'person' | Human detected |
'car' | Car detected |
'motorcycle' | Motorcycle or bicycle detected |
event.targetType // 'person', 'car', 'motorcycle'
IPC mapping: 1 = 'person', 2 = 'car', 4 = 'motorcycle'. The SDK handles this conversion automatically.
eventId
Identifier for the detection event.
Type: string
Source: IPC — from \<perimeter> or \<tripwire> XML block. NVR — from \<eventInfo> block.
event.eventId // e.g., '1'
targetId
Identifier for the tracked target within the event.
Type: string
Source: IPC — from \<perimeter> or \<tripwire> XML block. NVR — from \<eventInfo> block.
event.targetId // e.g., '3'
status
IPC only. Lifecycle stage of the detection event.
Type: string
| Value | Meaning |
|---|---|
'SMART_START' | Detection begins |
'PROCEDURE' | Detection ongoing |
'SMART_STOP' | Detection ends |
event.status // 'SMART_START', 'PROCEDURE', 'SMART_STOP'
NVR events do not include a status field. This property will be an empty string for NVR events.
boundary
NVR only. The type of boundary that was triggered.
Type: string
| Value | Meaning |
|---|---|
'area' | Zone / perimeter boundary |
'tripwire' | Tripwire / line crossing |
event.boundary // 'area', 'tripwire'
IPC events do not include a boundary field. For IPC, the boundary type is implicit: PEA events with a \<perimeter> block are zone intrusions, and those with a \<tripwire> block are line crossings. This property will be an empty string for IPC events.
IPC vs NVR Comparison
| Feature | IPC v1.x | NVR v2.0 |
|---|---|---|
| Event types | PEA, AOIENTRY, AOILEAVE, LOITER, PVD | regionIntrusion, lineCrossing |
| Target type | Numeric ID in XML, SDK maps to string | String directly from \<targetListInfo> |
| Event/target IDs | From \<perimeter> or \<tripwire> block | From \<eventInfo> block |
| Status lifecycle | SMART_START / PROCEDURE / SMART_STOP | Not available |
| Boundary type | Implicit (XML block structure) | Explicit ('area' or 'tripwire') |
| Channel ID | Not available | channelId property |
| Device IP / MAC | Not available | cameraIp, cameraMac properties |
Code Examples
Basic Intrusion Handling
const { ViewtronServer } = require('viewtron-sdk');
const server = new ViewtronServer({ port: 5050 });
server.on('event', (event, clientIP) => {
if (event.category === 'intrusion') {
console.log(`[${event.timestamp}] ${event.eventDescription} on ${event.cameraName}`);
console.log(` Target: ${event.targetType || 'unknown'}`);
}
});
server.start();
Filtering by Event Type
server.on('event', (event, clientIP) => {
if (event.category !== 'intrusion') return;
switch (event.eventType) {
case 'PEA':
case 'regionIntrusion':
console.log('Zone intrusion detected');
break;
case 'lineCrossing':
console.log('Line crossing detected');
break;
case 'LOITER':
console.log('Loitering detected');
break;
case 'AOIENTRY':
console.log('Zone entry');
break;
case 'AOILEAVE':
console.log('Zone exit');
break;
case 'PVD':
console.log('Illegal parking');
break;
}
});
Saving Images
const fs = require('fs');
server.on('event', (event, clientIP) => {
if (event.category !== 'intrusion') return;
if (!event.hasImages) return;
const ts = Date.now();
if (event.sourceImageBytes) {
fs.writeFileSync(`intrusion_${ts}.jpg`, event.sourceImageBytes);
}
if (event.targetImageBytes) {
fs.writeFileSync(`intrusion_target_${ts}.jpg`, event.targetImageBytes);
}
});
sourceImageBytes and targetImageBytes are lazy getters that decode the base64 data to a Buffer on first access. If you only need to check whether images exist, use the hasImages getter to avoid decoding.
Combined with Other Event Types
server.on('event', (event, clientIP) => {
switch (event.category) {
case 'lpr':
console.log(`Plate: ${event.plateNumber}`);
break;
case 'intrusion':
console.log(`Intrusion: ${event.eventDescription}`);
break;
case 'face':
console.log('Face detected');
break;
}
});
Related Pages
- ViewtronEvent — common properties and category routing
- Images — working with event images (sourceImageBytes, targetImageBytes, hasImages)
- API Reference: Intrusion/Perimeter Detection — raw XML endpoint documentation, detection zone configuration