SECTION 4:  PROGRAMMING DETAILS FOR CP290 HOME CONTROL INTERFACE
================================================================

Reference:  X10 CP290 Home Control Interface Programming Guide for
Advanced Programmers

The CP290 Home Control Interface communicates with the host computer via a
simplified RS-232 interface. Serial communication takes place at 600 baud,
eight data bits, no parity, and one stop bit. The reference recommends a
pause of one millisecond between transmitted bytes, although in many
applications this seems not to be required. This probably depends on the
efficiency of the serial communications software used to send data to the
interface.

The serial connector on the CP290 is a five pin DIN connector. As seen
from the back of the interface, the pinouts are as follows:

            5 - no connection  *       *  1 - no connection
          4 - data to computer  *     *  2 - data from computer
                                   *
                             3 - signal ground


There are eight possible commands that the computer can send to the CP290.
Each command starts with 16 hex FF bytes (each 0xff, or eight ones) for
synchronization purposes. These are followed by the command code 0-7 and
then a variable number of bytes as required by the syntax of each command.
The interface requires a checksum of data bytes that follow the command
code (see details for each command for exceptions) as the last byte in a
command.

The interface responds to each command with 6 hex FF bytes (each 0xFF, or
eight ones) for synchronization purposes. This is followed by a status
byte, and depending on the command, other information. The interface
generates a checksum for all bytes following the status byte and sends it
as the last byte in a reply to a command.


COMMAND 0 - SET INTERFACE BASE HOUSE CODE

The CP290 maintains a value called the base house code, which defaults to
house code A on power up. This is equivalent to setting the house code on
other X10 controllers; the eight buttons on the CP290 control units 1-8 on
or off for the base house code. Note that setting the base house code with
this command will clear all data in the interface.

Command syntax (computer to interface):

        bytes 0-15:      1111 1111 - synchronization
                16:      0000 0000 - command 0
                17:      HHHH 0000 - base house code to set

               where HHHH =  0000 - house code M
                             0001             E
                             0010             C
                             0011             K
                             0100             O
                             0101             G
                             0110             A
                             0111             I
                             1000             N
                             1001             F
                             1010             D
                             1011             L
                             1100             P
                             1101             H
                             1110             B
                             1111             J

Return (interface to computer):

        bytes 0-5:      1111 1111- synchronization
                6:      0000 000X - interface status

                where X = 0 - interface has lost all memory
                          1 - interface is OK


COMMAND 1 - SEND DIRECT COMMAND

It is possible to send X10 commands from the computer onto the power line
via the CP290. This is not particularly fast.

Command Syntax (computer to interface):

        bytes 0-15:      1111 1111 - synchronization
                16:      0000 0001 - command 1
                17:      LLLL FFFF - dimming level and function
                18:      HHHH 0000 - house code for this command
                19:      UUUU UUUU - unit codes bitmapped 9-16
                20:      VVVV VVVV - unit codes bitmapped 1-8
                21:      CCCC CCCC - checksum

                where   LLLL = 1111 - dimmest (not quite full off)
                                ... - intermediate brightness values
                               0000 - brightest (not quite full on)

                        FFFF = 0000 - units off (*)
                               0001 - lights on, not appliances (*)
                               0010 - turn on
                               0011 - turn off
                               0100 - if light off, turn on full; in any
                                        case, dim to full off. Responds as
                                        0011 (*)
                               0101 - if light off, turn on full; else
                                        brighten to full; then dim LLLL
                                        (LLLL+1?) steps. Responds as 0100.
                               0110 - if light off, turn on full; else
                                        brighten by LLLL+1 steps. Responds
                                        as 0101. (*)
                               0111 - no obvious effect. Responds as 0110.
                               1000 - no obvious effect.
                               1001 - no obvious effect.
                               1010 - no obvious effect.
                               1011 - no obvious effect.
                               1100 - no obvious effect. Responds as 1011.
                               1101 - no obvious effect. Responds as 1100.
                               1110 - no obvious effect. Responds as 1101.
                               1111 - no obvious effect. Responds as 1110.

                                where (*) indicates behavior undocumented
                                        in the reference

                        HHHH - as for Command 0

                        UUUU UUUU - units bitmapped as
                                9 10 11 12 13 14 15 16

                        VVVV VVVV - units bitmapped as
                                1 2 3 4 5 6 7 8

                        CCCC CCCC - sum of bytes 17-20

Return (interface to computer):

        bytes 0-5:      1111 1111 - synchronization
                6:      0000 000X - interface status
         (pause while X10 command is sent onto power line)
             7-12:      1111 1111 - synchronization
               13:      0000 000X - interface status
               14:      HHHH FFFF - house code and function
               15:      UUUU UUUU - unit codes bitmapped 9-16
               16:      VVVV VVVV - unit codes bitmapped 1-8
               17:      HHHH 0000 - base house code
               18:      CCCC CCCC - sum of bytes 14-17

               where all values are as explained above; response function
                        codes are same as command function codes except as
                        noted


COMMAND 2:  SET INTERFACE CLOCK

This command sets the internal clock in the CP290.

Command syntax (computer to interface):

        bytes 0-15:      1111 1111 - synchronization
                16:      0000 0010 - command 2
                17:      00mm mmmm - minutes 0-59
                18:      000h hhhh - hours 0-23
                19:      0ddd dddd - bitmapped day of week Sun - Mon
                20:      CCCC CCCC - sum of bytes 17-19

                where ddd dddd is day of week bitmapped as
                                Sun Sat Fri Thu Wed Tue Mon

Return (interface to computer):

        bytes 0-5:      1111 1111 - synchronization
                6:      0000 000X - interface status


COMMAND 3a:   SEND TIMER EVENT TO INTERFACE

This command sends a timer event to the interface. The computer can then
be disconnected and the event will be sent over the power line as X10
commands at the appropriate time. Events are stored eight bytes per event
in locations 0-1023 in the 2K RAM inside the interface.

Command syntax (computer to interface):

        bytes 0-15:      1111 1111 - synchronization
                16:      0000 0011 - command 3
                17:      AAAA AAAA - LSB of event address
                18:      0000 00AA - MSB of event address
                19:      NNNN MMMM - mode
                20:      0ddd dddd - bitmapped days Sun - Mon
                21:      000h hhhh - hour 0-23
                22:      00mm mmmm - minute 0-59
                23:      VVVV VVVV - bitmapped unit codes 1-8
                24:      UUUU UUUU - bitmapped unit codes 9-16
                25:      HHHH 0000 - house code for this event
                26:      LLLL FFFF - level and function
                27:      CCCC CCCC - sum of bytes 19-26

                where    0000 00AA AAAA AAAA (bytes 18 and 17) =

                         0000 0000 0000 0000 for event 0
                         0000 0000 0000 0100 for event 1
                         0000 0000 0000 1000 for event 2
                         .... (increases by 8 for each event)
                         0011 1111 1111 1100 for event 127


                         MMMM = 0000 - clear
                                0001 - ?
                                0010 - tomorrow only then clear
                                0011 - ?
                                0100 - today only then clear
                                0101 - ?
                                0110 - ?
                                0111 - ?
                                1000 - at exact time
                                1001 - at approximate time
                                1010 - ?
                                1011 - ?
                                1100 - ?
                                1101 - ?
                                1110 - ?
                                1111 - ?

                         NNNN = MMMM                  - program event
                         NNNN = MMMM = 0000           - clear event
                         NNNN not = 0000; MMMM = 0000 - store event but
                                   put it on hold (will not take place)

        Actually, setting for NNNN and MMMM is a bit vague. The reference
        indicates that NNNN = 0 and MMMM is function code as shown above.
        The software provided with the CP290 uses NNNN = MMMM except when
        "freezing" an event (deactivating it, but not erasing it). Frozen
        events also have UUUU UUUU = VVVV VVVV = 0. It's not clear how a
        frozen event knows what units it is to control. Not clearing the
        unit mask confuses the standard CP290 software...

Return (interface to computer):

        bytes 0-5:      1111 1111 - synchronization
                6:      0000 000X - interface status


COMMAND 3b:  SEND "GRAPHICS DATA" TO INTERFACE

In the 2K RAM of the interface, locations 1024 through 1535 are accessible
from the external computer, but are not used for events or any other
purpose by the interface. In the CP290 these are referred to as the
locations for graphics data. For each of 256 possible units, the memory
locations could be used to indicate (under control of an external program)
the on/off condition of a unit, or the type of unit it is (possibly an
index to a graphics icon). This command writes data from the computer two
bytes at a time to these memory locations in the interface.

Command syntax (computer to interface):

        bytes 0-15:     1111 1111 - synchronization
                16:     0000 0011 - command 3
                17:     AAAA AAA0 - LSB of data address
                18:     0000 0AAA - MSB of data address
                19:     GGGG GGGG - data byte 0
                20:     GGGG GGGG - data byte 1
                21:     CCCC CCCC - sum of bytes 19 and 20

                where   0000 0AAA AAAA AAAA(bytes 18 and 17) =

                        0000 0100 0000 0000 for data pair 0
                        0000 0100 0000 0010 for data pair 1
                        ... (increases by 2 for each subsequent data pair)

                        GGGG GGGG - can be anything relevant to the
                                        external program, since this data
                                        is not used by the interface

Return (interface to computer):

        bytes 0-5:      1111 1111 - synchronization
                6:      0000 000X - interface status


COMMAND 4:  GET CLOCK TIME AND BASE HOUSE CODE FROM INTERFACE

This command reads the time from the internal interface clock and also gets
the current base house code. It is an innocuous way of testing for the
presence of the interface, and to see if it has lost its memory since the
last time events were downloaded to it. If there is no reply to this
command after several seconds, the computer could assume that the interface
was not (properly) connected.

Command syntax (computer to interface):

        bytes 0-15:     1111 1111 - synchronization
                16:     0000 0100 - command 4

Return (interface to computer):

        bytes 0-5:      1111 1111
                6:      0000 000X - interface status
                7:      00mm mmmm - minute (0-59)
                8:      000h hhhh - hour (0-23)
                9:      0ddd dddd - bitmapped days Sun - Mon
               10:      HHHH 0000 - base house code
               11:      CCCC CCCC - sum of bytes 7-10


COMMAND 5:  GET TIMER EVENTS FROM INTERFACE

This command requests the interface to send to the computer the events that
it has stored in its memory.

Command syntax (computer to interface):

        bytes 0-15:     1111 1111 - synchronization
                16:     0000 0101 - command 5

Return (interface to computer):

        bytes 0-5:      1111 1111
                6:      0000 000X - interface status
                for( event = 0 ; event < 128 ; event = event+1 )
                {
                   if( event is not erased )
                   {
                         7:     NNNN MMMM - mode
                         8:     0ddd dddd - bitmapped days Sun - Mon
                         9:     000h hhhh - hour 0-23
                        10:     00mm mmmm - minute 0-59
                        11:     VVVV VVVV - bitmapped unit codes 1-8
                        12:     UUUU UUUU - bitmapped unit codes 9-16
                        13:     HHHH 0000 - house code for this event
                        14:     LLLL FFFF - level and function
                    }
                    else
                         7:     1111 1111 - indicates event in that
                                                location is erased
                }
        last byte:   CCCC CCCC - sum of all bytes for valid events
                                        starting with byte 7; does not
                                        include the 1111 1111 for locations
                                        where event has been erased


COMMAND 6:  GET "GRAPHICS DATA" FROM INTERFACE

This command requests the interface to send the "graphics data" that it has
stored in its memory. See COMMAND 3b above. Graphics data is not used in
any way by the interface.

Command syntax (computer to interface):

        bytes 0-15:     1111 1111 - synchronization
                16:     0000 0110 - command 6

Return (interface to computer):

        bytes 0-5:      1111 1111
                6:      0000 000X- status
                for( unit = 0 ; unit < 256 ; unit = unit+1 )
                {
                   if( graphics data for unit has been stored )
                   {
                        7:      GGGG GGGG
                        8:      GGGG GGGG
                   }
                   else
                        7:      1111 1111
                }
        last byte:      CCCC CCCC - sum of all data pairs for all units
                                        starting with byte 7; excludes the
                                        single 1111 1111s in cases where
                                        data for that unit has not been
                                        stored

COMMAND 7:  DIAGNOSTIC

This command tells the interface to run a self-check on its hardware and
firmware. Pin 4 on the interface goes low for 10 seconds; this may
generate extraneous characters that are detected by the attached computer.
At the end of this time, the interface sends its status if it can. Note
that this command will scramble or clear any data stored in the interface.

Command syntax (computer to interface):

        bytes 0-15:     1111 1111
                16:     0000 0111 - command 7

Return (interface to computer):

        bytes ?:        extraneous characters for 10 seconds
            0-5:        1111 1111 - synchronization
              6:        0000 000T - test status

             where 0000 000T = 0 - interface is OK
                               1 - interface has a fault


KEYBOARD COMMANDS

If X10 commands are sent using the keys on the top of the CP290, the
interface will send a report to the computer so it can keep track of the
status of units.

Report (interface to computer):

              0-5:      1111 1111 - synchronization
                6:      0000 000X - interface status
                7:      HHHH FFFF - house code and function
                8:      UUUU UUUU - unit codes bitmapped 9-16
                9:      VVVV VVVV - unit codes bitmapped 1-8
               10:      HHHH 0000 - base house code
               11:      CCCC CCCC - sum of bytes 14-17

                where FFFF is the function return code described for
                        Command 1 (SEND COMMAND DIRECT)


TIMED EVENTS

When the CP-290 sends X10 commands in accordance with an event programmed
into it, it will send a report to the computer so the computer can keep
track of the status of units. This report is in the same format as the
report for keyboard commands described above.


Comments to the Webmaster are always welcomed, please use this contact form.