Merge branch 'master' of github.com:ZoneMinder/ZoneMinder
This commit is contained in:
commit
956e2936a3
|
@ -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}")
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
--
|
||||
|
|
|
@ -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...")
|
||||
|
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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 )
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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() )
|
||||
|
|
|
@ -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 ); }
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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 & Nächstes',
|
||||
'DeleteAndPrev' => 'Löschen & 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(
|
|||
// ),
|
||||
);
|
||||
|
||||
?>
|
||||
?>
|
Loading…
Reference in New Issue