Мы любим пить чай и поэтому у нас есть большой чайник, кто-то делает Чайник, мы все пьем чай и все довольны.
Ну, почти проблема в том, как узнать, что в чайнике есть чай, сколько чашек чая осталось в чайнике или сколько лет чаю?
Чтобы решить эту важную проблему, мы сделали то, что сделала бы любая команда инженеров, и подключили наш чайник к Интернету.
Это просто, действительно все, что вам нужно, это
1x USB почтовые весы
1x Малиновый Пи
1x термометр
Мы используем весы, чтобы измерить вес чайника, термометр, чтобы сообщить, теплый ли чай, и малину, которая жалеет все это вместе с каким-то питоном.
Состояние Чайника представлено в виде конечного автомата, который выглядит примерно так:
Это определено здесь — https://github.com/gbrady92/Teabot/blob/master/teabot/teapot_state.py
- No Teapot — это начальное состояние, в которое будет сбрасываться конечный автомат в случае сбоя приложения.
Затем мы объединяем текущее состояние с показаниями весов и датчика температуры, чтобы решить, в какое состояние перейти.
- Мы взвесили чайник с водой, чтобы получить порог для нового чайника.
- Мы знаем, сколько весит чайник без воды, чтобы определить, когда он пуст.
- Все, что находится между этими двумя измерениями, означает, что у нас есть немного чая в чайнике, но это не ново.
К сожалению, датчик температуры работал не очень хорошо, поэтому наше обнаружение холодного чайника довольно шаткое.
Вся эта логика реализована здесь — https://github.com/gbrady92/Teabot/blob/master/teabot/status_helpers.py#L152
Таким образом, с возможностью определить, в каком состоянии находится чайник, нам теперь просто нужно было сообщить всем, когда появился новый чайник, и позволить им узнать, сколько чашек осталось.
Мы хотели иметь веб-интерфейс для получения статистики и взаимодействия с Teabot, поэтому решили сделать это отдельно от Teabot на стороне сервера.
Используем обратные вызовы для передачи по POST информации о новом состоянии чайника на сервер
Это позволяет нам сохранять историю каждого состояния, в котором находился чайник, для дальнейшей забавной аналитики.
Помимо отправки нового состояния чайника на сервер, если мы вошли в состояние FULL_TEAPOT, мы запускаем таймер заваривания.
ISO 3103 — https://en.wikipedia.org/wiki/ISO_3103 Стандарт заваривания чая рекомендует 6 минут, но мы обнаружили, что это слишком долго, поэтому мы ждем только 3 минуты, пока он заварится.
И как только таймер заваривания истекает, Teabot отправляет сообщение на сервер, предлагая ему опубликовать сообщение в нашем канале Slack, объявляющее, что чайник готов к употреблению.
Наконец, мы внедрили веб-хук Slack, чтобы люди могли использовать команду /teabot для POST-сообщения на сервер с вопросом, сколько чашек чая осталось в чайнике, и мы используем последний элемент истории, который был отправлен нам, чтобы ответить на этот вопрос.
Веб-сервер представляет собой простое приложение Flask, которое находится здесь — https://github.com/AaronKalair/teabot_endpoints/blob/master/teabot_endpoints/endpoints.py.
(Забавно, что есть конечная точка, которая возвращает код состояния 418 Я чайник — https://github.com/AaronKalair/teabot_endpoints/blob/master/teabot_endpoints/endpoints.py#L134 )
Это была первая версия Teabot, которая была выпущена, и с набором весов, показывающим, насколько тяжелым был чайник, на доске рядом с Teabot росла таблица лидеров с самым тяжелым чайником, который был сделан.
Поэтому мы решили превратить это в полноценную функцию Teabot, и родился teabot_stats — https://github.com/AaronKalair/teabot_stats.
Статистика Teabot — это приложение React/Redux, которое позволяет вам получить чайник, если вы его сделали.
И использует эту информацию для создания таблицы лидеров или Tea-derboard, как теперь известно — https://github.com/AaronKalair/teabot_stats/pull/21/files.
Пусть все увидят ваши навыки заваривания чая.
Он также предоставляет удобный обзор состояния чайника и отслеживает общее количество чайников, которые мы сделали, а также общий вес приготовленного чая.
Примерно через год мы готовили 1 мг чая и праздновали торт.
Итак, у нас есть чайник, подключенный к Интернету, чтобы отслеживать наш чайник и предоставлять статистику и таблицу лидеров.
Этот пост в блоге основан на трехминутном молниеносном выступлении, которое я сделал на PyconUK.
Подпишитесь на меня в Твиттере @AaronKalair