Найти - Пользователи
Полная версия: Помогите с реализацией кнопки (raspberry + telepot)
Начало » Центр помощи » Помогите с реализацией кнопки (raspberry + telepot)
1 2
mindwrk
Добрый день. в программировании новичек, помидорами прошу не забрасывать.
Собственно telepot
На кнопку бот должен отсылать команду /ring, но не отрабатывает условие.
Когда кнопка зажата GPIO.input(16) возвращает 1, не зажата 0.
Прошу направить на путь истенный. т.к я на 100% уверен что что-то не так делаю.

 import time
import datetime
import telepot
import RPi.GPIO as GPIO
 
GPIO.setmode(GPIO.BOARD)
GPIO.setup(16,GPIO.IN)
 
def handle(msg):
    chat_id = msg['chat']['id']
    command = msg['text']
 
    print('Got command: %s' % command)
 
    if GPIO.input(16) == 1:
        bot.sendMessage(chat_id, str('/ring)'))
        time.sleep(3)
    elif command == '/status':
        bot.sendMessage(chat_id, str('online'))
    elif command == '/open':
        bot.sendMessage(chat_id, str('moving'))
    elif command == '/time':
        bot.sendMessage(chat_id, str(datetime.datetime.now()))
 
bot = telepot.Bot('*********')
bot.message_loop(handle)
print('I am listening ...')
 
while 1:
    time.sleep(10)
ZerG
Так запустите бота и посмотрите что у вас вобще происходит при нажатии кнопки например добавив

 print(GPIO.input(16))
mindwrk
ZerG
Так запустите бота и посмотрите что у вас вобще происходит при нажатии кнопки например добавив

в спокойном сотоянии print(GPIO.input(16)) вернет 0. в нажатом 1
если запустить
 import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(16,GPIO.IN)
try:
    while True:
        if GPIO.input(16)==0:
            print "Open"
        else:
            print "Closed"
finally:
   
    GPIO.cleanup()

все работает.

если например использовать

 elif command == '/b':
       print(GPIO.input(16))
то значения по команде боту возвращаются 0 и 1 при зажатой кнопке.

не работает конкретно условие
 if GPIO.input(16) == 1:
        bot.sendMessage(chat_id, str('/ring)'))
        time.sleep(3)
ZerG
Давайте для начала
 if GPIO.input(16) == 1:
        print('Button ON') # что бы понять что условие вобще сработало
        # bot.sendMessage(chat_id, str('/ring)'))
        bot.sendMessage(chat_id, str('ring)')) # может символ '/' нужно экранировать
        time.sleep(3)
mindwrk
ZerG
if GPIO.input(16) == 1:
print('Button ON') # что бы понять что условие вобще сработало
# bot.sendMessage(chat_id, str('/ring)'))
bot.sendMessage(chat_id, str('ring)')) # может символ ‘/’ нужно экранировать
time.sleep(3)
или
 if GPIO.input(16) == 1:
        print('Button ON')

срабатывает только если зажав кнопку отправить боту любой текст .
т.е не важно будет это что-то из command ==
или рандомный набор символов

также
 if GPIO.input(16) == 0:
        print('Button OFF')
срабатывает с отпущенной кнопкой и отправкой боту сообщения

Срабатывает один раз, т.е не повторяется
я отрпаляю боту сообщение, срабатывает, след раз сработает если отправить еще одно.
python door.py
I am listening …
Got command: 5665
Button ON
Got command: длрор
Button ON
Got command: /time
Button ON
держа кнопку зажатой и if GPIO.input(16) == 1:

если делать выше сказанное с зажатой кнопкой, то бот не реагирует на команды.
т.е если кнопка зажата и я даю команду /time то бот не отправляет дату, если кнопку отпустить, то дату отправляет.

лог канала
Vladimir,
/time

Vladimir,
/time

—-
отпускаю кнопку
—-

Vladimir,
/time

bot,
2016-10-11 15:47:36.907086

Vladimir,
/time

bot,
2016-10-11 15:47:40.981510
ZerG
ХМ.
ну так если
 def handle(msg=None)
?
mindwrk
тоже самое
ZerG
Честно говоря не совсем до конца понимаю что у вас именно не срабатывает!

Давайте так:
возьмем ваш код
 # -*- coding: utf-8 -*-
import time
import datetime
import telepot
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(16, GPIO.IN)
def handle(msg):
    chat_id = msg['chat']['id'] # для теста исключим
    command = msg['text']
    print(chat_id, command)
    print('Got command: %s' % command)
    if GPIO.input(16): # тут уберем 1 - возможно результат булево
        print('Button ON')
        bot.sendMessage(chat_id, str('/ring)'))
        print('Message was sent')
        time.sleep(3)
    elif command == '/status':
        print('Status result')
        bot.sendMessage(chat_id, str('online'))
    elif command == '/open':
        bot.sendMessage(chat_id, str('moving'))
    elif command == '/time':
        bot.sendMessage(chat_id, str(datetime.datetime.now()))
bot = telepot.Bot('*********')
bot.message_loop(handle)
print('I am listening ...')
while 1:
    time.sleep(10)

Далее вы нажмете кнопку и скажете что происходит!
Button ON - печатается или нет? Переменные chat_id, command выводяться?
mindwrk
тожесамое происходит

срабатывает только если зажав кнопку отправить боту любой текст .

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

ZerG
Моя твоя не понимать!
Давайте по сути! Вы код скопировали последний? Запустили?
Нажали кнопку от пустили
при етом сообщения в консоли появились
Button ON и Message was sent ?
 print(chat_id, command)
отработала? данные вывела? если да то какие?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB