Merge branch 'master' of github.com:ZoneMinder/ZoneMinder

This commit is contained in:
Isaac Connor 2015-06-25 16:26:49 -04:00
commit 956e2936a3
15 changed files with 1812 additions and 472 deletions

View File

@ -31,6 +31,27 @@ endif(NOT CMAKE_BUILD_TYPE)
#set(CMAKE_VERBOSE_MAKEFILE ON)
#set(CMAKE_INSTALL_ALWAYS ON)
# Host OS Check
set(HOST_OS "")
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
set(HOST_OS "linux")
endif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
if(${CMAKE_SYSTEM_NAME} MATCHES ".*(SunOS|Solaris).*")
set(HOST_OS "solaris")
set(SOLARIS 1)
endif(${CMAKE_SYSTEM_NAME} MATCHES ".*(SunOS|Solaris).*")
if(${CMAKE_SYSTEM_NAME} MATCHES ".*BSD.*")
set(HOST_OS "BSD")
set(BSD 1)
endif(${CMAKE_SYSTEM_NAME} MATCHES ".*BSD.*")
if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
set(HOST_OS "darwin")
endif(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
if(NOT HOST_OS)
message(FATAL_ERROR
"ZoneMinder was unable to deterimine the host OS. Please report this. Value of CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}")
endif(NOT HOST_OS)
# Default CLFAGS and CXXFLAGS:
set(CMAKE_C_FLAGS_RELEASE "-Wall -D__STDC_CONSTANT_MACROS -O2")
set(CMAKE_CXX_FLAGS_RELEASE "-Wall -D__STDC_CONSTANT_MACROS -O2")
@ -163,27 +184,6 @@ include_directories("${CMAKE_BINARY_DIR}")
# This is required to enable searching in lib64 (if exists), do not change
set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ON)
# Host OS Check
set(HOST_OS "")
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
set(HOST_OS "linux")
endif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
if(${CMAKE_SYSTEM_NAME} MATCHES ".*(SunOS|Solaris).*")
set(HOST_OS "solaris")
set(SOLARIS 1)
endif(${CMAKE_SYSTEM_NAME} MATCHES ".*(SunOS|Solaris).*")
if(${CMAKE_SYSTEM_NAME} MATCHES ".*BSD.*")
set(HOST_OS "BSD")
set(BSD 1)
endif(${CMAKE_SYSTEM_NAME} MATCHES ".*BSD.*")
if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
set(HOST_OS "darwin")
endif(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
if(NOT HOST_OS)
message(FATAL_ERROR
"ZoneMinder was unable to deterimine the host OS. Please report this. Value of CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}")
endif(NOT HOST_OS)
# System checks
check_include_file("libv4l1-videodev.h" HAVE_LIBV4L1_VIDEODEV_H)
if(NOT HAVE_LIBV4L1_VIDEODEV_H)
@ -372,7 +372,7 @@ if(NOT ZM_NO_FFMPEG)
if(AVFORMAT_LIBRARIES)
set(HAVE_LIBAVFORMAT 1)
list(APPEND ZM_BIN_LIBS "${AVFORMAT_LIBRARIES}")
find_path(AVFORMAT_INCLUDE_DIR "libavformat/avformat.h")
find_path(AVFORMAT_INCLUDE_DIR "libavformat/avformat.h" /usr/include/ffmpeg)
if(AVFORMAT_INCLUDE_DIR)
include_directories("${AVFORMAT_INCLUDE_DIR}")
set(CMAKE_REQUIRED_INCLUDES "${AVFORMAT_INCLUDE_DIR}")
@ -389,7 +389,7 @@ if(NOT ZM_NO_FFMPEG)
if(AVCODEC_LIBRARIES)
set(HAVE_LIBAVCODEC 1)
list(APPEND ZM_BIN_LIBS "${AVCODEC_LIBRARIES}")
find_path(AVCODEC_INCLUDE_DIR "libavcodec/avcodec.h")
find_path(AVCODEC_INCLUDE_DIR "libavcodec/avcodec.h" /usr/include/ffmpeg)
if(AVCODEC_INCLUDE_DIR)
include_directories("${AVCODEC_INCLUDE_DIR}")
set(CMAKE_REQUIRED_INCLUDES "${AVCODEC_INCLUDE_DIR}")
@ -406,7 +406,7 @@ if(NOT ZM_NO_FFMPEG)
if(AVDEVICE_LIBRARIES)
set(HAVE_LIBAVDEVICE 1)
list(APPEND ZM_BIN_LIBS "${AVDEVICE_LIBRARIES}")
find_path(AVDEVICE_INCLUDE_DIR "libavdevice/avdevice.h")
find_path(AVDEVICE_INCLUDE_DIR "libavdevice/avdevice.h" /usr/include/ffmpeg)
if(AVDEVICE_INCLUDE_DIR)
include_directories("${AVDEVICE_INCLUDE_DIR}")
set(CMAKE_REQUIRED_INCLUDES "${AVDEVICE_INCLUDE_DIR}")
@ -423,7 +423,7 @@ if(NOT ZM_NO_FFMPEG)
if(AVUTIL_LIBRARIES)
set(HAVE_LIBAVUTIL 1)
list(APPEND ZM_BIN_LIBS "${AVUTIL_LIBRARIES}")
find_path(AVUTIL_INCLUDE_DIR "libavutil/avutil.h")
find_path(AVUTIL_INCLUDE_DIR "libavutil/avutil.h" /usr/include/ffmpeg)
if(AVUTIL_INCLUDE_DIR)
include_directories("${AVUTIL_INCLUDE_DIR}")
set(CMAKE_REQUIRED_INCLUDES "${AVUTIL_INCLUDE_DIR}")
@ -441,7 +441,7 @@ if(NOT ZM_NO_FFMPEG)
if(SWSCALE_LIBRARIES)
set(HAVE_LIBSWSCALE 1)
list(APPEND ZM_BIN_LIBS "${SWSCALE_LIBRARIES}")
find_path(SWSCALE_INCLUDE_DIR "libswscale/swscale.h")
find_path(SWSCALE_INCLUDE_DIR "libswscale/swscale.h" /usr/include/ffmpeg)
if(SWSCALE_INCLUDE_DIR)
include_directories("${SWSCALE_INCLUDE_DIR}")
set(CMAKE_REQUIRED_INCLUDES "${SWSCALE_INCLUDE_DIR}")

View File

@ -19,7 +19,7 @@
# use pkg-config to get the directories and then use these values
# in the FIND_PATH() and FIND_LIBRARY() calls
find_package(PkgConfig)
pkg_check_modules(PC_POLKIT polkit-gobject-1)
pkg_search_module(PC_POLKIT polkit-gobject-1 polkit)
#pkg_check_modules(PC_POLKIT_AGENT polkit-agent-1)
set(POLKIT_DEFINITIONS ${PC_POLKIT_CFLAGS_OTHER})
endif (NOT WIN32)
@ -31,8 +31,8 @@
HINTS ${PC_POLKIT_INCLUDE_DIRS}
)
find_path( POLKIT_INCLUDE_DIR
NAMES polkit/polkit.h
PATH_SUFFIXES polkit-1
NAMES polkit/polkit.h libpolkit/libpolkit.h
PATH_SUFFIXES polkit-1 polkit
HINTS ${PC_POLKIT_INCLUDE_DIRS}
)
#find_path( POLKIT_AGENT_INCLUDE_DIR
@ -43,7 +43,7 @@
#set(POLKIT_INCLUDE_DIRS ${GLIB2_INCLUDE_DIR} ${_POLKIT_INCLUDE_DIR})
#set(POLKIT_AGENT_INCLUDE_DIRS ${GLIB2_INCLUDE_DIR} ${_POLKIT_AGENT_INCLUDE_DIR})
find_library( POLKIT_LIBRARIES
NAMES polkit-gobject-1
NAMES polkit-gobject-1 polkit
HINTS ${PC_POLKIT_LIBDIR}
)
#find_library( POLKIT_AGENT_LIBRARY

View File

@ -1,3 +1,7 @@
#
# Building ZoneMinder via Autotools will be depreciated soon
# For instructions on building with cmake, please see INSTALL
#
AC_PREREQ(2.59)
AC_INIT(zm,1.28.1,[http://www.zoneminder.com/forums/ - Please check FAQ first],zoneminder,http://www.zoneminder.com/downloads.html)
AM_INIT_AUTOMAKE

View File

@ -559,6 +559,11 @@ INSERT INTO Controls VALUES (NULL,'Toshiba IK-WB11A','Remote','Toshiba_IK_WB11A'
INSERT INTO Controls VALUES (NULL,'WanscamPT','Remote','Wanscam',1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,16,0,0,0,0,0,1,16,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0);
INSERT INTO Controls VALUES (NULL,'3S Domo N5071', 'Remote', '3S', 0, 0, 1, 1, 0, 1, 1, 0, 0, 9999, 0, 9999, 0, 0, 0, 1, 1, 1, 1, 0, 0, 9999, 20, 9999, 0, 0, 0, 1, 1, 1, 1, 0, 0, 9999, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 1, 0, 1, 1, 0, 0, 0, 0, 1, -180, 180, 40, 100, 1, 40, 100, 0, 0, 1, -180, 180, 40, 100, 1, 40, 100, 0, 0, 0, 0);
INSERT INTO Controls VALUES (NULL,'ONVIF Camera','Ffmpeg','onvif',0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,255,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,6,1,1,0,0,0,1,10,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0);
INSERT INTO `Controls` VALUES (NULL,'Foscam 9831W','Ffmpeg','FI9831W',0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,16,1,1,1,1,0,0,0,1,1,0,360,0,360,1,0,4,0,0,1,0,90,0,90,0,0,0,0,0,0,0);
INSERT INTO `Controls` VALUES (NULL,'Foscam FI8918W','Ffmpeg','FI8918W',0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,8,0,1,1,1,0,0,0,1,1,0,360,0,360,1,0,4,0,0,1,0,90,0,90,1,0,4,0,0,0,0);
--
-- Add some monitor preset values

View File

@ -4,6 +4,8 @@
--
-- Add Controls definition for ONVIF
-- Add Controls definition for FI9831W
-- Add Controls definition for FI8918W
--
INSERT INTO Controls
SELECT * FROM (SELECT NULL as Id,
@ -108,6 +110,215 @@ SELECT * FROM (SELECT NULL as Id,
WHERE NOT EXISTS (
SELECT Name FROM Controls WHERE name = 'ONVIF Camera'
) LIMIT 1;
INSERT INTO Controls
SELECT * FROM (SELECT NULL as Id,
'Foscam 9831W' as Name,
'Ffmpeg' as Type,
'FI9831W' as Protocol,
0 as CanWake,
0 as CanSleep,
1 as CanReset,
0 as CanZoom,
0 as CanAutoZoom,
0 as CanZoomAbs,
0 as CanZoomRel,
0 as CanZoomCon,
0 as MinZoomRange,
0 as MaxZoomRange,
0 as MinZoomStep,
0 as MaxZoomStep,
0 as HasZoomSpeed,
0 as MinZoomSpeed,
0 as MaxZoomSpeed,
0 as CanFocus,
0 as CanAutoFocus,
0 as CanFocusAbs,
0 as CanFocusRel,
0 as CanFocusCon,
0 as MinFocusRange,
0 as MaxFocusRange,
0 as MinFocusStep,
0 as MaxFocusStep,
0 as HasFocusSpeed,
0 as MinFocusSpeed,
0 as MaxFocusSpeed,
0 as CanIris,
0 as CanAutoIris,
0 as CanIrisAbs,
0 as CanIrisRel,
0 as CanIrisCon,
0 as MinIrisRange,
0 as MaxIrisRange,
0 as MinIrisStep,
0 as MaxIrisStep,
0 as HasIrisSpeed,
0 as MinIrisSpeed,
0 as MaxIrisSpeed,
0 as CanGain,
0 as CanAutoGain,
0 as CanGainAbs,
0 as CanGainRel,
0 as CanGainCon,
0 as MinGainRange,
0 as MaxGainRange,
0 as MinGainStep,
0 as MaxGainStep,
0 as HasGainSpeed,
0 as MinGainSpeed,
0 as MaxGainSpeed,
0 as CanWhite,
0 as CanAutoWhite,
0 as CanWhiteAbs,
0 as CanWhiteRel,
0 as CanWhiteCon,
0 as MinWhiteRange,
0 as MaxWhiteRange,
0 as MinWhiteStep,
0 as MaxWhiteStep,
0 as HasWhiteSpeed,
0 as MinWhiteSpeed,
0 as MaxWhiteSpeed,
0 as HasPresets,
16 as NumPresets,
1 as HasHomePreset,
1 as CanSetPresets,
1 as CanMove,
1 as CanMoveDiag,
0 as CanMoveMap,
0 as CanMoveAbs,
0 as CanMoveRel,
1 as CanMoveCon,
1 as CanPan,
0 as MinPanRange,
360 as MaxPanRange,
0 as MinPanStep,
360 as MaxPanStep,
1 as HasPanSpeed,
0 as MinPanSpeed,
4 as MaxPanSpeed,
0 as HasTurboPan,
0 as TurboPanSpeed,
1 as CanTilt,
0 as MinTiltRange,
90 as MaxTiltRange,
0 as MinTiltStep,
90 as MaxTiltStep,
0 as HasTiltSpeed,
0 as MinTiltSpeed,
0 as MaxTiltSpeed,
0 as HasTurboTilt,
0 as TurboTiltSpeed,
0 as CanAutoScan,
0 as NumScanPaths) AS tmp
WHERE NOT EXISTS (
SELECT Name FROM Controls WHERE name = 'Foscam 9831W'
) LIMIT 1;
INSERT INTO Controls
SELECT * FROM (SELECT NULL as Id,
'Foscam FI8918W' as Name,
'Ffmpeg' as Type,
'FI8918W' as Protocol,
0 as CanWake,
0 as CanSleep,
1 as CanReset,
0 as CanZoom,
0 as CanAutoZoom,
0 as CanZoomAbs,
0 as CanZoomRel,
0 as CanZoomCon,
0 as MinZoomRange,
0 as MaxZoomRange,
0 as MinZoomStep,
0 as MaxZoomStep,
0 as HasZoomSpeed,
0 as MinZoomSpeed,
0 as MaxZoomSpeed,
0 as CanFocus,
0 as CanAutoFocus,
0 as CanFocusAbs,
0 as CanFocusRel,
0 as CanFocusCon,
0 as MinFocusRange,
0 as MaxFocusRange,
0 as MinFocusStep,
0 as MaxFocusStep,
0 as HasFocusSpeed,
0 as MinFocusSpeed,
0 as MaxFocusSpeed,
0 as CanIris,
0 as CanAutoIris,
0 as CanIrisAbs,
0 as CanIrisRel,
0 as CanIrisCon,
0 as MinIrisRange,
0 as MaxIrisRange,
0 as MinIrisStep,
0 as MaxIrisStep,
0 as HasIrisSpeed,
0 as MinIrisSpeed,
0 as MaxIrisSpeed,
0 as CanGain,
0 as CanAutoGain,
0 as CanGainAbs,
0 as CanGainRel,
0 as CanGainCon,
0 as MinGainRange,
0 as MaxGainRange,
0 as MinGainStep,
0 as MaxGainStep,
0 as HasGainSpeed,
0 as MinGainSpeed,
0 as MaxGainSpeed,
0 as CanWhite,
0 as CanAutoWhite,
0 as CanWhiteAbs,
0 as CanWhiteRel,
0 as CanWhiteCon,
0 as MinWhiteRange,
0 as MaxWhiteRange,
0 as MinWhiteStep,
0 as MaxWhiteStep,
0 as HasWhiteSpeed,
0 as MinWhiteSpeed,
0 as MaxWhiteSpeed,
0 as HasPresets,
8 as NumPresets,
0 as HasHomePreset,
1 as CanSetPresets,
1 as CanMove,
1 as CanMoveDiag,
0 as CanMoveMap,
0 as CanMoveAbs,
0 as CanMoveRel,
1 as CanMoveCon,
1 as CanPan,
0 as MinPanRange,
360 as MaxPanRange,
0 as MinPanStep,
360 as MaxPanStep,
1 as HasPanSpeed,
0 as MinPanSpeed,
4 as MaxPanSpeed,
0 as HasTurboPan,
0 as TurboPanSpeed,
1 as CanTilt,
0 as MinTiltRange,
90 as MaxTiltRange,
0 as MinTiltStep,
90 as MaxTiltStep,
0 as HasTiltSpeed,
0 as MinTiltSpeed,
0 as MaxTiltSpeed,
0 as HasTurboTilt,
0 as TurboTiltSpeed,
0 as CanAutoScan,
0 as NumScanPaths) AS tmp
WHERE NOT EXISTS (
SELECT Name FROM Controls WHERE name = 'Foscam FI8918W'
) LIMIT 1;
--
-- Hide USE_DEEP_STORAGE from user to prevent accidental event loss
--

View File

@ -16,7 +16,7 @@ else(ZM_TARGET_DISTRO STREQUAL "el7")
endif(ZM_TARGET_DISTRO STREQUAL "el7")
# Download jscalendar & move files into position
file(DOWNLOAD http://softlayer-dal.dl.sourceforge.net/project/jscalendar/jscalendar/1.0/jscalendar-1.0.zip ${CMAKE_CURRENT_SOURCE_DIR}/jscalendar-1.0.zip LOG jsc_log STATUS download_jsc)
file(DOWNLOAD http://nbtelecom.dl.sourceforge.net/project/jscalendar/jscalendar/1.0/jscalendar-1.0.zip ${CMAKE_CURRENT_SOURCE_DIR}/jscalendar-1.0.zip LOG jsc_log STATUS download_jsc)
#message(STATUS "Log of jscalender script was: ${jsc_log}")
if(download_jsc EQUAL 0)
message(STATUS "Jscalander successfully downloaded. Installing...")

View File

@ -0,0 +1,355 @@
# Modified on Jun 19 2016 by PP
# Changes made
# - modified command to work properly and pick up credentials from Control Device
# - the old script did not stop moving- added autostop
# (note that mjpeg cameras have onestep but that is too granular)
# - You need to set "user=xxx&pwd=yyy" in the ControlDevice field (NOT usr like in Foscam HD)
# ==========================================================================
#
# ZoneMinder Foscam FI8918W IP Control Protocol Module, $Date: 2009-11-25 09:20:00 +0000 (Wed, 04 Nov 2009) $, $Revision: 0001 $
# Copyright (C) 2001-2008 Philip Coombes
# Modified for use with Foscam FI8918W IP Camera by Dave Harris
# Modified Feb 2011 by Howard Durdle (http://durdl.es/x) to:
# fix horizontal panning, add presets and IR on/off
# use Control Device field to pass username and password
# Modified May 2014 by Arun Horne (http://arunhorne.co.uk) to:
# use HTTP basic auth as required by firmware 11.37.x.x upward
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# ==========================================================================
#
# This module contains the implementation of the Foscam FI8918W IP camera control
# protocol
#
package MyAgent;
use base 'LWP::UserAgent';
package ZoneMinder::Control::FI8918W;
use 5.006;
use strict;
use warnings;
require ZoneMinder::Base;
require ZoneMinder::Control;
our @ISA = qw(ZoneMinder::Control);
our $VERSION = $ZoneMinder::Base::VERSION;
# ==========================================================================
#
# Foscam FI8918W IP Control Protocol
#
# ==========================================================================
use ZoneMinder::Logger qw(:all);
use ZoneMinder::Config qw(:all);
use Time::HiRes qw( usleep );
sub new
{
my $class = shift;
my $id = shift;
my $self = ZoneMinder::Control->new( $id );
my $logindetails = "";
bless( $self, $class );
srand( time() );
return $self;
}
our $AUTOLOAD;
sub AUTOLOAD
{
my $self = shift;
my $class = ref($self) || croak( "$self not object" );
my $name = $AUTOLOAD;
$name =~ s/.*://;
if ( exists($self->{$name}) )
{
return( $self->{$name} );
}
Fatal( "Can't access $name member of object of class $class" );
}
our $stop_command;
sub open
{
my $self = shift;
$self->loadMonitor();
$self->{ua} = MyAgent->new;
$self->{ua}->agent( "ZoneMinder Control Agent/" );
$self->{state} = 'open';
}
sub close
{
my $self = shift;
$self->{state} = 'closed';
}
sub printMsg
{
my $self = shift;
my $msg = shift;
my $msg_len = length($msg);
Debug( $msg."[".$msg_len."]" );
}
sub sendCmd
{
my $self = shift;
my $cmd = shift;
my $result = undef;
printMsg( $cmd, "Tx" );
# PP Old cameras also support onstep=1 but it is too granular. Instead using moveCon and stop after interval
# PP - cleaned up URL to take it properly from Control device
# Control device needs to be of format user=xxx&pwd=yyy
my $req = HTTP::Request->new( GET=>"http://".$self->{Monitor}->{ControlAddress}."/$cmd"."&".$self->{Monitor}->{ControlDevice});
print ("Sending $req\n");
my $res = $self->{ua}->request($req);
if ( $res->is_success )
{
$result = !undef;
}
else
{
Error( "Error REALLY check failed:'".$res->status_line()."'" );
Error ("Cmd:".$req);
}
return( $result );
}
sub reset
{
my $self = shift;
Debug( "Camera Reset" );
my $cmd = "reboot.cgi?";
$self->sendCmd( $cmd );
}
# PP - in all move operations, added auto stop after timeout
#Up Arrow
sub moveConUp
{
my $self = shift;
Debug( "Move Up" );
my $cmd = "decoder_control.cgi?command=0";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
#Down Arrow
sub moveConDown
{
my $self = shift;
Debug( "Move Down" );
my $cmd = "decoder_control.cgi?command=2";
$self->sendCmd( $cmd );
}
#Left Arrow
sub moveConLeft
{
my $self = shift;
Debug( "Move Left" );
my $cmd = "decoder_control.cgi?command=6";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
#Right Arrow
sub moveConRight
{
my $self = shift;
Debug( "Move Right" );
my $cmd = "decoder_control.cgi?command=4";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
#Diagonally Up Right Arrow
sub moveConUpRight
{
my $self = shift;
Debug( "Move Diagonally Up Right" );
my $cmd = "decoder_control.cgi?command=90";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
#Diagonally Down Right Arrow
sub moveConDownRight
{
my $self = shift;
Debug( "Move Diagonally Down Right" );
my $cmd = "decoder_control.cgi?command=92";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
#Diagonally Up Left Arrow
sub moveConUpLeft
{
my $self = shift;
Debug( "Move Diagonally Up Left" );
my $cmd = "decoder_control.cgi?command=91";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
#Diagonally Down Left Arrow
sub moveConDownLeft
{
my $self = shift;
Debug( "Move Diagonally Down Left" );
my $cmd = "decoder_control.cgi?command=93";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
#Stop
sub moveStop
{
my $self = shift;
Debug( "Move Stop" );
my $cmd = "decoder_control.cgi?command=1";
$self->sendCmd( $cmd );
}
# PP - imported from 9831 - autostop after usleep
sub autoStop
{
my $self = shift;
my $autostop = shift;
if( $autostop )
{
Debug( "Auto Stop" );
usleep( $autostop );
my $cmd = "decoder_control.cgi?command=1";
$self->sendCmd( $cmd );
}
}
#Move Camera to Home Position
sub presetHome
{
my $self = shift;
Debug( "Home Preset" );
my $cmd = "decoder_control.cgi?command=25";
$self->sendCmd( $cmd );
}
#Set preset
sub presetSet
{
my $self = shift;
my $params = shift;
my $preset = $self->getParam( $params, 'preset' );
my $presetCmd = 30 + ($preset*2);
Debug( "Set Preset $preset with cmd $presetCmd" );
my $cmd = "decoder_control.cgi?command=$presetCmd";
$self->sendCmd( $cmd );
}
#Goto preset
sub presetGoto
{
my $self = shift;
my $params = shift;
my $preset = $self->getParam( $params, 'preset' );
my $presetCmd = 31 + ($preset*2);
Debug( "Goto Preset $preset with cmd $presetCmd" );
my $cmd = "decoder_control.cgi?command=$presetCmd";
$self->sendCmd( $cmd );
}
#Turn IR on
sub wake
{
my $self = shift;
Debug( "Wake - IR on" );
my $cmd = "decoder_control.cgi?command=95";
$self->sendCmd( $cmd );
}
#Turn IR off
sub sleep
{
my $self = shift;
Debug( "Sleep - IR off" );
my $cmd = "decoder_control.cgi?command=94";
$self->sendCmd( $cmd );
}
1;
__END__
=head1 FI8918W
ZoneMinder::Database - Perl extension for FOSCAM FI8918W
=head1 SYNOPSIS
Control script for Foscam MJPEG 8918W cameras.
=head1 DESCRIPTION
You need to set "user=xxx&pwd=yyy" in the ControlDevice field
of the control tab for that monitor.
Auto TimeOut should be 1. Don't set it to less - processes
start crashing :)
NOTE: unlike HD foscam cameras, this one uses "user" not "usr"
in the control device
=head2 EXPORT
None by default.
=head1 SEE ALSO
=head1 AUTHOR
Philip Coombes, E<lt>philip.coombes@zoneminder.comE<gt>
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2001-2008 Philip Coombes
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.3 or,
at your option, any later version of Perl 5 you may have available.
=cut

View File

@ -0,0 +1,763 @@
# Modified by PP to clean up user/auth dependencies inside the script
# Also, you can specify your auth credentials in the Control tab of the monitor
# In "ControlDevice" put in
# usr=xxxx&pwd=xxx
# where xxx is the auth credentials to your foscam camera
# The Foscam CGI manual referred to was v1.0.10
# All other notices below may be stale
#
# ==========================================================================
#
# ZoneMinder FOSCAM version 1.0 API Control Protocol Module, $Date$, $Revision$
# Copyright (C) 2001-2008 Philip Coombes
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# =========================================================================================
#
# This module FI8620_Y2k.pm contains the implementation of API camera control
# For FOSCAM FI8620 Dome PTZ Camera (This cam support only H264 streaming)
# V1.0 Le 09 AOUT 2013 - production usable for the script but not for the camera "reboot itself"
# If you wan't to contact me i understand French and English, precise ZoneMinder in subject
# My name is Christophe DAPREMONT my email is christophe_y2k@yahoo.fr
#
# =========================================================================================
#
package ZoneMinder::Control::FI9831W;
use 5.006;
use strict;
use warnings;
require ZoneMinder::Base;
require ZoneMinder::Control;
our @ISA = qw(ZoneMinder::Control);
# ===================================================================================================================================
#
# FI9821 FOSCAM PT H264 Control Protocol
# with Firmware version V1.2.1.1 (latest at 09/08/2013)
# based with the latest buggy CGI doc from FOSCAM ( http://foscam.us/forum/cgi-sdk-for-hd-camera-t6045.html )
# This IPCAM work under ZoneMinder V1.25 from alternative source of code
# from this svn at https://svn.unixmedia.net/public/zum/trunk/zum/
# Many Thanks to "MASTERTHEKNIFE" for the excellent speed optimisation ( http://www.zoneminder.com/forums/viewtopic.php?f=9&t=17652 )
# And to "NEXTIME" for the recent source update and incredible plugins ( http://www.zoneminder.com/forums/viewtopic.php?f=9&t=20587 )
# And all people helping ZoneMinder dev.
#
# -FUNCTION: display on OSD
# speed is progressive in function of where you click on arrow ========>
# speed low=/ \=speed high
# ===================================================================================================================================
use ZoneMinder::Logger qw(:all);
use ZoneMinder::Config qw(:all);
use Time::HiRes qw( usleep );
# Set $osd to "off" if you wan't disabled OSD i need to place this variable in another script because
# this script is reload at every command ,if i want the button on/off (Focus MAN) for OSD works...
# PP - changed this to off - it achieves OSD by renaming the Device and what happens is at times
# it does not reset the name if a command fails. Net result: Your camera gets a name like "Move Left" which
# I bet you won't like
my $osd = "off";
my $cmd;
sub new
{
my $class = shift;
my $id = shift;
my $self = ZoneMinder::Control->new( $id );
bless( $self, $class );
srand( time() );
return $self;
}
our $AUTOLOAD;
sub AUTOLOAD
{
my $self = shift;
my $class = ref($self) || croak( "$self not object" );
my $name = $AUTOLOAD;
$name =~ s/.*://;
if ( exists($self->{$name}) )
{
return( $self->{$name} );
}
Fatal( "Can't access $name member of object of class $class" );
}
sub open
{
my $self = shift;
$self->loadMonitor();
use LWP::UserAgent;
$self->{ua} = LWP::UserAgent->new;
#PP
#$self->{ua}->agent( "ZoneMinder Control Agent/".ZoneMinder::Base::ZM_VERSION );
$self->{ua}->agent( "ZoneMinder Control Agent/" );
$self->{state} = 'open';
}
sub close
{
my $self = shift;
$self->{state} = 'closed';
}
sub printMsg
{
my $self = shift;
my $msg = shift;
my $msg_len = length($msg);
Debug( $msg."[".$msg_len."]" );
}
sub sendCmd
{
my $self = shift;
my $cmd = shift;
my $result = undef;
printMsg( $cmd, "Tx" );
my $temps = time();
#PP - cleaned this up so it picks up the full auth from Control Devices
my $req = HTTP::Request->new( GET=>"http://".$self->{Monitor}->{ControlAddress}."/cgi-bin/CGIProxy.fcgi?cmd=".$cmd."&".$self->{Monitor}->{ControlDevice} );
#my $req = HTTP::Request->new( GET=>"http://".$self->{Monitor}->{ControlAddress}."/cgi-bin/CGIProxy.fcgi?usr%3Dadmin%26pwd%3D".$self->{Monitor}->{ControlDevice}."%26cmd%3D".$cmd."%26".$temps );
my $res = $self->{ua}->request($req);
if ( $res->is_success )
{
$result = !undef;
}
else
{
Error( "Error check failed: '".$res->status_line()."'" );
}
return( $result );
}
# PP - changed this to a system reboot. Its harmful to reset here. Settings may change
# with different firmware versions. Better to make this a reboot and use the camera
# interface to reset streams
sub reset
{ my $self = shift;
Debug ( "Reboot= setup camera FoscamHD" );
$cmd = "rebootSystem";
#my $cmd = "setOSDSetting%26isEnableTimeStamp%3D0%26isEnableDevName%3D1%26dispPos%3D0%26isEnabledOSDMask%3D0";
Info ("Sending reboot $cmd");
$self->sendCmd( $cmd );
# Setup For Stream=0 Resolution=720p Bandwith=4M FPS=30 KeyFrameInterval/GOP=100 VBR=ON
#$cmd = "setVideoStreamParam%26streamType%3D0%26resolution%3D0%26bitRate%3D4194304%26frameRate%3D30%26GOP%3D100%26isVBR%3D1";
#$self->sendCmd( $cmd );
# Setup For Infrared AUTO
#$cmd = "setInfraLedConfig%26Mode%3D1";
#$self->sendCmd( $cmd );
# Reset image settings
#$cmd = "resetImageSetting";
#$self->sendCmd( $cmd );
}
sub moveStop
{
my $self = shift;
Debug( "Move Stop" );
my $cmd = "ptzStopRun";
$self->sendCmd( $cmd );
if ($osd eq "on")
{
$cmd = "setDevName%26devName%3D.";
$self->sendCmd( $cmd );
$cmd = "setOSDSetting%26isEnableDevName%3D1";
$self->sendCmd( $cmd );
}
}
sub autoStop
{
my $self = shift;
my $autostop = shift;
if( $autostop )
{
Debug( "Auto Stop" );
usleep( $autostop );
my $cmd = "ptzStopRun";
$self->sendCmd( $cmd );
}
}
sub moveConUp
{
my $self = shift;
my $params = shift;
my $tiltspeed = $self->getParam( $params, 'tiltspeed' );
# speed inverter 4-->0 , 3-->1 , 2-->2 , 1-->3 , 0-->4
$tiltspeed = abs($tiltspeed - 4);
# Normalisation en cas de valeur erronée dans la base de données
if ( $tiltspeed > 4 ) {
$tiltspeed = 4;
}
if ( $tiltspeed < 0 ) {
$tiltspeed = 0;
}
Debug( "Move Up" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DMove Up $tiltspeed";
$self->sendCmd( $cmd );
}
my $cmd = "setPTZSpeed%26speed%3D$tiltspeed";
$self->sendCmd( $cmd );
$cmd = "ptzMoveUp";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
sub moveConDown
{
my $self = shift;
my $params = shift;
my $tiltspeed = $self->getParam( $params, 'tiltspeed' );
# speed inverter 4-->0 , 3-->1 , 2-->2 , 1-->3 , 0-->4
$tiltspeed = abs($tiltspeed - 4);
# Normalization
if ( $tiltspeed > 4 ) {
$tiltspeed = 4;
}
if ( $tiltspeed < 0 ) {
$tiltspeed = 0;
}
Debug( "Move Down" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DMove Down $tiltspeed";
$self->sendCmd( $cmd );
}
my $cmd = "setPTZSpeed%26speed%3D$tiltspeed";
$self->sendCmd( $cmd );
$cmd = "ptzMoveDown";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
sub moveConLeft
{
my $self = shift;
my $params = shift;
my $panspeed = $self->getParam( $params, 'panspeed' );
# Normalisation en cas de valeur erronée dans la base de données
if ( $panspeed > 4 ) {
$panspeed = 4;
}
if ( $panspeed < 0 ) {
$panspeed = 0;
}
Debug( "Move Left" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DMove Left $panspeed";
$self->sendCmd( $cmd );
}
my $cmd = "setPTZSpeed%26speed%3D$panspeed";
$self->sendCmd( $cmd );
$cmd = "ptzMoveLeft";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
sub moveConRight
{
my $self = shift;
my $params = shift;
my $panspeed = $self->getParam( $params, 'panspeed' );
# speed inverter 4-->0 , 3-->1 , 2-->2 , 1-->3 , 0-->4
$panspeed = abs($panspeed - 4);
# Normalisation en cas de valeur erronée dans la base de données
if ( $panspeed > 4 ) {
$panspeed = 4;
}
if ( $panspeed < 0 ) {
$panspeed = 0;
}
Debug( "Move Right" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DMove Right $panspeed";
$self->sendCmd( $cmd );
}
my $cmd = "setPTZSpeed%26speed%3D$panspeed";
$self->sendCmd( $cmd );
$cmd = "ptzMoveRight";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
sub moveConUpLeft
{
my $self = shift;
my $params = shift;
my $tiltspeed = $self->getParam( $params, 'tiltspeed' );
# speed inverter 4-->0 , 3-->1 , 2-->2 , 1-->3 , 0-->4
$tiltspeed = abs($tiltspeed - 4);
# Normalisation en cas de valeur erronée dans la base de données
if ( $tiltspeed > 4 ) {
$tiltspeed = 4;
}
if ( $tiltspeed < 0 ) {
$tiltspeed = 0;
}
Debug( "Move Con Up Left" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DMove Up Left $tiltspeed";
$self->sendCmd( $cmd );
}
my $cmd = "setPTZSpeed%26speed%3D$tiltspeed";
$self->sendCmd( $cmd );
$cmd = "ptzMoveTopLeft";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
sub moveConUpRight
{
my $self = shift;
my $params = shift;
my $tiltspeed = $self->getParam( $params, 'tiltspeed' );
# speed inverter 4-->0 , 3-->1 , 2-->2 , 1-->3 , 0-->4
$tiltspeed = abs($tiltspeed - 4);
# Normalisation en cas de valeur erronée dans la base de données
if ( $tiltspeed > 4 ) {
$tiltspeed = 4;
}
if ( $tiltspeed < 0 ) {
$tiltspeed = 0;
}
Debug( "Move Con Up Right" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DMove Up Right $tiltspeed";
$self->sendCmd( $cmd );
}
my $cmd = "setPTZSpeed%26speed%3D$tiltspeed";
$self->sendCmd( $cmd );
$cmd = "ptzMoveTopRight";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
sub moveConDownLeft
{
my $self = shift;
my $params = shift;
my $tiltspeed = $self->getParam( $params, 'tiltspeed' );
# speed inverter 4-->0 , 3-->1 , 2-->2 , 1-->3 , 0-->4
$tiltspeed = abs($tiltspeed - 4);
# Normalisation en cas de valeur erronée dans la base de données
if ( $tiltspeed > 4 ) {
$tiltspeed = 4;
}
if ( $tiltspeed < 0 ) {
$tiltspeed = 0;
}
Debug( "Move Con Down Left" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DMove Down Left $tiltspeed";
$self->sendCmd( $cmd );
}
my $cmd = "setPTZSpeed%26speed%3D$tiltspeed";
$self->sendCmd( $cmd );
$cmd = "ptzMoveBottomLeft";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
sub moveConDownRight
{
my $self = shift;
my $params = shift;
my $tiltspeed = $self->getParam( $params, 'tiltspeed' );
# speed inverter 4-->0 , 3-->1 , 2-->2 , 1-->3 , 0-->4
$tiltspeed = abs($tiltspeed - 4);
# Normalisation en cas de valeur erronée dans la base de données
if ( $tiltspeed > 4 ) {
$tiltspeed = 4;
}
if ( $tiltspeed < 0 ) {
$tiltspeed = 0;
}
Debug( "Move Con Down Right" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DMove Down Right $tiltspeed";
$self->sendCmd( $cmd );
}
my $cmd = "setPTZSpeed%26speed%3D$tiltspeed";
$self->sendCmd( $cmd );
$cmd = "ptzMoveBottomRight";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
sub zoomConTele
{
my $self = shift;
Debug( "Zoom-Tele=MANU IR LED ON" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DManual IR LED Switch ON";
$self->sendCmd( $cmd );
}
my $cmd = "setInfraLedConfig%26mode%3D1";
$self->sendCmd( $cmd );
$cmd = "openInfraLed";
$self->sendCmd( $cmd );
}
sub zoomConWide
{
my $self = shift;
Debug( "Zoom-Wide=MANU IR LED OFF" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DManual IR LED Switch OFF";
$self->sendCmd( $cmd );
}
my $cmd = "setInfraLedConfig%26mode%3D1";
$self->sendCmd( $cmd );
$cmd = "closeInfraLed";
$self->sendCmd( $cmd );
}
sub wake
{
my $self = shift;
Debug( "Wake=AUTO IR LED" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DAuto IR LED Mode";
$self->sendCmd( $cmd );
}
my $cmd = "setInfraLedConfig%26mode%3D0";
$self->sendCmd( $cmd );
}
sub focusConNear
{
my $self = shift;
my $params = shift;
my $speed = $self->getParam( $params, 'speed' );
# Normalisation en cas de valeur erronée dans la base de données
if ( $speed > 100 ) {
$speed = 100;
}
if ( $speed < 0 ) {
$speed = 0;
}
Debug( "Focus Near=Sharpness" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DSharpness $speed";
$self->sendCmd( $cmd );
$cmd = "setOSDSetting%26isEnableDevName%3D1";
$self->sendCmd( $cmd );
}
my $cmd = "setSharpness%26sharpness%3D$speed";
$self->sendCmd( $cmd );
# La variable speed ne fonctionne pas en paramètre du focus, alors je l'utilise pour définir la durée de la commande
# le résulat est identique
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
sub focusConFar
{
my $self = shift;
my $params = shift;
my $speed = $self->getParam( $params, 'speed' );
# Normalisation en cas de valeur erronée dans la base de données
if ( $speed > 100 ) {
$speed = 100;
}
if ( $speed < 0 ) {
$speed = 0;
}
Debug( "Focus Far" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DSharpness $speed";
$self->sendCmd( $cmd );
}
my $cmd = "setSharpness%26sharpness%3D$speed";
$self->sendCmd( $cmd );
# La variable speed ne fonctionne pas en paramètre du focus alors je l'utilise pour définir la durée de la commande
# le résulat est identique
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
sub focusAuto
{
my $self = shift;
Debug( "Focus Auto=Reset Sharpness" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DReset Sharpness";
$self->sendCmd( $cmd );
}
my $cmd = "setSharpness%26sharpness%3D10";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
sub focusMan
{
my $self = shift;
Debug( "Focus Manu=Reset Sharpness" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DFOSCAM FI9821W Script V1.0 By Christophe_y2k";
$self->sendCmd( $cmd );
}
}
sub whiteConIn
{
my $self = shift;
my $params = shift;
my $speed = $self->getParam( $params, 'speed' );
# Normalisation en cas de valeur erronée dans la base de données
if ( $speed > 100 ) {
$speed = 100;
}
if ( $speed < 0 ) {
$speed = 0;
}
Debug( "White ConIn=brightness" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DBrightness $speed";
$self->sendCmd( $cmd );
}
my $cmd = "setBrightness%26brightness%3D$speed";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
sub whiteConOut
{
my $self = shift;
my $params = shift;
my $speed = $self->getParam( $params, 'speed' );
# Normalisation en cas de valeur erronée dans la base de données
if ( $speed > 100 ) {
$speed = 100;
}
if ( $speed < 0 ) {
$speed = 0;
}
Debug( "White ConOut=Contrast" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DContrast $speed";
$self->sendCmd( $cmd );
}
my $cmd = "setContrast%26constrast%3D$speed";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
sub whiteAuto
{
my $self = shift;
Debug( "White Auto=Brightness Reset" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DBrightness Reset";
$self->sendCmd( $cmd );
}
my $cmd = "setBrightness%26brightness%3D50";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
sub whiteMan
{
my $self = shift;
Debug( "White Manuel=Contrast Reset" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DContrast Reset";
$self->sendCmd( $cmd );
}
my $cmd = "setContrast%26constrast%3D44";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
sub irisConOpen
{
my $self = shift;
my $params = shift;
my $speed = $self->getParam( $params, 'speed' );
# Normalisation en cas de valeur erronée dans la base de données
if ( $speed > 100 ) {
$speed = 100;
}
if ( $speed < 0 ) {
$speed = 0;
}
Debug( "Iris ConOpen=Saturation" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DSaturation $speed";
$self->sendCmd( $cmd );
}
my $cmd = "setSaturation%26saturation%3D$speed";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
sub irisConClose
{
my $self = shift;
my $params = shift;
my $speed = $self->getParam( $params, 'speed' );
# Normalisation en cas de valeur erronée dans la base de données
if ( $speed > 100 ) {
$speed = 100;
}
if ( $speed < 0 ) {
$speed = 0;
}
Debug( "Iris ConClose=Hue" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DHue $speed";
$self->sendCmd( $cmd );
}
my $cmd = "setHue%26hue%3D$speed";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
sub irisAuto
{
my $self = shift;
Debug( "Iris Auto=Saturation Reset" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DSaturation Reset";
$self->sendCmd( $cmd );
}
my $cmd = "setSaturation%26saturation%3D30";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
sub irisMan
{
my $self = shift;
Debug( "Iris Manuel=Hue Reset" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DHue Reset";
$self->sendCmd( $cmd );
}
my $cmd = "setHue%26hue%3D6";
$self->sendCmd( $cmd );
$self->autoStop( $self->{Monitor}->{AutoStopTimeout} );
}
sub presetSet
{
my $self = shift;
my $params = shift;
my $preset = $self->getParam( $params, 'preset' );
if ( ( $preset >= 1 ) && ( $preset <= 16 ) ) {
Debug( "Clear Preset $preset" );
my $cmd = "ptzDeletePresetPoint%26name%3D$preset";
$self->sendCmd( $cmd );
Debug( "Set Preset $preset" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DSet Preset $preset";
$self->sendCmd( $cmd );
}
$cmd = "ptzAddPresetPoint%26name%3D$preset";
$self->sendCmd( $cmd );
}
}
sub presetGoto
{
my $self = shift;
my $params = shift;
my $preset = $self->getParam( $params, 'preset' );
if ( ( $preset >= 1 ) && ( $preset <= 16 ) ) {
Debug( "Goto Preset $preset" );
if ( $osd eq "on" )
{
my $cmd = "setDevName%26devName%3DGoto Preset $preset";
$self->sendCmd( $cmd );
}
my $cmd = "setPTZSpeed%26speed%3D0";
$self->sendCmd( $cmd );
$cmd = "ptzGotoPresetPoint%26name%3D$preset";
$self->sendCmd( $cmd );
}
}
1;
__END__
# Below is stub documentation for your module. You'd better edit it!
=head1 FI9831W
ZoneMinder::Database - Perl extension for FOSCAM FI9831W
=head1 SYNOPSIS
Control script for Foscam HD cameras. Tested on 9831W but
should work on others too.
=head1 DESCRIPTION
Control script for Foscam HD cameras. Tested on 9831W but
should work on others too.
You need to set "usr=xxx&pwd=yyy" in the ControlDevice field
of the control tab for that monitor.
Auto TimeOut should be 1. Don't set it to less - processes
start crashing :)
=head2 EXPORT
None by default.
=head1 SEE ALSO
=head1 AUTHOR
Philip Coombes, E<lt>philip.coombes@zoneminder.comE<gt>
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2001-2008 Philip Coombes
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.3 or,
at your option, any later version of Perl 5 you may have available.
=cut

View File

@ -414,8 +414,7 @@ sub start
my $daemon = shift;
my @args = @_;
my $command = $daemon;
$command .= ' '.join( ' ', ( @args ) ) if ( @args );
my $command = join(' ', $daemon, @args );
my $process = $cmd_hash{$command};
if ( !$process )
@ -506,22 +505,13 @@ sub start
}
}
sub _stop
{
my $final = shift;
my $daemon = shift;
my @args = @_;
# Sends the stop signal, without waiting around to see if the process died.
sub send_stop {
my ( $final, $process ) = @_;
my $command = $process->{command};
if ( $process->{pending} ) {
my $command = $daemon;
$command .= ' '.join( ' ', ( @args ) ) if ( @args );
my $process = $cmd_hash{$command};
if ( !$process )
{
dPrint( ZoneMinder::Logger::WARNING, "Can't find process with command of '$command'\n" );
return();
}
elsif ( $process->{pending} )
{
delete( $cmd_hash{$command} );
dPrint( ZoneMinder::Logger::INFO, "Command '$command' removed from pending list at "
.strftime( '%y/%m/%d %H:%M:%S', localtime() )
@ -530,37 +520,63 @@ sub _stop
return();
}
my $cpid = $process->{pid};
if ( !$pid_hash{$cpid} )
my $pid = $process->{pid};
if ( !$pid_hash{$pid} )
{
dPrint( ZoneMinder::Logger::ERROR, "No process with command of '$command' is running\n" );
dPrint( ZoneMinder::Logger::ERROR, "No process with command of '$command' pid $pid is running\n" );
return();
}
dPrint( ZoneMinder::Logger::INFO, "'$daemon ".join( ' ', @args )
."' stopping at "
dPrint( ZoneMinder::Logger::INFO, "'$command' sending stop to pid $pid at "
.strftime( '%y/%m/%d %H:%M:%S', localtime() )
."\n"
);
$process->{keepalive} = !$final;
kill( 'TERM', $cpid );
delete( $cmd_hash{$command} );
kill( 'TERM', $pid );
return $pid;
} # end sub send_stop
sub kill_until_dead {
my ( $process ) = @_;
# Now check it has actually gone away, if not kill -9 it
my $count = 0;
while( $cpid && kill( 0, $cpid ) )
while( $process and $$process{pid} and kill( 0, $$process{pid} ) )
{
if ( $count++ > 5 )
{
kill( 'KILL', $cpid );
dPrint( ZoneMinder::Logger::WARNING, "'$$process{command}' has not stopped at "
.strftime( '%y/%m/%d %H:%M:%S', localtime() )
.". Sending KILL to pid $$process{pid}\n"
);
kill( 'KILL', $$process{pid} );
}
sleep( 1 );
}
}
sub _stop {
my ($final, $process ) = @_;
delete( $cmd_hash{$$process{command}} );
my $pid = send_stop( $final, $process );
return if ! $pid;
kill_until_dead( $process );
}
sub stop
{
_stop( 1, @_ );
my ( $daemon, @args ) = @_;
my $command = join(' ', $daemon, @args );
my $process = $cmd_hash{$command};
if ( !$process )
{
dPrint( ZoneMinder::Logger::WARNING, "Can't find process with command of '$command'\n" );
return();
}
_stop( 1, $process );
}
sub restart
@ -578,7 +594,7 @@ sub restart
my $cpid = $process->{pid};
if ( defined($pid_hash{$cpid}) )
{
_stop( 0, $daemon, @args );
_stop( 0, $process );
return;
}
}
@ -639,7 +655,7 @@ sub reaper
my $exit_signal = $status&0xfe;
my $core_dumped = $status&0x01;
my $out_str = "'$process->{daemon} ".join( ' ', @{$process->{args}} )."' ";
my $out_str = "'$process->{command}' ";
if ( $exit_signal )
{
if ( $exit_signal == 15 || $exit_signal == 14 ) # TERM or ALRM
@ -678,17 +694,16 @@ sub reaper
if ( $process->{keepalive} )
{
# Schedule for immediate restart
$cmd_hash{$process->{command}} = $process;
if ( !$process->{delay} || ($process->{runtime} > $Config{ZM_MAX_RESTART_DELAY} ) )
{
#start( $process->{daemon}, @{$process->{args}} );
# Schedule for immediate restart
$cmd_hash{$process->{command}} = $process;
$process->{pending} = $process->{stopped};
$process->{delay} = 5;
}
else
{
$cmd_hash{$process->{command}} = $process;
$process->{pending} = $process->{stopped}+$process->{delay};
$process->{delay} *= 2;
# Limit the start delay to 15 minutes max
@ -718,9 +733,20 @@ sub restartPending
sub shutdownAll
{
foreach my $process ( values( %pid_hash ) )
{
stop( $process->{daemon}, @{$process->{args}} );
foreach my $pid ( keys %pid_hash ) {
# This is a quick fix because a SIGCHLD can happen and alter pid_hash while we are in here.
next if ! $pid_hash{$pid};
send_stop( 1, $pid_hash{$pid} );
}
foreach my $pid ( keys %pid_hash ) {
# This is a quick fix because a SIGCHLD can happen and alter pid_hash while we are in here.
next if ! $pid_hash{$pid};
my $process = $pid_hash{$pid};
kill_until_dead( $process );
delete( $cmd_hash{$$process{command}} );
delete( $pid_hash{$pid} );
}
killAll( 5 );
dPrint( ZoneMinder::Logger::INFO, "Server shutdown at "
@ -830,21 +856,20 @@ sub killAll
{
my $delay = shift;
sleep( $delay );
my $killall;
if ( '@HOST_OS@' eq 'BSD' )
{
$killall = 'killall -';
} elsif ( '@HOST_OS@' eq 'solaris' ) {
$killall = 'pkill -';
} else {
$killall = 'killall -q -s ';
}
my $killall;
if ( '@HOST_OS@' eq 'BSD' )
{
$killall = 'killall -';
} elsif ( '@HOST_OS@' eq 'solaris' ) {
$killall = 'pkill -';
} else {
$killall = 'killall -q -s ';
}
foreach my $daemon ( @daemons )
{
my $cmd = $killall ."TERM $daemon";
Debug( $cmd );
qx( $cmd );
my $cmd = $killall ."TERM $daemon";
Debug( $cmd );
qx( $cmd );
}
sleep( $delay );
foreach my $daemon ( @daemons )

View File

@ -85,17 +85,67 @@ while( 1 )
or Fatal( "Can't execute: ".$sth->errstr() );
while( my $monitor = $sth->fetchrow_hashref() )
{
if ( $monitor->{Function} ne 'None' )
next if $monitor->{Function} eq 'None';
my $restart = 0;
if ( zmMemVerify( $monitor )
&& zmMemRead( $monitor, "shared_data:valid" )
)
{
my $restart = 0;
if ( zmMemVerify( $monitor )
&& zmMemRead( $monitor, "shared_data:valid" )
)
# Check we have got an image recently
my $image_time = zmGetLastWriteTime( $monitor );
next if ( !defined($image_time) ); # Can't read from shared data
next if ( !$image_time ); # We can't get the last capture time so can't be sure it's died.
my $max_image_delay = ( $monitor->{MaxFPS}
&&($monitor->{MaxFPS}>0)
&&($monitor->{MaxFPS}<1)
) ? (3/$monitor->{MaxFPS})
: $Config{ZM_WATCH_MAX_DELAY}
;
my $image_delay = $now-$image_time;
Debug( "Monitor $monitor->{Id} last captured $image_delay seconds ago, max is $max_image_delay\n" );
if ( $image_delay > $max_image_delay )
{
# Check we have got an image recently
my $image_time = zmGetLastWriteTime( $monitor );
next if ( !defined($image_time) ); # Can't read from shared data
next if ( !$image_time ); # We can't get the last capture time so can't be sure it's died.
Info( "Restarting capture daemon for "
.$monitor->{Name}.", time since last capture $image_delay seconds ($now-$image_time)\n"
);
$restart = 1;
}
}
else
{
Info( "Restarting capture daemon for ".$monitor->{Name}.", shared data not valid\n" );
$restart = 1;
}
if ( $restart )
{
my $command;
if ( $monitor->{Type} eq 'Local' )
{
$command = "zmdc.pl restart zmc -d $monitor->{Device}";
}
else
{
$command = "zmdc.pl restart zmc -m $monitor->{Id}";
}
runCommand( $command );
}
elsif ( $monitor->{Function} ne 'Monitor' )
{
# Now check analysis daemon
$restart = 0;
# Check we have got an image recently
my $image_time = zmGetLastReadTime( $monitor );
if ( !defined($image_time) ) {
# Can't read from shared data
$restart = 1;
Error( "Error reading shared data for $$monitor{id} $$monitor{Name}\n");
} elsif ( !$image_time ) {
# We can't get the last capture time so can't be sure it's died.
$restart = 1;
Error( "Error getting last capture time for $$monitor{id} $$monitor{Name}\n");
} else {
my $max_image_delay = ( $monitor->{MaxFPS}
&&($monitor->{MaxFPS}>0)
@ -104,68 +154,27 @@ while( 1 )
: $Config{ZM_WATCH_MAX_DELAY}
;
my $image_delay = $now-$image_time;
Debug( "Monitor $monitor->{Id} last captured $image_delay seconds ago, max is $max_image_delay\n" );
Debug( "Monitor $monitor->{Id} last analysed $image_delay seconds ago, max is $max_image_delay\n" );
if ( $image_delay > $max_image_delay )
{
Info( "Restarting capture daemon for "
.$monitor->{Name}.", time since last capture $image_delay seconds ($now-$image_time)\n"
Info( "Analysis daemon for $$monitor{id} $$monitor{Name} needs restarting,"
." time since last analysis $image_delay seconds ($now-$image_time)\n"
);
$restart = 1;
}
}
else
{
#Info( "Restarting capture daemon for ".$monitor->{Name}.", shared data not valid\n" );
#$restart = 1;
}
if ( $restart )
{
my $command;
if ( $monitor->{Type} eq 'Local' )
{
$command = "zmdc.pl restart zmc -d $monitor->{Device}";
}
else
{
$command = "zmdc.pl restart zmc -m $monitor->{Id}";
}
Info( "Restarting analysis daemon for $$monitor{id} $$monitor{Name}\n");
my $command = "zmdc.pl restart zma -m ".$monitor->{Id};
runCommand( $command );
}
elsif ( $monitor->{Function} ne 'Monitor' )
{
if ( zmMemVerify( $monitor )
&& zmMemRead( $monitor, "shared_data:valid" )
)
{
# Check we have got an image recently
my $image_time = zmGetLastReadTime( $monitor );
next if ( !defined($image_time) ); # Can't read from shared data
next if ( !$image_time ); # We can't get the last capture time so can't be sure it's died.
my $max_image_delay = ( $monitor->{MaxFPS}
&&($monitor->{MaxFPS}>0)
&&($monitor->{MaxFPS}<1)
) ? (3/$monitor->{MaxFPS})
: $Config{ZM_WATCH_MAX_DELAY}
;
my $image_delay = $now-$image_time;
Debug( "Monitor $monitor->{Id} last analysed $image_delay seconds ago, max is $max_image_delay\n" );
if ( $image_delay > $max_image_delay )
{
Info( "Restarting analysis daemon for "
.$monitor->{Name}.", time since last analysis $image_delay seconds ($now-$image_time)\n"
);
my $command = "zmdc.pl restart zma -m ".$monitor->{Id};
runCommand( $command );
}
}
}
}
} # end if restart
} # end if check analysis daemon
# Prevent open handles building up if we have connect to shared memory
zmMemInvalidate( $monitor );
}
} # end foreach monitor
sleep( $Config{ZM_WATCH_CHECK_INTERVAL} );
}
} # end while (1)
Info( "Watchdog exiting\n" );
exit();

View File

@ -660,7 +660,7 @@ Monitor::State Monitor::GetState() const
return( (State)shared_data->state );
}
int Monitor::GetImage( int index, int scale ) const
int Monitor::GetImage( int index, int scale )
{
if ( index < 0 || index > image_buffer_count )
{
@ -669,21 +669,32 @@ int Monitor::GetImage( int index, int scale ) const
if ( index != image_buffer_count )
{
Snapshot *snap = &image_buffer[index];
Image snap_image( *(snap->image) );
Image *image;
// If we are going to be modifying the snapshot before writing, then we need to copy it
if ( ( scale != ZM_SCALE_BASE ) || ( !config.timestamp_on_capture ) ) {
Snapshot *snap = &image_buffer[index];
Image *snap_image = snap->image;
if ( scale != ZM_SCALE_BASE )
{
snap_image.Scale( scale );
alarm_image.Assign( *snap_image );
//write_image.Assign( *snap_image );
if ( scale != ZM_SCALE_BASE ) {
alarm_image.Scale( scale );
}
if ( !config.timestamp_on_capture ) {
TimestampImage( &alarm_image, snap->timestamp );
}
image = &alarm_image;
} else {
image = image_buffer[index].image;
}
static char filename[PATH_MAX];
snprintf( filename, sizeof(filename), "Monitor%d.jpg", id );
if ( !config.timestamp_on_capture )
{
TimestampImage( &snap_image, snap->timestamp );
}
snap_image.WriteJpeg( filename );
image->WriteJpeg( filename );
}
else
{
@ -1547,7 +1558,7 @@ bool Monitor::Analyse()
if ( config.create_analysis_images )
{
bool got_anal_image = false;
Image alarm_image( *snap_image );
alarm_image.Assign( *snap_image );
for( int i = 0; i < n_zones; i++ )
{
if ( zones[i]->Alarmed() )

View File

@ -246,6 +246,8 @@ protected:
double fps;
Image delta_image;
Image ref_image;
Image alarm_image; // Used in creating analysis images, will be initialized in Analysis
Image write_image; // Used when creating snapshot images
Purpose purpose; // What this monitor has been created to do
int event_count;
@ -349,7 +351,7 @@ public:
State GetState() const;
int GetImage( int index=-1, int scale=100 ) const;
int GetImage( int index=-1, int scale=100 );
struct timeval GetTimestamp( int index=-1 ) const;
int GetCaptureDelay() const { return( capture_delay ); }
int GetAlarmCaptureDelay() const { return( alarm_capture_delay ); }

View File

@ -18,6 +18,7 @@
//
#include "zm_remote_camera_http.h"
#include "zm_rtsp_auth.h"
#include "zm_mem_utils.h"
@ -147,6 +148,12 @@ int RemoteCameraHttp::SendRequest()
return( 0 );
}
/* Return codes are as follows:
* -1 means there was an error
* 0 means no bytes were returned but there wasn't actually an error.
* > 0 is the # of bytes read.
*/
int RemoteCameraHttp::ReadData( Buffer &buffer, int bytes_expected )
{
fd_set rfds;
@ -158,8 +165,9 @@ int RemoteCameraHttp::ReadData( Buffer &buffer, int bytes_expected )
int n_found = select( sd+1, &rfds, NULL, NULL, &temp_timeout );
if( n_found == 0 )
{
Warning( "Select timed out" );
Disconnect();
Debug( 4, "Select timed out timeout was %d secs %d usecs", temp_timeout.tv_sec, temp_timeout.tv_usec );
// Why are we disconnecting? It's just a timeout, meaning that data wasn't available.
//Disconnect();
return( 0 );
}
else if ( n_found < 0)
@ -184,9 +192,11 @@ int RemoteCameraHttp::ReadData( Buffer &buffer, int bytes_expected )
if ( total_bytes_to_read == 0 )
{
Debug( 3, "Socket closed" );
Disconnect();
return( 0 );
// If socket is closed locally, then select will fail, but if it is closed remotely
// then we have an exception on our socket.. but no data.
Debug( 3, "Socket closed remotely" );
//Disconnect(); // Disconnect is done outside of ReadData now.
return( -1 );
}
}
Debug( 3, "Expecting %d bytes", total_bytes_to_read );
@ -205,9 +215,9 @@ int RemoteCameraHttp::ReadData( Buffer &buffer, int bytes_expected )
}
else if ( bytes_read == 0)
{
Debug( 3, "Socket closed" );
Disconnect();
return( 0 );
Debug( 2, "Socket closed" );
//Disconnect(); // Disconnect is done outside of ReadData now.
return( -1 );
}
else if ( bytes_read < bytes_to_read )
{
@ -228,6 +238,7 @@ int RemoteCameraHttp::ReadData( Buffer &buffer, int bytes_expected )
int RemoteCameraHttp::GetResponse()
{
int buffer_len;
#if HAVE_LIBPCRE
if ( method == REGEXP )
{
@ -257,17 +268,12 @@ int RemoteCameraHttp::GetResponse()
static RegExpr *content_length_expr = 0;
static RegExpr *content_type_expr = 0;
int buffer_len = ReadData( buffer );
if ( buffer_len == 0 )
{
Error( "Connection dropped by remote end" );
return( 0 );
}
else if ( buffer_len < 0 )
{
Error( "Unable to read header data" );
return( -1 );
while ( ! ( buffer_len = ReadData( buffer ) ) ) {
}
if ( buffer_len < 0 ) {
Error( "Unable to read header data" );
return( -1 );
}
if ( !header_expr )
header_expr = new RegExpr( "^(.+?\r?\n\r?\n)", PCRE_DOTALL );
if ( header_expr->Match( (char*)buffer, buffer.size() ) == 2 )
@ -435,16 +441,12 @@ int RemoteCameraHttp::GetResponse()
else
{
Debug( 3, "Unable to extract subheader from stream, retrying" );
int buffer_len = ReadData( buffer );
if ( buffer_len == 0 )
{
Error( "Connection dropped by remote end" );
return( 0 );
}
else if ( buffer_len < 0 )
{
return( -1 );
while ( ! ( buffer_len = ReadData( buffer ) ) ) {
}
if ( buffer_len < 0 ) {
Error( "Unable to extract subheader data" );
return( -1 );
}
}
break;
}
@ -479,14 +481,8 @@ int RemoteCameraHttp::GetResponse()
{
while ( (long)buffer.size() < content_length )
{
int buffer_len = ReadData( buffer );
if ( buffer_len == 0 )
{
Error( "Connection dropped by remote end" );
return( 0 );
}
else if ( buffer_len < 0 )
{
Debug(3, "Need more data buffer %d < content length %d", buffer.size(), content_length );
if ( ReadData( buffer ) < 0 ) {
Error( "Unable to read content" );
return( -1 );
}
@ -497,54 +493,26 @@ int RemoteCameraHttp::GetResponse()
{
while ( !content_length )
{
int buffer_len = ReadData( buffer );
if ( buffer_len == 0 )
{
if ( mode == MULTI_IMAGE )
{
Error( "Connection dropped by remote end" );
return( 0 );
}
}
else if ( buffer_len < 0 )
{
Error( "Unable to read content" );
return( -1 );
while ( ! ( buffer_len = ReadData( buffer ) ) ) {
}
if ( buffer_len < 0 ) {
Error( "Unable to read content" );
return( -1 );
}
static RegExpr *content_expr = 0;
if ( buffer_len )
{
if ( mode == MULTI_IMAGE )
{
if ( !content_expr )
{
char content_pattern[256] = "";
snprintf( content_pattern, sizeof(content_pattern), "^(.+?)(?:\r?\n)*(?:--)?%s\r?\n", content_boundary );
content_expr = new RegExpr( content_pattern, PCRE_DOTALL );
}
if ( content_expr->Match( buffer, buffer.size() ) == 2 )
{
content_length = content_expr->MatchLength( 1 );
Debug( 3, "Got end of image by pattern, content-length = %d", content_length );
}
}
}
else
{
content_length = buffer.size();
Debug( 3, "Got end of image by closure, content-length = %d", content_length );
if ( mode == SINGLE_IMAGE )
{
if ( !content_expr )
{
content_expr = new RegExpr( "^(.+?)(?:\r?\n){1,2}?$", PCRE_DOTALL );
}
if ( content_expr->Match( buffer, buffer.size() ) == 2 )
{
content_length = content_expr->MatchLength( 1 );
Debug( 3, "Trimmed end of image, new content-length = %d", content_length );
}
}
if ( mode == MULTI_IMAGE )
{
if ( !content_expr )
{
char content_pattern[256] = "";
snprintf( content_pattern, sizeof(content_pattern), "^(.+?)(?:\r?\n)*(?:--)?%s\r?\n", content_boundary );
content_expr = new RegExpr( content_pattern, PCRE_DOTALL );
}
if ( content_expr->Match( buffer, buffer.size() ) == 2 )
{
content_length = content_expr->MatchLength( 1 );
Debug( 3, "Got end of image by pattern, content-length = %d", content_length );
}
}
}
}
@ -650,17 +618,12 @@ int RemoteCameraHttp::GetResponse()
}
case HEADERCONT :
{
int buffer_len = ReadData( buffer );
if ( buffer_len == 0 )
{
Error( "Connection dropped by remote end" );
return( 0 );
}
else if ( buffer_len < 0 )
{
Error( "Unable to read header" );
return( -1 );
while ( ! ( buffer_len = ReadData( buffer ) ) ) {
}
if ( buffer_len < 0 ) {
Error( "Unable to read header" );
return( -1 );
}
char *crlf = 0;
char *header_ptr = (char *)buffer;
@ -1004,17 +967,12 @@ int RemoteCameraHttp::GetResponse()
else
{
Debug( 3, "Unable to extract subheader from stream, retrying" );
int buffer_len = ReadData( buffer );
if ( buffer_len == 0 )
{
Error( "Connection dropped by remote end" );
return( 0 );
}
else if ( buffer_len < 0 )
{
Error( "Unable to read subheader" );
return( -1 );
while ( ! ( buffer_len = ReadData( buffer ) ) ) {
}
if ( buffer_len < 0 ) {
Error( "Unable to read subheader" );
return( -1 );
}
state = SUBHEADERCONT;
}
break;
@ -1060,14 +1018,7 @@ int RemoteCameraHttp::GetResponse()
while ( (long)buffer.size() < content_length )
{
//int buffer_len = ReadData( buffer, content_length-buffer.size() );
int buffer_len = ReadData( buffer );
if ( buffer_len == 0 )
{
Error( "Connection dropped by remote end" );
return( 0 );
}
else if ( buffer_len < 0 )
{
if ( ReadData( buffer ) < 0 ) {
Error( "Unable to read content" );
return( -1 );
}
@ -1079,16 +1030,8 @@ int RemoteCameraHttp::GetResponse()
int content_pos = 0;
while ( !content_length )
{
int buffer_len = ReadData( buffer );
if ( buffer_len == 0 )
{
if ( mode == MULTI_IMAGE )
{
Error( "Connection dropped by remote end" );
return( 0 );
}
}
else if ( buffer_len < 0 )
buffer_len = ReadData( buffer );
if ( buffer_len < 0 )
{
Error( "Unable to read content" );
return( -1 );
@ -1147,7 +1090,7 @@ int RemoteCameraHttp::GetResponse()
}
}
Debug( 3, "Returning %d (%d) bytes of captured content", content_length, buffer.size() );
Debug( 3, "Returning %d bytes, buffer size: (%d) bytes of captured content", content_length, buffer.size() );
return( content_length );
}
}
@ -1191,7 +1134,7 @@ int RemoteCameraHttp::Capture( Image &image )
}
if ( content_length < 0 )
{
Error( "Unable to get response" );
Error( "Unable to get response, disconnecting" );
Disconnect();
return( -1 );
}

View File

@ -48,6 +48,14 @@ class ImageComponent extends Component {
$imageFile = $config['ZM_DIR_EVENTS']."/".$imagePath;
//$thumbFile = ZM_DIR_EVENTS."/".$thumbPath;
$thumbFile = $thumbPath;
// PP: This segment of code results in errors when trying to get Events API
// This actually seems to be generating images for the angular UI web view
// and should not be a part of the API anyway
// I've commented it so events APIs continue to work
// I did ask Kyle about this, but I don't have an answer from him
// Either way, it does no harm to remove it -- as the UI of master
// does not use API code anyway
/*
if ( $overwrite || !file_exists( $thumbFile ) || !filesize( $thumbFile ) )
{
// Get new dimensions
@ -63,8 +71,10 @@ class ImageComponent extends Component {
if ( !imagejpeg( $thumbImage, $thumbFile ) )
Error( "Can't create thumbnail '$thumbPath'" );
}
*/
}
/*
$imageData = array(
'eventPath' => $eventPath,
'imagePath' => $imagePath,
@ -77,6 +87,7 @@ class ImageComponent extends Component {
);
return( $imageData );
*/
}

View File

@ -20,6 +20,7 @@
// ZoneMinder german Translation by Robert Schumann (rs at core82 dot de)
// ZoneMinder german Translation by Sebastian Kaminski (github @seeebek)
// german Translation update by seebaer1976
// Notes for Translators
// 0. Get some credit, put your name in the line above (optional)
@ -77,7 +78,7 @@ $SLANG = array(
'8BitGrey' => '8-Bit-Grau',
'Action' => 'Aktion',
'Actual' => 'Original',
'AddNewControl' => 'Neues Kontrollelement hinzufügen',
'AddNewControl' => 'Neues Kontrollelement hinzufügen',
'AddNewMonitor' => 'Neuer Monitor',
'AddNewUser' => 'Neuer Benutzer',
'AddNewZone' => 'Neue Zone',
@ -88,7 +89,7 @@ $SLANG = array(
'AlarmLimits' => 'Alarm-Limits',
'AlarmMaximumFPS' => 'Alarm-Maximum-FPS',
'AlarmPx' => 'Alarm-Pixel',
'AlarmRGBUnset' => 'Sie müssen eine RGB-Alarmfarbe setzen',
'AlarmRGBUnset' => 'Sie müssen eine RGB-Alarmfarbe setzen',
'AlarmRefImageBlendPct'=> 'Alarm Reference Image Blend %ge', // Added - 2015-04-18
'Alert' => 'Alarm',
'All' => 'Alle',
@ -106,7 +107,7 @@ $SLANG = array(
'AttrCause' => 'Grund',
'AttrDate' => 'Datum',
'AttrDateTime' => 'Datum/Zeit',
'AttrDiskBlocks' => 'Disk-Bloecke',
'AttrDiskBlocks' => 'Disk-Blöcke',
'AttrDiskPercent' => 'Disk-Prozent',
'AttrDuration' => 'Dauer',
'AttrFrames' => 'Bilder',
@ -121,66 +122,66 @@ $SLANG = array(
'AttrTotalScore' => 'Totale Punktzahl',
'AttrWeekday' => 'Wochentag',
'Auto' => 'Auto',
'AutoStopTimeout' => 'Auto-Stopp-Zeitüberschreitung',
'Available' => 'Vorhanden', // Added - 2009-03-31
'AutoStopTimeout' => 'Auto-Stopp-Zeitüberschreitung',
'Available' => 'Verfügbar', // Added - 2009-03-31
'AvgBrScore' => 'Mittlere<br/>Punktzahl',
'Background' => 'Hintergrund',
'BackgroundFilter' => 'Filter im Hintergrund laufen lassen',
'BadAlarmFrameCount' => 'Die Bildanzahl muss ganzzahlig 1 oder größer sein',
'BadAlarmFrameCount' => 'Die Bildanzahl muss ganzzahlig 1 oder größer sein',
'BadAlarmMaxFPS' => 'Alarm-Maximum-FPS muss eine positive Ganzzahl oder eine Gleitkommazahl sein',
'BadChannel' => 'Der Kanal muss ganzzahlig 0 oder größer sein',
'BadColours' => 'Die Zielfarbe muss eine gültige Farbe sein.', // Added - 2011-06-15
'BadDevice' => 'Das Gerät muss eine gültige Systemresource sein',
'BadFPSReportInterval' => 'Der FPS-Intervall-Puffer-Zähler muss ganzzahlig 0 oder größer sein',
'BadFormat' => 'Das Format muss ganzzahlig 0 oder größer sein',
'BadFrameSkip' => 'Der Auslasszähler für Frames muss ganzzahlig 0 oder größer sein',
'BadHeight' => 'Die Höhe muss auf einen gültigen Wert eingestellt sein',
'BadHost' => 'Der Host muss auf eine gültige IP-Adresse oder einen Hostnamen (ohne http://) eingestellt sein',
'BadImageBufferCount' => 'Die Größe des Bildpuffers muss ganzzahlig 10 oder größer sein',
'BadLabelX' => 'Die x-Koordinate der Bezeichnung muss ganzzahlig 0 oder größer sein',
'BadLabelY' => 'Die y-Koordinate der Bezeichnung muss ganzzahlig 0 oder größer sein',
'BadChannel' => 'Der Kanal muss ganzzahlig 0 oder größer sein',
'BadColours' => 'Zielfarbe muss auf einen gültigen Wert gesetzt werden', // Added - 2011-06-15
'BadDevice' => 'Das Gerät muss eine gültige Systemresource sein',
'BadFPSReportInterval' => 'Der FPS-Intervall-Puffer-Zähler muss ganzzahlig 0 oder größer sein',
'BadFormat' => 'Das Format muss ganzzahlig 0 oder größer sein',
'BadFrameSkip' => 'Der Auslasszähler für Frames muss ganzzahlig 0 oder größer sein',
'BadHeight' => 'Die Höhe muss auf einen gültigen Wert eingestellt sein',
'BadHost' => 'Der Host muss auf eine gültige IP-Adresse oder einen Hostnamen (ohne http://) eingestellt sein',
'BadImageBufferCount' => 'Die Größe des Bildpuffers muss ganzzahlig 10 oder größer sein',
'BadLabelX' => 'Die x-Koordinate der Bezeichnung muss ganzzahlig 0 oder größer sein',
'BadLabelY' => 'Die y-Koordinate der Bezeichnung muss ganzzahlig 0 oder größer sein',
'BadMaxFPS' => 'Maximum-FPS muss eine positive Ganzzahl oder eine Gleitkommazahl sein',
'BadMotionFrameSkip' => 'Motion Frame skip count must be an integer of zero or more',
'BadNameChars' => 'Namen dürfen nur aus Buchstaben, Zahlen und Trenn- oder Unterstrichen bestehen',
'BadPalette' => 'Die Palette muss auf einen gültigen Wert eingestellt sein', // Added - 2009-03-31
'BadPath' => 'Der Pfad muss auf einen gültigen Wert eingestellt sein',
'BadPort' => 'Der Port muss auf eine gültige Zahl eingestellt sein',
'BadPostEventCount' => 'Der Zähler für die Ereignisfolgebilder muss ganzzahlig 0 oder größer sein',
'BadPreEventCount' => 'Der Zähler für die Ereignisvorlaufbilder muss mindestens ganzzahlig 0 und kleiner als die Bildpuffergröße sein',
'BadRefBlendPerc' => 'Der Referenz-Blenden-Prozentwert muss ganzzahlig 0 oder größer sein',
'BadSectionLength' => 'Die Bereichslänge muss ganzzahlig 0 oder größer sein',
'BadSignalCheckColour' => 'Die Signalprüffarbe muss auf einen gültigen Farbwert eingestellt sein',
'BadStreamReplayBuffer'=> 'Der Wiedergabestrompuffer tream replay buffer must be an integer of zero or more',
'BadWarmupCount' => 'Die Anzahl der Vorwärmbilder muss ganzzahlig 0 oder größer sein',
'BadWebColour' => 'Die Webfarbe muss auf einen gültigen Farbwert eingestellt sein',
'BadWidth' => 'Die Breite muss auf einen gültigen Wert eingestellt sein',
'BadMotionFrameSkip' => 'Bewegungsrahmen Skip-Zählung muß eine ganze Zahl von null oder mehr betragen,',
'BadNameChars' => 'Namen dürfen nur aus Buchstaben, Zahlen und Trenn- oder Unterstrichen bestehen',
'BadPalette' => 'Palette muss auf einen gültigen Wert gesetzt sein', // Added - 2009-03-31
'BadPath' => 'Der Pfad muss auf einen gültigen Wert eingestellt sein',
'BadPort' => 'Der Port muss auf eine gültige Zahl eingestellt sein',
'BadPostEventCount' => 'Der Zähler für die Ereignisfolgebilder muss ganzzahlig 0 oder größer sein',
'BadPreEventCount' => 'Der Zähler für die Ereignisvorlaufbilder muss mindestens ganzzahlig 0 und kleiner als die Bildpuffergröße sein',
'BadRefBlendPerc' => 'Der Referenz-Blenden-Prozentwert muss ganzzahlig 0 oder größer sein',
'BadSectionLength' => 'Die Bereichslänge muss ganzzahlig 0 oder größer sein',
'BadSignalCheckColour' => 'Die Signalprüffarbe muss auf einen gültigen Farbwert eingestellt sein',
'BadStreamReplayBuffer'=> 'Der Wiedergabestrompuffer muss eine ganze Zahl von null oder mehr betragen',
'BadWarmupCount' => 'Die Anzahl der Vorwärmbilder muss ganzzahlig 0 oder größer sein',
'BadWebColour' => 'Die Webfarbe muss auf einen gültigen Farbwert eingestellt sein',
'BadWidth' => 'Die Breite muss auf einen gültigen Wert eingestellt sein',
'Bandwidth' => 'Bandbreite',
'BandwidthHead' => 'Bandbreite', // This is the end of the bandwidth status on the top of the console, different in many language due to phrasing
'BlobPx' => 'Blob-Pixel',
'BlobSizes' => 'Blobgröße',
'BlobSizes' => 'Blobgröße',
'Blobs' => 'Blobs',
'Brightness' => 'Helligkeit',
'Buffer' => 'Buffer', // Added - 2015-04-18
'Buffers' => 'Buffer',
'CSSDescription' => 'Ändere das standard CSS für diesen Computer.', // Added - 2015-04-18
'CSSDescription' => 'Ändere das standard CSS für diesen Computer.', // Added - 2015-04-18
'CanAutoFocus' => 'Kann Autofokus',
'CanAutoGain' => 'Kann Auto-Verstärkung',
'CanAutoIris' => 'Kann Auto-Iris',
'CanAutoWhite' => 'Kann Auto-Weiß-Abgleich',
'CanAutoGain' => 'Kann Auto-Verstärkung',
'CanAutoIris' => 'Kann Auto-Blende',
'CanAutoWhite' => 'Kann Auto-Weiß-Abgleich',
'CanAutoZoom' => 'Kann Auto-Zoom',
'CanFocus' => 'Kann Fokus',
'CanFocusAbs' => 'Kann absoluten Fokus',
'CanFocusCon' => 'Kann kontinuierlichen Fokus',
'CanFocusRel' => 'Kann relativen Fokus',
'CanGain' => 'Kann Verstärkung',
'CanGainAbs' => 'Kann absolute Verstärkung',
'CanGainCon' => 'Kann kontinuierliche Verstärkung',
'CanGainRel' => 'Kann relative Verstäkung',
'CanIris' => 'Kann Iris',
'CanIrisAbs' => 'Kann absolute Iris',
'CanIrisCon' => 'Kann kontinuierliche Iris',
'CanIrisRel' => 'Kann relative Iris',
'CanMove' => 'Kann Bewegung',
'CanGain' => 'Kann Verstärkung',
'CanGainAbs' => 'Kann absolute Verstärkung',
'CanGainCon' => 'Kann kontinuierliche Verstärkung',
'CanGainRel' => 'Kann relative Verstärkung',
'CanIris' => 'Kann Blende',
'CanIrisAbs' => 'Kann absolute Blende',
'CanIrisCon' => 'Kann kontinuierliche Blende',
'CanIrisRel' => 'Kann relative Blende',
'CanMove' => 'Kann sich Bewegung',
'CanMoveAbs' => 'Kann absolute Bewegung',
'CanMoveCon' => 'Kann kontinuierliche Bewegung',
'CanMoveDiag' => 'Kann diagonale Bewegung',
@ -192,49 +193,49 @@ $SLANG = array(
'CanSleep' => 'Kann Sleep',
'CanTilt' => 'Kann Neigung',
'CanWake' => 'Kann Wake',
'CanWhite' => 'Kann Weiß-Abgleich',
'CanWhiteAbs' => 'Kann absoluten Weiß-Abgleich',
'CanWhiteBal' => 'Kann Weiß-Abgleich',
'CanWhiteCon' => 'Kann kontinuierlichen Weiß-Abgleich',
'CanWhiteRel' => 'Kann relativen Weiß-Abgleich',
'CanWhite' => 'Kann Weiß-Abgleich',
'CanWhiteAbs' => 'Kann absoluten Weiß-Abgleich',
'CanWhiteBal' => 'Kann Weiß-Abgleich-Balance',
'CanWhiteCon' => 'Kann kontinuierlichen Weiß-Abgleich',
'CanWhiteRel' => 'Kann relativen Weiß-Abgleich',
'CanZoom' => 'Kann Zoom',
'CanZoomAbs' => 'Kann absoluten Zoom',
'CanZoomCon' => 'Kann kontinuierlichen Zoom',
'CanZoomRel' => 'Kann relativen Zoom',
'Cancel' => 'Abbruch',
'CancelForcedAlarm' => 'Abbruch des unbedingten Alarms',
'CaptureHeight' => 'Erfasse Höhe',
'CaptureMethod' => 'Aufnahmemethode', // Added - 2009-02-08
'CapturePalette' => 'Erfasse Farbpalette',
'CaptureResolution' => 'Aufnahmeauflösung', // Added - 2015-04-18
'CaptureWidth' => 'Erfasse Breite',
'CaptureHeight' => 'Erfassungshöhe',
'CaptureMethod' => 'Erfassungsmethode', // Added - 2009-02-08
'CapturePalette' => 'Erfassungsfarbpalette',
'CaptureResolution' => 'Aufnahmeauflösung', // Added - 2015-04-18
'CaptureWidth' => 'Erfassungsbreite',
'Cause' => 'Grund',
'CheckMethod' => 'Alarm-Prüfmethode',
'ChooseDetectedCamera' => 'Wähle erkannte Kamera', // Added - 2009-03-31
'CheckMethod' => 'Alarm-Prüfmethode',
'ChooseDetectedCamera' => 'Erkannte Kamera wählen', // Added - 2009-03-31
'ChooseFilter' => 'Filterauswahl',
'ChooseLogFormat' => 'Wähle ein Log-Format', // Added - 2011-06-17
'ChooseLogSelection' => 'Wähle eine Log-Auswahl', // Added - 2011-06-17
'ChoosePreset' => 'Voreinstellung auswählen',
'ChooseLogFormat' => 'Log-Format wählen', // Added - 2011-06-17
'ChooseLogSelection' => 'Log-Auswahl', // Added - 2011-06-17
'ChoosePreset' => 'Voreinstellung auswählen',
'Clear' => 'Leeren', // Added - 2011-06-16
'Close' => 'Schließen',
'Close' => 'Schließen',
'Colour' => 'Farbe',
'Command' => 'Kommando',
'Component' => 'Komponente', // Added - 2011-06-16
'Config' => 'Konfig.',
'ConfiguredFor' => 'Konfiguriert für',
'ConfirmDeleteEvents' => 'Sind Sie sicher, dass Sie die ausgewählten Ereignisse löschen wollen?',
'ConfirmPassword' => 'Passwortbestätigung',
'ConfiguredFor' => 'Konfiguriert für',
'ConfirmDeleteEvents' => 'Sind Sie sicher, dass Sie die ausgewählten Ereignisse löschen wollen?',
'ConfirmPassword' => 'Passwortbestätigung',
'ConjAnd' => 'und',
'ConjOr' => 'oder',
'Console' => 'Konsole',
'ContactAdmin' => 'Bitte kontaktieren Sie den Administrator für weitere Details',
'ContactAdmin' => 'Bitte kontaktieren Sie den Administrator für weitere Details',
'Continue' => 'Weiter',
'Contrast' => 'Kontrast',
'Control' => 'Kontrolle',
'ControlAddress' => 'Kontrolladresse',
'ControlCap' => 'Kontrollmöglichkeit',
'ControlCaps' => 'Kontrollmöglichkeiten',
'ControlDevice' => 'Kontrollgerät',
'ControlCap' => 'Kontrollmöglichkeit',
'ControlCaps' => 'Kontrollmöglichkeiten',
'ControlDevice' => 'Kontrollgerät',
'ControlType' => 'Kontrolltyp',
'Controllable' => 'Kontrollierbar',
'Current' => 'Aktuell', // Added - 2015-04-18
@ -247,20 +248,20 @@ $SLANG = array(
'DefaultScale' => 'Standardskalierung',
'DefaultView' => 'Standardansicht',
'Deinterlacing' => 'Deinterlacing', // Added - 2015-04-18
'Delay' => 'Verzögerung', // Added - 2015-04-18
'Delete' => 'Löschen',
'DeleteAndNext' => 'Löschen &amp; Nächstes',
'DeleteAndPrev' => 'Löschen &amp; Vorheriges',
'DeleteSavedFilter' => 'Lösche gespeichertes Filter',
'Delay' => 'Verzögerung', // Added - 2015-04-18
'Delete' => 'Löschen',
'DeleteAndNext' => 'Löschen & Nächstes',
'DeleteAndPrev' => 'Löschen & Vorheriges',
'DeleteSavedFilter' => 'Lösche gespeichertes Filter',
'Description' => 'Beschreibung',
'DetectedCameras' => 'Erkannte Kameras', // Added - 2009-03-31
'DetectedProfiles' => 'Erkannte Profile', // Added - 2015-04-18
'Device' => 'Gerät', // Added - 2009-02-08
'DeviceChannel' => 'Gerätekanal',
'DeviceFormat' => 'Geräteformat',
'DeviceNumber' => 'Gerätenummer',
'DevicePath' => 'Gerätepfad',
'Devices' => 'Geräte',
'Device' => 'Gerät', // Added - 2009-02-08
'DeviceChannel' => 'Gerätekanal',
'DeviceFormat' => 'Geräteformat',
'DeviceNumber' => 'Gerätenummer',
'DevicePath' => 'Gerätepfad',
'Devices' => 'Geräte',
'Dimensions' => 'Abmessungen',
'DisableAlarms' => 'Alarme abschalten',
'Disk' => 'Disk',
@ -269,15 +270,15 @@ $SLANG = array(
'DoNativeMotionDetection'=> 'Do Native Motion Detection',
'Donate' => 'Bitte spenden Sie.',
'DonateAlready' => 'Nein, ich habe schon gespendet',
'DonateEnticement' => 'Sie benutzen ZoneMinder nun schon eine Weile und es ist hoffentlich eine nützliche Applikation zur Verbesserung Ihrer Heim- oder Arbeitssicherheit. Obwohl ZoneMinder eine freie Open-Source-Software ist und bleiben wird, entstehen Kosten bei der Entwicklung und dem Support.<br><br>Falls Sie ZoneMinder für Weiterentwicklung in der Zukunft unterstützen möchten, denken Sie bitte über eine Spende für das Projekt unter der Webadresse http://www.zoneminder.com/donate.html oder über nachfolgend stehende Option nach. Spenden sind, wie der Name schon sagt, immer freiwillig. Dem Projekt helfen kleine genauso wie größere Spenden sehr weiter und ein herzlicher Dank ist jedem Spender sicher.<br><br>Vielen Dank dafür, dass sie ZoneMinder benutzen. Vergessen Sie nicht die Foren unter ZoneMinder.com, um Support zu erhalten und Ihre Erfahrung mit ZoneMinder zu verbessern!',
'DonateEnticement' => 'Sie benutzen ZoneMinder nun schon eine Weile und es ist hoffentlich eine nützliche Applikation zur Verbesserung Ihrer Heim- oder Arbeitssicherheit. Obwohl ZoneMinder eine freie Open-Source-Software ist und bleiben wird, entstehen Kosten bei der Entwicklung und dem Support.<br><br>Falls Sie ZoneMinder für Weiterentwicklung in der Zukunft unterstützen möchten, denken Sie bitte über eine Spende für das Projekt unter der Webadresse http://www.zoneminder.com/donate.html oder über nachfolgend stehende Option nach. Spenden sind, wie der Name schon sagt, immer freiwillig. Dem Projekt helfen kleine genauso wie größere Spenden sehr weiter und ein herzlicher Dank ist jedem Spender sicher.<br><br>Vielen Dank dafür, dass sie ZoneMinder benutzen. Vergessen Sie nicht die Foren unter ZoneMinder.com, um Support zu erhalten und Ihre Erfahrung mit ZoneMinder zu verbessern!',
'DonateRemindDay' => 'Noch nicht, erinnere mich in einem Tag noch mal.',
'DonateRemindHour' => 'Noch nicht, erinnere mich in einer Stunde noch mal.',
'DonateRemindMonth' => 'Noch nicht, erinnere mich in einem Monat noch mal.',
'DonateRemindNever' => 'Nein, ich möchte nicht spenden, niemals erinnern.',
'DonateRemindNever' => 'Nein, ich möchte nicht spenden, niemals erinnern.',
'DonateRemindWeek' => 'Noch nicht, erinnere mich in einer Woche noch mal.',
'DonateYes' => 'Ja, ich möchte jetzt spenden.',
'DonateYes' => 'Ja, ich möchte jetzt spenden.',
'Download' => 'Download',
'DuplicateMonitorName' => 'Duplizierter Monitorname', // Added - 2009-03-31
'DuplicateMonitorName' => 'Monitornamen Duplizieren', // Added - 2009-03-31
'Duration' => 'Dauer',
'Edit' => 'Bearbeiten',
'Email' => 'E-Mail',
@ -286,16 +287,16 @@ $SLANG = array(
'EnterNewFilterName' => 'Neuen Filternamen eingeben',
'Error' => 'Fehler',
'ErrorBrackets' => 'Fehler. Bitte nur gleiche Anzahl offener und geschlossener Klammern.',
'ErrorValidValue' => 'Fehler. Bitte alle Werte auf richtige Eingabe prüfen',
'ErrorValidValue' => 'Fehler. Bitte alle Werte auf richtige Eingabe prüfen',
'Etc' => 'etc.',
'Event' => 'Ereignis',
'EventFilter' => 'Ereignisfilter',
'EventId' => 'Ereignis-ID',
'EventName' => 'Ereignisname',
'EventPrefix' => 'Ereignis-Präfix',
'EventPrefix' => 'Ereignis-Präfix',
'Events' => 'Ereignisse',
'Exclude' => 'Ausschluss;',
'Execute' => 'Ausführen',
'Execute' => 'Ausführen',
'Export' => 'Exportieren',
'ExportDetails' => 'Exportiere Ereignis-Details',
'ExportFailed' => 'Exportieren fehlgeschlagen',
@ -304,31 +305,31 @@ $SLANG = array(
'ExportFormatZip' => 'ZIP (Komprimiert)',
'ExportFrames' => 'Exportiere Bilddetails',
'ExportImageFiles' => 'Exportiere Bilddateien',
'ExportLog' => 'Export Log', // Added - 2011-06-17
'ExportLog' => 'Log Exportieren', // Added - 2011-06-17
'ExportMiscFiles' => 'Exportiere andere Dateien (falls vorhanden)',
'ExportOptions' => 'Exportierungsoptionen',
'ExportSucceeded' => 'Export erfolgreich', // Added - 2009-02-08
'ExportOptions' => 'Exportoptionen',
'ExportSucceeded' => 'Export Erfolgreich', // Added - 2009-02-08
'ExportVideoFiles' => 'Exportiere Videodateien (falls vorhanden)',
'Exporting' => 'Exportiere',
'FPS' => 'fps',
'FPSReportInterval' => 'fps-Meldeintervall',
'FPS' => 'FPS',
'FPSReportInterval' => 'FPS-Meldeintervall',
'FTP' => 'FTP',
'Far' => 'Weit',
'FastForward' => 'Schnell vorwärts',
'FastForward' => 'Schnell vorwärts',
'Feed' => 'Eingabe',
'Ffmpeg' => 'Ffmpeg', // Added - 2009-02-08
'File' => 'Datei',
'Filter' => 'Filter', // Added - 2015-04-18
'FilterArchiveEvents' => 'Archivierung aller Treffer',
'FilterDeleteEvents' => 'Löschen aller Treffer',
'FilterDeleteEvents' => 'Löschen aller Treffer',
'FilterEmailEvents' => 'Detaillierte E-Mail zu allen Treffern',
'FilterExecuteEvents' => 'Ausführen bei allen Treffern',
'FilterExecuteEvents' => 'Ausführen bei allen Treffern',
'FilterLog' => 'Log filtern', // Added - 2015-04-18
'FilterMessageEvents' => 'Detaillierte Nachricht zu allen Treffern',
'FilterPx' => 'Filter-Pixel',
'FilterUnset' => 'Sie müssen eine Breite und Höhe für das Filter angeben',
'FilterUnset' => 'Sie müssen eine Breite und Höhe für das Filter angeben',
'FilterUploadEvents' => 'Hochladen aller Treffer',
'FilterVideoEvents' => 'Video für alle Treffer erstellen',
'FilterVideoEvents' => 'Video für alle Treffer erstellen',
'Filters' => 'Filter',
'First' => 'Erstes',
'FlippedHori' => 'Horizontal gespiegelt',
@ -340,7 +341,7 @@ $SLANG = array(
'FnNone' => 'Keine', // Added 2013.08.16.
'FnRecord' => 'Record', // Added 2013.08.16.
'Focus' => 'Fokus',
'ForceAlarm' => 'Erzwinge Alarm',
'ForceAlarm' => 'Alarm erzwingen',
'Format' => 'Format',
'Frame' => 'Bild',
'FrameId' => 'Bild-ID',
@ -349,7 +350,7 @@ $SLANG = array(
'Frames' => 'Bilder',
'Func' => 'Fkt.',
'Function' => 'Funktion',
'Gain' => 'Verstärkung',
'Gain' => 'Verstärkung',
'General' => 'Allgemeines',
'GenerateVideo' => 'Erzeuge Video',
'GeneratingVideo' => 'Erzeuge Video...',
@ -358,15 +359,15 @@ $SLANG = array(
'Group' => 'Gruppe',
'Groups' => 'Gruppen',
'HasFocusSpeed' => 'Hat Fokus-Geschwindigkeit',
'HasGainSpeed' => 'Hat Verstäkungs-Geschwindigkeit',
'HasGainSpeed' => 'Hat Verstärkungs-Geschwindigkeit',
'HasHomePreset' => 'Hat Standardvoreinstellungen',
'HasIrisSpeed' => 'Hat Irisgeschwindigkeit',
'HasIrisSpeed' => 'Hat Blendengeschwindigkeit',
'HasPanSpeed' => 'Hat Pan-Geschwindigkeit',
'HasPresets' => 'Hat Voreinstellungen',
'HasTiltSpeed' => 'Hat Neigungsgeschwindigkeit',
'HasTurboPan' => 'Hat Turbo-Pan',
'HasTurboTilt' => 'Hat Turbo-Neigung',
'HasWhiteSpeed' => 'Hat Weiß-Abgleichgeschwindigkeit',
'HasWhiteSpeed' => 'Hat Weiß-Abgleichgeschwindigkeit',
'HasZoomSpeed' => 'Hat Zoom-Geschwindigkeit',
'High' => 'hohe',
'HighBW' => 'Hohe B/W',
@ -377,13 +378,13 @@ $SLANG = array(
'Idle' => 'Leerlauf',
'Ignore' => 'Ignoriere',
'Image' => 'Bild',
'ImageBufferSize' => 'Bildpuffergröße',
'ImageBufferSize' => 'Bildpuffergröße',
'Images' => 'Bilder',
'In' => 'In',
'Include' => 'Einschluss',
'Inverted' => 'Invertiert',
'Iris' => 'Iris',
'KeyString' => 'Schlüsselwort',
'Iris' => 'Blende',
'KeyString' => 'Schlüsselwort',
'Label' => 'Bezeichnung',
'Language' => 'Sprache',
'Last' => 'Letztes',
@ -416,21 +417,21 @@ $SLANG = array(
'MaxFocusRange' => 'Maximaler Fokusbereich',
'MaxFocusSpeed' => 'Maximale Fokusgeschwindigkeit',
'MaxFocusStep' => 'Maximale Fokusstufe',
'MaxGainRange' => 'Maximaler Verstärkungsbereich',
'MaxGainSpeed' => 'Maximale Verstärkungsgeschwindigkeit',
'MaxGainStep' => 'Maximale Verstärkungsstufe',
'MaxIrisRange' => 'Maximaler Irisbereich',
'MaxIrisSpeed' => 'Maximale Irisgeschwindigkeit',
'MaxIrisStep' => 'Maximale Irisstufe',
'MaxGainRange' => 'Maximaler Verstärkungsbereich',
'MaxGainSpeed' => 'Maximale Verstärkungsgeschwindigkeit',
'MaxGainStep' => 'Maximale Verstärkungsstufe',
'MaxIrisRange' => 'Maximaler Blendenbereich',
'MaxIrisSpeed' => 'Maximale Blendengeschwindigkeit',
'MaxIrisStep' => 'Maximale Blendenstufe',
'MaxPanRange' => 'Maximaler Pan-Bereich',
'MaxPanSpeed' => 'Maximale Pan-Geschw.',
'MaxPanStep' => 'Maximale Pan-Stufe',
'MaxTiltRange' => 'Maximaler Neig.-Bereich',
'MaxTiltSpeed' => 'Maximale Neig.-Geschw.',
'MaxTiltStep' => 'Maximale Neig.-Stufe',
'MaxWhiteRange' => 'Maximaler Weiß-Abgl.bereich',
'MaxWhiteSpeed' => 'Maximale Weiß-Abgl.geschw.',
'MaxWhiteStep' => 'Maximale Weiß-Abgl.stufe',
'MaxWhiteRange' => 'Maximaler Weiß-Abgl.bereich',
'MaxWhiteSpeed' => 'Maximale Weiß-Abgl.geschw.',
'MaxWhiteStep' => 'Maximale Weiß-Abgl.stufe',
'MaxZoomRange' => 'Maximaler Zoom-Bereich',
'MaxZoomSpeed' => 'Maximale Zoom-Geschw.',
'MaxZoomStep' => 'Maximale Zoom-Stufe',
@ -439,35 +440,35 @@ $SLANG = array(
'MediumBW' => 'Mittlere B/W',
'Message' => 'Nachricht', // Added - 2011-06-16
'MinAlarmAreaLtMax' => 'Der minimale Alarmbereich sollte kleiner sein als der maximale',
'MinAlarmAreaUnset' => 'Sie müssen einen Minimumwert an Alarmflächenpixeln angeben',
'MinBlobAreaLtMax' => 'Die minimale Blob-Fläche muss kleiner sein als die maximale',
'MinBlobAreaUnset' => 'Sie müssen einen Minimumwert an Blobflächenpixeln angeben',
'MinBlobLtMinFilter' => 'Die minimale Blob-Fläche sollte kleiner oder gleich der minimalen Filterfläche sein',
'MinBlobsLtMax' => 'Die minimalen Blobs müssen kleiner sein als die maximalen',
'MinBlobsUnset' => 'Sie müssen einen Minimumwert an Blobs angeben',
'MinFilterAreaLtMax' => 'Die minimale Filterfläche sollte kleiner sein als die maximale',
'MinFilterAreaUnset' => 'Sie müssen einen Minimumwert an Filterpixeln angeben',
'MinFilterLtMinAlarm' => 'Die minimale Filterfläche sollte kleiner oder gleich der minimalen Alarmfläche sein',
'MinAlarmAreaUnset' => 'Sie müssen einen Minimumwert an Alarmflächenpixeln angeben',
'MinBlobAreaLtMax' => 'Die minimale Blob-Fläche muss kleiner sein als die maximale',
'MinBlobAreaUnset' => 'Sie müssen einen Minimumwert an Blobflächenpixeln angeben',
'MinBlobLtMinFilter' => 'Die minimale Blob-Fläche sollte kleiner oder gleich der minimalen Filterfläche sein',
'MinBlobsLtMax' => 'Die minimalen Blobs müssen kleiner sein als die maximalen',
'MinBlobsUnset' => 'Sie müssen einen Minimumwert an Blobs angeben',
'MinFilterAreaLtMax' => 'Die minimale Filterfläche sollte kleiner sein als die maximale',
'MinFilterAreaUnset' => 'Sie müssen einen Minimumwert an Filterpixeln angeben',
'MinFilterLtMinAlarm' => 'Die minimale Filterfläche sollte kleiner oder gleich der minimalen Alarmfläche sein',
'MinFocusRange' => 'Min. Fokusbereich',
'MinFocusSpeed' => 'Min. Fokusgeschw.',
'MinFocusStep' => 'Min. Fokusstufe',
'MinGainRange' => 'Min. Verstärkungsbereich',
'MinGainSpeed' => 'Min. Verstärkungsgeschwindigkeit',
'MinGainStep' => 'Min. Verstärkungsstufe',
'MinIrisRange' => 'Min. Irisbereich',
'MinIrisSpeed' => 'Min. Irisgeschwindigkeit',
'MinIrisStep' => 'Min. Irisstufe',
'MinGainRange' => 'Min. Verstärkungsbereich',
'MinGainSpeed' => 'Min. Verstärkungsgeschwindigkeit',
'MinGainStep' => 'Min. Verstärkungsstufe',
'MinIrisRange' => 'Min. Blendenbereich',
'MinIrisSpeed' => 'Min. Blendengeschwindigkeit',
'MinIrisStep' => 'Min. Blendenstufe',
'MinPanRange' => 'Min. Pan-Bereich',
'MinPanSpeed' => 'Min. Pan-Geschwindigkeit',
'MinPanStep' => 'Min. Pan-Stufe',
'MinPixelThresLtMax' => 'Der minimale Pixelschwellwert muss kleiner sein als der maximale',
'MinPixelThresUnset' => 'Sie müssen einen minimalen Pixel-Schwellenwert angeben',
'MinPixelThresUnset' => 'Sie müssen einen minimalen Pixel-Schwellenwert angeben',
'MinTiltRange' => 'Min. Neigungsbereich',
'MinTiltSpeed' => 'Min. Neigungsgeschwindigkeit',
'MinTiltStep' => 'Min. Neigungsstufe',
'MinWhiteRange' => 'Min. Weiß-Abgleichbereich',
'MinWhiteSpeed' => 'Min. Weiß-Abgleichgeschwindigkeit',
'MinWhiteStep' => 'Min. Weiß-Abgleichstufe',
'MinWhiteRange' => 'Min. Weiß-Abgleichbereich',
'MinWhiteSpeed' => 'Min. Weiß-Abgleichgeschwindigkeit',
'MinWhiteStep' => 'Min. Weiß-Abgleichstufe',
'MinZoomRange' => 'Min. Zoom-Bereich',
'MinZoomSpeed' => 'Min. Zoom-Geschwindigkeit',
'MinZoomStep' => 'Min. Zoom-Stufe',
@ -476,9 +477,9 @@ $SLANG = array(
'Monitor' => 'Monitor',
'MonitorIds' => 'Monitor-ID',
'MonitorPreset' => 'Monitor-Voreinstellung',
'MonitorPresetIntro' => 'Wählen Sie eine geeignete Voreinstellung aus der folgenden Liste.<br><br>Bitte beachten Sie, dass dies mögliche Einstellungen von Ihnen am Monitor überschreiben kann.<br><br>',
'MonitorPresetIntro' => 'Wählen Sie eine geeignete Voreinstellung aus der folgenden Liste.<br><br>Bitte beachten Sie, dass dies mögliche Einstellungen von Ihnen am Monitor überschreiben kann.<br><br>',
'MonitorProbe' => 'Kamera suche', // Added - 2009-03-31
'MonitorProbeIntro' => 'Die nachfolgende Liste zeigt erkannte Analog- und Netzwerkkameras, ob sie bereits genutzt werden und ob sie zur Auswahl verfügbar sind.<br/><br/>Wähle den gewünschten Eintrag aus der folgenden Liste.<br/><br/>Bitte Beachten: Nicht alle Kameras können erkannt werden. Die Auswahl einer Kamera kann bereits eingetragene Werte im aktuellen Monitor überschreiben.<br/><br/>', // Added - 2009-03-31
'MonitorProbeIntro' => 'Die nachfolgende Liste zeigt erkannte Analog- und Netzwerkkameras, ob sie bereits genutzt werden und ob sie zur Auswahl verfügbar sind.<br/><br/>Wähle den gewünschten Eintrag aus der folgenden Liste.<br/><br/>Bitte Beachten: Nicht alle Kameras können erkannt werden. Die Auswahl einer Kamera kann bereits eingetragene Werte im aktuellen Monitor überschreiben.<br/><br/>', // Added - 2009-03-31
'Monitors' => 'Monitore',
'Montage' => 'Montage',
'Month' => 'Monat',
@ -490,11 +491,11 @@ $SLANG = array(
'Mtg3widgrx' => '3 Spalten, skaliert, vergr. bei Alarm', // Added 2013.08.15.
'Mtg4widgrd' => '4 Spalten', // Added 2013.08.15.
'MtgDefault' => 'Standard', // Added 2013.08.15.
'MustBeGe' => 'muss groesser oder gleich sein wie',
'MustBeGe' => 'muss größer oder gleich sein wie',
'MustBeLe' => 'muss kleiner oder gleich sein wie',
'MustConfirmPassword' => 'Sie müssen das Passwort bestätigen.',
'MustSupplyPassword' => 'Sie müssen ein Passwort vergeben.',
'MustSupplyUsername' => 'Sie müssen einen Usernamen vergeben.',
'MustConfirmPassword' => 'Sie müssen das Passwort bestätigen.',
'MustSupplyPassword' => 'Sie müssen ein Passwort vergeben.',
'MustSupplyUsername' => 'Sie müssen einen Usernamen vergeben.',
'Name' => 'Name',
'Near' => 'Nah',
'Network' => 'Netzwerk',
@ -504,23 +505,23 @@ $SLANG = array(
'NewPassword' => 'Neues Passwort',
'NewState' => 'Neuer Status',
'NewUser' => 'Neuer Benutzer',
'Next' => 'Nächstes',
'Next' => 'Nächstes',
'No' => 'Nein',
'NoDetectedCameras' => 'Keine Kameras erkannt', // Added - 2009-03-31
'NoFramesRecorded' => 'Es gibt keine Aufnahmen von diesem Ereignis.',
'NoGroup' => 'Keine Gruppe',
'NoSavedFilters' => 'Keine gespeicherten Filter',
'NoStatisticsRecorded' => 'Keine Statistik für dieses Ereignis/diese Bilder',
'NoStatisticsRecorded' => 'Keine Statistik für dieses Ereignis/diese Bilder',
'None' => 'ohne',
'NoneAvailable' => 'Nichts verfügbar',
'NoneAvailable' => 'Nichts verfügbar',
'Normal' => 'Normal',
'Notes' => 'Bemerkungen',
'NumPresets' => 'Nummerierte Voreinstellungen',
'Off' => 'Aus',
'On' => 'An',
'OnvifCredentialsIntro'=> 'Bitte den Benutzernamen und das Passwort für die gewählte Kamera eintragen.<br/>Der hier eingetragene Benutzer wird erstellt mitsamt des Passworts, falls kein Benutzer für diese Kamera erstellt wurde.<br/><br/>', // Added - 2015-04-18
'OnvifCredentialsIntro'=> 'Bitte den Benutzernamen und das Passwort für die gewählte Kamera eintragen.<br/>Der hier eingetragene Benutzer wird erstellt mitsamt des Passworts, falls kein Benutzer für diese Kamera erstellt wurde.<br/><br/>', // Added - 2015-04-18
'OnvifProbe' => 'ONVIF', // Added - 2015-04-18
'OnvifProbeIntro' => 'Die folgende Liste zeigt erkannte ONVIF Kameras, ob sie bereits genutzt werden und ob sie zur Auswahl verfügbar sind.<br/><br/>Wähle den gewünschten Eintrag aus der folgenden Liste.<br/><br/>Bitte Beachten: Nicht alle Kameras können erkannt werden. Die Auswahl einer Kamera kann bereits eingetragene Werte im aktuellen Monitor überschreiben.<br/><br/>', // Added - 2015-04-18
'OnvifProbeIntro' => 'Die folgende Liste zeigt erkannte ONVIF Kameras, ob sie bereits genutzt werden und ob sie zur Auswahl verfügbar sind.<br/><br/>Wähle den gewünschten Eintrag aus der folgenden Liste.<br/><br/>Bitte Beachten: Nicht alle Kameras können erkannt werden. Die Auswahl einer Kamera kann bereits eingetragene Werte im aktuellen Monitor überschreiben.<br/><br/>', // Added - 2015-04-18
'OpEq' => 'gleich zu',
'OpGt' => 'groesser als',
'OpGtEq' => 'groesser oder gleich wie',
@ -531,23 +532,23 @@ $SLANG = array(
'OpNe' => 'nicht gleich',
'OpNotIn' => 'nicht im Satz',
'OpNotMatches' => 'nicht zutreffend',
'Open' => 'öffnen',
'Open' => 'öffnen',
'OptionHelp' => 'Hilfe',
'OptionRestartWarning' => 'Veränderungen werden erst nach einem Neustart des Programms aktiv.\nFür eine sofortige änderung starten Sie das Programm bitte neu.',
'OptionRestartWarning' => 'Veränderungen werden erst nach einem Neustart des Programms aktiv.\nFür eine sofortige änderung starten Sie das Programm bitte neu.',
'Options' => 'Optionen',
'OrEnterNewName' => 'oder neuen Namen eingeben',
'Order' => 'Reihenfolge',
'Orientation' => 'Ausrichtung',
'Out' => 'Aus',
'OverwriteExisting' => 'überschreibe bestehende',
'OverwriteExisting' => 'überschreibe bestehende',
'Paged' => 'Seitennummeriert',
'Pan' => 'Pan',
'PanLeft' => 'Pan-Left',
'PanRight' => 'Pan-Right',
'PanLeft' => 'Pan-Links',
'PanRight' => 'Pan-Rechts',
'PanTilt' => 'Pan/Neigung',
'Parameter' => 'Parameter',
'Password' => 'Passwort',
'PasswordsDifferent' => 'Die Passwörter sind unterschiedlich',
'PasswordsDifferent' => 'Die Passwörter sind unterschiedlich',
'Paths' => 'Pfade',
'Pause' => 'Pause',
'Phone' => 'Telefon',
@ -562,13 +563,13 @@ $SLANG = array(
'Point' => 'Punkt',
'PostEventImageBuffer' => 'Nachereignispuffer',
'PreEventImageBuffer' => 'Vorereignispuffer',
'PreserveAspect' => 'Seitenverhältnis beibehalten',
'PreserveAspect' => 'Seitenverhältnis beibehalten',
'Preset' => 'Voreinstellung',
'Presets' => 'Voreinstellungen',
'Prev' => 'Vorheriges',
'Probe' => 'Sonde', // Added - 2009-03-31
'Probe' => 'Suchen', // Added - 2009-03-31
'ProfileProbe' => 'Streamsonde', // Added - 2015-04-18
'ProfileProbeIntro' => 'Die folgende Liste zeigt die verfügbaren Streamingprofile der ausgewählten Kamera.<br/><br/>Wähle den gewünschten Eintrag aus der folgenden Liste.<br/><br/>Bitte Beachten: Zoneminder kann keine zusätzlichen Profile konfigurieren. Die Auswahl einer Kamera kann bereits eingetragene Werte im aktuellen Monitor überschreiben.<br/><br/>', // Added - 2015-04-18
'ProfileProbeIntro' => 'Die folgende Liste zeigt die verfügbaren Streamingprofile der ausgewählten Kamera.<br/><br/>Wähle den gewünschten Eintrag aus der folgenden Liste.<br/><br/>Bitte Beachten: Zoneminder kann keine zusätzlichen Profile konfigurieren. Die Auswahl einer Kamera kann bereits eingetragene Werte im aktuellen Monitor überschreiben.<br/><br/>', // Added - 2015-04-18
'Progress' => 'Fortschritt', // Added - 2015-04-18
'Protocol' => 'Protokoll',
'Rate' => 'Abspielgeschwindigkeit',
@ -587,20 +588,20 @@ $SLANG = array(
'Rename' => 'Umbenennen',
'Replay' => 'Wiederholung',
'ReplayAll' => 'Alle Ereignisse',
'ReplayGapless' => 'Lückenlose Ereignisse',
'ReplayGapless' => 'Lückenlose Ereignisse',
'ReplaySingle' => 'Einzelereignis',
'Reset' => 'Zurücksetzen',
'ResetEventCounts' => 'Lösche Ereignispunktzahl',
'Reset' => 'Zurücksetzen',
'ResetEventCounts' => 'Lösche Ereignispunktzahl',
'Restart' => 'Neustart',
'Restarting' => 'Neustarten',
'RestrictedCameraIds' => 'Verbotene Kamera-ID',
'RestrictedMonitors' => 'Eingeschränkte Monitore',
'ReturnDelay' => 'Rückkehr-Verzögerung',
'ReturnLocation' => 'Rückkehrpunkt',
'Rewind' => 'Zurückspulen',
'RestrictedMonitors' => 'Eingeschränkte Monitore',
'ReturnDelay' => 'Rückkehr-Verzögerung',
'ReturnLocation' => 'Rückkehrpunkt',
'Rewind' => 'Zurückspulen',
'RotateLeft' => 'Drehung links',
'RotateRight' => 'Drehung rechts',
'RunLocalUpdate' => 'Bitte zmupdate.pl starten um upzudaten.', // Added - 2011-05-25
'RunLocalUpdate' => 'Für Update "zmupdate.pl" ausführen', // Added - 2011-05-25
'RunMode' => 'Betriebsmodus',
'RunState' => 'Laufender Status',
'Running' => 'In Betrieb',
@ -610,12 +611,12 @@ $SLANG = array(
'Scale' => 'Skalierung',
'Score' => 'Punktzahl',
'Secs' => 'Sekunden',
'Sectionlength' => 'Sektionslänge',
'Sectionlength' => 'Sektionslänge',
'Select' => 'Auswahl',
'SelectFormat' => 'Format Auswahl', // Added - 2011-06-17
'SelectLog' => 'Log Auswahl', // Added - 2011-06-17
'SelectMonitors' => 'Wähle Monitore',
'SelfIntersecting' => 'Die Polygonränder dürfen sich nicht überschneiden.',
'SelectFormat' => 'Format auswählen', // Added - 2011-06-17
'SelectLog' => 'Log auswählen', // Added - 2011-06-17
'SelectMonitors' => 'Wähle Monitore',
'SelfIntersecting' => 'Die Polygonränder dürfen sich nicht überschneiden.',
'Set' => 'Setze',
'SetNewBandwidth' => 'Setze neue Bandbreite',
'SetPreset' => 'Setze Voreinstellung',
@ -623,8 +624,8 @@ $SLANG = array(
'ShowFilterWindow' => 'Zeige Filterfenster',
'ShowTimeline' => 'Zeige Zeitlinie',
'SignalCheckColour' => 'Farbe des Signalchecks',
'Size' => 'Größe',
'SkinDescription' => 'Wähle den standard Skin für diesen Computer.', // Added - 2011-01-30
'Size' => 'Größe',
'SkinDescription' => 'Wähle den standard Skin für diesen Computer.', // Added - 2011-01-30
'Sleep' => 'Schlaf',
'SortAsc' => 'aufsteigend',
'SortBy' => 'Sortieren nach',
@ -640,16 +641,16 @@ $SLANG = array(
'SpeedTurbo' => 'Turbo-Geschwindigkeit',
'Start' => 'Start',
'State' => 'Status',
'Stats' => 'Status',
'Stats' => 'Statistik',
'Status' => 'Status',
'Step' => 'Stufe',
'StepBack' => 'Einen Schritt rückwärts',
'StepForward' => 'Einen Schritt vorwärts',
'StepLarge' => 'Große Stufe',
'StepMedium' => 'Mittlere Stufe',
'StepNone' => 'Keine Stufe',
'StepSmall' => 'Kleine Stufe',
'Stills' => 'Bilder',
'StepBack' => 'Einen Schritt rückwärts',
'StepForward' => 'Einen Schritt vorwärts',
'StepLarge' => 'Großer Schritt',
'StepMedium' => 'Mittlere Schhritt',
'StepNone' => 'Keine Schritt',
'StepSmall' => 'Kleiner Schritt',
'Stills' => 'Standbilder',
'Stop' => 'Stop',
'Stopped' => 'Gestoppt',
'Stream' => 'Stream',
@ -659,16 +660,16 @@ $SLANG = array(
'SystemLog' => 'System Log', // Added - 2011-06-16
'TargetColorspace' => 'Zielfarbbereich', // Added - 2015-04-18
'Tele' => 'Tele',
'Thumbnail' => 'Miniatur',
'Thumbnail' => 'Miniaturbild',
'Tilt' => 'Neigung',
'Time' => 'Zeit',
'TimeDelta' => 'Zeitdifferenz',
'TimeStamp' => 'Zeitstempel',
'Timeline' => 'Zeitlinie',
'TimelineTip1' => 'Bewege die Maus über dem Graphen um eine Vorschau und Ereignisdetails zu sehen.', // Added 2013.08.15.
'TimelineTip2' => 'Clicke auf den farbigen Abschnitt des Graphen oder auf das Bild um den Ereignis zu betrachten', // Added 2013.08.15.
'TimelineTip3' => 'Clicke auf den Hintergrund, um in den Zeitabschnitt um das Ereignis hereinzuzoomen.', // Added 2013.08.15.
'TimelineTip4' => 'Benutze die unteren Bedienelemente um herauszuzoomen oder sich in der Zeitleiste zu bewegen.', // Added 2013.08.15.
'TimelineTip1' => 'Fahren Sie mit der Maus über die Grafik, um eine Momentaufnahme der Bild- und Ereignisdetails zusehen.', // Added 2013.08.15.
'TimelineTip2' => 'Klicken Sie auf den farbig markierten Bereichen der Grafik oder das Bild, um das Ereignis zu sehen.', // Added 2013.08.15.
'TimelineTip3' => 'Klicken Sie auf den Hintergrund, um in einen kleineren Zeitraum zu vergrößern.', // Added 2013.08.15.
'TimelineTip4' => 'Verwenden Sie die Steuerelemente unten, um zu Zoomen oder navigieren Sie vorwärts und rückwärts durch die Zeit.', // Added 2013.08.15.
'Timestamp' => 'Zeitstempel',
'TimestampLabelFormat' => 'Format des Zeitstempels',
'TimestampLabelX' => 'Zeitstempel-X',
@ -677,9 +678,9 @@ $SLANG = array(
'Tools' => 'Werkzeuge',
'Total' => 'Total', // Added - 2011-06-16
'TotalBrScore' => 'Totale<br/>Punktzahl',
'TrackDelay' => 'Nachführungsverzögerung',
'TrackMotion' => 'Bewegungs-Nachführung',
'Triggers' => 'Auslöser',
'TrackDelay' => 'Nachführungsverzögerung',
'TrackMotion' => 'Bewegungs-Nachführung',
'Triggers' => 'Auslöser',
'TurboPanSpeed' => 'Turbo-Pan-Geschwindigkeit',
'TurboTiltSpeed' => 'Turbo-Neigungsgeschwindigkeit',
'Type' => 'Typ',
@ -688,12 +689,12 @@ $SLANG = array(
'Units' => 'Einheiten',
'Unknown' => 'Unbekannt',
'Update' => 'Aktualisieren',
'UpdateAvailable' => 'Eine Aktualisierung für ZoneMinder ist verfügbar.',
'UpdateNotNecessary' => 'Es ist keine Aktualisierung verfügbar.',
'UpdateAvailable' => 'Eine Aktualisierung für ZoneMinder ist verfügbar.',
'UpdateNotNecessary' => 'Es ist keine Aktualisierung verfügbar.',
'Updated' => 'Aktualisiert', // Added - 2011-06-16
'Upload' => 'Hochladen', // Added - 2011-08-23
'UseFilter' => 'Benutze Filter',
'UseFilterExprsPost' => ' Filter Ausdrücke', // This is used at the end of the phrase 'use N filter expressions'
'UseFilterExprsPost' => ' Filter Ausdrücke', // This is used at the end of the phrase 'use N filter expressions'
'UseFilterExprsPre' => 'Benutze ', // This is used at the beginning of the phrase 'use N filter expressions'
'UsedPlugins' => 'Used Plugins',
'User' => 'Benutzer',
@ -707,7 +708,7 @@ $SLANG = array(
'VersionIgnore' => 'Ignoriere diese Version',
'VersionRemindDay' => 'Erinnere mich wieder in 1 Tag.',
'VersionRemindHour' => 'Erinnere mich wieder in 1 Stunde.',
'VersionRemindNever' => 'Informiere mich nicht mehr über neue Versionen.',
'VersionRemindNever' => 'Informiere mich nicht mehr über neue Versionen.',
'VersionRemindWeek' => 'Erinnere mich wieder in 1 Woche.',
'Video' => 'Video',
'VideoFormat' => 'Videoformat',
@ -716,19 +717,19 @@ $SLANG = array(
'VideoGenNoFiles' => 'Keine Videodateien gefunden.',
'VideoGenParms' => 'Parameter der Videoerzeugung',
'VideoGenSucceeded' => 'Videoerzeugung erfolgreich!',
'VideoSize' => 'Videogröße',
'VideoSize' => 'Videogröße',
'View' => 'Ansicht',
'ViewAll' => 'Alles ansehen',
'ViewEvent' => 'Zeige Ereignis',
'ViewPaged' => 'Seitenansicht',
'Wake' => 'Aufwachen',
'WarmupFrames' => 'Aufwärmbilder',
'WarmupFrames' => 'Aufwärmbilder',
'Watch' => 'Beobachte',
'Web' => 'Web',
'WebColour' => 'Webfarbe',
'Week' => 'Woche',
'White' => 'Weiß',
'WhiteBalance' => 'Weiß-Abgleich',
'White' => 'Weiß',
'WhiteBalance' => 'Weiß-Abgleich',
'Wide' => 'Weit',
'X' => 'X',
'X10' => 'X10',
@ -739,17 +740,17 @@ $SLANG = array(
'Yes' => 'Ja',
'YouNoPerms' => 'Keine Erlaubnis zum Zugang dieser Resource.',
'Zone' => 'Zone',
'ZoneAlarmColour' => 'Alarmfarbe (Rot/Grün/Blau)',
'ZoneAlarmColour' => 'Alarmfarbe (Rot/Grün/Blau)',
'ZoneArea' => 'Zone Area',
'ZoneExtendAlarmFrames' => 'Alarmstatus nach Ende für Frames aufrechterhalten',
'ZoneFilterSize' => 'Filter-Breite/-Höhe (Pixel)',
'ZoneMinMaxAlarmArea' => 'Min./max. Alarmfläche',
'ZoneMinMaxBlobArea' => 'Min./max. Blobfläche',
'ZoneExtendAlarmFrames' => 'Alarmstatus nach Ende für Frames aufrechterhalten',
'ZoneFilterSize' => 'Filter-Breite/-Höhe (Pixel)',
'ZoneMinMaxAlarmArea' => 'Min./max. Alarmfläche',
'ZoneMinMaxBlobArea' => 'Min./max. Blobfläche',
'ZoneMinMaxBlobs' => 'Min./max. Blobs',
'ZoneMinMaxFiltArea' => 'Min./max. Filterfläche',
'ZoneMinMaxFiltArea' => 'Min./max. Filterfläche',
'ZoneMinMaxPixelThres' => 'Min./max. Pixelschwellwert',
'ZoneMinderLog' => 'ZoneMinder Log', // Added - 2011-06-17
'ZoneOverloadFrames' => 'Bildauslassrate bei Systemüberlastung',
'ZoneOverloadFrames' => 'Bildauslassrate bei Systemüberlastung',
'Zones' => 'Zonen',
'Zoom' => 'Zoom',
'ZoomIn' => 'Hineinzoomen',
@ -765,7 +766,7 @@ $CLANG = array(
'MonitorCount' => '%1$s %2$s', // For example '4 Monitors' (from Vlang below)
'MonitorFunction' => 'Monitor %1$s Funktion',
'RunningRecentVer' => 'Sie benutzen die aktuellste Version von Zoneminder, v%s.',
'VersionMismatch' => 'Version mismatch, system is version %1$s, database is %2$s.', // Added - 2011-05-25
'VersionMismatch' => 'Versionskonflikt, System-Version ist %1$s , Datenbank-Version ist %2$s.', // Added - 2011-05-25
);
// The next section allows you to describe a series of word ending and counts used to
@ -902,4 +903,4 @@ $OLANG = array(
// ),
);
?>
?>