Магазин / аукцион / FPR / donate / услуги / RSS / распечатать / вход 
Мой мир
Вконтакте
Одноклассники
Google+

[14 сентября 2018 | 17 сентября 2018 | 4 октября 2018]

Бот для Телеги с Далласом и Малиновым пирогом

После подключения Dallas DS18B20 к Raspberry я хотел опубликовать данные на своём сайте. Но так как у меня датчик установлен в комнате, то нет смысла публиковать эти данные на моём сайте. Я это сделаю только поле того как у меня в лапах окажется датчик в герметичном корпусе. Тогда я его смогу закрепить на штативе за окном. Пока не пришёл новый датчик руки чесались сделать что-нибудь в в чём был бы замешан температурный датчик и Raspberry. В итоге я натолкнулся на пару статей в которых описывалось создание бота для Телеграма, который работает с датчиками температуры. Но он слишком уж заумный и не поворотливый. Я хотел всё уместить в одном файле и ограничить его только ответом на вопрос о температуре. Без проверок, без прав доступа, бот должен отдавать информацию любому кто это попросит. Можно даже натравить этот бот на групповой чат в котором любой пользователь может узнать температуру. Теоретически можно сделать несколько устройств и раскидать по разным городам. Так же можно сделать тригеры которые будут срабатывать на какие-либо происшествия и самостоятельно писать оповещения в общий чат.

И так, пойдём по порядку. Чтобы написать такой бот понадобится не так много. Во-первых, сама плата Raspberry Pi. Во-вторых, датчик DS18b20 с обвязкой. В-третьих, экаунт Телеги. О том как физически всё соеденить написано в статье Подключение DS18B20 к Raspberry.

В начале требуется создать бота. Для этого ищем другого, зарегистрированного бота с именем @BotFather и нажимаем на кнопку Start.

@BotFather.

После нажатия на кнопку Start будет выведен список поддерживаемых команд. Нас интересует всего пара. Для начала нужно создать бот. Для этого даётся команда /newbot.

/newbot

После этого BotFather спросит имя создаваемого бота, которое будет отображаться у пользователей. Вы просто впечатаете ответ и отправляете сообщение. После этого будет запрошено уникальное имя для подключения и общения с ботом. После этого будет выдан результат с вашим токеном для HTTP API. Код состоит из цифр, двоеточия и набора символов. Запишите их и никому не давайте.

Теперь перейдём к Raspberry, подключимся к терминалу и установим Telepot для Пайтона.

pip install telepot
pip install telepot --upgrade

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

Мой скрипт выглядит следующим образом:

#!/usr/bin/python
# -*- coding: utf-8 -*-
#project: orcinus.ru

import sys
import time
import telepot
import os
import glob
import time
from telepot.loop import MessageLoop

# load one wire communication device kernel modules
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
device_file = '/sys/bus/w1/devices/28-0113163a2b7f/w1_slave' # домашний датчик

def read_temp():
   f = open(device_file, 'r')
   temp_raw = f.readlines()
   f.close()

   lines = temp_raw
   equals_pos = lines[1].find('t=')
   if equals_pos != -1:
      temp_string = lines[1][equals_pos+2:]
      temp_c = int(temp_string) // 1000
      return 'Температура ' + str(temp_c) + ' град. Цельсия.'
   else:
      temp_c = 'FAULT TEMPERATURE'
      return temp_c


# MAIN PROGRAM
def handle(msg):
    content_type, chat_type, chat_id = telepot.glance(msg)
    print(content_type, chat_type, chat_id)

    if content_type != 'text':
        bot.sendMessage(chat_id, 'Я понимаю только текст.')
        command = '/none'
        return
    else:
        command = msg['text'].lower()
        print(command)


    if command == '/start':
        bot.sendMessage(chat_id, 'Чтобы узнать температуру набери /temp.')

    elif command == '/temp' or command == u'/температура':
        bot.sendMessage(chat_id, read_temp())


TOKEN = 'XXXXXXXXX:YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY'

bot = telepot.Bot(TOKEN)
MessageLoop(bot, handle).run_as_thread()
print ('Starting module ...')

# Keep the program running.
while 1:
    time.sleep(10)

Копируем скрипт на Raspberry в домашний каталог, или куда хотите. Даём права на исполнение и запускаем. Если всё запустилось без ошибок, то в терминале можно будет наблюдить получение ботом сообщений. В этих сообщениях будут мелькать уникальные номера чатов пользователей. При желании их можно сохранить для анализа. Опять же вы никак не сможете увидеть общение вашего бота с пользователями в других местах. По этому рекомендую записывать логи, чтобы их потом анализировать и не оказаться взломанным.

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

Если вы не хотите писать свой, но хотите посмотреть результаты работы реально действующего бота, то добавляйте моего бота к себе в контакты и общайтесь с ним. Моего бота зовут @SlyCatBot.

@SlyCat.

В реальном же исполнении скрипт для работы бота значительно сложнее, так как в процессе написания и дотачивания всё-же приходится увеличивать сложность.

Желаю успехов в экспериментах.

• Перейти в архив


Комментарии

Включите JavaScript для комментирования.


Этот сайт использует файлы cookies, чтобы упростить вашу навигацию по сайту, предлагать только интересную информацию и упростить заполнение форм. Я предполагаю, что, если вы продолжаете использовать мой сайт, то вы согласны с использованием мной файлов cookies. Вы в любое время можете удалить и/или запретить их использование изменив настройки своего интернет-браузера.

Сообщайте мне о замеченных ошибках на: web@orcinus.ru. Все пожелания и советы будут учтены при дальнейшем проектировании сайта. Я готов сотрудничать со всеми желающими. В некоторых случаях, мнение автора может не совпадать с мнением автора! Phone: +7-902-924-70-49.

Рейтинг@Mail.ru LiveInternet Rambler's Top100 Яндекс.Метрика