Example #1
0
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)
Example #2
0
    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))