Skip to content

Please Add my code for 0-23Hour 0n/off Zone Operation #24

Closed
@DAVITALI

Description

@DAVITALI

I did not need 24x7 Motion detection, So I added a new Feature where zones have a Timestart and timeend. I needed An Active zone for Midnight till 3am.

My modifications for putting on/off time on Zones:

Modify zm_create.sql file:

In CREATE TABLE ZonePresets ( Section add:
OverloadFrames smallint(5) unsigned NOT NULL default '0',

++TimeStart tinyint(2) unsigned NOT NULL default '0',
++TimeEnd tinyint(2) unsigned NOT NULL default '23' ,

In CREATE TABLE Zones ( Section add:
OverloadFrames smallint(5) unsigned NOT NULL default '0',

++TimeStart tinyint(2) unsigned NOT NULL default '0',
++TimeEnd tinyint(2) unsigned NOT NULL default '23' ,

ADD TWO COLUMNS: ,0,23
--INSERT INTO ZonePresets VALUES (1,'Fast, low sensitivity','Active','Percent','AlarmedPixels',60,NULL,20,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,);
--INSERT INTO ZonePresets VALUES (2,'Fast, medium sensitivity','Active','Percent','AlarmedPixels',40,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);
--INSERT INTO ZonePresets VALUES (3,'Fast, high sensitivity','Active','Percent','AlarmedPixels',20,NULL,5,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,);
--INSERT INTO ZonePresets VALUES (4,'Best, low sensitivity','Active','Percent','Blobs',60,NULL,36,NULL,7,7,24,NULL,20,NULL,1,NULL,0);
--INSERT INTO ZonePresets VALUES (5,'Best, medium sensitivity','Active','Percent','Blobs',40,NULL,16,NULL,5,5,12,NULL,10,NULL,1,NULL,0);
--INSERT INTO ZonePresets VALUES (6,'Best, high sensitivity','Active','Percent','Blobs',20,NULL,8,NULL,3,3,6,NULL,5,NULL,1,NULL,0);

++INSERT INTO ZonePresets VALUES (1,'Fast, low sensitivity','Active','Percent','AlarmedPixels',60,NULL,20,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,23);
++INSERT INTO ZonePresets VALUES (2,'Fast, medium sensitivity','Active','Percent','AlarmedPixels',40,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,23);
++INSERT INTO ZonePresets VALUES (3,'Fast, high sensitivity','Active','Percent','AlarmedPixels',20,NULL,5,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,23);
++INSERT INTO ZonePresets VALUES (4,'Best, low sensitivity','Active','Percent','Blobs',60,NULL,36,NULL,7,7,24,NULL,20,NULL,1,NULL,0,0,23);
++INSERT INTO ZonePresets VALUES (5,'Best, medium sensitivity','Active','Percent','Blobs',40,NULL,16,NULL,5,5,12,NULL,10,NULL,1,NULL,0,0,23);
++INSERT INTO ZonePresets VALUES (6,'Best, high sensitivity','Active','Percent','Blobs',20,NULL,8,NULL,3,3,6,NULL,5,NULL,1,NULL,0,0,23);

Modify your favorite language file, default: en_gb.php:

'TimeStamp' => 'Time Stamp',
++ 'TimeStart' => 'TimeStart',
++ 'TimeEnd' => 'TimeEnd',

and also:

'ZoneOverloadFrames' => 'Overload Frame Ignore Count',
++ 'ZoneTimeStart' => 'Time Start',
++ 'ZoneTimeEnd' => 'Time End',

Modify big5_big5.php
add:

'ZoneOverloadFrames' => 'Overload Frame Ignore Count',
++ 'ZoneTimeStart' => 'Time Start',
++ 'ZoneTimeEnd' => 'Time End',

Modify zone.php:

'OverloadFrames' => '',
++ 'TimeStart' => '0',
++ 'TimeEnd' => '23',

and:

++
++
++ <input type="text" name="newZone[TimeStart]" value="" size="4"++
++ onchange="limitRange( this, 0,23 )"
++ />
++
++
++
++ <input type="text" name="newZone[TimeEnd]" value="" size="4"
++ onchange="limitRange( this, 0,23 )"
++ />
++

// The avove fixes Database structure, and new additions. Now to SRC Files::

In Src file zm_zone.h add:

int overload_frames;
++ int time_start;
++ int time_end;

--protected:

-- void Setup( Monitor *p_monitor, int p_id, const char *p_label, ZoneType p_type, const Polygon &p_polygon, const Rgb p_alarm_rgb, CheckMethod p_check_method, int p_min_pixel_threshold, int p_max_pixel_threshold, int p_min_alarm_pixels, int p_max_alarm_pixels, const Coord &p_filter_box, int p_min_filter_pixels, int p_max_filter_pixels, int p_min_blob_pixels, int p_max_blob_pixels, int p_min_blobs, int p_max_blobs, int p_overload_frames, int p_time_start, int p_time_end);

--public:
-- Zone( Monitor *p_monitor, int p_id, const char *p_label, ZoneType p_type, const Polygon &p_polygon, const Rgb p_alarm_rgb, CheckMethod p_check_method, int p_min_pixel_threshold=15, int p_max_pixel_threshold=0, int p_min_alarm_pixels=50, int p_max_alarm_pixels=75000, const Coord &p_filter_box=Coord( 3, 3 ), int p_min_filter_pixels=50, int p_max_filter_pixels=50000, int p_min_blob_pixels=10, int p_max_blob_pixels=0, int p_min_blobs=0, int p_max_blobs=0, int p_overload_frames=0 , int p_time_start=0, int p_time_end=23)
-- {
-- Setup( p_monitor, p_id, p_label, p_type, p_polygon, p_alarm_rgb, p_check_method, p_min_pixel_threshold, p_max_pixel_threshold, p_min_alarm_pixels, p_max_alarm_pixels, p_filter_box, p_min_filter_pixels, p_max_filter_pixels, p_min_blob_pixels, p_max_blob_pixels, p_min_blobs, p_max_blobs, p_overload_frames, p_time_start, p_time_end );
-- }
-- Zone( Monitor *p_monitor, int p_id, const char *p_label, const Polygon &p_polygon, const Rgb p_alarm_rgb, CheckMethod p_check_method, int p_min_pixel_threshold=15, int p_max_pixel_threshold=0, int p_min_alarm_pixels=50, int p_max_alarm_pixels=75000, const Coord &p_filter_box=Coord( 3, 3 ), int p_min_filter_pixels=50, int p_max_filter_pixels=50000, int p_min_blob_pixels=10, int p_max_blob_pixels=0, int p_min_blobs=0, int p_max_blobs=0, int p_overload_frames=0, int p_time_start=0, int p_time_end=23 )
-- {
-- Setup( p_monitor, p_id, p_label, Zone::ACTIVE, p_polygon, p_alarm_rgb, p_check_method, p_min_pixel_threshold, p_max_pixel_threshold, p_min_alarm_pixels, p_max_alarm_pixels, p_filter_box, p_min_filter_pixels, p_max_filter_pixels, p_min_blob_pixels, p_max_blob_pixels, p_min_blobs, p_max_blobs, p_overload_frames , p_time_start, p_time_end);
-- }

++protected:
++ void Setup( Monitor *p_monitor, int p_id, const char *p_label, ZoneType p_type, const Polygon &p_polygon, const Rgb p_alarm_rgb, CheckMethod p_check_method, int p_min_pixel_threshold, int p_max_pixel_threshold, int p_min_alarm_pixels, int p_max_alarm_pixels, const Coord &p_filter_box, int p_min_filter_pixels, int p_max_filter_pixels, int p_min_blob_pixels, int p_max_blob_pixels, int p_min_blobs, int p_max_blobs, int p_overload_frames, int p_time_start, int p_time_end);
++
++public:
++ Zone( Monitor *p_monitor, int p_id, const char *p_label, ZoneType p_type, const Polygon &p_polygon, const Rgb p_alarm_rgb, CheckMethod p_check_method, int p_min_pixel_threshold=15, int p_max_pixel_threshold=0, int p_min_alarm_pixels=50, int p_max_alarm_pixels=75000, const Coord &p_filter_box=Coord( 3, 3 ), int p_min_filter_pixels=50, int p_max_filter_pixels=50000, int p_min_blob_pixels=10, int p_max_blob_pixels=0, int p_min_blobs=0, int p_max_blobs=0, int p_overload_frames=0 , int p_time_start=0, int p_time_end=23)
++ {
++ Setup( p_monitor, p_id, p_label, p_type, p_polygon, p_alarm_rgb, p_check_method, p_min_pixel_threshold, p_max_pixel_threshold, p_min_alarm_pixels, p_max_alarm_pixels, p_filter_box, p_min_filter_pixels, p_max_filter_pixels, p_min_blob_pixels, p_max_blob_pixels, p_min_blobs, p_max_blobs, p_overload_frames, p_time_start, p_time_end );
++ }
++ Zone( Monitor *p_monitor, int p_id, const char *p_label, const Polygon &p_polygon, const Rgb p_alarm_rgb, CheckMethod p_check_method, int p_min_pixel_threshold=15, int p_max_pixel_threshold=0, int p_min_alarm_pixels=50, int p_max_alarm_pixels=75000, const Coord &p_filter_box=Coord( 3, 3 ), int p_min_filter_pixels=50, int p_max_filter_pixels=50000, int p_min_blob_pixels=10, int p_max_blob_pixels=0, int p_min_blobs=0, int p_max_blobs=0, int p_overload_frames=0, int p_time_start=0, int p_time_end=23 )
++ {
++ Setup( p_monitor, p_id, p_label, Zone::ACTIVE, p_polygon, p_alarm_rgb, p_check_method, p_min_pixel_threshold, p_max_pixel_threshold, p_min_alarm_pixels, p_max_alarm_pixels, p_filter_box, p_min_filter_pixels, p_max_filter_pixels, p_min_blob_pixels, p_max_blob_pixels, p_min_blobs, p_max_blobs, p_overload_frames , p_time_start, p_time_end);
++ }

--Setup( p_monitor, p_id, p_label, Zone::INACTIVE, p_polygon, RGB_BLACK, (Zone::CheckMethod)0, 0, 0, 0, 0, Coord( 0, 0 ), 0, 0, 0, 0, 0, 0, 0 );

++Setup( p_monitor, p_id, p_label, Zone::INACTIVE, p_polygon, RGB_BLACK, (Zone::CheckMethod)0, 0, 0, 0, 0, Coord( 0, 0 ), 0, 0, 0, 0, 0, 0, 0, 0, 0 );

Lastly:
inline unsigned int Score() const { return( score ); }
++ inline bool TimeFlag() const
++ {
++ int hr;
++ int zonetimestart=time_start;
++ int zonetimeend=time_end;
++ time_t rawtime;
++ struct tm *timeinfo;
++ time( &rawtime );
++ timeinfo=localtime (&rawtime);
++ hr=timeinfo->tm_hour;
++ if ((zonetimeend-zonetimestart) > 0)
++ {
++
++ if ( (hr >= zonetimestart) & (hr <= zonetimeend ) )
++ {
++ return (true);
++ }
++ }
++ if ((zonetimeend-zonetimestart) < 0)
++ {
++ if ( (hr >= zonetimestart) or (hr < zonetimeend ) )
++ {
++ return (true);
++ }
++ }
++ if ((zonetimeend-zonetimestart) == 0)
++ {
++ if ( (hr == zonetimestart) )
++ {
++ return (true);
++ }
++ }
++ return (false );
++ }

In SRC File zm_zone.cpp

--void Zone::Setup( Monitor *p_monitor, int p_id, const char *p_label, ZoneType p_type, const Polygon &p_polygon, const Rgb p_alarm_rgb, CheckMethod p_check_method, int p_min_pixel_threshold, int p_max_pixel_threshold, int p_min_alarm_pixels, int p_max_alarm_pixels, const Coord &p_filter_box, int p_min_filter_pixels, int p_max_filter_pixels, int p_min_blob_pixels, int p_max_blob_pixels, int p_min_blobs, int p_max_blobs, int p_overload_frames )

++void Zone::Setup( Monitor *p_monitor, int p_id, const char *p_label, ZoneType p_type, const Polygon &p_polygon, const Rgb p_alarm_rgb, CheckMethod p_check_method, int p_min_pixel_threshold, int p_max_pixel_threshold, int p_min_alarm_pixels, int p_max_alarm_pixels, const Coord &p_filter_box, int p_min_filter_pixels, int p_max_filter_pixels, int p_min_blob_pixels, int p_max_blob_pixels, int p_min_blobs, int p_max_blobs, int p_overload_frames, int p_time_start, int p_time_end )

ADD:
overload_frames = p_overload_frames;
++ time_start=p_time_start;
++ time_end=p_time_end;

-- Debug( 1, "Initialised zone %d/%s - %d - %dx%d - Rgb:%06x, CM:%d, MnAT:%d, MxAT:%d, MnAP:%d, MxAP:%d, FB:%dx%d, MnFP:%d, MxFP:%d, MnBS:%d, MxBS:%d, MnB:%d, MxB:%d, OF: %d", id, label, type, polygon.Width(), polygon.Height(), alarm_rgb, check_method, min_pixel_threshold, max_pixel_threshold, min_alarm_pixels, max_alarm_pixels, filter_box.X(), filter_box.Y(), min_filter_pixels, max_filter_pixels, min_blob_pixels, max_blob_pixels, min_blobs, max_blobs, overload_frames ,time_start,time_end);

++ Debug( 1, "Initialised zone %d/%s - %d - %dx%d - Rgb:%06x, CM:%d, MnAT:%d, MxAT:%d, MnAP:%d, MxAP:%d, FB:%dx%d, MnFP:%d, MxFP:%d, MnBS:%d, MxBS:%d, MnB:%d, MxB:%d, OF: %d, ZoneTimeStart: %d, ZoneTimeEnd: %d", id, label, type, polygon.Width(), polygon.Height(), alarm_rgb, check_method, min_pixel_threshold, max_pixel_threshold, min_alarm_pixels, max_alarm_pixels, filter_box.X(), filter_box.Y(), min_filter_pixels, max_filter_pixels, min_blob_pixels, max_blob_pixels, min_blobs, max_blobs, overload_frames ,time_start,time_end);

-- snprintf( sql, sizeof(sql), "select Id,Name,Type+0,Units,NumCoords,Coords,AlarmRGB,CheckMethod+0,MinPixelThreshold,MaxPixelThreshold,MinAlarmPixels,MaxAlarmPixels,FilterX,FilterY,MinFilterPixels,MaxFilterPixels,MinBlobPixels,MaxBlobPixels,MinBlobs,MaxBlobs,OverloadFrames from Zones where MonitorId = %d order by Type, Id", monitor->Id() );

++snprintf( sql, sizeof(sql), "select Id,Name,Type+0,Units,NumCoords,Coords,AlarmRGB,CheckMethod+0,MinPixelThreshold,MaxPixelThreshold,MinAlarmPixels,MaxAlarmPixels,FilterX,FilterY,MinFilterPixels,MaxFilterPixels,MinBlobPixels,MaxBlobPixels,MinBlobs,MaxBlobs,OverloadFrames,TimeStart,TimeEnd from Zones where MonitorId = %d order by Type, Id", monitor->Id() );

ADD:

int OverloadFrames = dbrow[col]?atoi(dbrow[col]):0; col++;
++ int TimeStart = dbrow[col]?atoi(dbrow[col]):0; col++;
++ int TimeEnd = dbrow[col]?atoi(dbrow[col]):0; col++;

Add new IF:
-- if ( atoi(dbrow[2]) == Zone::INACTIVE )
-- {
-- zones[i] = new Zone( monitor, Id, Name, polygon );
-- }
-- else
-- {
-- zones[i] = new Zone( monitor, Id, Name, (Zone::ZoneType)Type, polygon, AlarmRGB, (Zone::CheckMethod)CheckMethod, MinPixelThreshold, MaxPixelThreshold, MinAlarmPixels, MaxAlarmPixels, Coord( FilterX, FilterY ), MinFilterPixels, MaxFilterPixels, MinBlobPixels, MaxBlobPixels, MinBlobs, MaxBlobs, OverloadFrames);
-- }

++if ( atoi(dbrow[2]) == Zone::INACTIVE )
++ {
++ zones[i] = new Zone( monitor, Id, Name, polygon );
++ }
++ else
++ {
++ zones[i] = new Zone( monitor, Id, Name, (Zone::ZoneType)Type, polygon, AlarmRGB, (Zone::CheckMethod)CheckMethod, MinPixelThreshold, MaxPixelThreshold, MinAlarmPixels, MaxAlarmPixels, Coord( FilterX, FilterY ), MinFilterPixels, MaxFilterPixels, MinBlobPixels, MaxBlobPixels, MinBlobs, MaxBlobs, OverloadFrames,TimeStart,TimeEnd);
++ }

Now the final code:

In file zm_monitor.cpp

unsigned int Monitor::DetectMotion( const Image &comp_image, Event::StringSet &zoneSet )
{
bool alarm = false;
unsigned int score = 0;
++ bool ZoneTimeFlag;

zone->ClearAlarm();
++ ZoneTimeFlag=zone->TimeFlag() ;

if ( !zone->IsInactive() )
    {
        continue;
    }

++ if ( !ZoneTimeFlag )
++ {
++ {
++ continue;
++ }

   Debug( 3, "Blanking inactive zone %s", zone->Label() );

AND:

Zone *zone = zones[n_zone];
++ ZoneTimeFlag=zone->TimeFlag() ;

if ( !zone->IsPreclusive() )
    {
        continue;
    }

++ if ( !ZoneTimeFlag )
++ {
++ continue;
++ }
Debug( 3, "Checking preclusive zone %s", zone->Label() );

AND:

Zone *zone = zones[n_zone];
++ ZoneTimeFlag=zone->TimeFlag() ;
if (!zone->IsActive() )
{
continue;
}
++ if ( !ZoneTimeFlag )
++ {
++
++ continue;
++ }
Debug( 3, "Checking active zone %s", zone->Label() );

AND:

Zone *zone = zones[n_zone];
++ ZoneTimeFlag=zone->TimeFlag() ;
if (!zone->IsInclusive() )
{
continue;
}
++ if ( !ZoneTimeFlag )
++ {
++
++ continue;
++ }
Debug( 3, "Checking inclusive zone %s", zone->Label() );

LASTLY:

Zone *zone = zones[n_zone];
++ ZoneTimeFlag=zone->TimeFlag() ;
if (!zone->IsExclusive() )
{
continue;
}
++ if ( !ZoneTimeFlag )
++ {
++
++ continue;
++ }
Debug( 3, "Checking exclusive zone %s", zone->Label() );

Run And Enjoy
Dennis A. Vitali
vitali@snet.net

P.s.
Have not yet did or yet understand the sql upfdate files for older databases,
thats why i added my stuff to zm_create.sql!

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions