Openhab - telecomando infrarossi

Utilizzo del ripetitore di telecomandi Broadlink RM mini 3 per comandare dispositivi tramite infrarossi

Questo dispositivo, e i suoi fratelli maggiori che consentono di simulare anche telecomandi RF a 433MHz, sono molto comuni e diffusi nell'ambiente home automation. In rete si trovano diversi esempi di utilizzo con tutti i sistemi più comuni di automazione.

In questa pagina una descrizione dell'interno del dispositivo.

Come prima cosa occorre collegarlo alla WiFi usando l'app come spiegato nel manuale di istruzioni o nei vari tutorial che si trovano. Non c'è bisogno di registrazione al cloud se non si desidera backuppare le configurazioni fatte direttamente nell'app.

Occorre assegnare un IP fisso al dispositivo per configurarlo nella libreria insieme al MAC address.

E' stata scritta una libreria in python usando le API del dispositivo. Ci sono diversi tutorial per l'installazione su OpenHAB. Questo è il migliore che ho trovato, anche se non è completamente esatto. Di seguito saranno spiegate le operazioni necessarie per farlo funzionare correttamente.

Partendo dall'installazione base di OpenHAB 2.2 che si trova sul sito ufficiale bisogna installare anche openSSL per python dopo aver installato pip come spiegato nel tutorial, altrimenti non è possibile installare i moduli aggiuntivi di python:

sudo apt-get install openssl python-openssl

installando i moduli configparser, netaddr e pycrypto come spiegato nel tutorial il programma funziona lanciandolo da utente openhabian nel terminale ma non funziona lanciandolo tramite il binding exec di OpenHab 2.2. Occorre installarli nella directory di default in modo che siano disponibili per tutti gli utenti:

sudo pip install —target=/usr/local/lib/python2.7/dist-packages nome-modulo

Dopo aver terminato l'installazione e configurato i diversi tasti dei telecomandi come spiegato nel tutorial si possono provare da terminale prima di inserirli in OpenHAB.

Il tutorial fa riferimento ad un vecchio binding exec, su OpenHAB 2.2 questo lavora in modo diverso, seguendo le nuove specifiche. Occorre inserire i comandi in Things come nell'esempio:

ir.things
Thing exec:command:AmpliON [command="/usr/bin/python /home/openhabian/addons/BlackBeanControl/BlackBeanControl.py -c AmpliON", interval=0, timeout=5, autorun=false]
Thing exec:command:AmpliOFF [command="/usr/bin/python /home/openhabian/addons/BlackBeanControl/BlackBeanControl.py -c AmpliOFF", interval=0, timeout=5, autorun=false]

Questi possono poi essere associati a degli Item per usarli, ad esempio:

ir.items
Switch AmpliON_RUN "Ampli ON" <"player"> {channel="exec:command:AmpliON:run"}
Switch AmpliOFF_RUN "Ampli OFF" <"player"> {channel="exec:command:AmpliOFF:run"}

Poi si possono usare nel modo classico tramite UI o HAB panel, ad esempio:

Sitemap
Frame label="Remote Control"
        {
            Text item=AmpliON 
            {
                Switch item=AmpliON_RUN
                Switch item=AmpliOFF_RUN
            }
        }

Esempio di controllo di un condizionatore

I protocolli dei telecomandi IR per i condizionatori sono una jungla, ognuno ha il proprio. La cosa che hanno tutti in comune però è la modalità di trasmissione dei dati. Ad ogni pressione di un qualsiasi pulsante viene reinviato tutto il set di parametri, questo è necessario dal momento che la pressione dei tasti avviene in modo completamente asincrono rispetto rispetto all'effetiva ricezione, il telecomando può essere fuori range. Da un punto di vista è più semplice inviare i dati in questo modo, si prepara il pacchetto con tutte le informazioni e si trasmette ogni volta in modo simile. Da un altro punto di vista il lavoro di preparazione del pacchetto con applicativi tipo LIRC o il programma python per il Broadlink RM 3 mini del quale stiamo parlando è molto tedioso, bisogna preparare una serie di pacchetti con tutte le combinazioni possibili di modalità di funzionamento, temperatura e velocità della ventola. Anche limitando le variazioni possibili il numero è abbastanza alto.

Sarà preso come esempio il controllo di un condizionatore a pompa di calore LG. Per analizzare i comandi inviati ho usato il software AnalysIR tramite l'hardware USB Infrared Toy di Dangerous Prototypes. Come si può vedere sul sito del software ci sono molti altri hardware che si possono usare, dal classico Arduino, all'ESP8266, passando per la Rapsberry PI.

AnalysIR ha subito riconosciuto il protocollo come LG28AC. Questo è un protocollo a 28bit con una checksum finale di 4 bit, per un totale di 32 bit inviati ad ogni pressione. Un buon punto di partenza per analizzare la composizione del pacchetto si può trovare sul forum di Arduino. L'algoritmo per il calcolo della checksum è discusso sul forum di Stackexchange. Qui si può trovare un foglio di calcolo per la decodifica dei pacchetti ricevuti.

Una volta creato il database con tutti i comandi necessari, occorre utilizzarlo in OpenHAB. Con la basic UI o la classic UI si può usare l'element type "Selection".

AC.items
Number AC_mode "Modo"  (AC)
Number AC_fan "Ventola"  (AC)
Number AC_temp "Temperatura"  (AC)
Switch AC_on    "ON" (AC)
Switch AC_send "send" (AC)
String AC_string (AC)

Nell'habpanel la cosa si complica un pochino perché non esistono modalità già pronte ma devono essere configurate con le infinite possibilità messe a disposizione dai linguaggi di programmazione supportati.

Sul forum di OpenHAB si trovano diverse discussioni in merito

In questo esempio è usato il widget di Marcel Verpaalen modificato da Anders Alfredsson.

A questo sono associate una serie di regole per ottenere un comportamento il più simile possibile a quello del telecomando originale.

Per le ragioni già esposte il range di temperatura è stato limitato tra 20 e 25°C, ma con un po' di pazienza in più si può estendere. Il default, al quale si posiziona allo spegnimento, è di 23°C con la ventola al minimo. Una volta acceso in modalità non deumidificatore (nel quale la temperatura è automatica) è possibile variare modalità, temperatura e velocità della ventola.

var ac_mode = 1
var ac_on = OFF
var ac_fan = 0
var ac_temp = 23
var ac_send = OFF
var Timer set_timer = null

rule "Start"
when
    System started
then
    AC_mode.postUpdate(ac_mode)
    AC_on.postUpdate(ac_on)
    AC_fan.postUpdate(ac_fan)
    AC_temp.postUpdate(ac_temp)
    AC_send.postUpdate(ac_send)
end

rule "Send"
when 
    Item AC_send received command ON
then
    ac_mode=AC_mode.state 
    ac_fan=AC_fan.state 
    
    if (AC_mode.state == 1) //mode DRY
    {
        ac_temp=23
        AC_temp.postUpdate(ac_temp)
    }
    else
    {
        ac_temp=AC_temp.state 
    }

    if (AC_on.state==OFF)
    {
        ac_on=ON
        AC_on.state=ac_on
        AC_string.postUpdate("ON_"+ac_mode+"_"+ac_fan+"_"+ac_temp)
    }
    else
    {
        AC_string.postUpdate(ac_mode+"_"+ac_fan+"_"+ac_temp)
    }

            set_timer = createTimer(now.plusSeconds(1))
            [
                AC_send.postUpdate(OFF)
                set_timer = null
            ]   
end 

rule "AC_ON"
when 
    Item AC_on received command ON 
then
    ac_on=ON  
    ac_mode=AC_mode.state 
    ac_fan=AC_fan.state 
    ac_temp=AC_temp.state 
    AC_string.postUpdate(ac_on+"_"+ac_mode+"_"+ac_fan+"_"+ac_temp)
end 

rule "AC_OFF"
when 
    Item AC_on received command OFF
then
    AC_string.postUpdate("OFF")
    ac_on=OFF 
    ac_temp=23
    ac_fan=0
    AC_fan.postUpdate(ac_fan)
    AC_temp.postUpdate(ac_temp)
end

rule "Check_ON"
when 
    Item AC_fan changed or Item AC_temp changed
then
    if (ac_on==OFF)
    {
        ac_temp=23
        ac_fan=0
        AC_fan.postUpdate(ac_fan)
        AC_temp.postUpdate(ac_temp)
    }
end 

In questo modo viene composta la stringa (AC_string) che poi sarà usata come parametro per il programma in python, come già spiegato nell'articolo sul DALI, tramite l'istruzione "executeCommandLine".

val results = executeCommandLine(/usr/bin/python@@/home/openhabian/addons/BlackBeanControl/BlackBeanControl.py@@-c@@StringaDiControllo,5000)
        logInfo("Exec",results)

Ovviamente, ad ogni stringa inviata dovrà corrispondere una riga equivalente in /addons/BlackBeanControl/BlackBeanControl.ini con i parametri che dovrà usare il Broadlink RM 3 mini.

Ad esempio:


IPAddress = 192.168.1.79
Port = 80
MACAddress = 34:ea:34:8f:83:b3
Timeout = 10

[Commands]
ON_0_0_23 = 260040000001248c10350f13101310120f360f130f1310130f1310120f140f130e140f360f130f1310350f130f14103510120f1311120f130f3510350f130f360f000d050000000000000000
OFF = 260040000001258b113410130f130f130f360f130f1310130f35103510130f130f1310130f130f130f140f130f130f1310130e3610130f350f1410120f130f3610000d050000000000000000

Guido Ottaviani (Autore/Progettista elettronico-firmware-robotica)
Si occupa della progettazione elettronica e del firmware di sistemi embedded per la Robotica e applicazioni industriali e civili oltre che di divulgazione tecnica su internet.
http://www.guiott.com - https://github.com/guiott - guido@guiott.com



Le attività del TanzoLab si svolgono ogni mercoledi sera, salvo casi speciali, dalle ore 18:30 presso i locali della Acme Systems srl e consistono in:

  • Talk monotematici a cura di professionisti in vari settori tecnologici
  • Workshop pratici su elettronica embedded, produzione e informatica
  • Progettazione e realizzazione di nuovi prodotti embedded per l'IT

Le attività vengono coordinate tramite questo sito, in cui vengono pubblicati tutti i lavori svolti o in via di sviluppo, e tramite un gruppo Telegram con cui per interagire direttamente via chat con gli altri membri.