Пользователь
0,0
рейтинг
30 января 2015 в 00:21

Разработка → Raspberry и Telegram: предпосылки создания умного дома перевод

Lua*


Один итальянский магазинчик нащупал новые способы использования Телеграма (и ранее WhatsApp'а), установив его на одноплатный миниатюрный компьютер Raspberry Pi. Как выясняется, мессенджер можно использовать для удалённого общения с собственной техникой. Ниже – перевод статей (1, 2) с сайта Instructables.com. Если есть уточнения по переводу, напишите об этом в комментариях.

I. Telegram на Raspberry Pi

Шаг первый: инсталляция

Понадобится: Raspberry Pi B or B+, с последней версией Raspbian, или карта MIcroSD на 8Гб класса 10 с той же предустановленной Raspbian.

Сначала обновите пакеты программ:

sudo apt-get update

sudo apt-get upgrade

Установите библиотеки: readline или libedit, openssl и (если вы хотите использовать конфигурацию) libconfig и liblua. Если вам удобнее без них, проставьте --disable-libconfig и --disable-liblua соответственно.

sudo apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev make

Клонируйте архив GitHub

git clone --recursive https://github.com/vysheng/tg.git && cd tg 

./configure

make

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

Upd: запустите мессенджер и настройте аккаунт, введя номер телефона и(ли) ник. См.

Шаг второй: автоматическая отправка сообщений

Чтобы автоматически отправить сообщение, создайте файл

sudo nano /home/pi/tg.sh

с таким содержимым:

#!/bin/bash
  to=$1
  msg=$2
  tgpath=/home/pi/tg
  cd ${tgpath}
  (echo "msg $to $msg"; echo "safe_quit") | ${tgpath}/bin/telegram-cli -k tg-server.pub -W

Сохраните и закройте его, дав разрешение на действия:

sudo chmod -R 0655 /home/pi/tg.sh

Протестируйте его с помощью

/home/pi/tg.sh Name_lastname "your message"





Чтобы отправить фото, создайте файл

sudo nano /home/pi/tg_photo.sh

и впишите в него

#!/bin/bash
  to=$1
  msg=$2
  tgpath=/home/pi/tg
  cd ${tgpath}
  (echo "send_photo $to $msg"; echo "safe_quit") | ${tgpath}/bin/telegram-cli -k tg-server.pub -W

Сохраните и закройте его, дав разрешения:

sudo chmod -R 0655 /home/pi/tg_photo.sh

и протестируйте с помощью

/home/pi/tg_photo.sh Name_Lastname /folder/photo.png


II. Дистанционное управление Raspberry Pi через Telegram



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

В предыдущем обзоре мы увидели, как его установить, как отправлять текст и медиафайлы. Мы также убедились, что в Raspberry можно настроить автоматическую отправку сообщений через Telegram.

На этот раз мы попросим Raspberry выполнить конкретное действие как функцию полученного сообщения: например, мы могли бы послать слово «photo», чтобы Raspberry прислал нам фотографию дома, или «lamp», чтобы он повернул лампу, или «open», чтобы открыть дверь гаража. Начнём.

Шаг первый: инсталляция

Начинаем на основе описанных выше действий. Чтобы перехватить новое входящее сообщение, мы создаём файл action.lua (я опускаю описание языка Lua со ссылкой на официальный сайт, так как хабраюзеры с ним, очевидно, знакомы. — Прим. пер.):

sudo nano /home/pi/tg/action.lua

со следующим содержимым:

function on_msg_receive (msg)
      if msg.out then
          return
      end
      if (msg.text=='ping') then
         send_msg (msg.from.print_name, 'pong', ok_cb, false)
      end
  end
   
  function on_our_id (id)
  end
   
  function on_secret_chat_created (peer)
  end
   
  function on_user_update (user)
  end
   
  function on_chat_update (user)
  end
   
  function on_get_difference_end ()
  end
   
  function on_binlog_replay_end ()
  end

Сохраните и закройте файл. Теперь, когда входящее сообщение – «ping», Телеграм отвечает сообщением «pong».

Перейдите в tg

cd /home/pi/tg

и напишите:

bin/telegram-cli -k tg-server.pub -W -s action.lua

Попробуйте отправить сообщение. Если всё верно, Телеграм отвечает только на «ping» (не на «PING»), и мы должны увидеть что-то вроде этого:





Окей, давайте попробуем что-то более занятное.
Установите камеру Raspberry (см. этот туториал) и создайте новую папку, куда по умолчанию будут сохраняться фотографии с этой камеры.

sudo mkdir /home/pi/camera

Создайте новый файл «camera.ch»

sudo nano /home/pi/camera/camera.sh

вот с этой начинкой

#!/bin/bash  
   
  raspistill -w 800 -h 600 -o /home/pi/camera/photo.jpg 

Сохраните и закройте его, дав разрешение на действия

sudo chmod -R 0655 /home/pi/camera/camera.sh

Отредактируйте «action.lua»

sudo nano /home/pi/tg/action.lua

и добавьте эти строки в функцию on_msg_receive:

if (msg.text=='photo') then
     os.execute('/home/pi/camera/camera.sh')
     send_photo (msg.from.print_name, '/home/pi/camera/photo.jpg', ok_cb, false)
  end



Шаг второй: тест





bin/telegram-cli -k tg-server.pub -W -s action.lua

Теперь, если вы пошлёте сообщением слово «photo», Raspberry ответит фотографией.

Чтобы задать дополнительные команды, просто измените файл «action.lua», добавив новый блок «if». Например, можно активировать выключатель или запросить статус сигнализации.
Перевод: Emmeshop Electronics
Адда Альд @Adda_Ald
карма
7,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

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

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

  • 0
    Похоже, что любое использование Телеграма сводится к консольному клиенту, а здесь он еще и старой версии.
    • +3
      Расходится от него, я бы сказала.
  • +4
    А откуда берутся идентификаторы для девайсов? Я думал там обязательно реальный телефон использовать
    • +1
      Может, дело в том, что теперь достаточно задать никнейм?
  • +4
    Хм, а почему именно Телеграмм? А не XMPP какой-нибудь?
    • +2
      Прост))) Подозреваю, что из-за secret chat, в котором данные шифруются.
      • +5
        Так XMPP уже много лет умеет шифроваться:-)
    • 0
      Если смотреть с практической точки зрения, то, на сколько мне известно, Telegram потребляет гораздо меньше трафика в отличие от XMPP. Binary vs XML. Посмотрите на протокол MTProto.
      • +1
        Не уверен, что сейчас очень актуальна проблема трафика, тем более, что XMPP неплохо жмет трафик zlib'ом. Я еще в бородатые годы на кнопочном телефоне с поддержкой только EDGE вполне неплохо им пользовался и не замечал проблем с большим объемом гоняемого трафика.
        Но при этом, если я ничего не путаю, телеграм работает через свои сервера, а для жабера можно поднять свой собственный, и сделать всю инфраструктуру автономной, зависящей только от устойчивого коннекта с интернетом.
    • 0
      Потому что в телеграме сообщение или картинка гарантированно отсылаются (будь то кривой 3G или глючный Wifi).
  • 0
    На сколько безопасно "«open», чтобы открыть дверь гаража"?
    • –1
      Можно прикрутить парольчик и слать «open myverystrongpassword hashed with sha256 in base64» :)
  • +1
    Довольно интересное и не сложное решение. Первое что пришло в голову кормление домашнего животного :) если уезжаешь на пару дней, поставить так камеру что бы она смотрела на миску кота. Получаешь фотографии миски, и когда нужно отсылаешь команду FeedTheСat, порция корма насыпается в миску :)
    • +9
      Смотришь на фото — а у тебя там вся кухня раскурочена, кресла обивкой наружу, тапки в моче утонули, соседа заливает! И посылаешь команду KillTheCat…
      • +2
        главное случайно не перепутать команды :)
        • 0
          действительно, а то в этом сценарии можно второй раз кота покормить ненароком
  • +1
    Вовремя опубликовали, я вот думал, как бы запилить автозапуск на машину с помощью Pi… Надо попробовать.
    • 0
      Давно интересно, сколько аккумулятор на машине проживёт с включенным Pi?
      И какой температурный диапазон у Pi?
      • 0
        От 0°C до 70°C :(
      • 0
        Согласен, дурная идея.
  • 0
    Было бы здорово, если телеграм сделает связку с IFTTT. Тогда по какому-то триггеру приходило бы сообщение вам в телеграм.
  • 0
    Можно сделать связку tasker+whatsapp который будет делать то же самое. У меня умный дом сердцем которого выступает нексус7, шлет по whatsapp информацию о событиях, и может выполнять команды полученные по whatsapp
    • 0
      а у whatsapp есть API?
      • 0
        Поддерживаю вопрос!
      • 0
        Есть неофициальный API. Я как-то им пользовался со связкой на Google Voice, потом аккаунт Whatsapp закрыли. Активировал ещё раз.
        github.com/tgalal/yowsup
      • 0
        не знаю, я не настоящий сварщик. У меня работает через плагин WhatsTasker. Чтобы умный дом отсылал через вотсапп фотку с камеры при срабатывании датчика движения, у меня сделать не получилось, но початиться с умным домом можно :)
  • +1
    Телеграм ужасен. Вместо простого json over http (как например в шлак) надо собрать какие то бинарники и потом еще писать на shell/lua.
    • 0
      Мне кажется json over http как то не вяжется с концепцией безопасной передачи данных
      • 0
        И чем же вам ssl/tls не безопасен?
  • 0
    Решил попробовать (как раз есть «подопытная» малина). Линукс только-только осваиваю… «затык» сразу же на первом шаге (при попытке ./configure)
    pi@raspberrypi ~/tg $ ./configure
    checking for gcc... gcc
    checking whether the C compiler works... yes
    checking for C compiler default output file name... a.out
    checking for suffix of executables... 
    checking whether we are cross compiling... no
    checking for suffix of object files... o
    checking whether we are using the GNU C compiler... yes
    checking whether gcc accepts -g... yes
    checking for gcc option to accept ISO C89... none needed
    checking for sqrt in -lm... yes
    checking for library containing clock_gettime... -lrt
    checking for library containing backtrace... none required
    checking for event_base_new in -levent... no
    configure: error: no libevent found
    

    Подскажите, как починить?
    • 0
      sudo apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev make
      • 0
        Оказалось проще: нужно было начинать читать с начала, где написано, что нужна самая актуальная версия Raspbian.

        А вот чтобы «взлетело», пришлось немного пошаманить:

        1. Сразу после первого «make» нужно запустить

        bin/telegram-cli -k tg-server.pub -W

        И «зарегистрировать» свой «телефон» (ввести номер телефона, от «имени которого» будут осуществляться отправки сообщений). На этот номер телефона придет код подтверждения (в смс-сообщении), который нужно будет ввести в ответ на запрос программы.

        2. После этого следует создать контакт, с которым будет общаться «малина» (требуется ввести номер телефона, FistName, SecondName).

        Дальше уже можно следовать по инструкции «Шаг два»…

        Ну и от себя добавлю: у меня нет «оригинальной» камеры — использовал USB, соответственно, установил для нее все необходимое и подправил код в /home/pi/camera/camera.sh под себя

        Если кто-нибудь заинтересуется — расскажу.
        • 0
          У меня вот проблема с общением через консольный клиент Телеграма, сообщения не приходят, если делать как описано в статье.
          • 0
            запрос телефона был?
            • 0
              Это все нормально работает, как и консольный клиент, если его просто запускать, а не передавать сообщение аргументом.
              • 0
                пользователь, которому отправляем соообщение аргументом — есть в «записной книжке»?
                • 0
                  Конечно, при этом в логах только:
                  > msg Lev_Aminov 11
                  > safe_quit
                  > All done. Exit
                  halt

                  Но на деле ничего не приходило. Если написать сообщение из самого консольного клиента, то сообщения доходят.
                  • 0
                    а… понял:
                    Это ты тестируешь /home/pi/tg.sh Name_lastname «your message» — верно?

                    Так вот оно из командной строки у меня тоже не работает (почему-то), а вот уже из скрипта lua — отрабатывает замечательно.
                    • 0
                      Все верно говоришь, – тестирую из консоли. Попробую тогда вечерком из луа или питон-скрипта.

                      Спасибо за информацию!
                      • +1
                        У меня тоже не работало, пришлось добавить таймаут, чтобы telegram успевал:
                        (sleep 3; echo «msg $to $msg»; echo «safe_quit»)
                        • 0
                          А целиком можете привести скрипт? Что-то я не могу понять, как установить слип в представленном варианте.
                          • 0
                            Речь про bash.

                            #!/bin/bash
                            to=$1
                            msg=$2
                            tgpath=/home/pi/tg
                            (sleep 3; echo «msg $to $msg»; echo «safe_quit») | ${tgpath}/bin/telegram-cli -k tg-server.pub -W
                            • 0
                              Работает, спасибо) Жесть, конечно, но как вариант можно использовать и так.
                            • 0
                              Таки разобрался, как запускать это тело в режиме демона, теперь сообщения отправляю через телнет.
                              • 0
                                Поделитесь рецептом укрощения демона?
                        • 0
                          А, это луа, тогда вопрос отпадает.
  • +1
    Пропущен очень важный шаг, без которого все это не будет работать. После получения и сборки сорцов с гитхаба, необходимо выпонить запуск и настройку (там где просит ввести номер телефона)
    • 0
      Тоже несколько минут назад это описал. Подскажите, как сделать так, чтобы:

      bin/telegram-cli -k tg-server.pub -W -s action.lua


      запускалось автоматом при старте RPi?
      • +1
        Файл /etc/rc.local
        Туда пропишите полный path + bin/telegram-cli -k tg-server.pub -W -s action.lua
        Так как код запускается до начала X-сессии консольного окна не будет, для отладки и логгирования можно прописать в конце >> /path/log.txt 2>&1
        • 0
          В файл добавил вызов (пришлось еще и пути к файлу с ключем и скрипту дописать).
          Просто запуск /etc/rc.local — работает.

          Но вот при reboot — ничего не происходит… Куда копать?
          • 0
            Сам с собою я веду беседу:

            Повторил тот же туториал на Itead A20 — получилось, но чуток с путями пришлось «поплясать». Там же обнаружил, в чем проблема: Оказалось, что telegram при старте из rc.local почему-то хотел заново регистрироваться. В случае с A20 все получилось (там человеческая консоль через UART — т.е. я банально подтвердил регистрацию и там все заработало).

            Теперь то, что касается «малины». Тоже подключился к UART — процесс загрузки виден, но сообщений сильно меньше и нормальная «консоль» не получается (команды отправлять нельзя… или я что-то не так делаю). В rc.local все правильно — включил вывод сообщений в лог.файл… и тоже вижу, что telegram стартует и тоже вижу приглашение ввести номер телефона (для «подтверждения регистрации»)… но консоли нет.

            Как быть? Можно ли как-то telegram-у указать, что конфигурация уже нормальная и надо нормально стартовать?.. Пускать руками скрипт, имхо, неправльно :(

            Заодно еще никак не могу придумать, чтобы при старте автоматом конкретному пользователю отправлялось сообщение (типа «RPi ready») — может, поможете?
            • 0
              Судя по всему, не очень правильно запускать телеграм через rc.local — есть возможность сделать его демоном.

              Надо будет попробовать
              • 0
                Мануал по установке демона — сильно короткий. У меня «не взлетело». Если кто-то найдет решение — поделитесь, пожалуйста.
            • 0
              Прошу прощения, только сейчас вернулся.
              Проблема всё ещё актуальна? Если да, то.

              За демон не могу ничего сказать. Я вообще с телеграм не работаю, просто по работе знаю как автозапускать.

              За rc.local — консоли у вас из него никогда не будет, так как запускается код в стиле ниндзя, до запуска оконного менеджера.

              1. В первый запуск, судя по всему, он просит подтверждения регистрации, значит нужно ручками прописать | «продолжение банкета» в rc.local
              — продолжение банкета — это всё что Вы пишете в консоли в первый запуск телеграм. После этого софт пропишет свой конфиг под рутом и банкета требовать перестанет (по идее), и банкет можно будет убрать.

              2. Код исполняется из-под рута (нехорошо, я знаю). Если у вас есть конфиги под юзером, то телеграм из под рута их не читает, так как а) ищет в своей папке и б) не имеет прав.

              (Продублирую вам так же в пм)
    • 0
      Спасибо, поправила (со ссылкой на описание ритуала avstepanov).
  • +1
    Я у себя сделал не msg $to $text, а send_text $to $file_name — так становится возможным посылать многострочные сообщения. Я вот например сделал себе ежедневный контроль баланса сотовых всей семьи:
  • 0
    Пытаюсь получить на телефон сообщение:

    image

    Ничего не происходит. Из различий вижу только версию telegram_cli, у меня 1.2.0, у Вас 1.1.1.
    На «пинг» в lua_скрипте тоже не реагирует.
    Что я упускаю?
    • 0
      Используете один номер на телефоне и на малине?
      • 0
        Разные.
        Сперва не отправлялись сообщения, пропустил добавление номера в контакты.
        Сейчас разбираюсь почему не отрабатываются bash-скрипты.
        • 0
          Разобрался. добавил таймаут:
          (sleep 3; echo «msg $to $msg»; echo «safe_quit»)

          сейчас разбираюсь с actions.lua
  • 0
    По хорошему бы кстати надо ok_cb коллбэк реализовать, а то оно каждый раз падает немного при его вызове.

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