def play(camera_number, show_controls=None): """ Function to call to play the IP Camera feed. Determines if controls are shown or not. """ camera = Camera(camera_number) if camera.Connected(monitor): if show_controls == None: show_controls = False # Generic IP Cameras default without Controls if camera._type != GENERIC_IPCAM: # Foscam Cameras default with Controls show_controls = True if show_controls: player = CameraControlsWindow(camera, monitor) player.start() else: url = camera.getStreamUrl(0) name = settings.getCameraName(camera.number) utils.log( 2, 'Camera %s :: Name: %s; Url: %s' % (camera.number, name, url)) listitem = xbmcgui.ListItem() listitem.setInfo(type='Video', infoLabels={'Title': name}) listitem.setArt({'thumb': utils.get_icon(camera.number)}) utils.log( 1, 'Camera %s :: *** Playing Fullscreen *** URL: %s' % (camera.number, url)) player = xbmc.Player() player.play(url, listitem) if monitor.resume_previous_file(): while not player.isPlaying() and not monitor.stopped( ) and not monitor.abortRequested(): monitor.waitForAbort(.5) while player.isPlaying( ) and not monitor.stopped() and not monitor.abortRequested(): monitor.waitForAbort(.5) monitor.maybe_resume_previous() else: utils.log( 3, 'Camera %s :: Camera is not configured correctly' % camera.number) utils.notify('Camera %s not configured correctly' % camera.number)
def run(self, monitor): self.monitor = monitor self.monitor.reset() preview_enabled_cameras = [] self.threads = [] for camera_number in "123456": utils.log(2, 'Camera %s :: Enabled: %s; Preview Enabled: %s' %(camera_number, settings.enabled_camera(camera_number), settings.enabled_preview(camera_number))) if settings.enabled_camera(camera_number): camera = Camera(camera_number) if settings.enabled_preview(camera_number): if camera.Connected(self.monitor, useCache=False): previewWindow = threading.Thread(target = camerapreview.CameraPreviewWindow, args = (camera, self.monitor, )) previewWindow.daemon = True previewWindow.start() t = CameraPreviewThread(camera, self.monitor, ) t.daemon = True self.threads.append(t) t.start() utils.log(1, 'Camera %s :: Preview Thread started.' %camera_number) else: utils.log(1, 'Camera %s :: Preview thread did not start because camera is not properly configured.' %camera_number) utils.notify('Error Connecting to Camera %s.' %camera_number) utils.notify(utils.translation(32224)) #Service Started xbmc.executebuiltin('Container.Refresh') while not self.monitor.stopped() and not self.monitor.abortRequested(): self.monitor.waitForAbort(1) if self.monitor.stopped() and not self.monitor.abortRequested(): utils.notify(utils.translation(32225)) #Service Restarting self.restart() '''
def play(camera_number, show_controls = None): """ Function to call to play the IP Camera feed. Determines if controls are shown or not. """ camera = Camera(camera_number) if camera.Connected(monitor): if show_controls == None: show_controls = False # Generic IP Cameras default without Controls if camera._type != GENERIC_IPCAM: # Foscam Cameras default with Controls show_controls = True if show_controls: player = CameraControlsWindow(camera, monitor) player.start() else: url = camera.getStreamUrl(0) name = settings.getCameraName(camera.number) utils.log(2, 'Camera %s :: Name: %s; Url: %s' %(camera.number, name, url)) listitem = xbmcgui.ListItem() listitem.setInfo(type = 'Video', infoLabels = {'Title': name}) listitem.setArt({'thumb': utils.get_icon(camera.number)}) utils.log(1, 'Camera %s :: *** Playing Fullscreen *** URL: %s' %(camera.number, url)) player = xbmc.Player() player.play(url, listitem) if monitor.resume_previous_file(): while not player.isPlaying() and not monitor.stopped() and not monitor.abortRequested(): monitor.waitForAbort(.5) while player.isPlaying() and not monitor.stopped() and not monitor.abortRequested(): monitor.waitForAbort(.5) monitor.maybe_resume_previous() else: utils.log(3, 'Camera %s :: Camera is not configured correctly' %camera.number) utils.notify('Camera %s not configured correctly' %camera.number)
def main_menu(): """ First Level Menu to access main functions """ if settings.atLeastOneCamera(): # All Camera Player addDirectoryItem(name = utils.translation(32027), icon = utils.get_icon('default'), fanart = utils.get_fanart('default'), parameters = {'action': 'all_cameras'}) for camera_number in "123456": if settings.enabled_camera(camera_number): camera = Camera(camera_number) list_label = settings.getCameraName(camera_number) # Build Context Menu li = li = xbmcgui.ListItem(list_label) context_items = [] if settings.getSetting('enabled_preview', camera_number) == 'true': #Show Preview context_items.append((utils.translation(32210), 'RunPlugin(plugin://plugin.video.surveillanceroom?action=show_preview&camera_number=%s)' %camera_number)) #Disable Preview context_items.append((utils.translation(32212), 'RunPlugin(plugin://plugin.video.surveillanceroom?action=disable_preview&camera_number=%s)' %camera_number)) else: #Enable Preview context_items.append((utils.translation(32211), 'RunPlugin(plugin://plugin.video.surveillanceroom?action=enable_preview&camera_number=%s)' %camera_number)) camera_type = settings.getCameraType(camera_number) if camera_type < 3: #Play Stream no Controls context_items.append((utils.translation(32214), 'RunPlugin(plugin://plugin.video.surveillanceroom?action=single_camera_no_controls&camera_number=%s)' %camera_number)) #Camera Settings context_items.append((utils.translation(32215), 'RunPlugin(plugin://plugin.video.surveillanceroom?action=camera_settings&camera_number=%s)' %camera_number)) # Update Fanart if settings.getSetting_int('fanart') == 1: context_items.append((utils.translation(32213), 'RunPlugin(plugin://plugin.video.surveillanceroom?action=update_fanart&camera_number=%s)' %camera_number)) li.addContextMenuItems(context_items, replaceItems=True) # Fanart URL new_art_url = None if camera.Connected(monitor): new_art_url = camera.getSnapShotUrl() else: if camera.Connected(monitor, False): new_art_url = camera.getSnapShotUrl() # Single Camera Player for enabled cameras addDirectoryItem(name = list_label, icon = utils.get_icon(camera_number), fanart = utils.get_fanart(camera_number, new_art_url), li = li, parameters = {'action': 'single_camera', 'camera_number': camera_number}) # Link to Second Level Advanced Menu addDirectoryItem(name = utils.translation(32029), isFolder = True, icon = utils.get_icon('advanced'), fanart = utils.get_fanart('default'), parameters={'action': 'advanced'}) else: # Add-on Settings if no cameras are configured addDirectoryItem(name = utils.translation(32028), icon = utils.get_icon('settings'), fanart = utils.get_fanart('default'), parameters = {'action': 'settings'}) xbmcplugin.endOfDirectory(handle=handle, succeeded=True) utils.cleanup_images()
# Enable Preview elif action == 'enable_preview': settings.setSetting('enabled_preview', camera_number, 'true') xbmc.executebuiltin('Container.Refresh') # Toggle All Preview elif action == 'toggle_preview': monitor.togglePreview() # Update Fanart elif action == 'update_fanart': camera = Camera(camera_number) if camera.Connected(monitor, False): utils.get_fanart(camera_number, camera.getSnapShotUrl(), update = True) xbmc.executebuiltin('Container.Refresh') else: utils.notify(utils.translation(32222)) # Restart Preview Service elif action == 'restart_service': monitor.stop() # Preliminary attempt to show an overlay based on a URL, not fully tested and does not close on its own yet elif action == 'show_preview_custom':
def main_menu(): """ First Level Menu to access main functions """ if settings.atLeastOneCamera(): # All Camera Player addDirectoryItem(name=utils.translation(32027), icon=utils.get_icon('default'), fanart=utils.get_fanart('default'), parameters={'action': 'all_cameras'}) for camera_number in "123456": if settings.enabled_camera(camera_number): camera = Camera(camera_number) list_label = settings.getCameraName(camera_number) # Build Context Menu li = li = xbmcgui.ListItem(list_label) context_items = [] if settings.getSetting('enabled_preview', camera_number) == 'true': #Show Preview context_items.append((utils.translation( 32210 ), 'RunPlugin(plugin://plugin.video.surveillanceroom?action=show_preview&camera_number=%s)' % camera_number)) #Disable Preview context_items.append((utils.translation( 32212 ), 'RunPlugin(plugin://plugin.video.surveillanceroom?action=disable_preview&camera_number=%s)' % camera_number)) else: #Enable Preview context_items.append((utils.translation( 32211 ), 'RunPlugin(plugin://plugin.video.surveillanceroom?action=enable_preview&camera_number=%s)' % camera_number)) camera_type = settings.getCameraType(camera_number) if camera_type < 3: #Play Stream no Controls context_items.append((utils.translation( 32214 ), 'RunPlugin(plugin://plugin.video.surveillanceroom?action=single_camera_no_controls&camera_number=%s)' % camera_number)) #Camera Settings context_items.append((utils.translation( 32215 ), 'RunPlugin(plugin://plugin.video.surveillanceroom?action=camera_settings&camera_number=%s)' % camera_number)) # Update Fanart if settings.getSetting_int('fanart') == 1: context_items.append((utils.translation( 32213 ), 'RunPlugin(plugin://plugin.video.surveillanceroom?action=update_fanart&camera_number=%s)' % camera_number)) li.addContextMenuItems(context_items, replaceItems=True) # Fanart URL new_art_url = None if camera.Connected(monitor): new_art_url = camera.getSnapShotUrl() else: if camera.Connected(monitor, False): new_art_url = camera.getSnapShotUrl() # Single Camera Player for enabled cameras addDirectoryItem(name=list_label, icon=utils.get_icon(camera_number), fanart=utils.get_fanart( camera_number, new_art_url), li=li, parameters={ 'action': 'single_camera', 'camera_number': camera_number }) # Link to Second Level Advanced Menu addDirectoryItem(name=utils.translation(32029), isFolder=True, icon=utils.get_icon('advanced'), fanart=utils.get_fanart('default'), parameters={'action': 'advanced'}) else: # Add-on Settings if no cameras are configured addDirectoryItem(name=utils.translation(32028), icon=utils.get_icon('settings'), fanart=utils.get_fanart('default'), parameters={'action': 'settings'}) xbmcplugin.endOfDirectory(handle=handle, succeeded=True) utils.cleanup_images()
elif action == 'disable_preview': settings.setSetting('enabled_preview', camera_number, 'false') xbmc.executebuiltin('Container.Refresh') # Enable Preview elif action == 'enable_preview': settings.setSetting('enabled_preview', camera_number, 'true') xbmc.executebuiltin('Container.Refresh') # Toggle All Preview elif action == 'toggle_preview': monitor.togglePreview() # Update Fanart elif action == 'update_fanart': camera = Camera(camera_number) if camera.Connected(monitor, False): utils.get_fanart(camera_number, camera.getSnapShotUrl(), update=True) xbmc.executebuiltin('Container.Refresh') else: utils.notify(utils.translation(32222)) # Restart Preview Service elif action == 'restart_service': monitor.stop() # Preliminary attempt to show an overlay based on a URL, not fully tested and does not close on its own yet elif action == 'show_preview_custom':
def __init__(self, camera_number, title="Camera Settings"): title = "Camera Settings" self.x = 340 self.y = 150 width = 540 height = 400 self.ROW_START = 45 self.ROW_HEIGHT = 30 self.X_SHIFT = 10 self.LABEL_WIDTH = 240 self.camera = Camera(camera_number) self.label_enabled = {0: "Disabled", 1: "Enabled"} self.label_interval = { 5: "5 seconds", 6: "6 seconds", 7: "7 seconds", 8: "8 seconds", 9: "9 seconds", 10: "10 seconds", 11: "11 seconds", 12: "12 seconds", 13: "13 seconds", 14: "14 seconds", 15: "15 seconds", } self.label_sensitivity = {0: "Low", 1: "Medium", 2: "High", 3: "Lower", 4: "Lowest"} # Draw the window controls self._place_window(width, height, title) self.place_irconfig(0) self.place_pt_speedconfig(1) self.place_z_speedconfig(2) self.get_motion_default() self.place_motion_enable(3) self.place_motion_sensitivityconfig(4) self.place_motion_triggerconfig(5) self.get_sound_default() self.place_sound_enable(6) self.place_sound_sensitivityconfig(7) self.place_sound_triggerconfig(8) self.place_mjpeg_enable(9) self.place_close_button(10) # Set up/down navigation self.window_close_button.controlDown(self.radio_irAuto) self.radio_irAuto.controlUp(self.window_close_button) self.radio_irOn.controlUp(self.window_close_button) self.radio_irOff.controlUp(self.window_close_button) self.radio_irAuto.controlDown(self.button_pt_speedup) self.radio_irOn.controlDown(self.button_pt_speeddown) self.radio_irOff.controlDown(self.button_pt_speeddown) self.button_pt_speedup.controlUp(self.radio_irAuto) self.button_pt_speeddown.controlUp(self.radio_irOff) self.button_pt_speedup.controlDown(self.button_z_speedup) self.button_pt_speeddown.controlDown(self.button_z_speeddown) self.button_z_speedup.controlUp(self.button_pt_speedup) self.button_z_speeddown.controlUp(self.button_pt_speeddown) self.button_z_speedup.controlDown(self.radio_motion) self.button_z_speeddown.controlDown(self.radio_motion) self.radio_motion.controlUp(self.button_z_speedup) self.radio_motion.controlDown(self.button_m_sensitivityup) self.button_m_sensitivityup.controlUp(self.radio_motion) self.button_m_sensitivitydown.controlUp(self.radio_motion) self.button_m_sensitivityup.controlDown(self.button_m_triggerup) self.button_m_sensitivitydown.controlDown(self.button_m_triggerup) self.button_m_triggerup.controlUp(self.button_m_sensitivityup) self.button_m_triggerdown.controlUp(self.button_m_sensitivitydown) self.button_m_triggerup.controlDown(self.radio_sound) self.button_m_triggerdown.controlDown(self.radio_sound) self.radio_sound.controlUp(self.button_m_triggerup) self.radio_sound.controlDown(self.button_s_sensitivityup) self.button_s_sensitivityup.controlUp(self.radio_sound) self.button_s_sensitivitydown.controlUp(self.radio_sound) self.button_s_sensitivityup.controlDown(self.button_s_triggerup) self.button_s_sensitivitydown.controlDown(self.button_s_triggerdown) self.button_s_triggerup.controlUp(self.button_s_sensitivityup) self.button_s_triggerdown.controlUp(self.button_s_sensitivitydown) self.button_s_triggerup.controlDown(self.radio_mjpeg) self.button_s_triggerdown.controlDown(self.radio_h264) self.radio_mjpeg.controlUp(self.button_s_triggerup) self.radio_h264.controlUp(self.button_s_triggerdown) self.radio_mjpeg.controlDown(self.button_close) self.radio_h264.controlDown(self.button_close) self.button_close.controlUp(self.radio_mjpeg) # Disable unsupported features ptz = settings.getSetting_int("ptz", self.camera.number) if ptz == 0: # Disable Pan & Tilt self.label_pt.setEnabled(False) self.button_pt_speedup.setEnabled(False) self.button_pt_speeddown.setEnabled(False) self.label_pt_speedsetting.setEnabled(False) if ptz < 2: # Disable Zoom: self.label_z.setEnabled(False) self.button_z_speedup.setEnabled(False) self.button_z_speeddown.setEnabled(False) self.label_z_speedsetting.setEnabled(False) motion_enabled, sound_enabled = settings.getEnabledAlarms(self.camera.number) if not motion_enabled: self.label_m.setEnabled(False) self.label_ms.setEnabled(False) self.label_mt.setEnabled(False) self.radio_motion.setEnabled(False) self.button_m_triggerup.setEnabled(False) self.button_m_triggerdown.setEnabled(False) self.label_m_triggersetting.setEnabled(False) self.button_m_sensitivityup.setEnabled(False) self.button_m_sensitivitydown.setEnabled(False) self.label_m_sensitivitysetting.setEnabled(False) if not sound_enabled: self.label_s.setEnabled(False) self.label_ss.setEnabled(False) self.label_st.setEnabled(False) self.radio_sound.setEnabled(False) self.button_s_triggerup.setEnabled(False) self.button_s_triggerdown.setEnabled(False) self.label_s_triggersetting.setEnabled(False) self.button_s_sensitivityup.setEnabled(False) self.button_s_sensitivitydown.setEnabled(False) self.label_s_sensitivitysetting.setEnabled(False) self.setFocus(self.radio_irAuto)
class CameraSettingsWindow(xbmcgui.WindowDialog): """ The main window class Future Features: get_dev_name() | set_dev_name('name') devName get_osd_setting() | set_osd_setting(params) isEnableTimeStamp: Time stamp will display on screen or not isEnableDevName: Camera name will display on screen or not isEnableOSDMask: Is OSD mask effective """ def __init__(self, camera_number, title="Camera Settings"): title = "Camera Settings" self.x = 340 self.y = 150 width = 540 height = 400 self.ROW_START = 45 self.ROW_HEIGHT = 30 self.X_SHIFT = 10 self.LABEL_WIDTH = 240 self.camera = Camera(camera_number) self.label_enabled = {0: "Disabled", 1: "Enabled"} self.label_interval = { 5: "5 seconds", 6: "6 seconds", 7: "7 seconds", 8: "8 seconds", 9: "9 seconds", 10: "10 seconds", 11: "11 seconds", 12: "12 seconds", 13: "13 seconds", 14: "14 seconds", 15: "15 seconds", } self.label_sensitivity = {0: "Low", 1: "Medium", 2: "High", 3: "Lower", 4: "Lowest"} # Draw the window controls self._place_window(width, height, title) self.place_irconfig(0) self.place_pt_speedconfig(1) self.place_z_speedconfig(2) self.get_motion_default() self.place_motion_enable(3) self.place_motion_sensitivityconfig(4) self.place_motion_triggerconfig(5) self.get_sound_default() self.place_sound_enable(6) self.place_sound_sensitivityconfig(7) self.place_sound_triggerconfig(8) self.place_mjpeg_enable(9) self.place_close_button(10) # Set up/down navigation self.window_close_button.controlDown(self.radio_irAuto) self.radio_irAuto.controlUp(self.window_close_button) self.radio_irOn.controlUp(self.window_close_button) self.radio_irOff.controlUp(self.window_close_button) self.radio_irAuto.controlDown(self.button_pt_speedup) self.radio_irOn.controlDown(self.button_pt_speeddown) self.radio_irOff.controlDown(self.button_pt_speeddown) self.button_pt_speedup.controlUp(self.radio_irAuto) self.button_pt_speeddown.controlUp(self.radio_irOff) self.button_pt_speedup.controlDown(self.button_z_speedup) self.button_pt_speeddown.controlDown(self.button_z_speeddown) self.button_z_speedup.controlUp(self.button_pt_speedup) self.button_z_speeddown.controlUp(self.button_pt_speeddown) self.button_z_speedup.controlDown(self.radio_motion) self.button_z_speeddown.controlDown(self.radio_motion) self.radio_motion.controlUp(self.button_z_speedup) self.radio_motion.controlDown(self.button_m_sensitivityup) self.button_m_sensitivityup.controlUp(self.radio_motion) self.button_m_sensitivitydown.controlUp(self.radio_motion) self.button_m_sensitivityup.controlDown(self.button_m_triggerup) self.button_m_sensitivitydown.controlDown(self.button_m_triggerup) self.button_m_triggerup.controlUp(self.button_m_sensitivityup) self.button_m_triggerdown.controlUp(self.button_m_sensitivitydown) self.button_m_triggerup.controlDown(self.radio_sound) self.button_m_triggerdown.controlDown(self.radio_sound) self.radio_sound.controlUp(self.button_m_triggerup) self.radio_sound.controlDown(self.button_s_sensitivityup) self.button_s_sensitivityup.controlUp(self.radio_sound) self.button_s_sensitivitydown.controlUp(self.radio_sound) self.button_s_sensitivityup.controlDown(self.button_s_triggerup) self.button_s_sensitivitydown.controlDown(self.button_s_triggerdown) self.button_s_triggerup.controlUp(self.button_s_sensitivityup) self.button_s_triggerdown.controlUp(self.button_s_sensitivitydown) self.button_s_triggerup.controlDown(self.radio_mjpeg) self.button_s_triggerdown.controlDown(self.radio_h264) self.radio_mjpeg.controlUp(self.button_s_triggerup) self.radio_h264.controlUp(self.button_s_triggerdown) self.radio_mjpeg.controlDown(self.button_close) self.radio_h264.controlDown(self.button_close) self.button_close.controlUp(self.radio_mjpeg) # Disable unsupported features ptz = settings.getSetting_int("ptz", self.camera.number) if ptz == 0: # Disable Pan & Tilt self.label_pt.setEnabled(False) self.button_pt_speedup.setEnabled(False) self.button_pt_speeddown.setEnabled(False) self.label_pt_speedsetting.setEnabled(False) if ptz < 2: # Disable Zoom: self.label_z.setEnabled(False) self.button_z_speedup.setEnabled(False) self.button_z_speeddown.setEnabled(False) self.label_z_speedsetting.setEnabled(False) motion_enabled, sound_enabled = settings.getEnabledAlarms(self.camera.number) if not motion_enabled: self.label_m.setEnabled(False) self.label_ms.setEnabled(False) self.label_mt.setEnabled(False) self.radio_motion.setEnabled(False) self.button_m_triggerup.setEnabled(False) self.button_m_triggerdown.setEnabled(False) self.label_m_triggersetting.setEnabled(False) self.button_m_sensitivityup.setEnabled(False) self.button_m_sensitivitydown.setEnabled(False) self.label_m_sensitivitysetting.setEnabled(False) if not sound_enabled: self.label_s.setEnabled(False) self.label_ss.setEnabled(False) self.label_st.setEnabled(False) self.radio_sound.setEnabled(False) self.button_s_triggerup.setEnabled(False) self.button_s_triggerdown.setEnabled(False) self.label_s_triggersetting.setEnabled(False) self.button_s_sensitivityup.setEnabled(False) self.button_s_sensitivitydown.setEnabled(False) self.label_s_sensitivitysetting.setEnabled(False) self.setFocus(self.radio_irAuto) # CONTROLS ##################################### def _place_window(self, width, height, title): """ Main window drawing """ X_MARGIN = 5 # Horisontal adjustment for a header background if the main background has transparent edges. Y_MARGIN = 5 # Vertical adjustment for a header background if the main background has transparent edges Y_SHIFT = 4 # Header position adjustment if the main backround has visible borders. HEADER_HEIGHT = 35 # The height of a window header (for the title background and the title label). background_img = os.path.join(_images, "AddonWindow", "ContentPanel.png") background = xbmcgui.ControlImage(self.x, self.y, width, height, background_img) title_background_img = os.path.join(_images, "AddonWindow", "dialogheader.png") title_background = xbmcgui.ControlImage( self.x + X_MARGIN, self.y + Y_MARGIN, width - 2 * X_MARGIN, HEADER_HEIGHT, title_background_img ) title_bar = xbmcgui.ControlLabel( self.x + X_MARGIN, self.y + Y_MARGIN + Y_SHIFT, width - 2 * X_MARGIN, HEADER_HEIGHT, title, alignment=ALIGN_CENTER, textColor="0xFFFFA500", font="font13_title", ) self.window_close_button = xbmcgui.ControlButton( self.x + width - 70, self.y + Y_MARGIN + Y_SHIFT, 60, 30, "", focusTexture=os.path.join(_images, "AddonWindow", "DialogCloseButton-focus.png"), noFocusTexture=os.path.join(_images, "AddonWindow", "DialogCloseButton.png"), ) self.addControl(background) self.addControl(title_background) self.addControl(title_bar) self.addControl(self.window_close_button) def place_close_button(self, row): """ Close Buttondrawing """ BUTTON_WIDTH = 100 self.button_close = Button( self.x + 220, self.y + self.ROW_START + self.ROW_HEIGHT * row + 15, BUTTON_WIDTH, self.ROW_HEIGHT, "Close" ) self.addControl(self.button_close) def place_irconfig(self, row): """ IR LED Controls """ label_value = "IR LED Control" self.label_ir = xbmcgui.ControlLabel( self.x + self.X_SHIFT, self.y + self.ROW_START + self.ROW_HEIGHT * row, self.LABEL_WIDTH, self.ROW_HEIGHT, label_value, ) BUTTON_WIDTH = 80 SPACE = 20 self.radio_irAuto = RadioButton( self.x + self.X_SHIFT + self.LABEL_WIDTH, self.y + self.ROW_START + self.ROW_HEIGHT * row, BUTTON_WIDTH, self.ROW_HEIGHT, "Auto", ) self.radio_irOn = RadioButton( self.x + self.X_SHIFT + self.LABEL_WIDTH + BUTTON_WIDTH + SPACE, self.y + self.ROW_START + self.ROW_HEIGHT * row, BUTTON_WIDTH, self.ROW_HEIGHT, "On", ) self.radio_irOff = RadioButton( self.x + self.X_SHIFT + self.LABEL_WIDTH + BUTTON_WIDTH * 2 + SPACE, self.y + self.ROW_START + self.ROW_HEIGHT * row, BUTTON_WIDTH, self.ROW_HEIGHT, "Off", ) self.addControl(self.label_ir) self.addControl(self.radio_irAuto) self.addControl(self.radio_irOn) self.addControl(self.radio_irOff) self.radio_irAuto.controlLeft(self.radio_irOff) self.radio_irAuto.controlRight(self.radio_irOn) self.radio_irOn.controlLeft(self.radio_irAuto) self.radio_irOn.controlRight(self.radio_irOff) self.radio_irOff.controlLeft(self.radio_irOn) self.radio_irOff.controlRight(self.radio_irAuto) if int(self.camera.get_ir_config()[1].get("mode")) == 0: self.radio_irAuto.setSelected(True) else: if int(self.camera.get_dev_state()[1].get("infraLedState")) == 1: self.radio_irOn.setSelected(True) else: self.radio_irOff.setSelected(True) def place_pt_speedconfig(self, row): """ Pan and Tilt Camera Speed Controls """ self.ptlabel = {0: "Very Slow", 1: "Slow", 2: "Normal", 3: "Fast", 4: "Very Fast"} self.pt_speed = int(self.camera.get_ptz_speed()[1].get("speed")) label_value = "Pan & Tilt Speed" self.label_pt = xbmcgui.ControlLabel( self.x + self.X_SHIFT, self.y + self.ROW_START + self.ROW_HEIGHT * row, self.LABEL_WIDTH, self.ROW_HEIGHT, label_value, ) BUTTON_WIDTH = 40 LABEL_WIDTH = 160 SPACE = 20 self.button_pt_speedup = Button( self.x + self.X_SHIFT + self.LABEL_WIDTH, self.y + self.ROW_START + self.ROW_HEIGHT * row, BUTTON_WIDTH, self.ROW_HEIGHT, "+", ) self.label_pt_speedsetting = xbmcgui.ControlLabel( self.x + self.X_SHIFT + self.LABEL_WIDTH + BUTTON_WIDTH + SPACE, self.y + self.ROW_START + self.ROW_HEIGHT * row, LABEL_WIDTH, self.ROW_HEIGHT, self.ptlabel.get(self.pt_speed), alignment=6, ) self.button_pt_speeddown = Button( self.x + self.X_SHIFT + self.LABEL_WIDTH + BUTTON_WIDTH + LABEL_WIDTH + SPACE, self.y + self.ROW_START + self.ROW_HEIGHT * row, BUTTON_WIDTH, self.ROW_HEIGHT, "-", ) self.addControl(self.label_pt) self.addControl(self.button_pt_speedup) self.addControl(self.label_pt_speedsetting) self.addControl(self.button_pt_speeddown) self.button_pt_speedup.controlLeft(self.button_pt_speeddown) self.button_pt_speedup.controlRight(self.button_pt_speeddown) self.button_pt_speeddown.controlLeft(self.button_pt_speedup) self.button_pt_speeddown.controlRight(self.button_pt_speedup) def place_z_speedconfig(self, row): """ Zoom Camera Speed controls """ self.zlabel = {0: "Slow", 1: "Normal", 2: "Fast"} self.z_speed = int(self.camera.get_ptz_zoom_speed()[1].get("speed")) label_value = "Zoom Speed" self.label_z = xbmcgui.ControlLabel( self.x + self.X_SHIFT, self.y + self.ROW_START + self.ROW_HEIGHT * row, self.LABEL_WIDTH, self.ROW_HEIGHT, label_value, ) BUTTON_WIDTH = 40 LABEL_WIDTH = 160 SPACE = 20 self.button_z_speedup = Button( self.x + self.X_SHIFT + self.LABEL_WIDTH, self.y + self.ROW_START + self.ROW_HEIGHT * row, BUTTON_WIDTH, self.ROW_HEIGHT, "+", ) self.label_z_speedsetting = xbmcgui.ControlLabel( self.x + self.X_SHIFT + self.LABEL_WIDTH + BUTTON_WIDTH + SPACE, self.y + self.ROW_START + self.ROW_HEIGHT * row, LABEL_WIDTH, self.ROW_HEIGHT, self.zlabel.get(self.z_speed), alignment=6, ) self.button_z_speeddown = Button( self.x + self.X_SHIFT + self.LABEL_WIDTH + BUTTON_WIDTH + LABEL_WIDTH + SPACE, self.y + self.ROW_START + self.ROW_HEIGHT * row, BUTTON_WIDTH, self.ROW_HEIGHT, "-", ) self.addControl(self.label_z) self.addControl(self.button_z_speedup) self.addControl(self.label_z_speedsetting) self.addControl(self.button_z_speeddown) self.button_z_speedup.controlLeft(self.button_z_speeddown) self.button_z_speedup.controlRight(self.button_z_speeddown) self.button_z_speeddown.controlLeft(self.button_z_speedup) self.button_z_speeddown.controlRight(self.button_z_speedup) def place_mjpeg_enable(self, row): """ Enable MJPEG Video Control """ label_value = "Substream Type" self.label_mjpeg = xbmcgui.ControlLabel( self.x + self.X_SHIFT, self.y + self.ROW_START + self.ROW_HEIGHT * row, self.LABEL_WIDTH, self.ROW_HEIGHT, label_value, ) BUTTON_WIDTH = 120 SPACE = 20 self.radio_mjpeg = RadioButton( self.x + self.X_SHIFT + self.LABEL_WIDTH, self.y + self.ROW_START + self.ROW_HEIGHT * row, BUTTON_WIDTH, self.ROW_HEIGHT, "MJPEG", ) self.radio_h264 = RadioButton( self.x + self.X_SHIFT + self.LABEL_WIDTH + BUTTON_WIDTH + SPACE, self.y + self.ROW_START + self.ROW_HEIGHT * row, BUTTON_WIDTH, self.ROW_HEIGHT, "h264", ) self.addControl(self.label_mjpeg) self.addControl(self.radio_mjpeg) self.addControl(self.radio_h264) self.radio_mjpeg.controlLeft(self.radio_h264) self.radio_mjpeg.controlRight(self.radio_h264) self.radio_h264.controlLeft(self.radio_mjpeg) self.radio_h264.controlRight(self.radio_mjpeg) # MOTION ####################################################### def get_motion_default(self): """ Function to get motion config from a single camera respnse """ sound_defaults = self.camera.get_motion_detect_config()[1] self.m_enable = int(sound_defaults.get("isEnable")) self.m_trigger = int(sound_defaults.get("triggerInterval")) self.m_sensitivity = int(sound_defaults.get("sensitivity")) def place_motion_enable(self, row): """ Enable Motion Detection button """ label_value = "Motion Detection" self.label_m = xbmcgui.ControlLabel( self.x + self.X_SHIFT, self.y + self.ROW_START + self.ROW_HEIGHT * row, self.LABEL_WIDTH, self.ROW_HEIGHT, label_value, ) BUTTON_WIDTH = 160 self.radio_motion = RadioButton( self.x + self.X_SHIFT + self.LABEL_WIDTH, self.y + self.ROW_START + self.ROW_HEIGHT * row, BUTTON_WIDTH, self.ROW_HEIGHT, self.label_enabled.get(self.m_enable), ) self.addControl(self.label_m) self.addControl(self.radio_motion) if self.m_enable == 1: self.radio_motion.setSelected(True) def place_motion_sensitivityconfig(self, row): """ Motion Detection Sensitivity control """ label_value = "Motion Sensitivity" self.label_ms = xbmcgui.ControlLabel( self.x + self.X_SHIFT, self.y + self.ROW_START + self.ROW_HEIGHT * row, self.LABEL_WIDTH, self.ROW_HEIGHT, label_value, ) BUTTON_WIDTH = 40 LABEL_WIDTH = 160 SPACE = 20 self.button_m_sensitivityup = Button( self.x + self.X_SHIFT + self.LABEL_WIDTH, self.y + self.ROW_START + self.ROW_HEIGHT * row, BUTTON_WIDTH, self.ROW_HEIGHT, "+", ) self.label_m_sensitivitysetting = xbmcgui.ControlLabel( self.x + self.X_SHIFT + self.LABEL_WIDTH + BUTTON_WIDTH + SPACE, self.y + self.ROW_START + self.ROW_HEIGHT * row, LABEL_WIDTH, self.ROW_HEIGHT, self.label_sensitivity.get(self.m_sensitivity), alignment=6, ) self.button_m_sensitivitydown = Button( self.x + self.X_SHIFT + self.LABEL_WIDTH + BUTTON_WIDTH + LABEL_WIDTH + SPACE, self.y + self.ROW_START + self.ROW_HEIGHT * row, BUTTON_WIDTH, self.ROW_HEIGHT, "-", ) self.addControl(self.label_ms) self.addControl(self.button_m_sensitivityup) self.addControl(self.label_m_sensitivitysetting) self.addControl(self.button_m_sensitivitydown) self.button_m_sensitivityup.controlLeft(self.button_m_sensitivitydown) self.button_m_sensitivityup.controlRight(self.button_m_sensitivitydown) self.button_m_sensitivitydown.controlLeft(self.button_m_sensitivityup) self.button_m_sensitivitydown.controlRight(self.button_m_sensitivityup) def place_motion_triggerconfig(self, row): """ Motion detection trigger interval control """ label_value = "Motion Trigger Interval" self.label_mt = xbmcgui.ControlLabel( self.x + self.X_SHIFT, self.y + self.ROW_START + self.ROW_HEIGHT * row, self.LABEL_WIDTH, self.ROW_HEIGHT, label_value, ) BUTTON_WIDTH = 40 LABEL_WIDTH = 160 SPACE = 20 self.button_m_triggerup = Button( self.x + self.X_SHIFT + self.LABEL_WIDTH, self.y + self.ROW_START + self.ROW_HEIGHT * row, BUTTON_WIDTH, self.ROW_HEIGHT, "+", ) self.label_m_triggersetting = xbmcgui.ControlLabel( self.x + self.X_SHIFT + self.LABEL_WIDTH + BUTTON_WIDTH + SPACE, self.y + self.ROW_START + self.ROW_HEIGHT * row, LABEL_WIDTH, self.ROW_HEIGHT, self.label_interval.get(self.m_trigger), alignment=6, ) self.button_m_triggerdown = Button( self.x + self.X_SHIFT + self.LABEL_WIDTH + BUTTON_WIDTH + LABEL_WIDTH + SPACE, self.y + self.ROW_START + self.ROW_HEIGHT * row, BUTTON_WIDTH, self.ROW_HEIGHT, "-", ) self.addControl(self.label_mt) self.addControl(self.button_m_triggerup) self.addControl(self.label_m_triggersetting) self.addControl(self.button_m_triggerdown) self.button_m_triggerup.controlLeft(self.button_m_triggerdown) self.button_m_triggerup.controlRight(self.button_m_triggerdown) self.button_m_triggerdown.controlLeft(self.button_m_triggerup) self.button_m_triggerdown.controlRight(self.button_m_triggerup) # SOUND ####################################################### def get_sound_default(self): """ Function to get sound config from a single camera respnse """ sound_defaults = self.camera.get_sound_detect_config()[1] self.s_enable = int(sound_defaults.get("isEnable")) self.s_trigger = int(sound_defaults.get("triggerInterval")) self.s_sensitivity = int(sound_defaults.get("sensitivity")) def place_sound_enable(self, row): """ Enable sound detection button """ label_value = "Sound Detection" self.label_s = xbmcgui.ControlLabel( self.x + self.X_SHIFT, self.y + self.ROW_START + self.ROW_HEIGHT * row, self.LABEL_WIDTH, self.ROW_HEIGHT, label_value, ) BUTTON_WIDTH = 160 self.radio_sound = RadioButton( self.x + self.X_SHIFT + self.LABEL_WIDTH, self.y + self.ROW_START + self.ROW_HEIGHT * row, BUTTON_WIDTH, self.ROW_HEIGHT, self.label_enabled.get(self.s_enable), ) self.addControl(self.label_s) self.addControl(self.radio_sound) if self.s_enable == 1: self.radio_sound.setSelected(True) def place_sound_sensitivityconfig(self, row): """ Sound detection sensitivity control """ label_value = "Sound Sensitivity" self.label_ss = xbmcgui.ControlLabel( self.x + self.X_SHIFT, self.y + self.ROW_START + self.ROW_HEIGHT * row, self.LABEL_WIDTH, self.ROW_HEIGHT, label_value, ) BUTTON_WIDTH = 40 LABEL_WIDTH = 160 SPACE = 20 self.button_s_sensitivityup = Button( self.x + self.X_SHIFT + self.LABEL_WIDTH, self.y + self.ROW_START + self.ROW_HEIGHT * row, BUTTON_WIDTH, self.ROW_HEIGHT, "+", ) self.label_s_sensitivitysetting = xbmcgui.ControlLabel( self.x + self.X_SHIFT + self.LABEL_WIDTH + BUTTON_WIDTH + SPACE, self.y + self.ROW_START + self.ROW_HEIGHT * row, LABEL_WIDTH, self.ROW_HEIGHT, self.label_sensitivity.get(self.s_sensitivity), alignment=6, ) self.button_s_sensitivitydown = Button( self.x + self.X_SHIFT + self.LABEL_WIDTH + BUTTON_WIDTH + LABEL_WIDTH + SPACE, self.y + self.ROW_START + self.ROW_HEIGHT * row, BUTTON_WIDTH, self.ROW_HEIGHT, "-", ) self.addControl(self.label_ss) self.addControl(self.button_s_sensitivityup) self.addControl(self.label_s_sensitivitysetting) self.addControl(self.button_s_sensitivitydown) self.button_s_sensitivityup.controlLeft(self.button_s_sensitivitydown) self.button_s_sensitivityup.controlRight(self.button_s_sensitivitydown) self.button_s_sensitivitydown.controlLeft(self.button_s_sensitivityup) self.button_s_sensitivitydown.controlRight(self.button_s_sensitivityup) def place_sound_triggerconfig(self, row): """ Sound detection trigger interval control """ label_value = "Sound Trigger Interval" self.label_st = xbmcgui.ControlLabel( self.x + self.X_SHIFT, self.y + self.ROW_START + self.ROW_HEIGHT * row, self.LABEL_WIDTH, self.ROW_HEIGHT, label_value, ) BUTTON_WIDTH = 40 LABEL_WIDTH = 160 SPACE = 20 self.button_s_triggerup = Button( self.x + self.X_SHIFT + self.LABEL_WIDTH, self.y + self.ROW_START + self.ROW_HEIGHT * row, BUTTON_WIDTH, self.ROW_HEIGHT, "+", ) self.label_s_triggersetting = xbmcgui.ControlLabel( self.x + self.X_SHIFT + self.LABEL_WIDTH + BUTTON_WIDTH + SPACE, self.y + self.ROW_START + self.ROW_HEIGHT * row, LABEL_WIDTH, self.ROW_HEIGHT, self.label_interval.get(self.s_trigger), alignment=6, ) self.button_s_triggerdown = Button( self.x + self.X_SHIFT + self.LABEL_WIDTH + BUTTON_WIDTH + LABEL_WIDTH + SPACE, self.y + self.ROW_START + self.ROW_HEIGHT * row, BUTTON_WIDTH, self.ROW_HEIGHT, "-", ) self.addControl(self.label_st) self.addControl(self.button_s_triggerup) self.addControl(self.label_s_triggersetting) self.addControl(self.button_s_triggerdown) self.button_s_triggerup.controlLeft(self.button_s_triggerdown) self.button_s_triggerup.controlRight(self.button_s_triggerdown) self.button_s_triggerdown.controlLeft(self.button_s_triggerup) self.button_s_triggerdown.controlRight(self.button_s_triggerup) def onAction(self, action): if action == ACTION_PREVIOUS_MENU: self.close() elif action == ACTION_BACKSPACE: self.close() def onControl(self, control): if control == self.window_close_button: self.close() elif control == self.button_close: self.close() elif control == self.radio_irAuto: self.irAuto_update() elif control == self.radio_irOn: self.irOn_update() elif control == self.radio_irOff: self.irOff_update() elif control == self.button_pt_speedup: self.pt_speedup() elif control == self.button_pt_speeddown: self.pt_speeddown() elif control == self.button_z_speedup: self.z_speedup() elif control == self.button_z_speeddown: self.z_speeddown() elif control == self.radio_motion: self.motion_update() elif control == self.button_m_sensitivityup: self.m_sensitivityup() elif control == self.button_m_sensitivitydown: self.m_sensitivitydown() elif control == self.button_m_triggerup: self.m_triggerup() elif control == self.button_m_triggerdown: self.m_triggerdown() elif control == self.radio_sound: self.sound_update() elif control == self.button_s_sensitivityup: self.s_sensitivityup() elif control == self.button_s_sensitivitydown: self.s_sensitivitydown() elif control == self.button_s_triggerup: self.s_triggerup() elif control == self.button_s_triggerdown: self.s_triggerdown() elif control == self.radio_mjpeg: self.mjpeg_update() elif control == self.radio_h264: self.h264_update() # EVENTS ######################################################### def irAuto_update(self): self.radio_irAuto.setSelected(True) self.radio_irOn.setSelected(False) self.radio_irOff.setSelected(False) self.camera.set_ir_config(0) def irOn_update(self): self.radio_irAuto.setSelected(False) self.radio_irOn.setSelected(True) self.radio_irOff.setSelected(False) self.camera.set_ir_config(1) self.camera.set_ir_on() def irOff_update(self): self.radio_irAuto.setSelected(False) self.radio_irOn.setSelected(False) self.radio_irOff.setSelected(True) self.camera.set_ir_config(1) self.camera.set_ir_off() def mjpeg_update(self): self.radio_mjpeg.setSelected(True) self.radio_h264.setSelected(False) self.camera.enable_mjpeg() def h264_update(self): self.radio_mjpeg.setSelected(False) self.radio_h264.setSelected(True) self.camera.disable_mjpeg() # PTZ EVENTS ############## def pt_speedup(self): if self.pt_speed < 4: self.pt_speed += 1 self.camera.set_ptz_speed(self.pt_speed) self.label_pt_speedsetting.setLabel(self.ptlabel.get(self.pt_speed)) def pt_speeddown(self): if self.pt_speed > 0: self.pt_speed -= 1 self.camera.set_ptz_speed(self.pt_speed) self.label_pt_speedsetting.setLabel(self.ptlabel.get(self.pt_speed)) def z_speedup(self): if self.z_speed < 2: self.z_speed += 1 self.camera.set_ptz_zoom_speed(self.z_speed) self.label_z_speedsetting.setLabel(self.zlabel.get(self.z_speed)) def z_speeddown(self): if self.z_speed > 0: self.z_speed -= 1 self.camera.set_ptz_zoom_speed(self.z_speed) self.label_z_speedsetting.setLabel(self.zlabel.get(self.z_speed)) # MOTION EVENTS ######################## def motion_update(self): if self.radio_motion.isSelected(): self.m_enable = 1 self.camera.enable_motion_detection() else: self.camera.disable_motion_detection() self.m_enable = 0 self.radio_motion.setLabel(self.label_enabled.get(self.m_enable)) def m_triggerup(self): if self.m_trigger < 15: self.m_trigger += 1 self.camera.set_motion_triggerinterval(self.m_trigger) self.label_m_triggersetting.setLabel(self.label_interval.get(self.m_trigger)) def m_triggerdown(self): if self.m_trigger > 5: self.m_trigger -= 1 self.camera.set_motion_triggerinterval(self.m_trigger) self.label_m_triggersetting.setLabel(self.label_interval.get(self.m_trigger)) def m_sensitivityup(self): # 4 -> 3 -> 0 -> 1 -> 2 if self.m_sensitivity != 2: if self.m_sensitivity < 2: self.m_sensitivity += 1 elif self.m_sensitivity == 4: self.m_sensitivity = 3 elif self.m_sensitivity == 3: self.m_sensitivity = 0 self.camera.set_motion_sensitivity(self.m_sensitivity) self.label_m_sensitivitysetting.setLabel(self.label_sensitivity.get(self.m_sensitivity)) def m_sensitivitydown(self): # 2 -> 1 -> 0 -> 3 -> 4 if self.m_sensitivity != 4: if self.m_sensitivity > 0 and self.m_sensitivity < 3: self.m_sensitivity -= 1 elif self.m_sensitivity == 0: self.m_sensitivity = 3 elif self.m_sensitivity == 3: self.m_sensitivity = 4 self.camera.set_motion_sensitivity(self.m_sensitivity) self.label_m_sensitivitysetting.setLabel(self.label_sensitivity.get(self.m_sensitivity)) # SOUND EVENTS ######################## def sound_update(self): if self.radio_sound.isSelected(): self.s_enable = 1 self.camera.enable_sound_detection() else: self.camera.disable_sound_detection() self.s_enable = 0 self.radio_sound.setLabel(self.label_enabled.get(self.s_enable)) def s_triggerup(self): if self.s_trigger < 15: self.s_trigger += 1 self.camera.set_sound_triggerinterval(self.s_trigger) self.label_s_triggersetting.setLabel(self.label_interval.get(self.s_trigger)) def s_triggerdown(self): if self.s_trigger > 5: self.s_trigger -= 1 self.camera.set_sound_triggerinterval(self.s_trigger) self.label_s_triggersetting.setLabel(self.label_interval.get(self.s_trigger)) def s_sensitivityup(self): # 4 -> 3 -> 0 -> 1 -> 2 if self.s_sensitivity != 2: if self.s_sensitivity < 2: self.s_sensitivity += 1 elif self.s_sensitivity == 4: self.s_sensitivity = 3 elif self.s_sensitivity == 3: self.s_sensitivity = 0 self.camera.set_sound_sensitivity(self.s_sensitivity) self.label_s_sensitivitysetting.setLabel(self.label_sensitivity.get(self.s_sensitivity)) def s_sensitivitydown(self): # 2 -> 1 -> 0 -> 3 -> 4 if self.s_sensitivity != 4: if self.s_sensitivity > 0 and self.m_sensitivity < 3: self.s_sensitivity -= 1 elif self.s_sensitivity == 0: self.s_sensitivity = 3 elif self.s_sensitivity == 3: self.s_sensitivity = 4 self.camera.set_sound_sensitivity(self.s_sensitivity) self.label_s_sensitivitysetting.setLabel(self.label_sensitivity.get(self.s_sensitivity))