예제 #1
0
def get_widget_data():
    """
    Функция для получения данных для отображение краткой сводки прогноза погоды на сегодня и завтра
    на Главной странице.

    :return: list Погодные данные
    """

    result = []

    # Получаем все используемые модели плагинов типа 'Forecast'
    for plugin in get_used_plugins_by(plugin_type='Forecast'):
        tmp_tuple = ()

        today = get_forecast(plugin, datetime.today())
        today = not_empty(today)
        if today:
            tmp_tuple += (('Сегодня', today), )

        tomorrow = get_forecast(plugin, datetime.today() + timedelta(days=1))
        tommorrow = not_empty(tomorrow)
        if tomorrow:
            tmp_tuple += (('Завтра', tomorrow), )

        result.append((plugin, tmp_tuple))

    return result
예제 #2
0
    def do(self):

        hosts = get_used_plugins_by(package='plugins.system_ping')

        if hosts:
            for host in hosts:
                ping(host)
예제 #3
0
파일: cron.py 프로젝트: sug4rok/Servus
    def do(self):

        hosts = get_used_plugins_by(package='plugins.system_ip_online')

        if hosts:
            pool = Pool(5)  # 5 - количество потоков
            pool.map(set_host_status, hosts)
            pool.close()
            pool.join()
예제 #4
0
파일: views.py 프로젝트: sug4rok/Servus
def climate(request):
    """
    Функция вывода необходимых вкладке Климат данных с климатических датчиков, названий
    единиц измерения, название вкладки и пр.

    :param request: django request
    """

    charts = []

    # Данные для графиков температуры и влажности
    th_sensors = get_used_plugins_by(plugin_type='TempHumidSensor')
    if th_sensors:
        temps = get_climate_data(th_sensors, TempHumidValue, 'temperature')
        humids = get_climate_data(th_sensors, TempHumidValue, 'humidity')
        if temps:
            charts.append(('temp_div', 'температуры', '°C', temps))
        if humids:
            charts.append(('hum_div', 'влажности', '%', humids))

    # Данные для графика атмосферного давления
    p_sensors = get_used_plugins_by(plugin_type='PressureSensor')
    if p_sensors:
        pressures = get_climate_data(p_sensors, PressureValue, 'pressure')
        if pressures:
            charts.append(('press_div', 'атмосферного давления', 'мм рт.ст.', pressures))

    # Данные для графиков освещенности
    al_sensors = get_used_plugins_by(plugin_type='AmbientLightSensor')
    if al_sensors:
        ambient_lights = get_climate_data(al_sensors, AmbientLightValue, 'ambient_light')
        if ambient_lights:
            charts.append(('ambl_div', 'освещенности', 'лк', ambient_lights))

    # Данные для графиков выпадения осадков
    rd_sensors = get_used_plugins_by(plugin_type='RaindropSensor')
    if rd_sensors:
        raindrops = get_climate_data(rd_sensors, RaindropValue, 'raindrop')
        if raindrops:
            charts.append(('rd_div', 'выпадения осадков', 'ед', raindrops))

    params = {'active_app_name': 'climate', 'charts': charts}

    return call_template(request, params)
예제 #5
0
파일: widget.py 프로젝트: sug4rok/Servus
def get_widget_data():
    """
    Получение данных о текущей температуре и влажности из таблицы climate_temphumidvalue БД
    :returns: список кортежей вида [(<полное имя датчика>, влажность, тепмпература), ...]
    """

    sensors = get_used_plugins_by(plugin_type='TempHumidSensor')
    values = [get_latest_sensor_value(TempHumidValue, sensor) for sensor in sensors]

    return [(v.content_object.location, v.humidity, v.temperature) for v in values if v is not None]
예제 #6
0
파일: widget.py 프로젝트: sug4rok/Servus
def get_widget_data(plan_id):
    """
    Функция, предоставляющая данные о температурах HDD

    :returns: list Список кортежей с данными о температурах жестких дистков и
    координатами расположения виджетов.
    """

    switches = get_used_plugins_by(package='plugins.system_hddtemp')
    switches = [sw for sw in switches if sw.plan_image_id == plan_id]

    return [(plan_id, sw.name, sw.horiz_position, sw.vert_position,
             sw.level, sw.temperature) for sw in switches]
예제 #7
0
파일: widget.py 프로젝트: sug4rok/Servus
def get_widget_data(plan_id):
    """
    Функция, предоставляющая данные с герконов

    :returns: list Список кортежей с данными о состояниях герконов и
    координатами расположения виджетов.
    """

    switches = get_used_plugins_by(package='plugins.arduino_reed_switch')
    switches = [sw for sw in switches if sw.plan_image_id == plan_id]

    return [(plan_id, sw.name, sw.horiz_position, sw.vert_position,
             sw.level, sw.location_type, get_state(sw.state)) for sw in switches]
예제 #8
0
파일: cron.py 프로젝트: sug4rok/Servus
    def do():
        """
        Метод для опроса всех прогнозных провайдеров (подключенные плагины прогноза погоды)
        и запись полученных результатов с помощью функции weather_setter в таблицу БД Weather.
        """

        forecasts = get_used_plugins_by(plugin_type='Forecast')

        if forecasts:
            # Очищаем базу weather_weather перед заполнением свежими данными
            WeatherValue.objects.all().delete()

            for wp in forecasts:
                get_weather(wp)
예제 #9
0
def get_widget_data(plan_id):
    """
    Функция, предоставляющая данные с датчиков дождя YL-83

    :returns: list Список кортежей с данными о дожде и координатами расположения
    виджетов.
    """

    sensors = get_used_plugins_by(package='plugins.arduino_yl83')
    sensors = [s for s in sensors if s.plan_image_id == plan_id]

    values = [get_latest_sensor_value(RaindropValue, sensor) for sensor in sensors]

    return [(plan_id, v.content_object.name, v.content_object.horiz_position,
             v.content_object.vert_position, rain_level(v.content_object, v.raindrop)) for v in values if v is not None]
예제 #10
0
def get_widget_data(plan_id):
    """
    Функция, предоставляющая данные атмосферного давления для каждого добавленого датчика BMP085/BMP180

    :param plan_id: int ID планировки.
    :returns: list Список кортежей с данными атмосферного давления и координатами расположения.
    виджетов.
    """

    sensors = get_used_plugins_by(package='plugins.arduino_bmp085')
    sensors = [s for s in sensors if s.plan_image_id == plan_id]

    values = [get_latest_sensor_value(PressureValue, sensor) for sensor in sensors]

    return [(plan_id, v.content_object.name, v.content_object.horiz_position,
             v.content_object.vert_position, v.pressure) for v in values if v is not None]
예제 #11
0
def get_widget_data(plan_id):
    """
    Функция, предоставляющая данные освещенности для каждого добавленого датчика BH1750

    :param plan_id: int ID планировки.
    :returns: list Список кортежей с данными освещенности и координатами расположения
    виджетов.
    """

    sensors = get_used_plugins_by(package='plugins.arduino_bh1750')
    sensors = [s for s in sensors if s.plan_image_id == plan_id]

    values = [get_latest_sensor_value(AmbientLightValue, sensor) for sensor in sensors]

    return [(plan_id, v.content_object.name, v.content_object.horiz_position,
             v.content_object.vert_position, v.ambient_light) for v in values if v is not None]
예제 #12
0
def get_widget_data(plan_id):
    """
    Функция, предоставляющая данные температуры и относительной влажности для каждого
    добавленого датчика DHT.

    :param plan_id: int ID планировки.
    :returns: list Список кортежей с данными температуры, влажности и координатами расположения
    виджета.
    """

    sensors = get_used_plugins_by(package='plugins.arduino_dht')
    sensors = [sensor for sensor in sensors if sensor.plan_image_id == plan_id]

    values = [get_latest_sensor_value(TempHumidValue, sensor) for sensor in sensors]

    return [(plan_id, v.content_object.name, v.content_object.horiz_position,
             v.content_object.vert_position, v.temperature, v.humidity) for v in values if v is not None]
예제 #13
0
def weather(request):
    global bg_styles

    params = {}
    forecast = []

    # Получаем все модели плагинов типа 'Forecast'
    forecasts = get_used_plugins_by(plugin_type='Forecast')

    # Если хотябы один прогнозный API добавлен, собираем список данных для передачи в шаблон.
    if forecasts:

        fields = WeatherValue._meta.fields

        for wp in forecasts:  # wp - от Weather Provider

            forecast_times = list_field_values(wp, 'datetime')

            if not forecast_times:  # Если нет ни одной записи о времени прогноза погоды, считаем,
                continue  # что нет данных для данного прогнозного API и пропускаем данную итерацию.

            bg_styles = get_bg_styles(forecast_times)  # Получаем кортеж названий классов css
            values = []
            for field_i in fields[3:-3]:
                field_values = [field_i.name, field_i.verbose_name, field_i.help_text]

                if field_i.name == 'datetime':
                    field_values.append(zip(forecast_times, bg_styles))
                elif field_i.name == 'clouds':
                    field_values.append(get_clouds(wp))
                elif field_i.name == 'precipitation':
                    field_values.append(get_precipitation(wp))
                elif field_i.name == 'wind_speed':
                    field_values.append(get_wind(wp))
                else:
                    field_values.append(zip(list_field_values(wp, field_i.name), bg_styles))

                values.append(field_values)

            site = wp.get_url().split('/')[2].split('.')
            forecast.append((site[-2] + '.' + site[-1], values, wp.city))

        params = {'active_app_name': 'weather', 'forecast': forecast}

    return call_template(request, params)
예제 #14
0
파일: cron.py 프로젝트: sug4rok/Servus
    def do():
        """
        Функция проверяет наличие сообщений с важностью 'warning' и 'error' и
        формирует SMS-сообщение для отправлки по расписанию на все api_id из таблицы base_userprofile БД.
        Затем, меняет флаг sms_sent у каждого события, которое
        блыо отправлено.
        """

        recipients = get_used_plugins_by(plugin_type='SMS')
        recipients_filled = [r for r in recipients if r.phone is not None and r.sms_ru_id != '']

        if recipients_filled:
            events = Event.objects.filter(level__gte=3).exclude(sms_sent=True).order_by('-level')

            # Объединяем  все события в одну строку для последующей разбивки по 70 символов
            # (ограничение СМС для русских символов в сообщении)
            txt_msg = '\\n'.join(['[%s] %s' % (e.datetime.strftime('%b-%d %H:%M'), e.message) for e in events])
            sms_msgs = []
            while txt_msg:
                sms_msgs.append(txt_msg[:69])
                txt_msg = txt_msg[69:]

            sms_were_sent = []

            for recipient in recipients_filled:
                for msg in sms_msgs:
                    url = 'http://sms.ru/sms/send?api_id=%s&to=%s&text=%s' % (recipient.sms_ru_id,
                                                                              recipient.phone, msg)
                    # В API sms.ru  в тексте сообщения использутся знаки "+" в качестве пробела
                    url = url.replace(' ', '+')
                    try:
                        res = urlopen(url.encode('utf-8')).read().splitlines()

                        if res is not None and int(res[0]) != 100:
                            event_setter('system', u'Ошибка отправки СМС: %s' % SERVICECODES[int(res[0])], 3, delay=3)
                            sms_were_sent.append(False)
                        else:
                            sms_were_sent.append(True)
                    except URLError as err:
                        event_setter('system', u'Ошибка отправки СМС: %s' % err, 3, delay=3)
                        sms_were_sent.append(False)

            # Если все сообщения отправлены всем получателям, меняем параметр sms_sent сообщений
            if all(sms_were_sent):
                events.update(sms_sent=True)
예제 #15
0
파일: cron.py 프로젝트: sug4rok/Servus
    def do(self):

        hdds = get_used_plugins_by(package='plugins.system_hddtemp')

        if hdds:
            for hdd in hdds:
                if hdd.type != '?':
                    hdd_str = '{0}:/dev/{1}'.format(hdd.type, hdd.name)
                else:
                    hdd_str = '/dev/' + hdd.name

                process = Popen(['hddtemp', '-n', hdd_str], stdout=PIPE)
                temp, err = process.communicate()
                temp = temp.replace('\n', '')

                if temp and temp.isdigit():
                    temp = int(temp)
                    hdd.set_result(temp)
예제 #16
0
파일: cron.py 프로젝트: sug4rok/Servus
    def do(self):
        sensors = get_used_plugins_by(plugin_type="PressureSensor")

        if sensors:
            for sensor in sensors:
                sensor.set_command()
예제 #17
0
def get_widget_data():
    """ Функция, для виджета plugins.system_ping, возвращающая словарь с объектами сетевых устройств. """

    return get_used_plugins_by(package='plugins.system_ping')
예제 #18
0
    def do(self):
        controllers = get_used_plugins_by(plugin_type='Controller')

        if controllers:
            for controller in controllers:
                controller.perform_commands()
예제 #19
0
파일: widget.py 프로젝트: sug4rok/Servus
def get_widget_data():
    """ Функция, возвращающая словарь с объектами сетевых устройств. """

    return get_used_plugins_by(package='plugins.system_ip_online')
예제 #20
0
파일: cron.py 프로젝트: sug4rok/Servus
    def do(self):
        sensors = get_used_plugins_by(plugin_type='OnOffSwitch')

        if sensors:
            for sensor in sensors:
                sensor.set_command()
예제 #21
0
파일: cron.py 프로젝트: sug4rok/Servus
    def do(self):
        sensors = get_used_plugins_by(plugin_type="RaindropSensor")

        if sensors:
            for sensor in sensors:
                sensor.set_command()
예제 #22
0
파일: cron.py 프로젝트: sug4rok/Servus
    def do(self):
        sensors = get_used_plugins_by(plugin_type="AmbientLightSensor")

        if sensors:
            for sensor in sensors:
                sensor.set_command()
예제 #23
0
파일: cron.py 프로젝트: sug4rok/Servus
    def do(self):
        sensors = get_used_plugins_by(plugin_type="TempHumidSensor")

        if sensors:
            for sensor in sensors:
                sensor.set_command()