Мне телеграмма



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

    Но проблема не в этом. А в том, что уведомления о различных событиях я выбрал получать по электронной почте, потому что так было проще всего в самом начале. Теперь же я замучился периодически выгребать кучу статусов из почтового ящика (это необязательно, но для порядка надо), и подумал, что раз есть такой прекрасный Telegram, то почему бы не воспользоваться его талантами в своих целях.

    Далее приводятся мои экзистенциальные переживания на тему скрещивания PushingBox, IFTTT и Telegram синей изолентой для получения малобюджетной (и столь же малоумной) системы уведомлений.

    TL/DR
    Дорогие друзья! Нет, у меня нет домашнего сервера. И нет, я не планирую ставить сервер для обслуживания системы уведомлений Arduino Uno. Только если совсем прижмет.

    Для начала пара слов о предыдущей конфигурации. В далекие времена, в одном из рукавов далекой-далекой галактики бесплатные почтовые сервера разрешали отправлять почту через SMTP по HTTP. То есть, с этой задачей достаточно легко справлялась плата Arduino Uno в дуэте с Ethernet-шилдом.

    Потом все дружно перешли на HTTPS/SSL (надеюсь, я правильно излагаю) и пришлось изобретать что-то другое, так как в HTTPS Arduino Uno уже не умеет. Выходом из положения стал сервис уведомлений PushingBox, который получает от Arduino Uno обычный HTTP-запрос, а его параметры использует для отправки письма-уведомления (отправлять письма PushingBox умеет сам).

    К слову, эта штука мне понравилась даже больше — работает гораздо быстрее общения с POP/SMTP-сервером.

    Что еще лучше, PushingBox умеет выполнять и HTTPS-запросы. И, следовательно, дружит с современными веб-сервисами. Собственно, я уже размышлял на тему, что, наверное, надо сделать своего Telegram-бота и попробовать подружить его с PushingBox, как вдруг увидел, что Telegram уже успешно работает с сервисом автоматизации IFTTT.

    И тут я не устоял. Дело в том, что IFTTT настолько же для меня интересен, насколько и бесполезен. Т.е. 99.9% его возможностей мне просто негде применять: в соцсетях неактивен, смартлампочки не покупаю, скучная, словом, личность.

    Так что решил, конечно, дать IFTTT шанс.

    Для произвольных взаимодействий с внешним миром у IFTTT есть сервис Maker, который умеет отправлять и принимать HTTP-запросы. Для решаемой задачи, разумеется, более актуально второе.

    Далее, для работы с Telegram у IFTTT есть вообще специализированный сервис, который позволяет отправлять в чат или группу сообщения, картинки, музыку. Самое главное для меня — возможность отправки сообщения в приватный чат. Мне ведь не нужно, чтобы статусы читал совсем уж кто угодно.

    Остается только все связать:

    Arduino → PushingBox → IFTTT → Telegram

    Отправка запроса с уведомлением в PushingBox лично у меня выглядит примерно так (статусов, конечно, больше и, конечно, добавлена инициализация Ethernet):

    #include <Ethernet.h>
    #include <avr/pgmspace.h> // для PROGMEM
    
    char servermail[] = "api.pushingbox.com"; // PushingBox
    
    // строки состояния в PROGMEM
    const char statusString_0[] PROGMEM = "Room_softlight_ON";
    const char statusString_1[] PROGMEM = "Kitchen_softlight_ON";
    const char statusString_2[] PROGMEM = "Humidifier_ON";
    
    // табличка указателей на строки состояния
    PROGMEM const char * const statusString[] =
    {
      statusString_0,
      statusString_1,
      statusString_2,
    };
    
    char statusStringBuf[40];    // буфер для чтения строк состояния
    
    void sendMail(byte statusStringN) {
    
      mail.stop();
      if (mail.connect(servermail, 80)) {
        strcpy_P(statusStringBuf, (char*)pgm_read_word(&(statusString[statusStringN])));
        mail.print("GET /pushingbox?devid=КЛЮЧ_PUSHINGBOX&status=");
        mail.print(statusStringBuf);
        mail.println(" HTTP/1.1");
        mail.print("Host: ");
        mail.println(servermail);
        mail.println("User-Agent: Arduino");
        mail.println();
      }
      delay(1000);
      mail.stop();
    }

    Как легко видеть, уведомление передается в параметре &status, которым затем следует манипулировать в пределах PushingBox. Для этого сначала щелкаем My Services и добавляем сервис Custom URL с необходимыми параметрами (они указаны в агитке IFTTT) и запоминающимся именем.

    Раз:



    Два:



    Три:



    Потом нужно добавить сценарий, который будет использовать данный сервис. И вот здесь как раз пригодится содержание параметра &status, которое в PushingBox присваивается почти одноименной переменной $status$. Вообще, любой параметр, передаваемый в PushingBox трансформируется в одноименную переменную, окаймленную значками нашего бакса.



    Итак, щелчок по My Scenarios, где после ввода имени нужно добавить действие. Для действия, связанного с IFTTT понадобится знать ключ авторизации, который отображается на страничке настроек сервиса Maker в IFTTT (нужно войти и/или зарегистрироваться в IFTTT, чтобы увидеть):



    Так вот, после нажатия Add an Action, следует выбрать сервис типа Custom URL созданный в PushingBox ранее, а в параметре Data указать остаток строки, который должен передаваться IFTTT для срабатывания условия.



    Например, согласно инструкции IFTTT, запрос должен выглядеть так:

    https://maker.ifttt.com/trigger/{event}/with/key/ключ_авторизации

    Из этого уже (при добавлении сервиса) в PushingBox есть maker.ifttt.com/trigger, поэтому остается добавить событие {event} и завершающую часть с ключом авторизации.

    Так что в упомянутое выше поле Data смело прописывается следующая комбинация символов:

    $status$/with/key/ключ_авторизации

    Повторюсь еще раз, в данном случае $status$ не что-то незыблемое. Ваша переменная может называться как угодно. Но в рамках данного примера я буду придерживаться этой терминологии.

    Итак, PushingBox и IFTTT связаны. Осталось привязаться к Telegram, и тут начинается тягомотина. Дело в том, что IFTTT (в отличие от PushingBox) реагирует на конкретные условия и выполняет конкретные действия. Ему нельзя сказать передавать все входящие запросы, подходящие под условия, сразу в Telegram.

    Нет, нужно на каждое условие добавлять правило обработки. Поэтому описанную ниже процедуру придется повторить по количеству нужных уведомлений.

    Так что переходим в IFTTT:

    1) Добавляем новый апплет с сервисом Maker — Receive a web request







    2) В поле Event name указываем параметр, который передается через переменную $status$ из PushingBox. В моем случае, это, к примеру, может быть Humidifier_ON (или Intercom_unarmed). С точностью до буквы и регистра.





    3) Нажимаем Create trigger и выбираем сервис Telegram для действия по срабатыванию условия. При первом использовании сервиса нужно будет авторизовать бота IFTTT, но это не проблема.

    Авторизация:



    Выбор сервиса:



    4) В качестве действия — Send message. Здесь уже будут заданы параметры по умолчанию — адрес (чат или группа) и предварительно отформатированное сообщение. Если сообщение вас устраивает — можете пользоваться им или собрать из модификаторов что-то свое. Я же вообще заменил весь текст на более понятное объяснение произошедшего.





    Т.е. вместо, скажем,

    
    What: {{EventName}}<br>
    When: {{OccurredAt}}<br>
    Extra Data: {{Value1}}, {{Value2}}, {{Value3}},
    

    В случае с Humidifier_ON написал «Увлажнитель включен» (а в случае с домофоном, как на скриншоте — «Домофон: разблокирован»). Именно это сообщение я получу от бота IFTTT при срабатывании указанного условия.



    Готово:



    И все эти мучения только для того, чтобы в конце концов увидеть:



    Нет, я не спорю. Можно было бы заменить уже Arduino на что-то более продвинутое. Или прикрутить туда ESP8266, для которого уже есть библиотека TelegramBot, которая позволяет отправлять сообщения в Telegram напрямую, без посредников вроде PushingBox или IFTTT.

    Возможно, я именно это и сделаю, если PushingBox и IFTTT исчезнут, как AltaVista и Yahoo!.. Но пока что моя позиция незыблема: мне проще написать несколько строк кода или сконфигурировать софт, чем брать в руки паяльник.

    Простите.

    Но я верю, что вы лучше меня, и наверняка сделаете что-то более впечатляющее. А пока что, если у вас есть еще мысли и комментарии, то я и читатели будем вам очень признательны за все.
    Метки:
    Поделиться публикацией
    Похожие публикации
    Комментарии 20
    • 0
      Для произвольных взаимодействий с внешним миром у IFTTT есть сервис Maker, который умеет отправлять и принимать HTTP-запросы. Для решаемой задачи, разумеется, более актуально второе.

      Arduino -> PushingBox -> IFTTT -> Telegram.

      Не очень понял зачем тогда в этой цепочке вы оставили PushingBox?

      И ещё, по поводу картинок в статье… Очень много лишнего визуального мусора. Вы бы чтоли часть картинок убрали, некоторые никакой особой смысловой нагрузки не несут. Ну и, например, заголовки окон, с вкладками и иконками закладок можно было бы обрезать.
      • 0
        Думаю, я «плаваю» в терминологии. Дело в том, что IFTTT принимает HTTP-запросы только по протоколу https://, а Arduino так не умеет. Поэтому нужен посредник в виде PushingBox.

        По поводу картинок понял, возьму себя в руки, отрежу лишнее. Что до некоторых, не несущих смысловой нагрузки, то это мое личное: иногда понимаю, что пишу так убого, что лучше бы была картинка, чтобы понять, о чем речь. Это такой промежуточный этап между текстом и пресловутым «видеообзором».
      • +1
        А не проще свой сервер + telegram bot?
        • 0
          Из статьи...
          TL/DR
          Дорогие друзья! Нет, у меня нет домашнего сервера. И нет, я не планирую ставить сервер для обслуживания системы уведомлений Arduino Uno. Только если совсем прижмет.
          • 0
            Вот за это спасибо! И плюс в карму.
        • 0
          Можно сократить цепочку до ESP8266->Telegram, не очень понимаю зачем вообще нужно использовать ардуину в проектах где требуется сеть.
          • 0
            В 2013 году ESP8266 еще не было. А это вариант для модернизации так сказать легаси-систем без особых затрат — как материальных, так и моральных
            • 0
              Он как раз в 2013 и появился. И кстати а что сложного или дорогово в есп? Он стоит дешевле чем уна, и на нем можно писать используя фраймворк ардуино.
              • 0
                Хорошо, значит, по поводу физического выпуска я ошибся. Приношу извинения. Но разве в 2013 году сообщество ESP8266 уже было сравнимо с Arduino и уже был выпущена поддержка чипа в этой среде? Если нет, то вот и ответ — я не один в поле воин, и не моя профессия осваивать новую электронику.

                И, собственно, в марте 2013 года мой контроллер уже работал. И если бы я делал все сначала, то выбрал бы все то же самое — для новичка это самый простой и очевидный вариант.

                Что касается ESP8266, то лежит у меня несколько купленных по случаю плат. То ли ESP-07, то ли ESP-12, Не знаю. Это, кстати, первая трудность — сам черт сломит ногу в вариациях, которые клепают все, кому не лень.

                Несмотря на то что к плате прилагался переходник с необходимым минимумом (какой-то резистор и перемычка, кажется), по правилам следовало добавить еще резисторов и конденсаторов для более стабильной работы. Я решил сделать все по правилам и замучился даже с минимальной обвязкой.

                Плюс пришлось дополнительно купить стабилизатор на 3.3В — в моих платах его не оказалось.

                А Arduino взял и включил. Да, я знаю, что если покопаться, то сейчас (ключевое слово — сейчас) можно найти превосходную отладочную плату с ESP8266, со всем уже блекджеком, чтобы как и Arduino, включил и пользуйся. Но я наступил на вот такие грабли и мне не понравилось.

                Кроме того, моя периферия рассчитана на уровни 5В. И, насколько понимаю, до сих пор ни у кого нет особой уверенности, что ESP8266 тоже рассчитан на эти уровни. Есть ли на современны отладочных платах схемы согласования — я не знаю.

                Наконец, не особо гонясь за оптимизацией, я успел занять практически все доступные IO-пины на Arduino Uno. А у ESP8266 их вообще раз два и обчелся — меня это не устраивает. То есть, максимум, на что мне сгодился бы сейчас этот чип — на замену сетевого Ethernet-шилда. Да и то я не уверен, что это хорошая альтернатива.
          • 0
            Можно обойтись и без IFTTT, заюзав бота e2tlgr
            • 0
              А дайте, пожалуйста, ссылку посмотреть. Я тут загуглил — и полный ноль.
              • +1
                Так это просто бот https://etlgr.com
                • 0
                  Просто бот называется без двойки, т.е. просто etlgr. Поэтому и не получалось нагуглить.
                • +1
                  Попробуйте @bullhorn_bot. Я только что проверил, он принимает запросы по http.
                  • 0
                    Спасибо, записал!
              • +1
                Я для уведомлений заббикса использую Crier Bot в телеграмме.
                синтаксис простой:
                Бот присылает все, что было в специальном HTTP GET запросе вида: http://crierbot.appspot.com//send?message= Где TOKEN — токен выданный ботом при его добавлении в список контактов Telegram, а MESSAGE — собственно сообщение, которые хотите передать.


                может подойдет такой способ, выглядит проще.
                ман для заббикса тут
                • 0
                  Спасибо, и это тоже записал. Повторюсь, вот за это я и люблю подобные ресурсы — в комментариях узнаешь гораздо больше полезного.
                • +1
                  Вобщем получилось используя почту отправлять в телеграм сообщения с atmega. Т.е.
                  В далекие времена, в одном из рукавов далекой-далекой галактики бесплатные почтовые сервера разрешали отправлять почту через SMTP по HTTP.
                  имено так, если я что-то не путаю. Конечно выглядит само сообщение не так красиво как здесь в качестве примера продемонстрированно, но всё-таки…
                  Так
                  image
                  http://www.picshare.ru/view/7847141/
                  • 0
                    Спасибо, записал на будущее!
                    • 0
                      Да, в принципе в картинке видно, а в тексте я не указал, но если кто упустил из виду, получилось это сделать в настоящее время. Рамблер помог )

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