Monday, February 22, 2010

Linux Voice Recognition and Speech Home Automation

Here is a video I made for the Syno contest:



Please read more!!


I was able to successfully cross-compile and run Julius Voice Recognition Engine on my Synology DS209.
http://julius.sourceforge.jp/en_index.php
http://voxforge.org/home/downloads#QuickStart%20Anchor

I am working on trying to compile Festival w/ MBROLA engine in place of Flite for better TTS voices. I am also looking at Cepstral and AT&T Natural Voices.
http://www.cstr.ed.ac.uk/projects/festival/
http://tcts.fpms.ac.be/synthesis/mbrola.html
http://cepstral.com/
http://www.voiceforge.com/demo/
http://www2.research.att.com/~ttsweb/tts/demo.php


Another good program to look at would be DomotiGa + Gambas for linux HA.
http://www.domotiga.nl/

Flite TTS on a Synology NAS

I was able to successfully cross compile a text-to-speech engine called Flite which is very lightweight to run on my DS209j. This means you can use HEYU or Misterhouse to output speech upon an event.

http://www.speech.cs.cmu.edu/flite/

Here is my config file generated from running configure:


root@xubuntu-vm:/usr/local/flite-1.3-release# cat config/config
# -*- makefile -*-
#
# This file is automatically generated by configure.
# Do not hand edit.

TARGET_OS    = linux-gnu
TARGET_CPU   = powerpc
HOST_OS    = linux-gnu
HOST_CPU   = powerpc

CC       = /usr/local/powerpc-linux/bin/powerpc-linux-gcc
CFLAGS   = -I/usr/local/powerpc-linux/include -Wall
CPPFLAGS = 
DEFS     = -DWORDS_BIGENDIAN=1
#DEFS     = -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DWORDS_BIGENDIAN=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1   # we don't use these anywhere
SHFLAGS  = 

AR       = /usr/local/powerpc-linux/bin/powerpc-linux-ar
RANLIB   = /usr/local/powerpc-linux/bin/powerpc-linux-ranlib
INSTALL  = /usr/bin/install -c

M68KCC   = 

AUDIODRIVER = oss
AUDIODEFS   = -DCST_AUDIO_LINUX
AUDIOLIBS   = 

LEXDEFS = 
VOXDEFS = 

OTHERLIBS = 

MMAPTYPE    = posix
STDIOTYPE   = stdio

FL_LANG  = usenglish
FL_VOX   = cmu_us_kal16
FL_LEX   = cmulex

prefix        = /usr/local
exec_prefix   = ${prefix}
EXEEXT       = 
INSTALLBINDIR = ${exec_prefix}/bin
INSTALLLIBDIR = ${exec_prefix}/lib
INSTALLINCDIR = ${prefix}/include/flite

Misterhouse on Synology NAS

Misterhouse:
http://misterhouse.sourceforge.net/

I've confirmed that misterhouse does work with /dev/usb/ttyUSB0.

I recommend unzipping Misterhouse in /usr/local

DiskStation> cd /usr/local
DiskStation> gunzip < /volume1/Downloads/misterhouse-2.105.tar.gz | tar xvf -
Make sure you run the configure which uses h2ph. h2ph is just a perl script, but you have to make sure you download the your systems GPL source from Synology and change one line in the Misterhouse configure script:
#cd /usr/include
cd /usr/local/powerpc-linux/include 
When you run the script it will remove all Windows files and will use the C header files to produce Perl header files ending in .ph Follow this: http://misterhouse.sourceforge.net/install.html#quick_install_instructions and this: http://misterhouse.sourceforge.net/install.html#unix_detailed_install_instructions In /usr/local/mh/bin create a file called mh.private.ini and add these basic entries:
sound_program=
latitude=12.345678
longitude=-123.456789
time_zone=-8
city=YourCity
zone=SomeMajorCityNearYou
state=YourStateAbbreviation
zip_code= 12345
dbi_user=mhuser
dbi_password=SomePassword
voice_text=
cm11_port=/dev/ttyUSB0
tk=0
Now when you start Misterhouse do something like this to run it in the background and have its output go to some logfile:
DiskStation> cd /usr/local/mh/bin
DiskStation> ./mhl & > /var/log/mh.out
Now you should be able to go to http://192.168.x.x:8080 and access Misterhouse. Please read the Misterhosue docs from here...

CM11a, Heyu, and domus.Link running on Synology NAS

I have an old HD11a which is just a re-branded CM11a, and I verified that it does work through the usb/serial converter I have.

Using optware ipkg (ipkg is a must!) I was able to install HEYU. They also have one called Ppower or Penguin Power, which I assume would also work:


DiskStation> ipkg list | grep "home automation"
heyu - 2.8.0-1 - X10 home automation control using the CM11A
ppower - 0.1.5-1 - Ppower, short for 'Penguin Power', is a piece of software for controlling x10 home automation equipment connected to the comput



domus.Link PHP frontend for HEYU


I wasn't too excited about cgi/perl scripts, but I found what I think is one of the only PHP front ends which runs perfectly on the Syno after slight tweaking of the php.ini file.

domus.Link
http://domus.link.co.pt/

I was even able to create a 3rd-Party applications node for it to run embedded in the web manager.
DiskStation> pwd
/usr/syno/synoman/webman/3rdparty
DiskStation> ls -laR domusLink/
domusLink/:
drwxr-xr-x    2 root     root         4096 Dec 23 00:53 .
drwxr-xr-x    3 root     root         4096 Dec 23 00:33 ..
-rw-r--r--    1 root     root          198 Dec 23 01:01 application.cfg
lrwxrwxrwx    1 root     root           44 Dec 23 00:53 images -> /volume1/web/domus.Link/theme/default/images

DiskStation> cat application.cfg 
text_enu = domus.Link
description_enu = domus.Link - Home Automation Interface
type = embedded
protocol = https
port = 443 
path = /domus.Link
icon_16 = images/menu_home_on.png
icon_32 = images/menu_home_on.png


Cross-Compiling Bottlerocket for CM17a Firecracker on Synology

Cross-Compiling Bottlerocket, which uses the Firecracker CM17a:
http://www.linuxha.com/bottlerocket/

Following the 3rd-party app integration guide; configure, make, make install. This puts it in your local machines /usr/local/bin. You then have to upload the program 'br' to your Synology in the same directory.

Set your cross-compiling environment variables to point to the toolchain you installed in /usr/local:
root@xubuntu-vm:/usr/local/bottlerocket-0.04c# export CC=/usr/local/powerpc-linux/bin/powerpc-linux-gcc
root@xubuntu-vm:/usr/local/bottlerocket-0.04c# export LD=/usr/local/powerpc-linux/bin/powerpc-linux-ld
root@xubuntu-vm:/usr/local/bottlerocket-0.04c# export RANLIB=/usr/local/powerpc-linux/bin/powerpc-linux-ranlib
root@xubuntu-vm:/usr/local/bottlerocket-0.04c# export CFLAGS="-I/usr/local/powerpc-linux/include"
root@xubuntu-vm:/usr/local/bottlerocket-0.04c# export LDFLAGS="-L/usr/local/powerpc-linux/lib"

Run the configure that came with the code giving it a few extra parameters as specified in the guide:
root@xubuntu-vm:/usr/local/bottlerocket-0.04c# ./configure \
> --host=powerpc-unknown-linux \
> --target=powerpc-unknown-linux \
> --build=i686-pc-linux \
> --prefix=/usr/local
creating cache ./config.cache
checking for gcc... /usr/local/powerpc-linux/bin/powerpc-linux-gcc
checking whether the C compiler (/usr/local/powerpc-linux/bin/powerpc-linux-gcc -I/usr/local/powerpc-linux/include -L/usr/local/powerpc-linux/lib) works... yes
checking whether the C compiler (/usr/local/powerpc-linux/bin/powerpc-linux-gcc -I/usr/local/powerpc-linux/include -L/usr/local/powerpc-linux/lib) is a cross-compiler... yes
checking whether we are using GNU C... yes
checking whether /usr/local/powerpc-linux/bin/powerpc-linux-gcc accepts -g... yes
checking how to run the C preprocessor... /usr/local/powerpc-linux/bin/powerpc-linux-gcc -E
checking for a BSD compatible install... /usr/bin/install -c
checking for features.h... yes
checking for errno.h... yes
checking for sys/termios.h... yes
checking for termios.h... yes
guessing x10 port
using /dev/ttyS0 for x10 port
updating cache ./config.cache
creating ./config.status
creating Makefile
creating config.h

Run make:
root@xubuntu-vm:/usr/local/bottlerocket-0.04c# make
/usr/local/powerpc-linux/bin/powerpc-linux-gcc -I/usr/local/powerpc-linux/include -I. -Wall  -O2 -DX10_PORTNAME=\"/dev/ttyS0\" -DHAVE_CONFIG_H -c ./br_cmd.c
/usr/local/powerpc-linux/bin/powerpc-linux-gcc -I/usr/local/powerpc-linux/include -I. -Wall  -O2 -DX10_PORTNAME=\"/dev/ttyS0\" -DHAVE_CONFIG_H -c ./br.c
/usr/local/powerpc-linux/bin/powerpc-linux-gcc -I/usr/local/powerpc-linux/include -I. -Wall  -O2 -DX10_PORTNAME=\"/dev/ttyS0\" -DHAVE_CONFIG_H -o br br.o br_cmd.o

Run 'make install' which installs it in /usr/local/bin on your local machine:
root@xubuntu-vm:/usr/local/bottlerocket-0.04c# make install
/usr/bin/install -c -d -m 755 /usr/local/bin
/usr/bin/install -c -m 555 br /usr/local/bin

Now copy the file /usr/local/bin/br to your synology in the same directory.


Once that is running, you issue commands as such:
DiskStation> cd /usr/local/bin/
DiskStation> ./br
BottleRocket version 0.04c

Usage: ./br [][()  ...]

  Options:
  -v, --verbose   add v's to increase verbosity
  -x, --port=PORT  set port to use
  -c, --house=[A-P]  use alternate house code (default "A")
  -n, --on=LIST   turn on devices in LIST
  -f, --off=LIST  turn off devices in LIST
  -N, --ON   turn on all devices in housecode
  -F, --OFF   turn off all devices in housecode
  -d, --dim=LEVEL[,LIST] dim devices in housecode to  relative LEVEL
  -B, --lamps_on  turn all lamps in housecode on
  -D, --lamps_off  turn all lamps in housecode off
  -r, --repeat=NUM  repeat commands NUM times (0 = ~ forever)
  -h, --help   this help

  is a comma separated list of devices (no spaces),
  each ranging from 1 to 16
 is an integer from -12 to 12 (0 means no change)
 is a letter between A and P
 is one of ON, OFF, DIM, BRIGHT, ALL_ON, ALL_OFF,
  LAMPS_ON or LAMPS_OFF

For native commands,  should only be specified for ON or OFF.

DiskStation> ./br -x /dev/ttyUSB0 -v M3 OFF
./br:  Turning off appliance M3
DiskStation> ./br -x /dev/ttyUSB0 -v M3 ON 
./br:  Turning on appliance M3
DiskStation> ./br -x /dev/ttyUSB0 -v M3 OFF
./br:  Turning off appliance M3
DiskStation> ./br -x /dev/ttyUSB0 -v C1 ON 
./br:  Turning on appliance C1
DiskStation> ./br -x /dev/ttyUSB0 -v C1 OFF
./br:  Turning off appliance C1
DiskStation> ./br -x /dev/ttyUSB0 -v C1 ON 
./br:  Turning on appliance C1
DiskStation> ./br -x /dev/ttyUSB0 -v C3 ON
./br:  Turning on appliance C3
DiskStation> ./br -x /dev/ttyUSB0 -v C3 OFF
./br:  Turning off appliance C3
DiskStation> ./br -x /dev/ttyUSB0 -v C3 ON 
./br:  Turning on appliance C3
DiskStation> ./br -x /dev/ttyUSB0 -v C1 OFF
./br:  Turning off appliance C1
DiskStation> ./br -x /dev/ttyUSB0 -v C3 OFF
./br:  Turning off appliance C3
DiskStation> ./br -x /dev/ttyUSB0 -v C LAMPS_ON
DiskStation> ./br -x /dev/ttyUSB0 -v C LAMPS_OFF
DiskStation> ./br -x /dev/ttyUSB0 -v C1 ON      
./br:  Turning on appliance C1
DiskStation> ./br -x /dev/ttyUSB0 -v -d25 C1   
./br:  For dimming either specify just a dim level or a comma
separated list containing the dim level and the devices to dim.
./br:  Valid dimlevels are numbers between -12 and 12.
DiskStation> ./br -x /dev/ttyUSB0 -v -d6 C1 
BottleRocket version 0.04c

Usage: ./br [][()  ...]

  Options:
  -v, --verbose   add v's to increase verbosity
  -x, --port=PORT  set port to use
  -c, --house=[A-P]  use alternate house code (default "A")
  -n, --on=LIST   turn on devices in LIST
  -f, --off=LIST  turn off devices in LIST
  -N, --ON   turn on all devices in housecode
  -F, --OFF   turn off all devices in housecode
  -d, --dim=LEVEL[,LIST] dim devices in housecode to  relative LEVEL
  -B, --lamps_on  turn all lamps in housecode on
  -D, --lamps_off  turn all lamps in housecode off
  -r, --repeat=NUM  repeat commands NUM times (0 = ~ forever)
  -h, --help   this help

  is a comma separated list of devices (no spaces),
  each ranging from 1 to 16
 is an integer from -12 to 12 (0 means no change)
 is a letter between A and P
 is one of ON, OFF, DIM, BRIGHT, ALL_ON, ALL_OFF,
  LAMPS_ON or LAMPS_OFF

For native commands,  should only be specified for ON or OFF.

DiskStation> ./br -x /dev/ttyUSB0 -v -cC -d6,1
./br:  Brightening lamp C1 by 6.
DiskStation> ./br -x /dev/ttyUSB0 -v -cC -d-6,1
./br:  Dimming lamp C1 by 6.
DiskStation> ./br -x /dev/ttyUSB0 -v -cC -d6,3 
./br:  Brightening lamp C3 by 6.
DiskStation> ./br -x /dev/ttyUSB0 -v -cC -d-3,3
./br:  Dimming lamp C3 by 3.
DiskStation> ./br -x /dev/ttyUSB0 -v -cC -d-3,3
./br:  Dimming lamp C3 by 3.
DiskStation> ./br -x /dev/ttyUSB0 -v -cC -d-3,2
./br:  Dimming lamp C2 by 3.
DiskStation> ./br -x /dev/ttyUSB0 -v -cC -d3,2 
./br:  Brightening lamp C2 by 3.
DiskStation> ./br -x /dev/ttyUSB0 -v C LAMPS_OFF

Home Automation on Synology NAS

I am the proud owner of a Synology DS209j NAS. This NAS has firmware that allows much more than just storage. While I only wanted one computer on 2/47 in the house. I also wanted a home automation server. Unfortunately, the Synology NAS devices weren't intended to be home automation servers. Therefore, a lot of modification has been required to get it to act as a home automation server. These next few posts have been up in the Synology forum for a while now, but I wanted to add my work to my own blog so please click 'read more' to expand this post...


http://forum.synology.com/enu/viewtopic.php?f=27&t=19788#p81040

I have a Synology DS209j, and I'll always run the latest firmware.

I've installed Xubuntu 9.04 in a virtual machine on my mac.

Following this page:
http://www.synology.com/us/support/3rd-party_application_integration.php

There is a document:
http://download.synology.com/download/ds/userguide/Synology%20NAS%20Server%203rd-Party%20Apps%20Integration%20Guide.pdf

Following the document I've downloaded the latest toolchain from Synology as well as the latest GPL source:
http://www.synology.com/us/gpl/index.php

As far as usb to serial hardware goes, I am using this product from Parallax as it give you proper RS232 levels and is very affordable:
http://www.parallax.com/tabid/768/ProductID/378/Default.aspx

From that page I followed the link to the external FTDI drivers for linux.

I renamed the ftdi_sio header and c file to .orig and placed these new files in their location in the synology source. From their I followed the document and made the modules.



Now i've got usbserial.ko and ftdi_sio.ko somewhere on my DS209j

Now you have to load the modules into the kernel and create the devices:
insmod usbserial.ko
insmod ftdi.ko
mknod /dev/usb/ttyUSB0 c 188 0
mknod /dev/usb/ttyUSB1 c 188 1

Also, add some lines like these to /etc/rc.local to make it persistent over reboot:
insmod /volume1/archive/usbserial.ko
insmod /volume1/archive/ftdi_sio.ko
mknod /dev/usb/ttyUSB0 c 188 0
mknod /dev/usb/ttyUSB1 c 188 1

run the command 'dmesg' and you should see something like this:
usb 1-2.1: new full speed USB device using ehci_hcd and address 15
usb 1-2.1: configuration #1 chosen from 1 choice
ftdi_sio 1-2.1:1.0: FTDI USB Serial Device converter detected
drivers/usb/serial/ftdi_sio.c: Detected FT232RL
drivers/usb/serial/ftdi_sio.c: Number of endpoints 2
drivers/usb/serial/ftdi_sio.c: Endpoint 1 MaxPacketSize 16384
drivers/usb/serial/ftdi_sio.c: Endpoint 2 MaxPacketSize 16384
drivers/usb/serial/ftdi_sio.c: Setting MaxPacketSize 16384
usb 1-2.1: FTDI USB Serial Device converter now attached to ttyUSB0

The X-10 device I got working for now is known as the Firecracker CM17a, and the HD11A/CM11A 2-way computer interface

Sunday, January 31, 2010

I got one of these to help me map the circuits in my house for X10 use. With this you can do it without turning the power off to see what is on what circuit.