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