def get_bathroom_usages(start, end): usages = [] using_bathroom = None last_start_datetime = None for event in smarthome_db.query(SmarthomeEvent).filter( SmarthomeEvent.smart == "bathroom_usage_watcher", SmarthomeEvent.attribute.in_(["started", "stopped"]), SmarthomeEvent.datetime >= start, SmarthomeEvent.datetime <= end, ).order_by(SmarthomeEvent.datetime): if using_bathroom is None: # Первое событие за интервал: узнаём, в начале интервала пользователь был в ванной или нет или нет? if event.attribute == "stopped": # Вышел, значит, пользовался using_bathroom = True last_start_datetime = start else: # Зашёл, значит, не был using_bathroom = False if not using_bathroom and event.attribute == "started": using_bathroom = True last_start_datetime = event.datetime elif using_bathroom and event.attribute == "stopped": usages.append((last_start_datetime, event.datetime)) using_bathroom = False else: logger.warning(u"using_bathroom = %d и в %s произошло событие %s" % (using_bathroom, event.datetime.strftime("%Y-%m-%d %H:%M:%S"), event.attribute)) # Если в конце интервала пользователь в ванной, зафиксируем последний вход if using_bathroom: usages.append((last_start_datetime, end)) return usages
def get_outs(start, end): outs = [] owner_is_at_home = None last_leave_datetime = None for event in smarthome_db.query(SmarthomeEvent).filter( SmarthomeEvent.smart == "owner_presence_watcher", SmarthomeEvent.attribute.in_(["came", "left"]), SmarthomeEvent.datetime >= start, SmarthomeEvent.datetime <= end, ).order_by(SmarthomeEvent.datetime): if owner_is_at_home is None: # Первое событие за интервал: узнаём, в начале интервала пользователь был дома или нет? if event.attribute == "came": # Пришёл, значит, не был owner_is_at_home = False last_leave_datetime = start else: # Ушёл, значит, был owner_is_at_home = True if owner_is_at_home and event.attribute == "left": owner_is_at_home = False last_leave_datetime = event.datetime elif not owner_is_at_home and event.attribute == "came": outs.append((last_leave_datetime, event.datetime)) owner_is_at_home = True else: logger.warning(u"owner_is_at_home = %d и в %s произошло событие %s" % (owner_is_at_home, event.datetime.strftime("%Y-%m-%d %H:%M:%S"), event.attribute)) # Если в конце интервала пользователь не дома, зафиксируем последний уход if not owner_is_at_home: outs.append((last_leave_datetime, end)) return outs