• Benvenuti su RaspberryItaly!
Benvenuto ospite! Login Login con Facebook Registrati Login with Facebook


Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5

[-]
Tags
telegram python da principiante con problema

[Problema] problema da principiante con Python-Telegram
#1
Ciao,
Sono nuovo del forum e alle prime armi con python.
Voglio realizzare un Bot x telegram che mi invii un messaggio di testo + un messaggio vocale (che deve registrare il raspberry) alla chiusura di un contatto collegato alla GPIO.
Oltre a questo ho bisogno di inviare dei comandi al Bot da telegram per fare effettuare dei comandi  banali al raspberry (il riavvio, spegnerlo, ecc.)
Seguendo alcune discussioni in internet sono riuscito a fare le due cose separatamente ma se metto tutto il codice sotto lo stesso file py non riesco a farlo girare.
Sicuramente sbaglio un comando o l'indentazione del codice o giù di lì ma non ne vengo a capo....
questo è quello che ho realizzato:


import sys
import os
import telepot
import datetime
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP)
input_state = GPIO.input(16)
"""
Ctrl-C per uscire.
"""
id_a = [1111111,2222222,3333333,4444444,5555555]

def handle(msg):
   chat_id = msg['chat']['id']
   command = msg['text']
   sender = msg['from']['id']

   print 'Got command: %s' % command
   
   while True:
       if input_state == False:    
           bot.sendMessage(chat_id, 'messaggio_di_testo') #invio un messaggio su Telegram
           time.sleep(3) #attendo 3 secondi, mi serve per partire giusto con la registrazione
           os.system("arecord -d 20 -f cd -t raw -D plughw:1 | oggenc - -r -o f.ogg") #registro l'audio da microfono e lo converto in messaggio vocale
           bot.sendAudio(chat_id, open('f.ogg', 'rb'), title='titolo_del_messaggio_vocale')

#qui parte la seconda parte di codice dove invio comandi al raspberry da telegram
   
   if sender in id_a:
      if command == '/ciao':
          bot.sendMessage(chat_id, 'Hei, ciao!')
       
      elif command == '/riavvia':
          bot.sendMessage(chat_id, 'Riavvio in corso...')
          os.system("sudo reboot")
 
      else:
           bot.sendMessage(chat_id, 'Non sei autorizzato a darmi ordini!')
           bot.sendMessage(chat_id, sender)
     

bot = telepot.Bot('TOKEN')
bot.message_loop(handle)


while 1:
   time.sleep(10)


Grazie in anticipo a chi mi potrà aiutare....
Risposta
#2
ciao.

1) usa il tag [ code ] [ /code] quando incolli codice, aiuta la leggibilità.

2) per quanto riguarda le notifiche ti consiglio rpinotify a cura del nostro bravissimo Gabriele. E comunque se cerchi "rpinotify" sul forum otterrai altro materiale a riguardo.

3) per inviare comandi invece puoi usare la modalità che stavi facendo tu, nel frattempo che qualcuno crei un bot simile al notify ma utilizzabile per l'invio dei comandi.



Coltiva linux, che windows si pianta da solo! (cit.)
Risposta
#3
- che errore da?
- metti i tag code o allega lo script cambiando l'estensione in .txt
Heart Libro  | Blog EnricoSartori.it | Idea YouTube
Se un utente ti è stato utile, aumenta la sua reputazione! premi il Pollicione! 
Risposta
#4
Avevo già guardato rpinotify, ma per il mio utilizzo mi sembrava esagerato. Curiosando un po' sono riuscito a mettere insieme questo. Arrivato fino a qui mi piacerebbe farlo funzionare....
Il problema è che se invio un comando al raspberry dopo non mi esegue l'invio dei messaggi (testo e audio) a telegram e viceversa.
Riesco far rimanere in attesa le due funzioni contemporaneamente sino a quando non ne esegue una dopodichè esegue solo quella.
Codice:
import sys
import os
import telepot
import datetime
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP)
input_state = GPIO.input(16)
"""
Ctrl-C per uscire.
"""


id_a = [111111,2222222,3333333,4444444,5555555]


def handle(msg):
   chat_id = msg['chat']['id']
   command = msg['text']
   sender = msg['from']['id']

   print 'Got command: %s' % command
   
     
   if sender in id_a:
      if command == '/ciao':
          bot.sendMessage(chat_id, 'Hei, ciao!')
       
      elif command == '/riavvia':
          bot.sendMessage(chat_id, 'Riavvio in corso...')
          os.system("sudo reboot")
#fine invio comandi al raspberry da telegram inizio codice invio messaggi da raspberry a Telegram
   while True:
       if input_state == False:    
           bot.sendMessage(chat_id, 'Messaggio di testo') #invio messaggio di testo
           time.sleep(3)#tempo in secondi dal messaggio di testo all'inizio registrazione messaggio
           os.system("arecord -d 20 -f cd -t raw -D plughw:1 | oggenc - -r -o f.ogg") #registra il messaggio e lo converte in file.ogg
           bot.sendAudio(chat_id, open('f.ogg', 'rb'), title='audio')#invia il file.ogg
   
      else:
           bot.sendMessage(chat_id, 'Non sei autorizzato a darmi ordini!')
           bot.sendMessage(chat_id, sender)
     

bot = telepot.Bot('il mio token')
bot.message_loop(handle)


while 1:
   time.sleep(10)
Risposta
#5
con telepot ero incappato nello stesso problema pure io.
alla fine ho usato un bot per dialogare e un bot per avere solo notifiche.

non molto snello, lo ammetto. dovrei migrare almeno ad rpinotify. almeno levo un pezzo lasciando solo quello che riceve comandi.
tra l'altro per far andare i comandi con root vuol dire eseguire lo script con root, appunto. e non credo sia una saggia scelta per la sicurezza del sistema visto che telepot non è proprio maturo/stabile.



Coltiva linux, che windows si pianta da solo! (cit.)
Risposta
#6
Scusate se rispondo solo ora...
Grazie delle dritte, proverò con rpinotify!!
Ciao
Risposta
#7
Utilizzo lo stesso post per chiedere ancora aiuto.
Ho modificato così il mio programma, con la speranza di aggirare il problema:
Codice:
import sys
import os
import telepot
import datetime
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(16,GPIO.IN, pull_up_down=GPIO.PUD_UP)
"""
Ctrl-C per uscire.
"""

id_a = [1111111,2222222,3333333,4444444,5555555]

def messaggio(push):
   GPIO.input(16,False)
   bot.sendMessage(chat_id, 'qui il mio messaggio')
   time.sleep(3)
   os.system("arecord -d 20 -f cd -t raw -D plughw:1 | oggenc - -r -o f.ogg")
   bot.sendAudio(chat_id, open('f.ogg', 'rb'), title='messaggio')

GPIO.add_event_detect(16, GPIO.RISING, callback=messaggio)

def handle(msg):
   chat_id = msg['chat']['id']
   command = msg['text']
   sender = msg['from']['id']

   print 'Got command: %s' % command


   if sender in id_a:
       if command == '/ciao':
           bot.sendMessage(chat_id, 'Hei, ciao!')
       elif command == '/riavvia':
           bot.sendMessage(chat_id, 'Riavvio in corso...')
           os.system("sudo reboot")

     
                 
   else:
       bot.sendMessage(chat_id, 'Non sei autorizzate a darmi ordini!')
       bot.sendMessage(chat_id, sender)

   

bot = telepot.Bot('IL_MIO_TOKEN')
bot.message_loop(handle)


while 1:
   time.sleep(10)
Python mi risponde così:

Traceback (most recent call last):
  File "Documents/prova.py", line 19, in messaggio
    GPIO.input(16,False)
TypeError: function takes exactly 1 argument (2 given)

Cercando in giro mi sembra di capire che devo creare una classe ma non ho capito come funziona.
Se qualcuno ha voglia di darmi una mano ne sarei molto felice....
Risposta
#8
Secondo me Python ti sta semplicemente dicendo che con GPIO.input puoi mettere un solo parametro (il pin) non due.
Perché non usi gpiozero, molto più semplice da utilizzare e più moderna?
Risposta
  


Vai al forum:


Navigazione: 1 Ospite(i)
Forum con nuovi Post
Forum senza nuovi post
Forum bloccato
Forum Redirect