Controllare Raspberry Pi via Telegram

Sapevate di poter controllare il vostro Raspberry remotamente tramite Telegram?
seguendo questa guida, sarete in grado di comandare il vostro Pi tramite un semplice messaggio, anche fuori casa!

Installazione e configurazione:
per prima cosa installiamo e configuriamo telegram-cli (istruzioni su github)
e la variante openbsd di netcat:

apt-get install netcat-openbsd

aggiungiamo al nostro /etc/crontab:

BASH_ENV=/home/pi/.profile   #oppure /root/.profile a seconda dell'utente*  
...
...
@reboot root bash -l -c '/bin/telegram-cli -WRD -S /tmp/tg.sck -s /etc/cron.d/script.lua'

*indicando il .profile dell’utente con cui è stato configurato telegram.

Creiamo script.lua:

function on_msg_receive (msg)  
  if started == 0 then
    return
  end
if (msg.from.phone==nostro_numero) then  
  if msg.out then    
    return
  end

 if (msg.text=='sorveglianza on') then    

questo blocco di controllo:

  • Processa solo i messaggi provenienti dal nostro numero
  • Non considera i messaggi inviati dallo script stesso
  • Esegue una operazione (a seguire) se riceve il messaggio "sorveglianza on"

di seguito scriviamo il comando shell da lanciare, il suo output verrà letto nella variabile result

local handle = io.popen('curl http://192.168.1.35:8080/1/detection/start -u user:password)  
local result = handle:read("*a")  
handle:close()  

^ comando di esempio tra singoli apici dentro io.popen(' comando ')

e ora, rispondiamo al mittente con l’output del comando

send_msg (msg.from.print_name, result, ok_cb, false)  
end

...e così via per tutti gli altri comandi che vogliamo prevedere:

 if (msg.text=='sorveglianza off') then
        local handle = io.popen('curl http://192.168.1.35:8080/1/detection/pause -u user:password)
        local result = handle:read("*a")
        handle:close()
        send_msg (msg.from.print_name, result, ok_cb, false)
  end
end  
  return
end  

Ora che il socket è creato e telegram viene avviato all’avvio del sistema, possiamo mandare messaggi nel seguente modo:

echo "msg Contatto ciao" | nc -U /tmp/tg.sck

per gli utenti motion: se tutto è andato a buon fine, possiamo ora modificare il nostro motion.conf con:

on_picture_save echo "send_photo Contatto %f" | nc -U /tmp/tg.sck

per ricevere le foto direttamente sul nostro contatto di telegram.

[ EXTRA ]

Opzione pericolosa:
Eseguire qualunque comando viene passato via telegram

è molto semplice, basterà aggiungere alle condizioni il seguente controllo:

 if (msg.text~='') then    
         local handle = io.popen(msg.text)
        local result = handle:read("*a")
        handle:close()
        send_msg (msg.from.print_name, result, ok_cb, false)
  end
  • se l’input non è vuoto
  • eseguilo direttamente in shell

Tutto insieme script.lua diventa:

function on_msg_receive (msg)  
  if started == 0 then
    return
  end

if (msg.from.phone==nostro_numero) then  
  if msg.out then                
    return
  end

 if (msg.text=='sorveglianza on') then        
        local handle = io.popen('curl http://192.168.1.35:8080/1/detection/start -u user:password)
        local result = handle:read("*a")
        handle:close()
        send_msg (msg.from.print_name, result, ok_cb, false)
 end
 if (msg.text=='sorveglianza off') then
        local handle = io.popen('curl http://192.168.1.35:8080/1/detection/pause -u user:password)
        local result = handle:read("*a")
        handle:close()
        send_msg (msg.from.print_name, result, ok_cb, false)
  end
end  
  return
end

Per chi non sapesse cosa sia motion e fosse interessato ad usare il proprio Raspberry Pi come DVR per la sorveglianza, vi lascio a Questo articolo

Buon divertimento!