ќбсудим вашу задачу в Telegram - чате?

ћерион Ќетворкс

8 минут чтени€

»так, вы полностью укомплектовали и настроили ваш умный дом. » конечно, вам нравитс€ периодически показывать выпендриватьс€ перед друзь€м, как круто включать лампы, проигрывать видео и фильмы подсказкой голосовому помощнику, приготовить кофе или регулировать термостат коснувшись приложени€ на экране смартфона. ѕоздравл€ем!

Ќо если вы любитель автоматизации (как и мы), который редко останавливаетс€ на достигнутом, то возможно будете разочарованы количеством необходимых программ, которые нужно загрузить, интерфейсов, которые вам придЄтс€ усваивать, чтобы управл€ть гаджетами. —корее всего, будут отдельные приложени€ дл€ управлени€ освещением, медиацентром, термостатом и приложение Google Home, который изо всех сил (но безнадежно) стараетс€ собрать всЄ это воедино.

Ѕольша€ веро€тность того, что некоторые приложени€ будут несовместимы с другими и, веро€тно, многие из них не будут работать, если они не в одной сети с гаджетом. ѕредставьте если бы мы смогли управл€ть всем этим из одного интерфейса, на засор€€ телефон или компьютер сотн€ми приложений, через интерфейс, который доступен как на смартфонах, так и на компьютерах, а также с помощью сторонних сценариев вне зависимости от того, находимс€ ли мы в одной сети с умным домом или нет. »нтерфейс, который был бы легким и простым в использовании?

ј что если мы будем делать это через мессенджер или чат? ¬ конце концов, разве не легче было бы контролировать наш дом, гаджеты и облачные сервисы через тот же интерфейс, который мы используем дл€ отправки фотографий котиков нашим друзь€м, и через бот, полностью адаптированный к нашим потребност€м?

¬ этой статье € покажу вам, как настроить команды и процедуры в дополнение к существующим сетапам умного дома. ¬ данном руководстве мы используем два основных инструмента:

Telegram: существует много мессенджеров и платформ, но до сих пор попытки многих из них (Facebook Messenger, Whatsapp, Hangouts и т.д.) в предоставлении пригодного дл€ разработчиков API, м€гко говор€, были тщетны. ”шли те дни, когда все использовали XMPP или IRC в качестве своего мессенджер. —егодн€шний мир мессенджеров очень разнообразен.

 роме того, поскольку в интересах многих крупных игроков создавать изолированные »“ экосистемы, наиболее часто используемые решени€ не поставл€ютс€ с официально поддерживаемыми API/интерфейсами разработчиков. ћало того: некоторые из них активно отговаривает пользователей от использовани€ чего-либо, кроме официального приложени€, дл€ взаимодействи€ с платформой (почитайте, как Whatsapp может забанить вас).

¬ этом чрезвычайно разнообразном мире, состо€щем из нескольких несв€занных островов, Telegram представл€ет собой радостное исключение: их официальный bot API хорошо задокументирован и поддерживаетс€, и дл€ тех, кто знает немного программировани€, очень легок в интеграции.

Platypush: Platypush поставл€етс€ с плагином дл€ Telegram и бэкэндом. “ак что давайте начнем и создадим первый бот дл€ автоматизации управлени€ домом!


—оздание Telegram-бота

  • Ќачните беседу с Botfather.
  • Ќаберите /start, а затем /newbot дл€ создани€ нового бота. «адайте боту ник и им€.
  • ¬ы получите ссылку, чтобы начать беседу с вашим ботом и уникальный API-ключ. —охраните его где-нибудь, так как он нам понадобитс€ дл€ конфигурации плагина platypush.
—оздаем Telegram бота

 онфигураци€ бота в platypush

1. ”становите platypush с основными расширени€ и интеграцией с Telegram:

pip install 'platypush[http,db,telegram]'
apt-get install redis-server
[sudo] systemctl start redis
[sudo] systemctl enable redis

2. »зучите platypush хот€ бы немного, если еще не сделали этого. ќпределите несколько вещей, которыми вы хотите управл€ть/автоматизировать - источники света, музыку, датчики, базу данных, роботы - и установите/настройте соответствующие расширени€.

¬ этой статье мы рассмотрим, как настроить наш новый бот дл€ управлени€ освещением Philips Hue, воспроизведением музыки и потоковой передачей PiCamera.

3. ƒобавьте настройки Telegram в файл ~/.config/platypush/config.yaml:

chat.telegram:
 api_token: <your bot token>
backend.chat.telegram:
 enabled: true

Ѕэкэнд-система позвол€ет получать событи€ (например, новые сообщени€, вложени€, запросы и т.д.) и создавать на них пользовательские "хуки". ѕлагин позвол€ет писать вам чаты, программно отправл€ть сообщени€ и вложени€, администрировать каналы и т.д.

ƒопустим, мы хотим, чтобы бот реализовал следующие команды:

/start

ѕриветствие пользовател€

/help

ѕоказать доступные команды

/lights_on

¬ключить свет

/lights_off

¬ыключить свет

/music_play

¬ключить музыку

/music_pause

ѕриостановить музыку

/music_next

ѕерейти на следующую песню

/music_prev

ѕерейти на предыдущую песню

/start_streaming

Ќачать удаленное вещание PiCamera

/stop_streaming

ќстановить удалЄнное вещание PiCamera

¬сЄ что мы должны сделать это создать действие в конфигурационном файле platypush config.yaml. ¬ этом контексте вы должны:

”становить и настроить плагины Philips Hue, mopidy и PiCamera:

pip install 'platypush[hue,mpd,picamera]'
# Hue lights configuration
light.hue:
 # Hue bridge IP address
 bridge: 192.168.1.10

 # Default groups to control
 groups:
 - Living Room

# MPD/Mopidy configuration
music.mpd:
 host: localhost
 port: 6600

# PiCamera configuration
camera.pi:
 vflip: False
 hflip: False

„тобы не засор€ть файл config.yaml, создайте новый файл с названием ~/.config/platypush/include/bot.yaml:

# /start command handler
event.hook.OnTelegramStartCmd:
 if:
 type: platypush.message.event.chat.telegram.CommandMessageEvent
 command: start
 then:
 - action: chat.telegram.send_message
 args:
 chat_id: ${chat_id}
 text: "Welcome! Type /help to see the available commands"

# /help command handler
event.hook.OnTelegramHelpCmd:
 if:
 type: platypush.message.event.chat.telegram.CommandMessageEvent
 command: help
 then:
 - action: chat.telegram.send_message
 args:
 chat_id: ${chat_id}
 text: "Available commands:\n

 - /lights_on\n
 - /lights_off\n
 - /music_play [resource]\n
 - /music_pause\n
 - /music_prev\n
 - /music_next\n
 - /start_streaming\n
 - /stop_streaming\n
 "

# /lights_on command handler
event.hook.OnTelegramLightsOnCmd:
 if:
 type: platypush.message.event.chat.telegram.CommandMessageEvent
 command: lights_on
 then:
 - action: light.hue.on
 - action: chat.telegram.send_message
 args:
 chat_id: ${chat_id}
 text: "Lights turned on"

# /lights_off command handler
event.hook.OnTelegramLightsOffCmd:
 if:
 type: platypush.message.event.chat.telegram.CommandMessageEvent
 command: lights_off
 then:
 - action: light.hue.off
 - action: chat.telegram.send_message
 args:
 chat_id: ${chat_id}
 text: "Lights turned off"

# /music_play command handler
event.hook.OnTelegramMusicPlayCmd:
 if:
 type: platypush.message.event.chat.telegram.CommandMessageEvent
 command: music_play
 then:
 - if ${cmdargs}:
 - action: music.mpd.play
 args:
 resource: cmdargs[0]
 - else:
 - action: music.mpd.play

 - action: chat.telegram.send_message
 args:
 chat_id: ${chat_id}
 text: "Music playing"

# /music_pause command handler
event.hook.OnTelegramMusicPauseCmd:
 if:
 type: platypush.message.event.chat.telegram.CommandMessageEvent
 command: music_pause
 then:
 - action: music.mpd.pause
 - action: chat.telegram.send_message
 args:
 chat_id: ${chat_id}
 text: "Music paused"

# /music_prev command handler
event.hook.OnTelegramMusicPrevCmd:
 if:
 type: platypush.message.event.chat.telegram.CommandMessageEvent
 command: music_prev
 then:
 - action: music.mpd.previous
 - action: chat.telegram.send_message
 args:
 chat_id: ${chat_id}
 text: "Playing previous track"

# /music_next command handler
event.hook.OnTelegramMusicNextCmd:
 if:
 type: platypush.message.event.chat.telegram.CommandMessageEvent
 command: music_next
 then:
 - action: music.mpd.next
 - action: chat.telegram.send_message
 args:
 chat_id: ${chat_id}
 text: "Playing next track"

# /start_streaming command handler
event.hook.OnTelegramCameraStartStreamingCmd:
 if:
 type: platypush.message.event.chat.telegram.CommandMessageEvent
 command: start_streaming
 then:
 - action: camera.pi.start_streaming
 args:
 listen_port: 2222

 - action: chat.telegram.send_message
 args:
 chat_id: ${chat_id}
 text: "PiCamera streaming started. Check it out with vlc tcp/h264://hostname:2222"


# /stop_streaming command handler
event.hook.OnTelegramCameraStopStreamingCmd:
 if:
 type: platypush.message.event.chat.telegram.CommandMessageEvent
 command: stop_streaming
 then:
 - action: camera.pi.stop_streaming
 - action: chat.telegram.send_message
 args:
 chat_id: ${chat_id}
 text: "PiCamera streaming stopped"

ѕодключите файл конфигурации бота в config.yaml:

include:
-include/bot.yaml

«апустите platypush:

# Manual start
platypush

# Service start
systemctl start platypush.service

—оздайте беседу в вашим ботом перейд€ по ссылке, выданной BotFather и начните говорить ему, что делать:

—оздайте беседу в вашим ботом

—ейчас бот доступен любому мы этого €вно не хотим. ѕредставьте, что кто-то включит на полную громкость System Of A Down- Jet Pilot вам ночью. “ак себе пробуждение. ћожно настроить бэкэнд Telegram так, чтобы он принимал сообщени€ только из определенного списка идентификаторов чатов (в Telegram chat_id используетс€ как дл€ частных пользователей, так и дл€ групп).

ќтправьте сообщение боту и откройте журналы platypush или проверьте его стандартные выходные данные. Ќа экране по€в€тс€ следующие сообщени€:

2020-01-03 19:09:32,701| INFO|platypush|Received event: {"type": "event", "target": "turing", "origin": "turing", "id": "***", "args": {"type": "platypush.message.event.chat.telegram.CommandMessageEvent", "chat_id": your_chat_id, "message": {"text": "/help", ...}, "user": {"user_id": your_user_id, "username": "****", "is_bot": false, "link": "https://t.me/you", "language_code": "en", "first_name": "***", "last_name": "***"}, "command": "help", "cmdargs": []}}

—копируйте chat_id своего пользовател€ и вставьте в бак-энд файл:

backend.chat.telegram:
 authorized_chat_ids:
 - your_user_id

“еперь бот ответит ошибкой, если вы попытаетесь отправить сообщение от неавторизованного пользовател€.

¬ы также можете пригласить своего бота в групповой чат и позволить вашим друзь€м или членам семьи регулировать свет в вашем доме, если вы захотите!


„то дальше?

¬ этой статье мы изучили только одну специфическую особенность интеграции Telegram - способность бота реагировать на событи€ в команде, запускать действи€ и отвечать текстовыми сообщени€ми.

 ак видно из списка поддерживаемых событий Telegram, можно сделать больше, например:

  • —оздавать обработчики, когда кто-то делитс€ контактной информацией - когда-нибудь думали разрешить боту автоматически хранить новые контакты, отправленные вам вашими друзь€ми в чате?
  • —оздавайте обработчики при совместном использовании документов, видео или изображени€ - например, автоматически загружайте все файлы мультимедиа, отправленные в чат, на жесткий диск или удаленную папку Dropbox.
  • ¬ыполн€ть действи€ с текстовыми сообщени€ми вместо команд - можно использовать TextNewsEvent, например, если вы предпочитаете вводить "включить свет" вместо "/lights_on."
  • —делайте снимок на камеру наблюдени€ и отправьте ее себе командой send_photo. ћожно также развернуть несколько ботов, например, дл€ каждого устройства, чтобы можно было запускать действи€ на конкретном устройстве из св€занного чата или вместо этого использовать один бот в качестве точки входа и доставл€ть сообщени€ другим устройствам через MQTT, Kafka или HTTP API.

ѕолезна ли ¬ам эта стать€?


Ёти статьи могут быть вам интересны: