Telecomando universale per apricancelli a 433.92 MHz

Di recente ho dovuto comprare un set di telecomandi  (parlo del telecomando universale, quelli ad autoapprendimento) per i cancelli di casa. La procedura di solito è semplice, si prende il telecomando originale, lo si affianca a quello universale e si clona il segnale. Purtroppo nel mio caso non ha funzionato, probabilmente per una incompatibilità a livello di frequenze (433.92MHz degli universali e 433 MHz del’originale o viceversa). Il modello del telecomando originale è Elvox ET2 ZX03.

Siccome i telecomandi originali Elvox sono alquanto costosi, una soluzione è stata quella di realizzare un circuito in grado di rendere comunque compatibili i cancelli con i telecomandi universali o qualsiasi altra marca di telecomandi. Questa soluzione richiede però la realizzazione di un circuito e non necessariamente potrebbe funzionare con altri tipi di telecomandi.

Ho trovato online invece un’altra soluzione interessate, per chi non avesse il tempo di realizzare il circuito da solo e che risolve in modo definitivo il problema legato alla duplicazione del telecomando, si chiama SHEDU

shedu

Si tratta di un prodotto che permette di usare lo smartphone in alternativa al telecomando.
Visto il costo equiparabile a quello di un paio di telecomandi e l’indubbia praticità, è una soluzione interessante sia per un uso personale che per le aziende.
Molto interessanti anche alcune funzioni aggiuntive come l’apertura per prossimità e la possibilità di condividere l’accesso ad altri utenti tramite l’app stessa in tutta sicurezza (utile ad esempio per concedere ai familiari la possibilità di aprire il cancello senza acquistare nuovi telecomandi).
Attualmente è in corso una promozione che permette di ottenere degli sconti sull’acquisto per chi si registra e condivide sui social tramite il link che vi viene inviato

SHEDU è sicuramente la soluzione più pratica e risolve definitivamente il problema; per quanto riguarda invece la realizzazione di un circuito ad-hoc, occorrerà prendere un modulo ricevitore da collegare elettricamente al telecomando Elvox originale: il circuito riceve il segnale dai telecomandi universali e comanda il telecomando originale. Il telecomando originale a sua volta emette il segnale per i cancelli che quindi si aprono/chiudono come di consueto.

Il circuito scelto è RKAU2, un ricevitore con attacco molex in auto-apprendimento a 2 canali; è dotato di due relè non polarizzati (quindi semplici contatti) ideali per essere collegati ai 2 pulsanti del telecomando originale.

ricevitore

Il circuito ricevitore deve essere alimentato a 12V e non include l’antenna. L’alimentatore è facilmente reperibile, qualsiasi 12V ad almeno 500mA va bene. Per l’antenna è sufficiente un filo elettrico lungo esattamente 17.3 cm (la lunghezza d’onda a 433Mhz è 69.3 cm, quindi 1/4 di lunghezza d’onda è all’incirca 17.3 cm).

Questi sono i contatti del circuito ricevitore:

ricevitore_schema

I pulsanti P1 e P2 servono per la programmazione.

Ho quindi collegato il circuito ricevitore al telecomando, collegando tra loro i contatti dei 2 relè (CN1 e CN2) ai due pulsanti del telecomando Elvox originale. Sia il circuito ricevitore che il telecomando vengono alimentati dallo stessa fonte a 12V. Questo lo schema elettrico finale:

remote

Il circuito finale, una volta realizzati i collegamenti, si presenta cosi’:

20141002_084354

Il cavetto nero è l’alimentazione, il filo in alto l’antenna. Il circuito a sinistra è il telecomando Elvox originale, quello a destra il circuito ricevente.

Tutto l’insieme è stato inserito in una cassetta plastica per esterni opportunamente alimentata. Programmando il circuito ricevente è possibile aprire/chiudere i cancelli utilizzando qualsiasi telecomando (ovviamente compatibile con il ricevitore), da quelli universali ai cloni più economici.

In questo modo è possibile comandare i cancelli sia con gli eventuali altri telecomandi originali (ne abbiamo sacrificato solo uno) che con i nuovi. In più non abbiamo dovuto modificare o sostituire i circuiti dei singoli motori dei cancelli.

MioComm – caricare tracce GPS sul ciclocomputer Mio 105 H/HC

MioComm è un piccolo tool sviluppato in C# per l’importazione di tracce GPS arbitrarie (in formato Google Earth .kml) sul ciclocomputer Mio 105 H/HC. Le tracce importate possono poi essere ripercorse grazie alla modalità navi del Mio.

1348067046-Cyclo105_zoom

Ho deciso di sviluppare questo software per colmare quello che secondo me (e anche per molti altri utenti) è il più grande difetto di questo dispositivo ossia l’impossibilità di importare tracce GPS esterne.

Il software originale a corredo permette infatti solo l’esportazione delle tracce dal Mio al computer, la loro pubblicazione sul network  mioshare.com e la condivisione con gli altri utenti. I progettisti hanno dimenticato (?) o non hanno voluto prendere in considerazione il classico caso d’uso del GPS da bici:  prendere una traccia GPS scaricata da internet, caricarla sul dispositivo e ripercorrerla.

Il tool è frutto di un lungo lavoro di reverse engineering del protocollo seriale di comunicazione, fortunatamente abbastanza semplice e lineare: il classico protocollo half-duplex (botta e risposta) con pacchetto della forma command+size+payload+crc

Screen shot 2014-09-14 at 12.44.47 AM

Il tool permette fondamentalmente 3 operazioni:

  • Importazione di una traccia GPS arbitraria in formato Google Earth .kml
  • Elenco delle tracce memorizzate nel dispositivo
  • Esportazione in formato .kml delle tracce memorizzate

Screen shot 2014-09-14 at 12.15.35 AM

L’utilizzo è abbastanza semplice: basta collegare il Mio al PC tramite cavetto USB e premere “connect”. Il software inizierà il discovery del device su tutte le porte COM presenti (virtuali USB e non) e poi scaricherà e mostrerà l’elenco delle tracce correntemente in memoria. Il tasto “export” permette di esportare un traccia (selezionata dall’elenco), il tasto “import” permette invece di importare una.

Download

Download link: MioComm_ver1.1

Per il corretto funzionamento del tool sono necessari i driver STMicroelectronics della porta seriale virtuale scaricabili qui.

Per il momento il tool supporta solo il formato .kml (e anche .kmz: basti sapere che un file .kmz non è altro che una versione zippata di un kml). In futuro è prevista l’introduzione del formato Garmin .gpx e l’esportazione dei parametri non GPS della traccia (velocità, potenza, cadenza, battiti etc..).

Per chiarimenti, bug dell’ultimo minuto o miglioramenti non esitate a contattarmi!

Protocollo seriale – pacchetto

Una breve descrizione del protocollo seriale di comunicazione, per le persone interessate. Il protocollo è stato parizialmente reversato sniffando il traffico da e verso il Mio 105 H/HC. La comunicazione avviene ovviamente in half-duplex, il master (l’applicativo desktop) interroga il dispositivo, il dispositvo risponde. Se il dispositivo non risponde entro un certo timeout lo si considera assente o spento e la richiesta viene annullata. Ho notato alcune incongruenze nella codifica dei valori numerici, ad esempio il campo LENGTH e le coordinate GPS sono codificate big-endian mentre tutti gli altri valori numerici in little-endian.

A livello link il pacchetto si presenta nella classica forma CMD+LENGTH+PAYLOAD+CRC, più nello specifico:

packet

  • CMD: 1 byte, indica il codice comando del pacchetto.
  • L0 e L1, 2 byte in tutto. Indicano la dimensione del payload, espressa in bytes. Campo big-endian.
  • P0,P1…,PN-1: payload
  • CHECK: 1 byte. Non propriamente un codice ciclico CRC ma un semplice XOR di tutti i byte precedenti, escluso il byte CMD

DNS dinamico fai-da-te senza servizi di terze parti

Rimpiazzare il proprio servizio di DNS dinamico con una coppia di script PHP e bash.

Esistono moltissimi servizi online anche gratuiti per il DNS dinamico quali DynDNS o NoIP. Questi servizi permettono l’associazione del propro indirizzo IP dinamico ad un nome DNS statico. Grazie ad essi è possibile raggiungere i servizi web installati dietro le proprie ADSL casalinghe (opportunamente nattate) senza dover ricordare e prendere nota dell’indirizzo IP pubblico che il provider di volta in volta ci fornisce.

Avevo un account su DynDNS per gestire da remoto il mio disco di backup ReadyNAS ma purtroppo dopo molto tempo il servizio è stato revocato e messo a pagamento. A tal punto, avendo già un dominio web PHP+MySQL (questo blog per l’appunto) ho deciso di implementarvi sopra un semplice servizio di traduzione IP in modo da raggiungere di nuovo il disco di backup.

Si è trattato semplicemente di realizzare una pagina web PHP che fornisce un redirect automatico (redirect HTML) al proprio indirizzo IP pubblico. L’indirizzo IP pubblico è memorizzato online in un file di testo ip.txt. E’ chiaro che tale indirizzo cambia con regolarità (al termine del lease-time impostato dal provider o ad ogni riavvio del modem ADSL) e quindi deve esistere un meccanismo per aggiornare tale file con il nuovo indirizzo. Un piccolo script bash che gira localmente sul ReadyNAS provvede ad aggiornare periodicamente il file remoto tramite una semplice richiesta HTTP GET.

In sostanza si tratta di realizzare due software distinti:

  1. ipremote.php: pagina PHP remota sul proprio dominio web che effettua il redirect all’indirizzo IP di casa
  2. ipupdater.sh: script bash locale (dietro ADSL) che ad intervalli regolari notifica la pagina web inviando il nuovo indirizzo IP

1) Pagina PHP (ipremote.php)

Molto semplicemente assolve alla duplice funzione di 1) redirect automatico e 2) aggiornamento del file ip.txt da parte dello script bash locale. Per accedere come redirect basta fornire la password corretta (in questo caso 123456) tramite una semplice richiesta GET: la pagina legge l’indirizzo IP pubblico corrente dal file e crea l’HTML per il redirect a quell’indirizzo. Per accedere in modalità aggiornamento (script bash presumibilmente) basta fornire, sempre in GET,  la password e il nuovo indirizzo IP: la pagina salverà l’indizzo IP specificato nel file di testo.

Ecco il codice:


<?php

$file = "ip.txt";

if(isset($_GET['newip']) == true && isset($_GET['pass']) == true)
{
   $ip = $_GET['newip'];
   $pass = $_GET['pass'];

   if($pass == "123456")
   {
      // update IP address
      file_put_contents($file, $ip);
   }
   else
   {
      echo "wrong password";
   }
}
else if(isset($_GET['pass']) == true)
{
   $pass = $_GET['pass'];

   if($pass == "123456")
   {
      // get IP address
      $ip = file_get_contents($file);
      echo '<html>';
      echo '<head>';
      echo '<meta http-equiv="refresh" content="0; url=http://'.$ip.'" />';
      echo '</head>';
      echo '<body>';
      echo '</html>';
   }
   else
   {
      echo "wrong password";
   }
}

?>

2) Script bash locale (ipupdater.sh)

Lo script bash viene eseguito periodicamente grazie a cron (ebbene si, il ReadyNAS è un embedded Linux a tutti gli effetti) e provvede a rilevare l’indirizzo pubblico corrente e a notificarlo alla pagina web PHP remota. La regola cron può essere impostata su una volta al minuto, una volta all’ora o quello che si vuole: più il rate di notifica è alto più bassa sarà la probabilità di trovare la pagina web momentaneamente disallineata col vero indirizzo IP.

Ecco lo script:

#!/bin/bash
ip=$(curl -s icanhazip.com)
password="123456"
url="http://www.mysite.it/ipremote.php?newip=$ip&pass=$password"
wget -qO- $url &> /dev/null

Lo script valorizza la variabile $ip con l’IP pubblico corrente. A tal file viene utilizzato il servizio web icanhazip.com che molto semplicemente restituisce l’indirizzo corrente.
Viene quindi composta la stringa URL con la richiesta GET di aggiornamento IP verso la pagina ipremote.php. www.mysite.it è il proprio dominio web, dove risiede ipremote.php.
Infine viene mandata la richiesta HTTP GET tramite wget ovviamente disabilitando opportunamente l’output su file e su console (a noi non interessa).

Come si usa

Accedere al ReadyNAS locale diventa ora banale: basta collegarsi all’indirizzo http://www.mysite.it/ipremote.php?pass=123456 per ottenere il redirect.
Ovvimente il sistema funziona non solo per accedere a dischi di rete, ma tutto quello che avete deciso di esporre nella vostra rete LAN (pannello di gestione remota del modem ADSL, VNC server, programmi vari etc..).

Perchè la password?

E’ chiaro che solo lo script bash locale deve essere in grado di aggiornare l’indirizzo altrimenti potreste ritrovarvi con un redirect ad un IP impostato da terzi. Anche il semplice redirect deve essere protetto da password, più che altro per questioni di privacy: conviene che solo voi possiate raggiungere i servizi della vostra rete LAN (protetti anch’essi da password, ovviamente).

Conclusioni

Vantaggi del sistema? Innanzitutto non occorre registrarsi e fare affidamento a servizi di terze parti (DynDNS, NoIP etc..). Il sistema non soffre dei ritardi di propagazione tipici del DNS per cui il nuovo IP pubblico è prontamente rilevato e aggiornato (basta settare un rate di aggiornamento ragionevolmente breve, tipo 5 minuti). Con un pò di fortuna è possibile embeddare lo script bash direttamente nel modem ADSL; è sufficiente che il modem si appoggi su una qualche distro Linux e abbia il demone cron installato.

Esistono alcuni contro però: la password fissa è soggetta ad attacchi di tipo replay-attack. Converrebbe implementare o un rolling code (ma introduce la possibilità di disallineamento) o meglio ancora uno schema più raffinato di tipo challenge-response.
Altro problema è che occore avere un dominio web PHP funzionante dove appoggiare la pagina ipremote.php.