Esempio n. 1
0
def restart(wait=1, block=False):
    """Provides orderly restart of the OSPy server. Module first spawns a new
    thread which calls this module with the the 'block' flag set. When
    block=True the server is shut down, stations cleared, and current process
    is replaced.

    wait    Time to wait after clearing stations before reboot process.
    block   Flag used to initiate reboot."""
    if block:
        # Stop the web server first:
        from ospy import server
        server.stop()

        from ospy.stations import stations
        stations.clear()
        time.sleep(wait)
        logging.info("Restarting...")

        import sys
        if determine_platform() == 'nt':
            import subprocess
            # Use this weird construction to start a separate process that is not killed when we stop the current one
            subprocess.Popen(['cmd.exe', '/c', 'start', sys.executable] +
                             sys.argv)
        else:
            import os
            os.execl(sys.executable, sys.executable, *sys.argv)
    else:
        from threading import Thread
        t = Thread(target=restart, args=(wait, True))
        t.daemon = False
        t.start()
Esempio n. 2
0
def poweroff(wait=1, block=False):
    """Provides orderly power off of the OSPy machine. Module first spawns a new
    thread which calls this module with the the 'block' flag set. When
    block=True the server is shut down, stations cleared, and power off begins
    via a shell command.

    wait    Time to wait after clearing stations before power off process.
    block   Flag used to initiate power off."""
    if block:
        # Stop the web server first:
        from ospy import server
        server.stop()

        from ospy.stations import stations
        stations.clear()
        time.sleep(wait)
        logging.info("Powering off...")

        import subprocess
        if determine_platform() == 'nt':
            subprocess.Popen('shutdown /t 0'.split())
        else:
            subprocess.Popen(['poweroff'])
    else:
        from threading import Thread
        t = Thread(target=poweroff, args=(wait, True))
        t.daemon = False
        t.start()
Esempio n. 3
0
def restart(wait=1, block=False):
    if block:
        # Stop the web server first:
        from ospy import server
        server.stop()

        from ospy.stations import stations
        stations.clear()
        time.sleep(wait)
        logging.info("Restarting...")

        import sys
        if determine_platform() == 'nt':
            import subprocess
            # Use this weird construction to start a separate process that is not killed when we stop the current one
            subprocess.Popen(['cmd.exe', '/c', 'start', sys.executable] +
                             sys.argv)
        else:
            import os
            os.execl(sys.executable, sys.executable, *sys.argv)
    else:
        from threading import Thread
        t = Thread(target=restart, args=(wait, True))
        t.daemon = False
        t.start()
Esempio n. 4
0
    def _option_cb(self, key, old, new):
        # Clear if manual mode changed:
        if key == 'manual_mode':
            programs.run_now_program = None
            run_once.clear()
            log.finish_run(None)
            stations.clear()

        # Stop relay if not used anymore:
        if key == 'master_relay' and not new and outputs.relay_output:
            outputs.relay_output = False
Esempio n. 5
0
    def _option_cb(self, key, old, new):
        # Clear if manual mode changed:
        if key == 'manual_mode':
            programs.run_now_program = None
            run_once.clear()
            log.finish_run(None)
            stations.clear()

        # Stop relay if not used anymore:
        if key == 'master_relay' and not new and outputs.relay_output:
            outputs.relay_output = False
Esempio n. 6
0
 def _botCmd_stop(self, bot, update):                      # msg for stop all station and disable scheduler
     chat_id = update.message.chat.id
     if chat_id in list(self._currentChats):
         txt = _(u'{} System - scheduler OFF. All stations OFF.').format(options.name)
         programs.run_now_program = None
         run_once.clear()
         log.finish_run(None)
         stations.clear() 
     else:
         txt = _(u'Sorry I can not do that.')   
     if is_python2():
         bot.sendMessage(chat_id, text=txt.encode('utf-8'))
     else:    
         bot.sendMessage(chat_id, text=txt)    
Esempio n. 7
0
 def _botCmd_runOnce(self, bot, update, args):             # run-now program xx
     chat_id = update.message.chat.id
     if chat_id in list(self._currentChats):
         txt = _(u'{} RunOnce: program {}.').format(options.name, args)
         for program in programs.get():
             if (program.index == int(args-1)):   
                 options.manual_mode = False   
                 log.finish_run(None)
                 stations.clear()    
                 programs.run_now(program.index)
                 break       
             program.index+1
     else:
         txt = _(u'Sorry I can not do that.')   
     if is_python2():
         bot.sendMessage(chat_id, text=txt.encode('utf-8'))
     else:    
         bot.sendMessage(chat_id, text=txt)
Esempio n. 8
0
def poweroff(wait=1, block=False):
    if block:
        # Stop the web server first:
        from ospy import server
        server.stop()

        from ospy.stations import stations
        stations.clear()
        time.sleep(wait)
        logging.info("Powering off...")

        import subprocess
        if determine_platform() == 'nt':
            subprocess.Popen('shutdown /t 0'.split())
        else:
            subprocess.Popen(['poweroff'])
    else:
        from threading import Thread
        t = Thread(target=poweroff, args=(wait, True))
        t.daemon = False
        t.start()
Esempio n. 9
0
def poweroff(wait=1, block=False):
    if block:
        # Stop the web server first:
        from ospy import server
        server.stop()

        from ospy.stations import stations
        stations.clear()
        time.sleep(wait)
        logging.info("Powering off...")

        import subprocess
        if determine_platform() == 'nt':
            subprocess.Popen('shutdown /t 0'.split())
        else:
            subprocess.Popen(['poweroff'])
    else:
        from threading import Thread
        t = Thread(target=poweroff, args=(wait, True))
        t.daemon = False
        t.start()
Esempio n. 10
0
def restart(wait=1, block=False):
    if block:
        # Stop the web server first:
        from ospy import server
        server.stop()

        from ospy.stations import stations
        stations.clear()
        time.sleep(wait)
        logging.info("Restarting...")

        import sys
        if determine_platform() == 'nt':
            import subprocess
            # Use this weird construction to start a separate process that is not killed when we stop the current one
            subprocess.Popen(['cmd.exe', '/c', 'start', sys.executable] + sys.argv)
        else:
            import os
            os.execl(sys.executable, sys.executable, *sys.argv)
    else:
        from threading import Thread
        t = Thread(target=restart, args=(wait, True))
        t.daemon = False
        t.start()
Esempio n. 11
0
    def run(self):
        once_text = True
        two_text = True
        send = False
        mini = True

        while not self._stop.is_set():
            try:
                if tank_options['use_sonic']:
                    if two_text:
                        log.clear(NAME)
                        log.info(NAME, _('Water tank monitor is enabled.'))
                        once_text = True
                        two_text = False

                    level_in_tank = get_sonic_tank_cm()

                    if level_in_tank >= 0:  # if I2C device exists
                        log.info(
                            NAME,
                            datetime_string() + ' ' + _('Water level') + ': ' +
                            str(level_in_tank) + ' ' + _('cm') + '.')

                        if level_in_tank <= int(
                                tank_options['water_minimum']
                        ) and mini and not options.manual_mode and level_in_tank > -1:

                            if tank_options['use_send_email']:
                                send = True
                                mini = False

                            log.info(
                                NAME,
                                datetime_string() + ' ' +
                                _('ERROR: Water in Tank') + ' < ' +
                                str(tank_options['water_minimum']) + ' ' +
                                _('cm') + '!')
                            options.scheduler_enabled = False  # disable scheduler
                            log.finish_run(None)  # save log
                            stations.clear()  # set all station to off

                        if level_in_tank > int(tank_options['water_minimum']
                                               ) + 5 and not mini:
                            mini = True
                    else:
                        log.info(
                            NAME,
                            datetime_string() + ' ' +
                            _('Water level: Error I2C device not found.'))

                else:
                    if once_text:
                        log.info(NAME, 'Water tank monitor is disabled.')
                        once_text = False
                        two_text = True
                        last_level = 0

                if tank_options['use_freq_1']:
                    humi1 = get_freq(1)
                    if humi1 >= 0:
                        humi1_lvl = maping(humi1,
                                           int(tank_options['minimum_freq']),
                                           int(tank_options['maximum_freq']),
                                           0, 100)
                        if humi1_lvl >= 100:
                            humi1_lvl = 100
                        log.info(
                            NAME,
                            datetime_string() + ' F1: ' + str(humi1) +
                            'Hz H: ' + str(humi1_lvl) + '%.')
                    else:
                        log.info(
                            NAME,
                            datetime_string() + ' F1: ' +
                            _('Error I2C device not found.'))

                if tank_options['use_freq_2']:
                    humi2 = get_freq(2)
                    if humi2 >= 0:
                        humi2_lvl = maping(humi2,
                                           int(tank_options['minimum_freq']),
                                           int(tank_options['maximum_freq']),
                                           0, 100)
                        if humi2_lvl >= 100:
                            humi2_lvl = 100
                        log.info(
                            NAME,
                            datetime_string() + ' F2: ' + str(humi2) +
                            'Hz H: ' + str(humi2_lvl) + '%.')
                    else:
                        log.info(
                            NAME,
                            datetime_string() + ' F2: ' +
                            _('Error I2C device not found.'))

                if tank_options['use_freq_3']:
                    humi3 = get_freq(3)
                    if humi3 >= 0:
                        humi3_lvl = maping(humi3,
                                           int(tank_options['minimum_freq']),
                                           int(tank_options['maximum_freq']),
                                           0, 100)
                        if humi3_lvl >= 100:
                            humi3_lvl = 100
                        log.info(
                            NAME,
                            datetime_string() + ' F3: ' + str(humi3) +
                            'Hz H: ' + str(humi3_lvl) + '%.')
                    else:
                        log.info(
                            NAME,
                            datetime_string() + ' F3: ' +
                            _('Error I2C device not found.'))

                if tank_options['use_freq_4']:
                    humi4 = get_freq(4)
                    if humi4 >= 0:
                        humi4_lvl = maping(humi4,
                                           int(tank_options['minimum_freq']),
                                           int(tank_options['maximum_freq']),
                                           0, 100)
                        if humi4_lvl >= 100:
                            humi4_lvl = 100
                        log.info(
                            NAME,
                            datetime_string() + ' F4: ' + str(humi4) +
                            'Hz H: ' + str(humi4_lvl) + '%.')
                    else:
                        log.info(
                            NAME,
                            datetime_string() + ' F4: ' +
                            _('Error I2C device not found.'))

                if tank_options['use_freq_5']:
                    humi5 = get_freq(5)
                    if humi5 >= 0:
                        humi5_lvl = maping(humi5,
                                           int(tank_options['minimum_freq']),
                                           int(tank_options['maximum_freq']),
                                           0, 100)
                        if humi5_lvl >= 100:
                            humi5_lvl = 100
                        log.info(
                            NAME,
                            datetime_string() + ' F5: ' + str(humi5) +
                            'Hz H: ' + str(humi5_lvl) + '%.')
                    else:
                        log.info(
                            NAME,
                            datetime_string() + ' F5: ' +
                            _('Error I2C device not found.'))

                if tank_options['use_freq_6']:
                    humi6 = get_freq(6)
                    if humi6 >= 0:
                        humi6_lvl = maping(humi6,
                                           int(tank_options['minimum_freq']),
                                           int(tank_options['maximum_freq']),
                                           0, 100)
                        if humi6_lvl >= 100:
                            humi6_lvl = 100
                        log.info(
                            NAME,
                            datetime_string() + ' F6: ' + str(humi6) +
                            'Hz H: ' + str(humi6_lvl) + '%.')
                    else:
                        log.info(
                            NAME,
                            datetime_string() + ' F6: ' +
                            _('Error I2C device not found.'))

                if tank_options['use_freq_7']:
                    humi7 = get_freq(7)
                    if humi7 >= 0:
                        humi7_lvl = maping(humi7,
                                           int(tank_options['minimum_freq']),
                                           int(tank_options['maximum_freq']),
                                           0, 100)
                        if humi7_lvl >= 100:
                            humi7_lvl = 100
                        log.info(
                            NAME,
                            datetime_string() + ' F7: ' + str(humi7) +
                            'Hz H: ' + str(humi7_lvl) + '%.')
                    else:
                        log.info(
                            NAME,
                            datetime_string() + ' F7: ' +
                            _('Error I2C device not found.'))

                if tank_options['use_freq_8']:
                    humi8 = get_freq(8)
                    if humi8 >= 0:
                        humi8_lvl = maping(humi8,
                                           int(tank_options['minimum_freq']),
                                           int(tank_options['maximum_freq']),
                                           0, 100)
                        if humi8_lvl >= 100:
                            humi8_lvl = 100
                        log.info(
                            NAME,
                            datetime_string() + ' F8: ' + str(humi8) +
                            'Hz H: ' + str(humi8_lvl) + '%.')
                    else:
                        log.info(
                            NAME,
                            datetime_string() + ' F8: ' +
                            _('Error I2C device not found.'))

                if send:
                    msg = (datetime_string() + '\n' + _(
                        'System detected error: Water Tank has minimum Water Level'
                    ) + ': ' + str(
                        tank_options['water_minimum']
                    ) + _('cm') + '.\n' + _(
                        'Scheduler is now disabled and all Stations turn Off.')
                           )
                    try:
                        send_email(msg)
                        log.info(NAME, _('Email was sent') + ': ' + msg)
                        send = False
                    except Exception as err:
                        log.error(NAME,
                                  _('Email was not sent') + '! ' + str(err))

                self._sleep(10)  # 2 for tested
                log.clear(NAME)

            except Exception:
                log.error(
                    NAME,
                    _('Water tank and humidity Monitor plug-in') + ':\n' +
                    traceback.format_exc())
                self._sleep(60)
Esempio n. 12
0
def sms_check(self):
    """Control and processing SMS"""
    try:
        import gammu
    except Exception:
        log.error(NAME,
                  _('SMS Modem plug-in') + ':\n' + traceback.format_exc())

    tel1 = sms_options['tel1']
    tel2 = sms_options['tel2']
    comm1 = sms_options['txt1']
    comm2 = sms_options['txt2']
    comm3 = sms_options['txt3']
    comm4 = sms_options['txt4']
    comm5 = sms_options['txt5']
    comm6 = sms_options['txt6']
    comm7 = sms_options['txt7']
    comm8 = sms_options['txt8']
    comm9 = sms_options['txt9']

    sm = gammu.StateMachine()
    sm.ReadConfig()
    try:
        sm.Init()
        log.debug(NAME, datetime_string() + ': ' + _('Checking SMS...'))
    except:
        log.error(NAME,
                  _('SMS Modem plug-in') + ':\n' + traceback.format_exc())
        self._sleep(60)

    if sms_options[
            "use_strength"]:  # print strength signal in status Window every check SMS
        signal = sm.GetSignalQuality(
        )  # list: SignalPercent, SignalStrength, BitErrorRate
        log.info(
            NAME,
            datetime_string() + ': ' + _('Signal') + ': ' +
            str(signal['SignalPercent']) + '% ' +
            str(signal['SignalStrength']) + 'dB')

    status = sm.GetSMSStatus()
    remain = status['SIMUsed'] + status['PhoneUsed'] + status['TemplatesUsed']
    sms = []
    start = True
    while remain > 0:
        if start:
            cursms = sm.GetNextSMS(Start=True, Folder=0)
            start = False
        else:
            cursms = sm.GetNextSMS(Location=cursms[0]['Location'], Folder=0)
        remain = remain - len(cursms)
        sms.append(cursms)
    data = gammu.LinkSMS(sms)
    for x in data:
        v = gammu.DecodeSMS(x)
        m = x[0]
        print '%-15s: %s' % ('Sender', m['Number'])
        print '%-15s: %s' % ('Date', str(m['DateTime']))
        print '%-15s: %s' % ('State', m['State'])
        print '%-15s: %s' % ('SMS command', m['Text'])
        if (m['Number']
                == tel1) or (m['Number']
                             == tel2):  # If telephone is admin 1 or admin 2
            log.info(NAME, datetime_string() + ': ' + _('SMS from admin'))
            if m['State'] == "UnRead":  # If SMS is unread
                log.clear(NAME)
                if m['Text'] == comm1:  # If command = comm1 (info - send SMS to admin phone1 and phone2)
                    log.info(
                        NAME,
                        _('Command') + ' ' + comm1 + ' ' + _('is processed'))
                    # send 1/2 SMS with text 1
                    up = helpers.uptime()
                    temp = helpers.get_cpu_temp(
                        options.temp_unit) + ' ' + options.temp_unit
                    ip = str(helpers.get_ip())
                    ver = version.ver_date
                    datastr = ('SMS 1/2. ' + datetime_string() + ', TEMP: ' +
                               temp + ', IP: ' + ip + ', SW: ' + ver +
                               ', UP: ' + up)
                    message = {
                        'Text': datastr,
                        'SMSC': {
                            'Location': 1
                        },
                        'Number': m['Number'],
                    }
                    sm.SendSMS(message)  # send sms 1/2
                    log.info(NAME, datastr)
                    # send 2/2 SMS with text 2
                    if inputs.rain_sensed():
                        rain = "Active"
                    else:
                        rain = "Inactive"
                    try:
                        from plugins import pressure_monitor
                        state_press = pressure_monitor.get_check_pressure()

                        if state_press:
                            press = "High"
                        else:
                            press = "Low"
                    except Exception:
                        press = "N/A"
                    finished = [
                        run for run in log.finished_runs()
                        if not run['blocked']
                    ]
                    if finished:
                        last_prog = finished[-1]['start'].strftime(
                            '%H:%M: ') + finished[-1]['program_name']
                    else:
                        last_prog = 'None'
                    datastr = ('SMS 2/2. ' + 'RAIN: ' + rain + ', PRESS: ' +
                               press + ', LAST: ' + last_prog)
                    message = {
                        'Text': datastr,
                        'SMSC': {
                            'Location': 1
                        },
                        'Number': m['Number'],
                    }
                    sm.SendSMS(message)  # send sms 2/2
                    log.info(NAME, datastr)

                    log.info(
                        NAME,
                        _('Command') + ': ' + comm1 + ' ' +
                        _('was processed and confirmation was sent as SMS to')
                        + ': ' + m['Number'])
                    sm.DeleteSMS(m['Folder'], m['Location'])  # SMS deleted
                    log.info(NAME, _('Received SMS was deleted'))

                elif m['Text'] == comm2:  # If command = comm2 (stop - scheduler)
                    log.info(
                        NAME,
                        _('Command') + ' ' + comm2 + ' ' + _('is processed'))
                    options.scheduler_enabled = False
                    log.finish_run(None)
                    stations.clear()

                    message = {
                        'Text': 'Command: ' + comm2 + ' was processed',
                        'SMSC': {
                            'Location': 1
                        },
                        'Number': m['Number'],
                    }
                    sm.SendSMS(message)
                    log.info(
                        NAME,
                        _('Command') + ': ' + comm2 + ' ' +
                        _('was processed and confirmation was sent as SMS to')
                        + ': ' + m['Number'])
                    sm.DeleteSMS(m['Folder'], m['Location'])
                    log.info(NAME, _('Received SMS was deleted'))

                elif m['Text'] == comm3:  # If command = comm3 (start - scheduler)
                    log.info(
                        NAME,
                        _('Command') + ' ' + comm3 + ' ' + _('is processed'))
                    options.scheduler_enabled = True
                    message = {
                        'Text': 'Command: ' + comm3 + ' was processed',
                        'SMSC': {
                            'Location': 1
                        },
                        'Number': m['Number'],
                    }
                    sm.SendSMS(message)
                    log.info(
                        NAME,
                        _('Command') + ': ' + comm3 + ' ' +
                        _('was processed and confirmation was sent as SMS to')
                        + ': ' + m['Number'])
                    sm.DeleteSMS(m['Folder'], m['Location'])
                    log.info(NAME, _('Received SMS was deleted'))

                elif m['Text'] == comm4:  # If command = comm4 (reboot system)
                    log.info(
                        NAME,
                        _('Command') + ' ' + comm4 + ' ' + _('is processed'))
                    message = {
                        'Text': 'Command: ' + comm4 + ' was processed',
                        'SMSC': {
                            'Location': 1
                        },
                        'Number': m['Number'],
                    }
                    sm.SendSMS(message)
                    log.info(
                        NAME,
                        _('Command') + ': ' + comm4 + ' ' +
                        _('was processed and confirmation was sent as SMS to')
                        + ': ' + m['Number'])
                    sm.DeleteSMS(m['Folder'], m['Location'])
                    log.info(
                        NAME,
                        _('Received SMS was deleted and system is now reboot'))
                    reboot()  # restart linux system

                elif m['Text'] == comm5:  # If command = comm5 (poweroff system)
                    log.info(
                        NAME,
                        _('Command') + ' ' + comm5 + ' ' + _('is processed'))
                    message = {
                        'Text': 'Command: ' + comm5 + ' was processed',
                        'SMSC': {
                            'Location': 1
                        },
                        'Number': m['Number'],
                    }
                    sm.SendSMS(message)
                    log.info(
                        NAME,
                        _('Command') + ': ' + comm5 + ' ' +
                        _('was processed and confirmation was sent as SMS to')
                        + ': ' + m['Number'])
                    sm.DeleteSMS(m['Folder'], m['Location'])
                    log.info(
                        NAME,
                        _('Received SMS was deleted and system is now poweroff'
                          ))
                    poweroff()  # poweroff linux system

                elif m['Text'] == comm6:  # If command = comm6 (update ospi system)
                    log.info(
                        NAME,
                        _('Command') + ' ' + comm6 + ' ' + _('is processed'))
                    message = {
                        'Text': 'Command: ' + comm6 + ' was processed',
                        'SMSC': {
                            'Location': 1
                        },
                        'Number': m['Number'],
                    }
                    sm.SendSMS(message)
                    log.info(
                        NAME,
                        _('Command') + ': ' + comm6 + ' ' +
                        _('was processed and confirmation was sent as SMS to')
                        + ': ' + m['Number'])
                    try:
                        from plugins.system_update import perform_update

                        perform_update()
                        log.info(
                            NAME,
                            _('Received SMS was deleted, update was performed and program will restart'
                              ))
                    except ImportError:
                        log.info(
                            NAME,
                            _('Received SMS was deleted, but could not perform update'
                              ))

                    sm.DeleteSMS(m['Folder'], m['Location'])

                elif m['Text'] == comm7:  # If command = comm7 (send email with foto from webcam)
                    log.info(
                        NAME,
                        _('Command') + ' ' + comm7 + ' ' + _('is processed'))
                    message = {
                        'Text': 'Command: ' + comm7 + ' was processed',
                        'SMSC': {
                            'Location': 1
                        },
                        'Number': m['Number'],
                    }
                    sm.SendSMS(message)
                    log.info(
                        NAME,
                        _('Command') + ': ' + comm7 + ' ' +
                        _('was processed and confirmation was sent as SMS to')
                        + ': ' + m['Number'])
                    try:
                        from plugins.webcam import get_run_cam, get_image_location

                        get_run_cam()  # process save foto to ./data/image.jpg
                        msg = _('SMS plug-in send image file from webcam.')

                        send_email(msg, attach=get_image_location())

                    except ImportError:
                        log.info(
                            NAME,
                            _('Received SMS was deleted, but could not send email with photo from webcam'
                              ))
                        message = {
                            'Text': 'Error: not send foto from webcam',
                            'SMSC': {
                                'Location': 1
                            },
                            'Number': m['Number'],
                        }
                        sm.SendSMS(message)
                    sm.DeleteSMS(m['Folder'], m['Location'])

                elif m['Text'] == comm8:  # If command = comm8 (send SMS with available commands)
                    log.info(
                        NAME,
                        _('Command') + ' ' + comm8 + ' ' + _('is processed'))
                    message = {
                        'Text':
                        'Available commands: ' + comm1 + ',' + comm2 + ',' +
                        comm3 + ',' + comm4 + ',' + comm5 + ',' + comm6 + ',' +
                        comm7 + ',' + comm8 + ',' + comm9 + 'xx',
                        'SMSC': {
                            'Location': 1
                        },
                        'Number':
                        m['Number'],
                    }
                    sm.SendSMS(message)
                    log.info(
                        NAME,
                        _('Command') + ': ' + comm8 + ' ' +
                        _('was processed and confirmation was sent as SMS to')
                        + ': ' + m['Number'])
                    sm.DeleteSMS(m['Folder'], m['Location'])
                    log.info(NAME, _('Received SMS was deleted'))

                elif m['Text'][0:len(
                        comm9
                )] == comm9:  # If command = lenght char comm9 (run now program xx)
                    num = m['Text'][len(
                        comm9
                    ):]  # number from sms text example: run36 -> num=36
                    log.info(
                        NAME,
                        _('Command') + ' ' + comm9 + ' ' + _('is processed'))
                    index = int(num)
                    if index <= programs.count(
                    ):  # if program number from sms text exists in program db
                        log.finish_run(None)
                        stations.clear()
                        prog = int(index - 1)
                        programs.run_now(prog)
                        log.info(
                            NAME,
                            _('Program') + ': ' + str(index) + ' ' +
                            _('now run'))
                        message = {
                            'Text': 'Program: ' + str(index) + ' now run',
                            'SMSC': {
                                'Location': 1
                            },
                            'Number': m['Number'],
                        }
                    else:
                        message = {
                            'Text': 'Program: ' + str(index) + ' no exists!',
                            'SMSC': {
                                'Location': 1
                            },
                            'Number': m['Number'],
                        }

                    sm.SendSMS(message)
                    log.info(
                        NAME,
                        _('Command') + ': ' + str(m['Text']) + ' ' +
                        _('was processed and confirmation was sent as SMS to')
                        + ': ' + m['Number'])
                    sm.DeleteSMS(m['Folder'], m['Location'])
                    log.info(NAME, _('Received SMS was deleted'))

                else:  # If SMS command is not defined
                    sm.DeleteSMS(m['Folder'], m['Location'])
                    log.info(
                        NAME,
                        _('Received command') + ' ' + m['Text'] + ' ' +
                        _('is not defined!'))

            else:  # If SMS was read
                sm.DeleteSMS(m['Folder'], m['Location'])
                log.info(NAME, _('Received SMS was deleted - SMS was read'))
        else:  # If telephone number is not admin 1 or admin 2 phone number
            sm.DeleteSMS(m['Folder'], m['Location'])
            log.info(NAME,
                     _('Received SMS was deleted - SMS was not from admin'))
Esempio n. 13
0
    def GET(self):
        from ospy import server
        qdict = web.input()

        stop_all = get_input(qdict, 'stop_all', False, lambda x: True)
        scheduler_enabled = get_input(qdict, 'scheduler_enabled', None, lambda x: x == '1')
        manual_mode = get_input(qdict, 'manual_mode', None, lambda x: x == '1')
        rain_block = get_input(qdict, 'rain_block', None, float)
        level_adjustment = get_input(qdict, 'level_adjustment', None, float)
        toggle_temp = get_input(qdict, 'toggle_temp', False, lambda x: True)

        if stop_all:
            if not options.manual_mode:
                options.scheduler_enabled = False
                programs.run_now_program = None
                run_once.clear()
            log.finish_run(None)
            stations.clear()

        if scheduler_enabled is not None:
            options.scheduler_enabled = scheduler_enabled

        if manual_mode is not None:
            options.manual_mode = manual_mode

        if rain_block is not None:
            options.rain_block = datetime.datetime.now() + datetime.timedelta(hours=rain_block)

        if level_adjustment is not None:
            options.level_adjustment = level_adjustment / 100

        if toggle_temp:
            options.temp_unit = "F" if options.temp_unit == "C" else "C"

        set_to = get_input(qdict, 'set_to', None, int)
        sid = get_input(qdict, 'sid', 0, int) - 1
        set_time = get_input(qdict, 'set_time', 0, int)

        if set_to is not None and 0 <= sid < stations.count() and options.manual_mode:
            if set_to:  # if status is on
                start = datetime.datetime.now()
                new_schedule = {
                    'active': True,
                    'program': -1,
                    'station': sid,
                    'program_name': "Manual",
                    'fixed': True,
                    'cut_off': 0,
                    'manual': True,
                    'blocked': False,
                    'start': start,
                    'original_start': start,
                    'end': start + datetime.timedelta(days=3650),
                    'uid': '%s-%s-%d' % (str(start), "Manual", sid),
                    'usage': stations.get(sid).usage
                }
                if set_time > 0:  # if an optional duration time is given
                    new_schedule['end'] = datetime.datetime.now() + datetime.timedelta(seconds=set_time)

                log.start_run(new_schedule)
                stations.activate(new_schedule['station'])

            else:  # If status is off
                stations.deactivate(sid)
                active = log.active_runs()
                for interval in active:
                    if interval['station'] == sid:
                        log.finish_run(interval)

        self._redirect_back()
Esempio n. 14
0
    def run(self):
        try:
            import smbus  # for PCF 8583

            self.bus = smbus.SMBus(1 if get_rpi_revision() >= 2 else 0)
        except ImportError:
            log.warning(NAME, _('Could not import smbus.'))

        if self.bus is not None:
            self.pcf = set_counter(self.bus)  # set pcf8583 as counter

        log.clear(NAME)
        send = False  # send email
        disable_text = True
        val = 0.0
        maxval = 0.0
        timer_reset = 0

        while not self._stop.is_set():
            try:
                if self.bus is not None and wind_options[
                        'use_wind_monitor']:  # if wind plugin is enabled
                    disable_text = True

                    puls = counter(
                        self.bus) / 10.0  # counter value is value/10sec

                    val = puls / (wind_options['pulses'] * 1.0)
                    val = val * wind_options['metperrot']

                    if val > maxval:
                        maxval = val

                    if timer_reset >= 86400:  # 1 day
                        timer_reset = 0
                        maxval = 0.0

                    self.status['meter'] = round(val, 2)
                    self.status['kmeter'] = round(val * 3.6, 2)

                    log.clear(NAME)
                    log.info(NAME, _('Please wait 10 sec...'))
                    log.info(
                        NAME,
                        _('Speed') + ' ' + str(round(val, 2)) + ' ' +
                        _('m/sec'))
                    log.info(
                        NAME,
                        _('Speed Peak 24 hour') + ' ' + str(round(maxval, 2)) +
                        ' ' + _('m/sec'))
                    log.info(
                        NAME,
                        _('Pulses') + ' ' + str(puls) + ' ' + _('pulses/sec'))

                    if val >= 42:
                        log.error(NAME, _('Wind speed > 150 km/h (42 m/sec)'))

                    if get_station_is_on():  # if station is on
                        if val >= int(
                                wind_options['maxspeed']
                        ):  # if wind speed is > options max speed
                            log.clear(NAME)
                            log.finish_run(None)  # save log
                            stations.clear()  # set all station to off
                            log.clear(NAME)
                            log.info(
                                NAME,
                                _('Stops all stations and sends email if enabled sends email.'
                                  ))
                            if wind_options[
                                    'sendeml']:  # if enabled send email
                                send = True

                else:
                    # text on the web if plugin is disabled
                    if disable_text:
                        log.clear(NAME)
                        log.info(NAME,
                                 _('Wind speed monitor plug-in is disabled.'))
                        disable_text = False

                if send:
                    TEXT = (datetime_string() + ': ' + _(
                        'System detected error: wind speed monitor. All stations set to OFF. Wind is'
                    ) + ': ' + str(round(val * 3.6, 2)) + ' km/h.')
                    try:
                        from plugins.email_notifications import email
                        email(TEXT)  # send email without attachments
                        log.info(NAME, _('Email was sent') + ': ' + TEXT)
                        send = False
                    except Exception:
                        log.clear(NAME)
                        log.error(
                            NAME,
                            _('Email was not sent') + '! ' +
                            traceback.format_exc())

                timer_reset += 10  # measure is 10 sec long

            except Exception:
                log.clear(NAME)
                log.error(
                    NAME,
                    _('Wind Speed monitor plug-in') + ':\n' +
                    traceback.format_exc())
                self._sleep(60)
                self.pcf = set_counter(self.bus)  # set pcf8583 as counter
Esempio n. 15
0
    def GET(self):
        from ospy import server
        qdict = web.input()

        stop_all = get_input(qdict, 'stop_all', False, lambda x: True)
        scheduler_enabled = get_input(qdict, 'scheduler_enabled', None, lambda x: x == '1')
        manual_mode = get_input(qdict, 'manual_mode', None, lambda x: x == '1')
        rain_block = get_input(qdict, 'rain_block', None, float)
        level_adjustment = get_input(qdict, 'level_adjustment', None, float)
        toggle_temp = get_input(qdict, 'toggle_temp', False, lambda x: True)

        if stop_all:
            if not options.manual_mode:
                options.scheduler_enabled = False
                programs.run_now_program = None
                run_once.clear()
            log.finish_run(None)
            stations.clear()

        if scheduler_enabled is not None:
            options.scheduler_enabled = scheduler_enabled

        if manual_mode is not None:
            options.manual_mode = manual_mode

        if rain_block is not None:
            options.rain_block = datetime.datetime.now() + datetime.timedelta(hours=rain_block)

        if level_adjustment is not None:
            options.level_adjustment = level_adjustment / 100

        if toggle_temp:
            options.temp_unit = "F" if options.temp_unit == "C" else "C"

        set_to = get_input(qdict, 'set_to', None, int)
        sid = get_input(qdict, 'sid', 0, int) - 1
        set_time = get_input(qdict, 'set_time', 0, int)

        if set_to is not None and 0 <= sid < stations.count() and options.manual_mode:
            if set_to:  # if status is on
                start = datetime.datetime.now()
                new_schedule = {
                    'active': True,
                    'program': -1,
                    'station': sid,
                    'program_name': "Manual",
                    'fixed': True,
                    'cut_off': 0,
                    'manual': True,
                    'blocked': False,
                    'start': start,
                    'original_start': start,
                    'end': start + datetime.timedelta(days=3650),
                    'uid': '%s-%s-%d' % (str(start), "Manual", sid),
                    'usage': stations.get(sid).usage
                }
                if set_time > 0:  # if an optional duration time is given
                    new_schedule['end'] = datetime.datetime.now() + datetime.timedelta(seconds=set_time)

                log.start_run(new_schedule)
                stations.activate(new_schedule['station'])

            else:  # If status is off
                stations.deactivate(sid)
                active = log.active_runs()
                for interval in active:
                    if interval['station'] == sid:
                        log.finish_run(interval)

        self._redirect_back()
Esempio n. 16
0
def FTP_download(self):
    try:  # read command file and save to ramdisk
        self.ftp.retrbinary("RETR " + plugin_options['loc'] + "data.txt",
                            open("/home/pi/ramdisk/data.txt", 'wb').write)
        fs = file("/home/pi/ramdisk/data.txt", 'r')
        obsahaut = fs.readline()
        fs.close()

        log.debug(
            NAME,
            _(u'FTP received data from file data.txt') + ': ' + str(obsahaut))

        change = False

        if (obsahaut == "AU"):  # scheduller
            options.manual_mode = False
            log.info(NAME, _(u'Scheduler mode is activated.'))
            change = True

        if (obsahaut == "MA"):  # manual
            options.manual_mode = True
            log.info(NAME, _(u'Manual mode is activated.'))
            change = True

        for num_output in range(0, options.output_count):
            s = 'Z' + str(num_output)
            if (obsahaut == s):  # stations xx ON
                options.manual_mode = True
                log.info(NAME, _(u'Manual mode is activated.'))
                stations.activate(num_output)
                log.info(NAME,
                         _(u'Activated stations') + ': ' + str(num_output + 1))
                change = True

            s = 'V' + str(num_output)
            if (obsahaut == s):  # stations xx OFF
                options.manual_mode = True
                log.info(NAME, _(u'Manual mode is activated.'))
                stations.deactivate(num_output)
                log.info(
                    NAME,
                    _(u'Deactivated stations') + ': ' + str(num_output + 1))
                change = True

        for program in programs.get():
            s = 'P' + str(program.index + 1)
            if (obsahaut == s):  # Run-now program xx
                options.manual_mode = False
                log.info(NAME, _(u'Scheduler mode is activated.'))
                programs.run_now(program.index)
                log.info(NAME,
                         _(u'Activated program') + ': ' + str(program.name))
                self._sleep(2)
                change = True
            program.index + 1

        if (obsahaut == "STOP"):  # stop all stations and disable scheduler
            options.scheduler_enabled = False
            programs.run_now_program = None
            run_once.clear()
            log.finish_run(None)
            stations.clear()
            log.info(NAME, _(u'Stop all stations and disable system.'))
            change = True

        if (obsahaut == "START"):  # enable scheduler
            options.scheduler_enabled = True
            log.info(NAME, _(u'Enable system.'))
            change = True

        if (change):  # delete data.txt command now is OK
            fs = open('/home/pi/ramdisk/data.txt', 'w')
            fs.write('OK')
            fs.close()
            FTP_upload(self)  # send to server actual data


# TODO save_to_options

    except Exception:
        log.clear(NAME)
        log.info(
            NAME,
            _(u'Remote FTP control settings') + ':\n' + traceback.format_exc())
        pass
Esempio n. 17
0
    def run(self):
        send = False

        once_text = True
        two_text = True
        three_text = True
        four_text = True
        five_text = True

        last_time = int(time.time())
        actual_time = int(time.time())

        while not self._stop.is_set():
            try:
                if pressure_options[
                        'use_press_monitor']:  # if pressure plugin is enabled
                    four_text = True
                    if get_master_is_on():  # if master station is on
                        three_text = True
                        if once_text:  # text on the web if master is on
                            log.clear(NAME)
                            log.info(NAME, _('Master station is ON.'))
                            once_text = False
                        if get_check_pressure():  # if pressure sensor is on
                            actual_time = int(time.time())
                            count_val = int(pressure_options['time'])
                            log.clear(NAME)
                            log.info(
                                NAME,
                                _('Time to test pressure sensor') + ': ' +
                                str(count_val - (actual_time - last_time)) +
                                ' ' + _('sec'))
                            if actual_time - last_time > int(
                                    pressure_options['time']
                            ):  # wait for activated pressure sensor (time delay)
                                last_time = actual_time
                                if get_check_pressure(
                                ):  # if pressure sensor is actual on
                                    #  options.scheduler_enabled = False                   # set scheduler to off
                                    log.finish_run(None)  # save log
                                    stations.clear()  # set all station to off
                                    log.clear(NAME)
                                    log.info(
                                        NAME,
                                        _('Pressure sensor is not activated in time -> stops all stations and send email.'
                                          ))
                                    if pressure_options[
                                            'sendeml']:  # if enabled send email
                                        send = True

                        if not get_check_pressure():
                            last_time = int(time.time())
                            if five_text:
                                once_text = True
                                five_text = False
                    else:
                        if stations.master is not None:
                            if two_text:
                                log.clear(NAME)
                                log.info(NAME, _('Master station is OFF.'))
                                two_text = False
                                five_text = True
                            last_time = int(time.time())

                else:
                    once_text = True
                    two_text = True
                    if four_text:  # text on the web if plugin is disabled
                        log.clear(NAME)
                        log.info(NAME,
                                 _('Pressure monitor plug-in is disabled.'))
                        four_text = False

                if stations.master is None:  # text on the web if master station is none
                    if three_text:
                        log.clear(NAME)
                        log.info(NAME, _('Not used master station.'))
                        three_text = False

                if send:
                    msg = (datetime_string() + ': ' +
                           _('System detected error: pressure sensor.'))
                    try:
                        send_email(msg)
                        log.info(NAME, _('Email was sent') + ': ' + msg)
                        send = False
                    except Exception:
                        log.error(
                            NAME,
                            _('Email was not sent') + '! ' +
                            traceback.format_exc())

                if get_check_pressure():
                    self.status['Pstate%d'] = _('INACTIVE')
                else:
                    self.status['Pstate%d'] = _('ACTIVE')

                self._sleep(1)

            except Exception:
                log.error(
                    NAME,
                    _('Pressure monitor plug-in') + ':\n' +
                    traceback.format_exc())
                self._sleep(60)
Esempio n. 18
0
    def run(self):       
        log.clear(NAME)  
        while not self._stop.is_set():
            try:
                if plugin_options['use_button']:  # if button plugin is enabled
                    actual_buttons = read_buttons()
                    
                    #led_outputs(actual_buttons)

                    for i in range(8):
                       tb = "button" + str(i)    
                       if actual_buttons == i and plugin_options[tb]== "reboot":
                          log.info(NAME, datetime_string() + ': ' + _('System reboot')) 
                          stations.clear()
                          reboot()
                          self._sleep(2)
                       
                       if actual_buttons == i and plugin_options[tb]== "pwrOff":
                          log.info(NAME, datetime_string() + ': ' + _('System shutdown')) 
                          stations.clear()
                          poweroff()
                          self._sleep(2)
                         
                       if actual_buttons == i and plugin_options[tb]== "stopAll":
                          log.info(NAME, datetime_string() + ': ' + _('All stations now stopped')) 
                          log.finish_run(None)       # save log
                          stations.clear()           # set all station to off 
                          self._sleep(2)

                       if actual_buttons == i and plugin_options[tb]== "schedEn":
                          log.info(NAME, datetime_string() + ': ' + _('Scheduler is now enabled')) 
                          options.scheduler_enabled = True
                          self._sleep(2)

                       if actual_buttons == i and plugin_options[tb]== "schedDis":
                          log.info(NAME, datetime_string() + ': ' + _('Scheduler is now disabled')) 
                          options.scheduler_enabled = False
                          self._sleep(2)

                       if actual_buttons == i and plugin_options[tb]== "RunP1":
                          log.info(NAME, datetime_string() + ': ' + _('Run now program 1')) 
                          for program in programs.get():
                             if (program.index == 0):   # Run-now program 1
                                options.manual_mode = False   
                                log.finish_run(None)
                                stations.clear()    
                                programs.run_now(program.index)       
                             program.index+1
                          self._sleep(2)

                       if actual_buttons == i and plugin_options[tb]== "RunP2":
                          log.info(NAME, datetime_string() + ': ' + _('Run now program 2')) 
                          for program in programs.get():
                             if (program.index == 1):   # Run-now program 2  
                                options.manual_mode = False     
                                log.finish_run(None)
                                stations.clear()   
                                programs.run_now(program.index)
                             program.index+1
                          self._sleep(2)

                       if actual_buttons == i and plugin_options[tb]== "RunP3":
                          log.info(NAME, datetime_string() + ': ' + _('Run now program 3')) 
                          for program in programs.get():
                             if (program.index == 2):   # Run-now program 3  
                                options.manual_mode = False     
                                log.finish_run(None)  
                                stations.clear() 
                                programs.run_now(program.index)
                             program.index+1
                          self._sleep(2)
                            
                       if actual_buttons == i and plugin_options[tb]== "RunP4":
                          log.info(NAME, datetime_string() + ': ' + _('Run now program 4')) 
                          for program in programs.get():
                             if (program.index == 3):   # Run-now program 4  
                                options.manual_mode = False   
                                log.finish_run(None)
                                stations.clear()     
                                programs.run_now(program.index)
                             program.index+1
                          self._sleep(2)        
 
                       if actual_buttons == i and plugin_options[tb]== "RunP5":
                          log.info(NAME, datetime_string() + ': ' + _('Run now program 5'))
                          for program in programs.get():
                             if (program.index == 4):   # Run-now program 5
                                options.manual_mode = False
                                log.finish_run(None)
                                stations.clear() 
                                programs.run_now(program.index)
                             program.index+1
                          self._sleep(2)

                       if actual_buttons == i and plugin_options[tb]== "RunP6":
                          log.info(NAME, datetime_string() + ': ' + _('Run now program 6'))
                          for program in programs.get():
                             if (program.index == 5):   # Run-now program 6
                                options.manual_mode = False
                                log.finish_run(None)
                                stations.clear() 
                                programs.run_now(program.index)
                             program.index+1
                          self._sleep(2)

                       if actual_buttons == i and plugin_options[tb]== "RunP7":
                          log.info(NAME, datetime_string() + ': ' + _('Run now program 7'))
                          for program in programs.get():
                             if (program.index == 6):   # Run-now program 7
                                options.manual_mode = False
                                log.finish_run(None)
                                stations.clear() 
                                programs.run_now(program.index)
                             program.index+1
                          self._sleep(2)

                       if actual_buttons == i and plugin_options[tb]== "RunP8":
                          log.info(NAME, datetime_string() + ': ' + _('Run now program 8'))
                          for program in programs.get():
                             if (program.index == 7):   # Run-now program 8
                                options.manual_mode = False
                                log.finish_run(None)
                                stations.clear() 
                                programs.run_now(program.index)
                             program.index+1
                          self._sleep(2)

                    self._sleep(1)

            except Exception:
                log.clear(NAME)
                log.error(NAME, _('Button plug-in') + ':\n' + traceback.format_exc())
                self._sleep(60)
                pass
Esempio n. 19
0
    def run(self):
        log.clear(NAME)
        disable_text = True

        while not self._stop_event.is_set():
            try:
                if plugin_options['use_button']:  # if button plugin is enabled
                    disable_text = True
                    actual_buttons = read_buttons()

                    # led_outputs(actual_buttons) # for test

                    for i in range(8):
                        tb = "button" + str(i)
                        if actual_buttons == i and plugin_options[
                                tb] == "reboot":
                            log.info(
                                NAME,
                                datetime_string() + ': ' + _(u'System reboot'))
                            stations.clear()
                            report_rebooted()
                            reboot(block=True)  # Linux HW software
                            self._sleep(1)

                        if actual_buttons == i and plugin_options[
                                tb] == "pwrOff":
                            log.info(
                                NAME,
                                datetime_string() + ': ' +
                                _(u'System shutdown'))
                            stations.clear()
                            report_poweroff()
                            poweroff(wait=10, block=True)  # shutdown HW system
                            self._sleep(1)

                        if actual_buttons == i and plugin_options[
                                tb] == "stopAll":
                            log.info(
                                NAME,
                                datetime_string() + ': ' +
                                _(u'Selected stations now stopped'))
                            set_stations_in_scheduler_off()
                            self._sleep(1)

                        if actual_buttons == i and plugin_options[
                                tb] == "schedEn":
                            log.info(
                                NAME,
                                datetime_string() + ': ' +
                                _(u'Scheduler is now enabled'))
                            options.scheduler_enabled = True
                            self._sleep(1)

                        if actual_buttons == i and plugin_options[
                                tb] == "schedDis":
                            log.info(
                                NAME,
                                datetime_string() + ': ' +
                                _(u'Scheduler is now disabled'))
                            options.scheduler_enabled = False
                            self._sleep(1)

                        if actual_buttons == i and plugin_options[
                                tb] == "RunP1":
                            log.info(
                                NAME,
                                datetime_string() + ': ' +
                                _(u'Run now program 1'))
                            for program in programs.get():
                                if (program.index == 0):  # Run-now program 1
                                    options.manual_mode = False
                                    if plugin_options['first_stop']:
                                        log.finish_run(None)
                                        stations.clear()
                                    programs.run_now(program.index)
                                program.index + 1
                            self._sleep(1)

                        if actual_buttons == i and plugin_options[
                                tb] == "RunP2":
                            log.info(
                                NAME,
                                datetime_string() + ': ' +
                                _(u'Run now program 2'))
                            for program in programs.get():
                                if (program.index == 1):  # Run-now program 2
                                    options.manual_mode = False
                                    if plugin_options['first_stop']:
                                        log.finish_run(None)
                                        stations.clear()
                                    programs.run_now(program.index)
                                program.index + 1
                            self._sleep(1)

                        if actual_buttons == i and plugin_options[
                                tb] == "RunP3":
                            log.info(
                                NAME,
                                datetime_string() + ': ' +
                                _(u'Run now program 3'))
                            for program in programs.get():
                                if (program.index == 2):  # Run-now program 3
                                    options.manual_mode = False
                                    if plugin_options['first_stop']:
                                        log.finish_run(None)
                                        stations.clear()
                                    programs.run_now(program.index)
                                program.index + 1
                            self._sleep(1)

                        if actual_buttons == i and plugin_options[
                                tb] == "RunP4":
                            log.info(
                                NAME,
                                datetime_string() + ': ' +
                                _(u'Run now program 4'))
                            for program in programs.get():
                                if (program.index == 3):  # Run-now program 4
                                    options.manual_mode = False
                                    if plugin_options['first_stop']:
                                        log.finish_run(None)
                                        stations.clear()
                                    programs.run_now(program.index)
                                program.index + 1
                            self._sleep(1)

                        if actual_buttons == i and plugin_options[
                                tb] == "RunP5":
                            log.info(
                                NAME,
                                datetime_string() + ': ' +
                                _('Run now program 5'))
                            for program in programs.get():
                                if (program.index == 4):  # Run-now program 5
                                    options.manual_mode = False
                                    if plugin_options['first_stop']:
                                        log.finish_run(None)
                                        stations.clear()
                                    programs.run_now(program.index)
                                program.index + 1
                            self._sleep(1)

                        if actual_buttons == i and plugin_options[
                                tb] == "RunP6":
                            log.info(
                                NAME,
                                datetime_string() + ': ' +
                                _(u'Run now program 6'))
                            for program in programs.get():
                                if (program.index == 5):  # Run-now program 6
                                    options.manual_mode = False
                                    if plugin_options['first_stop']:
                                        log.finish_run(None)
                                        stations.clear()
                                    programs.run_now(program.index)
                                program.index + 1
                            self._sleep(1)

                        if actual_buttons == i and plugin_options[
                                tb] == "RunP7":
                            log.info(
                                NAME,
                                datetime_string() + ': ' +
                                _(u'Run now program 7'))
                            for program in programs.get():
                                if (program.index == 6):  # Run-now program 7
                                    options.manual_mode = False
                                    if plugin_options['first_stop']:
                                        log.finish_run(None)
                                        stations.clear()
                                    programs.run_now(program.index)
                                program.index + 1
                            self._sleep(1)

                        if actual_buttons == i and plugin_options[
                                tb] == "RunP8":
                            log.info(
                                NAME,
                                datetime_string() + ': ' +
                                _(u'Run now program 8'))
                            for program in programs.get():
                                if (program.index == 7):  # Run-now program 8
                                    options.manual_mode = False
                                    if plugin_options['first_stop']:
                                        log.finish_run(None)
                                        stations.clear()
                                    programs.run_now(program.index)
                                program.index + 1
                            self._sleep(1)

                    self._sleep(1)

                else:
                    # text on the web if plugin is disabled
                    if disable_text:
                        log.clear(NAME)
                        log.info(NAME, _(u'Button plug-in is disabled.'))
                        disable_text = False
                    self._sleep(1)

            except Exception:
                log.clear(NAME)
                log.error(
                    NAME,
                    _(u'Button plug-in') + ':\n' + traceback.format_exc())
                self._sleep(60)
                pass