This is Part 2 of an article on Siri integration with a Home Automation system. Part 1 can be found here

The instructions are similar to those in part 1, but are specifically for installing SiriProxy on the Raspberry PI running Debian Wheezy. Follow this section if you’re installing on a Raspberry PI. Refer back to Part 1 for detailed errors and solutions, as well as customization of the proxy server. See Part 3 for integration with Home Automation Systems.

If you want to download a fully installed working version that just needs an IP address change, see the downloads section in Part 1

My Configuration

There’s nothing special about my configuration.

  • iPhone 5 (6.0.2)
  • Raspberry PI Model B (8GB Class 10 SD Card – Also had it working with 2GB Class 2)


An 8GB card is required. If there is sufficient (read: “overwhelming”) demand for a 4GB image I’ll make one.

Connect Raspberry to the network,Monitor/TV, and USB Keyboard (no mouse is required)

Do not apply power until the SD Card is inserted (see below). I power mine from a USB port on my PC while I’m working on it at my desk.

Download Wheezy – 2012-12-16-wheezy-raspbian


Copy to SD Card (I use HDDRawCopy1.02Portable) – does not require any thing like “sys linux”, just insert and copy.

Double-click File and select the extracted .img

Select SD Card

Click Start and click OK to warnings

The copy took about 3 minutes on my PC

Install the SD in the Raspberry PI and power it up.

Linux Configuration

When you power on the Raspberry, the first thing you’ll see is raspi-config

Steps I carried out are as follows. (Step 1 is critical on the Wheezy image):

  1. expand_rootfs
  2. change_locale
  3. change_timezone
  4. ssh (enable)
  5. boot_behaviour (I turned off boot to desktop as I’ll do everything via command prompt and ssh
  6. update

Upon completion you’ll be back in raspi-config

Select finish

You MUST reboot at this point to expand the root filesystem; otherwise, you will run out of disk space installing Ruby.

    sudo reboot

The reboot will take a while, as it has to resize the filesystem

Once it’s back up, login as pi / raspberry again

At this point you should have an IP address if you’re using DHCP. (If not google “Wheezy Static IP”.) For the SiriProxy a DHCP reservation or Static IP should be used.

To find the ipaddress, run


We can now use ssh from our Mac/PC/ (I use TerraTerm)

Login: Username: pi Password: raspberry

Before we start, I’d recommend getting tmux, but feel free to skip. You’ll need this (or something similar), if you plan to start the SiriProxy server in the foreground (so you can see the output) and disconnect the terminal session (without backgrounding the server). This will let you disconnect, reconnect without the server stopping. This install process contains one very long step and I’d recommend running this with tmux in case you get disconnected. It also lets you run several terminal session with a single telnet/ssh login. (See Part 1 for more info)

    sudo apt-get install tmux

I’m also going to create a user called “siri”

    sudo adduser siri

Add to sudo group

    sudo adduser siri sudo

Logout (Ctrl-D) and log back in as user siri

SiriProxy Install

1. Install everything needed for Ruby, RVM, git, etc.

    sudo apt-get install dnsmasq ruby build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0
    libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion

Select ‘y’ to continue.

2. Edit DNS

(You can skip this if your router or other DNS can handle it. See “DNS” below)

    sudo nano /etc/dnsmasq.conf

Find the line starting with: #address=/ (use Ctrl-W to search)
Add a new line redirecting the Apple’s Siri server to your local IP (from ifconfig)


Save and exit (Ctrl-O, Enter, Ctrl-X)

Restart dnsmasq

    sudo /etc/init.d/dnsmasq restart

Test DNS is resolving correctly


Type Ctrl-C as soon as you see an ip address (almost immediately)

This should return Apple’s IP address (I got Apple blocks ICMP, so the pings will timeout just make sure it resolves into a 17.x.y.z address.

3. Install RVM

    bash < <(curl -s

Don’t worry about the warning in red, the next two commands take care of it

Load RVM as a function and update profile

    [[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"
    echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function' >> ~/.bash_profile

(I’d recommend using tmux for this bit)

    rvm install 1.9.3

Don’t worry about this message:

    No binary rubies available for: debian/wheezy_sid/armv6l/ruby-1.9.3-p374.

answer “Y” to all prompts (takes over an hour to run on the Raspberry)

If you get the following error, it’s likely that you ran out of disk space (run “df –k” to check).

    Error running 'make', please read /home/pi/.rvm/log/ruby-1.9.3-p374/make.log
    There has been an error while running make. Halting the installation.

Set Ruby 1.9.3 as default

    rvm use 1.9.3 --default

4. Install the SiriProxy

    git clone git://
    cd SiriProxy

Select ‘y’ to warning to continue.

    mkdir ~/.siriproxy
    cp ~/SiriProxy/config.example.yml ~/.siriproxy/config.yml
    rake install

Takes a while too

5. Generate Certificates

    siriproxy gencerts

6. Install the Certificate on your iPhone

You can use any mechanism to get it to the iphone. As I’m using TerraTerm, I just used SSH SCP (File menu -> SSH SCP…)

Another great alternative (if you’ll be doing a lot of editing on your local machine) is WinSCP:

E-mail the certificate yourself, click it and install on phone (ignore warning about it being untrusted)

7. Bundle

Set a few things in the environment first and create a symbolic link so that rvmsudo works.

    echo 'export rvmsudo_secure_path=1 ' >> ~/.bash_profile
    source ~/.bash_profile
    sudo ln -s ~/.siriproxy /root/.siriproxy
    rvmsudo siriproxy bundle

8. Start the server

    rvmsudo siriproxy server

A message should appear saying something like:

    Starting SiriProxy on
    SiriProxy up and running.

9. Set DNS server on phone

The last step is to point your iPhone at your DNS server. This will be the PI’s IP unless you are using an external DNS server.

  1. Got to Settings -> Wi-Fi
  2. Click the blue arrow next to your connection
  3. Enter the Linux VM’s IP

10. Test

Note: with the current versions you will highly likely receive an InvalidByteSequence error. Don’t panic.See  InvalidByteSequence below. Other errors, and solutions, can be found in Part 1

Try it anyway

Press and hold the home button.

Say the exact phrase “Test Siri Proxy”. It should respond with exactly “Siri Proxy is up and running” and you should see something like this:

    Create server for iPhone connection
    start conn #, @zip_stream=#, @consumed_ace=false, @name="iPhone",
    [Info - Plugin Manager] Plugins laoded: [#>]
    [Info - iPhone] Received Object: LoadAssistant
    [Info - iPhone] Received Object: SetRestrictions
    [Info - iPhone] Received Object: SetRestrictions
    [Info - iPhone] Received Object: ClearContext
    [Info - iPhone] Received Object: SetSessionObjects
    [Info - Guzzoni] Received Object: AssistantLoaded
    [Info - iPhone] Received Object: StartSpeechRequest
    [Info - iPhone] Received Object: SetRequestOrigin
    [Info - User Location] lat: XX.07408038900973, long: -YY.70323611215576
    [Info - iPhone] Received Object: SpeechPacket
    [Info - Guzzoni] Received Object: SetConnectionHeader
    [Info - iPhone] Received Object: SpeechPacket
    [Info - iPhone] Received Object: SpeechPacket
    [Info - iPhone] Received Object: SpeechPacket
    [Info - iPhone] Received Object: SpeechPacket
    [Info - iPhone] Received Object: SpeechPacket
    [Info - iPhone] Received Object: SpeechPacket
    [Info - iPhone] Received Object: SpeechPacket
    [Info - iPhone] Received Object: SpeechPacket
    [Info - iPhone] Received Object: SpeechPacket
    [Info - iPhone] Received Object: SpeechPacket
    [Info - iPhone] Received Object: FinishSpeech
    [Info - Guzzoni] Received Object: SpeechRecognized
    [Info - Plugin Manager] Processing 'Test Siri proxy '
    [Info - Plugin Manager] Processing plugin #
    [Info - Plugin Manager] Matches (?i-mx:test siri proxy)
    [Info - Plugin Manager] Applicable states:
    [Info - Plugin Manager] Current state:
    [Info - Plugin Manager] Matches, executing block
    [Info - Plugin Manager] Say: Siri Proxy is up and running!
    [Info - Plugin Manager] Sending Request Completed

See Known Errors and Fixes


It’s extremely likely that the first time you test, you’ll get an error on the Linux host when you hold down the home button:

    /home/siri/.rvm/gems/ruby-1.9.3-p374@SiriProxy/gems/CFPropertyList-2.2.0/lib/rbBinaryCFPropertyList.rb:217:in `encode': "\xDD" followed by "n" on UTF-8

This seems to be due to CFPropertyList-2.2.0 being downloaded in place of CFPropertyList-2.1.2. I’ve seen various suggestions for a fix (google it). I know this is not the right way to do it, but it worked every time for me (and I’ve done it about 20 times). We’re basically downloading CFPropertyList-2.1.2 and copying its contents to the 2.2.0 directory (Make sure you use the correct home directory in the command below.)

    gem install CFPropertyList -v 2.1.2
    sudo cp -r ~/.rvm/gems/ruby-1.9.3-p374@SiriProxy/gems/CFPropertyList-2.1.2/* ~/.rvm/gems/ruby-1.9.3-p374@SiriProxy/gems/CFPropertyList-2.2.0    
    rvmsudo siriproxy bundle 
    rvmsudo siriproxy server

Shutting down

    sudo halt

Further Info

Now the Siri Proxy is up and running, further examples and Home Automation integration can be found in Part 3