Thursday, October 11, 2012

Controlling an A/C unit using LIRC on centos

UPDATE 22/2/15: OK apparently the reason for the mess is that lirc_serial needs to be compiled/provided/supported by the kernel and is not included in recent lirc versions. ELREPO has kmod-lirc for Centos that seems to work out of the box (manually load it after "setserial /dev/ttyS? uart none" for el7 too). So you can install lirc using yum.

I needed to turn on the AC unit in a small server room. It would go off when a power failure occurred.

I purchased a serial transceiver from Iguana works.

Since Centos' (2.6.18-274.7.1.el5) lirc package did not include the default driver and lirc_serial modules, I downloaded lirc-0.8.7 (lirc-0.9.0 would not compile).

Compilation is pretty straight forward:

./setup.sh

make


make install

During setup I chose the serial port the transceiver was on.

Next steps are:

Copy the init script from contrib and adjust it to your requirements. Do not start lirc though.

Here is my init script:



#!/bin/sh
#
# lirc:        This is an init script for RedHat distribution.
#
# Author:      Denis V. Dmitrienko 
#
# chkconfig: 345 95 10
# description: lirc is a Linux Infrared Remote Control system.

# Source function library.
. /etc/rc.d/init.d/functions

[ -f /usr/local/sbin/lircd ] || exit 0
[ -f /usr/local/sbin/lircmd ] || exit 0

PATH=/usr/local/sbin:/usr/local/bin:$PATH

LIRC_CONFIG=/etc/lirc/lircd.conf
DRIVER=default
DEVICE=/dev/lirc
PORT=/dev/ttyS1
 
# Load LIRC config
[ -f /etc/sysconfig/lirc ] && . /etc/sysconfig/lirc

# See how we were called.
case "$1" in
  start)
        echo -n "Starting Infrared Remote Control: "
        setserial $PORT uart none

        if [ "$MODULES" != "" ]; then
                IFS=" "
                for MODULE in $MODULES
                do
                        modprobe $MODULE
                done
        fi

        daemon lircd --device=$DEVICE --driver=$DRIVER $LIRCD_ARGS $LIRC_CONFIG
        daemon lircmd $LIRC_CONFIG
        echo
        touch /var/lock/subsys/lirc
        ;;
  stop)
        echo -n "Shutting down Infrared Remote Control: "
        killproc lircmd
        killproc lircd
        echo
        rm -f /var/lock/subsys/lirc
        ;;
  status)
        status lircd
        status lircmd
        ;;
  restart)
        $0 stop
        $0 start
        ;;
  *)
        echo "Usage: lirc {start|stop|status|restart}"
        exit 1
esac

exit 0

Create /etc/sysconfig/lirc file:

# Arguments which will be used when launching lircd
LIRCD_ARGS=""

# Run "lircd --driver=help" for a list of supported drivers.
DRIVER="default"
# Check which the name when lirc_serial is loaded
DEVICE="/dev/lirc0"

# lirc_dev will be loaded automatically
MODULES="lirc_serial"
 
#the serial port of your device 
PORT="/dev/ttyS1" 
Try to start lirc now.
Make sure that lirc_serial is loaded i.e. lsmod | grep lirc should produce something similar to:

lirc_serial            16980  1
lirc_dev               17176  3 lirc_serial

 


AC remote signals are more like complete status updates than state relative commands. irrecord will not work with that. Use mode2 -m and for each remote command capture the output in a file. Lircd must be stopped in order for mode2 to work  Remove any blank lines  and the first line if it only contains one number (leave any 6 columns of numbers). Repeat the process for any other states you wish. Capturing under fluorescent light can cause errors so turn off the lights for better results. When you use mode2 lirc should not be running.

Create the /etc/lirc/lircd.conf file and add the data from the previous step inside the raw_codes section. Precede each data block with a name line as shown below.




begin remote

  name  AC
  flags RAW_CODES
  frequency    38000
  gap 107326
    begin raw_codes

      name ON_24
     9115     4427      698     1594      585     1710
      661      460      688      455      585      536
      716      429      585     1708      691     1629
      617     1675      585     1708      688     1606
      689      457      663      455      691      455
      666      455      691     1629      592     1700
      585     1708      610     1681      719      430
      689      429      689      457      666      455
      691      455      689      457      689     1603
      692      429      716     1576      717      429
      589      532      716      430      584      562
      591      530      690      456      689      429
      691      458      688      430      689     1603
      717      432      582      563      590      529
      717      429      691      430      716      430
      691      430      686      460      688      430
      719      429      689      458      663      455
      607      514      716      430      585      535
      717     1601      690      431      690      455
      689      458      665      456      660      458
      691      455      608      512      691      455
      587      534      691      456      690      455
      585      536      691      455      587      531
      692      457      589      530      690      456
      607      538      591      530      691      455
      666      455      691      455      663      456
      690     1604      716      431      605      540
      590      528      694      453      665      456
      690      455      666      455      688      458
      665      453      694      455      691     1601
      691      455      615     1677      608      513
      691      455      589      530      693      455
      605      540      610      509      691      456
      665      455      691      455      666      455
      690      456      665     1627      606     1687
      692

      name ON_25
     9034     4483      663     1629      663     1629
      663      483      587      534      663      483
      587      534      661     1631      663     1657
      663     1629      663     1629      663     1657
      636     1656      635      486      661      485
      636      482      663     1657      668     1624
      587     1708      633     1659      689      457
      635      486      661      485      635      483
      663      483      663     1632      663     1629
      688      458      587      533      687      460
      642      476      663      483      587      559
      589      532      663      483      591      530
      662      484      635      483      663     1632
      662      484      607      538      615      506
      663      484      589      529      663      483
      637      484      688      458      636      484
      663      484      662      484      663      457
      661      485      636      482      608      513
      663     1657      663      455      689      458
      665      481      663      457      664      482
      638      483      608      510      691      455
      587      535      662      483      664      482
      585      536      663      483      585      536
      689      457      587      531      664      482
      608      538      587      534      663      483
      592      529      663      483      638      480
      666     1629      688      458      608      538
      587      534      663      483      589      529
      666      480      638      483      663      482
      639      483      662      484      663     1629
      691      455      614     1678      587      534
      663      483      589      531      664      482
      608      539      639     1653      608      512
      664      483      584      534      665      483
      587      532      690     1602      691     1629
      663

      name OFF
     9144     4425      642     1652      583     1710
      688      430      693      453      663      458
      692      454      607     1685      693     1627
      591     1701      584     1708      691     1603
      692     1601      693      453      638      482
      692      455      605     1687      693     1627
      665     1627      665     1627      591      530
      693      453      665      453      694      455
      605      541      665      453      693      453
      668      452      694      452      666      456
      691      455      665      453      693      455
      692      455      665      452      692      429
      694      453      633      487      691     1627
      668      452      693      453      691      455
      666      456      688      429      694      455
      658      461      692      453      608      513
      691      455      693      453      605      516
      691      455      589      529      693      453
      593     1702      606      512      694      452
      694      455      605      513      695      451
      610      511      693      453      665      455
      692      455      605      541      638      480
      693      456      665      453      693      453
      666      455      691      455      665      455
      691      455      691      456      665      453
      691      430      693      453      661      459
      691      455      606      513      693      455
      691      455      606      513      693      452
      611      510      694      453      637      483
      691      455      633      513      589     1703
      634      487      691     1629      665      453
      661      460      691      455      633      485
      694      453      693      455      606     1686
      689     1603      694     1599      693     1601
      691      455      605      513      694     1626
      666

    end raw_codes

end remote 

The gap value can be any number similar to what I've used, it does not matter since it doesn't apply for AC remotes. If it's too big it will block irsend for a significant amount of time though.

Next step is to try and start lirc. If all goes well you should be able to try sending commands using:

irsend DIRECTIVE REMOTE_NAME CODE_NAME

for instance:

irsend SEND_ONCE AC ON_24