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
def do(self): hosts = get_used_plugins_by(package='plugins.system_ping') if hosts: for host in hosts: ping(host)
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()
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)
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]
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]
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]
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)
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]
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]
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]
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]
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)
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)
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)
def do(self): sensors = get_used_plugins_by(plugin_type="PressureSensor") if sensors: for sensor in sensors: sensor.set_command()
def get_widget_data(): """ Функция, для виджета plugins.system_ping, возвращающая словарь с объектами сетевых устройств. """ return get_used_plugins_by(package='plugins.system_ping')
def do(self): controllers = get_used_plugins_by(plugin_type='Controller') if controllers: for controller in controllers: controller.perform_commands()
def get_widget_data(): """ Функция, возвращающая словарь с объектами сетевых устройств. """ return get_used_plugins_by(package='plugins.system_ip_online')
def do(self): sensors = get_used_plugins_by(plugin_type='OnOffSwitch') if sensors: for sensor in sensors: sensor.set_command()
def do(self): sensors = get_used_plugins_by(plugin_type="RaindropSensor") if sensors: for sensor in sensors: sensor.set_command()
def do(self): sensors = get_used_plugins_by(plugin_type="AmbientLightSensor") if sensors: for sensor in sensors: sensor.set_command()
def do(self): sensors = get_used_plugins_by(plugin_type="TempHumidSensor") if sensors: for sensor in sensors: sensor.set_command()