Пользователь
0,0
рейтинг
17 марта 2014 в 12:39

Разработка → iToilet. Офисный туалет свободен



Привет, Хабр!
Меня зовут Serg Krivoblotsky и я алкоголик iOS-разработчик. Я работаю в небольшой киевской компании, которая специализируется на iOS разработке и дизайне для нашей платформы. «Люби то, что делаешь и делай то, что любишь», говорят у нас. Делаем. Любим.

Идея ежемесячных хакатонов прижилась в нашем коллективе на отлично. Раз в месяц, на выходных, собирается команда для развлечения в виде написания кода, изучения новых технологий, просто генерации идей, или поедания пиццы. Задачи бывали разные: от виртуального planning poker'а, до распознавания цены на чеке и конвертации в нац. валюту. Главная цель всего этого — не зарелизить готовый продукт, а скорее написать рабочий прототип, a.k.a MVP, как хотите.
Об одной из идей и ее реализации, я бы хотел рассказать подробнее.

Каждый кто находится в co-working'е, или небольшом офисе сталкивался с таком алгоритмом своих действий:
  1. Подходишь к туалету
  2. Упс, занято
  3. Идешь на рабочее место.
  4. Ждешь до тех пор, пока не освободится.

Есть проблема — должно быть решение. Было бы удобно, если находясь на рабочем месте я уже знал, занят ли туалет в данный момент, стоит ли мне туда идти.




Что нам понадобится для этого:
  • Датчик света. (Свет включен == туалет занят)
  • Устройство, способное считывать его показания.
  • Немного кода на PHP и Objective C.


Было куплено:

  1. PCduino
  2. Самый обыкновенный аналоговый датчик освещенности
  3. Множество проводов и несколько резисторов


Ход работы:
Кода писать много не буду, потому что он понятен как hello world. В конце статьи будут ссылки на Github.

  1. Подключаем датчик к pcduino:

    Датчик вернет значения в диапазоне 0..4096.
    Эмпирическим путем было определено, что наша лампочка в туалете в включенном состоянии выдает:
    >3400 — темнота
    <3400 — свет
  2. Поднимаем apache. (предварительно туда ubuntu поставили).
  3. Пишем код на php для считывания показаний (вконце статьи ссылки на GitHub):

    $this->port = (isset($_GET["port"]) && is_numeric($_GET["port"])) ? $_GET["port"]:2;
    $this->data = exec("cat /proc/adc".$this->port);


  4. Пишем API для мобильных, и не только, клиентов:
            $this->answer(array(
                'light_value' => (int)$this->data,
                'light_status' => (bool)$l_status,
                'light_change' => (int)$l_change,
                'sensor_status' => true
            ));
  5. Опрашиваем по таймеру устройство любым удобным для вас способом:
    OSX:
        NSURL *toiletURL = [NSURL URLWithString:kToiletURLString];
        NSError *requestError = nil;
        NSData *responseData = [NSData dataWithContentsOfURL:toiletURL options:NSDataReadingUncached error:&requestError];

    iOS:
        NSURL *url = [NSURL URLWithString:urlString];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        //Send NSURLSession dataTask
        [self sendRequest:request withCompletion:completion];
    

  6. Постим notification:
    [self.notificationController deliverNotificationWithTitle:kBusyNotificationText andText:notificationText];
    



… В общем-то это и все что нужно. Позже мы добавили несколько плюшек в виде таймера и возможности отключить всплывающие нотификейшны.
Результат работы:
OSX:


iOS


Исходники хакатона:
OSX:
github.com/Krivoblotsky/iToilet-Mac-OS

iOS
github.com/Krivoblotsky/iToilet

PHP:
github.com/Krivoblotsky/iToilet-PHP

@Krivoblotsky
Serg Krivoblotsky @Krivoblotsky
карма
19,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (136)

  • +197
    Надо еще электронную очередь организовать :)

    «Туалет свободен, ваша очередь: 5, примерное время ожидания: 27 минут 43 секунды»
    • +70
      ИМХО — не хватает аналитики, а ля:
      > последним гадил Вася
      > свет не вырубил Андрей
      > за собой не смыл…
      > а Баб Нюра там сидит уже 43 мин.
      • +9
        Да, BigData сейчас в моде… добавить функцию предсказания времени освобождения, на основе предыдущего поведения пользователей.
      • +10
        А если через API получать данные из столовой, можно так же исследовать интересные зависимости…
    • +54
      И кнопка «Заплатить 100р и подвинуться в очереди»
      • 0
        А как вы себе представляете реализацию? Процесс то неконтролируемый.
        • 0
          если есть люди, которые стоят выше вас в очереди на посещение, то можно «обгонять» их.
          • +2
            Ну можно тогда проще поступить — устроить аукцион за место на толчке и списывать деньги автоматом с кредитки за каждую минуту проведенную в туалете.
            • 0
              «Оптимизируй это»
      • +4
        А потом занимать очередь без надобности и продавать свое место в очереди со скидкой!
    • –1
      Кстати, если серьёзно, то это справедливо: а то некоторые про запас начнут бежать и после того, как появится оповещение об освободившемся туалете, несколько человек сорвутся со своих мест и, ставя друг другу подножки, наперегонки побегут к туалету…
      • 0
        Если уж действительно говорить серьезно, то такая ситуация возможна только при нарушении каких-нибудь там норм по количеству туалетов на душу населения. У нас на этаже всего один унитаз и один уринал (для мужчин). Лично я сталкиваюсь с ситуацией «пришел — занято» раз в 2-3 месяца от силы, а то и реже. «Побегут наперегонки» — это начальная школа какая-то :)
    • 0
      Тогда можно будет вести статистику посещения и время пребывания в туалете у сотрудников с возможностью выбора временного интервала :) Так, в конце года составлять шуточный рейтинг например)
  • +1
    Это уже было тут habrahabr.ru/post/215009/
    Что случилось?
    • +8
      Пришлось перепостить из-за бюрократии.
    • +1
      На хабре нельзя публиковать топики, в которых ты в первом же абзаце даешь ссылку на свою компанию, а потом уже рассказываешь суть поста :)…
  • +8
    Это в планах на следующие релизы. Назвали фичу «Я следующий»:)
    • +24
      Функции перекупа очередь для тех, кому приперло :)
      • +3
        Купоны и купоны спецобращений как в техподдержке битрикса.
  • +4
    Сразу видно, кто зачитался в «библиотеке». :)

    image
  • +2
    Слегка назойливо с уведомлениями) Иконку бы в таскбар
    • +2
      Она там есть (Красный/зеленый круг).
  • +12
    Свет включен == туалет занят

    Не все люди за собой свет выключают, увы. Было бы лучше по замку отслеживать.

    Другая проблема — если «сервисом» пользуется весь офис, при получении нотификации сразу 5 человек бегут к освободившемуся туалету, и все равно приходится ждать.
    • +8
      Практика показала, что для 15-ти человек «сервиса» вполне достаточно. Пробки не создаются.
      • +2
        Интересно, какое предельное число пользователей можно подключить до первых пробок)
      • +42
        Ждём iToilet.Пробки
        • 0
          И народные комментарии.
        • +7
          Судя по навигатору, я сижу в туалете со скоростью 3 км/ч…
    • +5
      Было бы лучше отслеживать емкостным датчиком.
    • 0
      Классический race-condition, который можно решить, добавлением рандомного промежутка времени когда отсылать уведомление.
      • +1
        O, теперь вот тут! «Пошли 'iToilet' на короткий номер ХХХХ и уменьши свой рандомный промежуток времени вдвое»
  • +1
    У нас есть такие личности, которые за собой свет не выключают.
    М.б. стоило использовать датчик движения? Ибо вероятность нахождения зверьков в туалете гораздо меньше той, что человек забудет выключить за собой свет.
    • +12
      Датчик движения не прокатит, так как человек там сидит в неподвижном состоянии:)
      • +1
        И правда, как-то не подумал об этом;)
        • +5
          У нас в одном из офисных туалетов свет в кабинке включался по движению. Короче приходилось как-то двигаться, либо сидеть в темноте :)
          • +25
            Полезно сидеть в темноте, наедине с собственными мыслями.
      • +4
        Повесьте лампу с детектером движения. К ней подключите девайс. Если не хочет сидеть в темноте — будет шевелить руками, чего мы и добиваемся.
      • +4
        Как эксперт с мировым именем по данному вопросу, могу заметить: если человек пришел в неподвижное состояние — пора беспокоиться…
        • +11
          А если человек постоянно движется, то скорее всего их два ;)
        • +2
          Только камеру с собой взять не забудьте. На всякий случай :)
          • +1
            Поза не совсем естественная для живого человека, может у него судороги были.
      • 0
        Решается достаточно просто.

        У датчика движения есть два события: «алярм» и «дизалярм», что значит «движение обнаружено» и «ухожу из режима тревоги».
        Суть в том, что можно настроить таймер, по срабатыванию которого датчик уходит в «дизалярм».

        Человек пошевелился в 4 минутном отрезке времени? Таймер сбрасывается и снова ждёт.
        4 минуты движения не обнаружено? Уходим в режим «дизалярм».

        Если 3 минуты человек неподвижно ещё сможет просидеть на унитазе, то 4 минуты — едва ли (нос почесать, взять баллончик освежителя воздуха, чтоб этикетку почитать и т.п.).

        Таким образом состояние датчика «дизалярм» можно считать как состояние туалета «Свободно».

        Минус описанного метода в том, что если человек покинул туалет через минуту, то датчик будет продолжать ждать истечения времени для перехода в режим «дизалярм».
    • +2
      Лучше ИК-датчик (пример)
      • 0
        Кстати да, как на парковках
  • 0
    Датчик света. (Свет включен == туалет занят)


    У нас такое не прокатит, ибо свет в туалете включен всегда в течении всего раболчего дня. А так прикольно.
    • +7
      Ну заодно будем воспитывать культуру экономии света.
      • +3
        Можно добавить таймер. Например через 15-30 мину статус меняется на «Возможно забыли выключить свет»
      • 0
        а у нас в туалете какие-то медленные лампы, из выключенного состояния долго разогреваются, поэтому свет никогда не выключается :)
    • +2
      Можно поставить датчик в сам унитаз, если свет внезапно пропадает, значит туалет занят.
  • +51
    Прикрутите систему ачивок и рейтинг участников. Будет круто. А так же возможность написать тому, кто находится внутри.
    • +1
      С Твиттером и Фейсбуком :)
      • +23
        И инстаграмом ;)
      • +22
        Установить веб-камеру и сразу все знают занято или нет :) И монетизация с канала на YouTube. И смс голосование за лучшего серуна.
        • +1
          Вы бы ещё комментатора посадили :D
          • +1
            Губерниева
    • +5
      Еще систему скилов. В том числе и негативных вроде «сломать слив» или «разбросать бумагу».
      И обязательно возможность выкладывать фото.
    • +6
      «Король туалета», «Завсегдатай», плюс таблица лидеров. Да, поле не паханное )
      • +3
        Для пущего веселья не хватает квестов: «Не промахнуться», «управиться за 60 секунд», «ДВОЙНОЕ ПОСЕЩЕНИЕ» и т.д.: )
  • +2
    Да, а потом соберут статистику, скрестят со статистикой активноси в браузере и вычислят главного сруна и писуна.

    Кто то же не сможет расслабится из за того что за ним косвенно но «следят». От этого в туалете не будут долго находиться и как следствие скорости — лужи перед унитазом)

    Как сейчас помню хотели с админом найти у какой заразы прицел сбит.
  • +28
    Прогресс-бар!
    • +4
      К сожалению разместить датчик уровня в мочевом пузыре не так просто.
      • 0
        Фиксированный по времени прогресс бар… с катапультой )
      • +1
        Чего сложного-то? Устанавливаем небольшой тензодатчик, замеряем вес посетителя, следим за процессом.
        • 0
          А за 0 что примим?) Может у посетителя простатит и он на пару капель пришел?)
          • 0
            Можно по среднему времени продвигать прогрессбар. Ну а если «клиент» сидит больше положенного, то вводить штрафные санкции ))
      • 0
        Можно сделать по примеру TeamCity: собирать статистику по времени выполнения и выводить прогресс относительно ее )
  • +10
    Еще нужно отслеживать тех, кто не смывает и руки после сортира не моет и вывешивать их на доску позора.
  • +6
    А WiFi в вашем туалете доступен? :)
    • +1
      Ну что за туалет в ІТ-компании без WiFi?!
  • +1
    Так доберемся скоро до диаграмм использования туалета, автооповещении о заканчивающейся бумаге и кнопка приглашения уборщицы (последняя затея, кстати, неплоха).

    Хотя, если с другой стороны, раз мы в таком месте проводим 6 месяцев своей жизни, почему бы не привлекать технологии и сюда, что японцы и так давно уже делают?)
  • 0
    прям как в поезде
    • 0
      Идея пришла из самолета.
      • +2
        может попробовать повесить датчик на защелку? Её только изнутри можно закрыть = внутри кто-то есть.
        • +1
          Ваш комментарий самый разумный, но тогда не нужна ардуина и датчик освещенности.
          • +2
            A как «датчик на защелке» будет слать данные на компы и телефоны сотрудников?
  • +1
    Занятость еще можно определять инфракрасным датчиком типа такого

    > Sharp GP2Y0A02YK0F has an analog output that varies from 2.8V at 15cm to 0.4V at 150cm with a supply voltage between 4.5 and 5.5VDC
    • +1
      Это датчик для измерения расстояния. Вы хотите просвечивать место над унитазом, и если расстояние меньше, чем расстояние до стены, то считать занятым? А если человек стоит?
      • 0
        Освещённость им тоже можно мерить. Вопрос только в том как использовать.
        • 0
          Не получится, там стоит фильтр пропускающий только все то, что ИК и ниже.
          • 0
            А отковырять его нельзя?
            • 0
              Не в курсе. Возможно, если сенсор не залит этим самым фильтром, то можно.
      • 0
        Все равно расстояние будет отличным от пустого помещения, а если помещение не большое, то стоять так, чтобы не попасть в поле зрения датчика нужно постараться. Зато решится проблема с забытым светом и можно рассылать уведомления «помоги сэкономить электричество — сходи выключи свет». А если прикрутить метки на вход, то можно рассылать «Увидишь Васю, скажи ему, что свет не выключать плохо».
        • +2
          … а если помещение не большое, то стоять так, чтобы не попасть в поле зрения датчика нужно постараться.

          А за это будет даваться ачивка «Невидимка» ;)
      • –1
        А если стоит — то просто запускать таймер на разумный интервал (от минуты для здоровых молодых людей с брюками на молнии до пяти минут для старпёров с пуговицами и проблемами мочеиспускания)
        • +2
          Что вы имеете против джинсов с пуговицами на ширинке? :)
      • 0
        Можно повесить над дверью и направить на унитаз, тогда он будет срабатывать и на сидящего, и на стоящего человека.
        • 0
          У данного датчика максимальное измеряемое расстояние, как я понимаю, составляет 1,5 метра. Может не хватить. Придется использовать ультразвуковой.
      • 0
        Мерять не от стены до стены а от спинки унитаза до двери. Но мне всё-таки больше датчик объёма по душе, вряд ли на толчке все как статуи сидят. Ну а лучше объединить датчики для пущей надёжности.
    • 0
      Проще всего кнопку подогнать к щеколде.
  • +12
    Вы самое главное забыли сделать: автоматический постинг в Твиттер!
    • +12
      Главное, чтоб не в Инстаграм.
    • +2
      Лучше классически: в комментарии!
  • +2
    Я думаю система получит большее распространение, если в качестве датчика использовать Android смартфон/планшет с камерой. Практически в любом IT офисе можно найти человека, у которого есть ненужный старый Android девайс.
    Поставить его на зарядку в туалете и камерой измерять освещённость. Я думаю приложение получится тривиальным и снимет необходимость заказывать pcduino.

    Кто возьмётся реализовать?
    • +1
      Сопрут ваш телефон
      • +1
        Ну, в офисах обычно все свои и никто воровать не станет. Но в качестве антивандальных мер можно снять экран/корпус, прикрутить к стене саморезом и спрятать всё в какой-нибудь невзрачный корпус.
    • +1
      Еще OpenCV, распознавание лиц и тогда можно будет гораздо точнее определять занятость и отслеживать кто именно забыл выключить свет, отправлять смс забывчивым и т.п.
      • +2
        А по сигналу с микрофона отслеживать кто не моет руки и не смывает за собой!
    • +20
      Ещё нужна возможность подключения датчика метана! Для определения безопастно ли заходить в туалет в данный момент или нет.
      Ну и включать вытяжку если данный параметр превышает какое-то пороговое значение.

      • +4
        А пороговое значение определить опытным путем…
    • 0
      А в случае «засиделся дольше 5 минут», автоматом в паблик инстаграммится лицо сидящего с соответствующей подписью.
      • +5
        И в соцсетях его выставлять статус: «Какаю 43 минуты». :)
  • +18
    У нас в офисе:



    Извините :)
    • +2
      У нас в тренажерке вот такое висит — вроде работает)
      image
      • +14
        Добро пожаловать в Интернет.
      • 0
        Практика показывает, что подобных лозунгов нужно пару десятков. И менять где-то раз в две недели.
        Один и тот же текст посетителям надоедает и перестаёт работать.
      • 0
        Ну, испортили весь цимус. После «просим смывать за собой» должна стоять подпись «Администрация» печатным шрифтом. А ниже — рукописно, про цели, ожидания и ёршик. И подпись «уборщица».
  • 0
    Хорошо, что это прототип, потому что избыточность решения довольно велика.
  • 0
    А не проще ли устройство подключить параллельно лампочке? Тогда если опросилось, то туалет занят, если нет — свободен. Погрешность, конечно, вносится временем поднятия сети, но не нужно датчиков. Но ваш вариант хорош в плане удовольствия от реализации и масштабируемости :)
    • 0
      Две вещи, убивающие идею:
      1. Лампочки, забытые во включенном состоянии
      2. Туалеты с окном — в дневное время
      • +1
        ага, это точно. Предлагаю прикрутить вебку, направленную на дверь, и с помощью OpenCV по положению ручки анализировать закрытость двери изнутри. Беспроигрышный вариант! :)
  • +7
    Столько идей, и никто не посоветовал просто установить ещё один унитаз image
    • +2
      Это дороже, чем купить плату и датчик ;)
      • 0
        Что верно, то верно! :-)
    • +2
      Ах вот что имели в виду строители небезызвестного недавно нашумевшего «туалета на двоих»!.. :)
    • +2
      Распараллеливание процессов IRL.
  • 0
    А может просто датчики давления? Датчики на полу(под ковриком) и под ободком унитаза? :D
  • +15
    Это вы чего?

    $this->data = exec("cat /proc/adc".$this->port);
    

    Смеётесь что ли? PHP и сам отлично умеет файлы читать:

    $this->data = file_get_contents("/proc/adc".$this->port);
    
  • +3
    Правильно ли я понял, что клиенский софт обращается напрямую к ардуине с датчиком, на которой установлен веб-сервер?

    Предвижу проблемы в такой архитектуре: нехватка производительности самой ардуины, узкий или нестабильный канал до датчика — могут привести к нестабильной работе сервиса.

    Чтобы решить эти проблемы, предлагаю перейти на трехзвенную архитектуру:
    1. датчик (или датчики) — та самая ардуина или прибитый гвоздем старый android, постит информацию на сервер
    2. сервер — размещен в быстром стабильном дата-центре, хранит информацию со всех датчиков и отдает ее клиентам
    3. клиенты (iOS, Mac OS и т.п.) — получают данные от сервера (и кстати, push неплохо было бы сделать)

    Кроме повышения надежности, такая архитектура позволит развязать стандарт взаимодействия сервера с датчиком и сервера с клиентом. Таким образом, можно будет, не меняя софт на клиенте, подключать новые типы датчиков (например, работающие только по poll-режиму или использующие нестандартный канал типа sms).
    • 0
      Хороший поинт. Если проект выйдет за рамки хакатона — обсудим.
  • +1
    Комментарии прелестны!
    Но мне кажется Вы усложняете, может поставить просто датчик на задвижку что изнутри?
    • 0
      Мы думали над этим. Но задвижки везде разные, к тому же возле двери не очень удобно монтировать устройство.
      Но идея такая была, да:)
  • 0
    «Ваша очередь через 5… 4… 3… 2… 1 минуту» — и тут тебе по работе звонок на настольный телефон прилетает!
    «Вы пропустили вашу очередь, в виде штрафа теперь вы сможете пойти в туалет через 43… 42… 41 минуту»

    Затем начнутся ответы по телефону «не могу говорить, моя очередь подходит, не хочу получить штраф и iКарму». Затем пойдут идеи сделать на входе в туалет QR-сканер, и печатать очередникам «билеты», чтобы пускать именно того, кому сейчас пришла очередь… А ведь еще можно внутри туалета повесить моник с клавой, выводить юзеру на экран персонализированный контент, в завосимости от личности, времени в туалете за сегодня, за неделю, числа коммитов за сегодня и за 7 дней по прямой работе…

    P.S. Один вопрос — там что, один туалет и 100 человек в него очень хотят, что нужно было столько труда тратить, или это все потому, что автор, написавший свое имя латиницей, не знал, чем заняться в течении хакинтона? )
  • +1
    Нет, не 100, всего 15. Хакатоны собираются just for fun (прошу прощения за латиницу), и «столько труда» было потратить действительно интересно, никто ведь не претендует на «изобретения года».
  • 0
    Не понял зачем это в уведомлении: «Был занят 0:13». Это чтобы показать, что последний человек успел за 13 секунд?
  • 0
    iShitter
    На пожарный, чтобы без двусмысленности urbandictionary.com/define.php?term=shitter
    • +1
      iPooper лучше звучит. ИМО.
  • 0
    Вы ситуацию однобоко рассматриваете.
    У нас вот в туалете (это только мужской) 5 кабинок и два писуара. Свет горит постоянно. Выключается общим выключателем, соответственно, в течение дня он никогда не выключается. Как тут быть?
    • 0
      Ставить детектор веса по круг унитаза и детектор жидкости в писуар.
  • 0
    Ждем релиза датчика для мочевого пузыря)
  • +1
    pcduino это какой-то оверкилл для такой простой задачи.
  • 0
    хмм: madebymany.com/blog/is-the-toilet-free
    у них иконка лучше :)
    • 0
      Да, видели этот пост пару недель назад. Хорошая идея приходит сразу нескольким:)
  • 0
    Тупиковый путь. Великолепный пример реализации без привязки к реальной жизни.

    Будет работать только первое время в небольшом коллективе.
    Как только люди начнут завязываться на индикатор, то происходит вот что:

    Индикатор гаснет (семафор зеленый), одновременно несколько человек, которые ждали очереди, срываются с места. Таким образом один идет в туалет, а остальные остаются с помытой шеей.
    Разбредаются по местам. И с удвоенной энергией начинают мониторить семафор. Во второй и все последующие разы количество желающих будет увеличиваться.

    Когда нет электронного датчика, естесвенным регулятором является равномерный генератор импульсов на основе датчиков кишечника отдельно взятого индивида.

    Удачи.
    • 0
      Раз уж заговорили о датчиках, то тогда самым выгодным с точки зрения организации процессов будет запуск перистальтики в нужное специально отведенное этому индивиду время.
  • 0
    Я просто оставлю это здесь

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.