karlentwistle / ruby_home

Ruby HAP Server - HomeKit support for the Rubyist

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Error running sample accessory

lazyatom opened this issue · comments

I'm trying to get up and running with ruby_home, but struggling to get off the ground. My iOS device is an iPhone X running iOS 12.0.1. I've run the bin/rubyhome script, and see this output:

$ bin/rubyhome                              
Please enter this code with your HomeKit app on your iOS device to pair with RubyHome
                       
    ┌────────────┐     
    │ 150-11-185 │    
    └────────────┘     
                       
Listening on 0.0.0.0:4567

At this point, I tap to add a new HomeKit accessory on my iPhone, and see "RubyHome", so I add that and give the code above. This is the terminal output after that:

*** 192.168.0.49:60726 connected
[2018-11-06 15:21:55] INFO  WEBrick 1.4.2
[2018-11-06 15:21:55] INFO  ruby 2.5.1 (2018-03-29) [x86_64-darwin17]
192.168.0.49 - - [06/Nov/2018:15:21:55 +0000] "POST /pair-setup HTTP/1.1" 200 409 0.0915
192.168.0.49 - - [06/Nov/2018:15:22:01 +0000] "POST /pair-setup HTTP/1.1" 200 69 0.0442
192.168.0.49 - - [06/Nov/2018:15:22:01 +0000] "POST /pair-setup HTTP/1.1" 200 140 0.0036
*** 192.168.0.49:60726 disconnected
*** 192.168.0.49:60727 connected
192.168.0.49 - - [06/Nov/2018:15:22:02 +0000] "POST /pair-verify HTTP/1.1" 200 140 0.0047
192.168.0.49 - - [06/Nov/2018:15:22:02 +0000] "POST /pair-verify HTTP/1.1" 200 3 0.0012
- - - [06/Nov/2018:15:22:02 +0000] "GET /accessories HTTP/1.1" 200 2138 0.0040
E, [2018-11-06T15:22:02.454241 #56017] ERROR -- : undefined method `write' for "":String (NoMethodError)
/Users/james/.rubies/ruby-2.5.1/lib/ruby/2.5.0/webrick/httpresponse.rb:298:in `send_header'
/Users/james/.rubies/ruby-2.5.1/lib/ruby/2.5.0/webrick/httpresponse.rb:210:in `send_response'
/Users/james/Code/experiments/ruby_home/lib/ruby_home/hap/hap_response.rb:14:in `send_response'
/Users/james/Code/experiments/ruby_home/lib/ruby_home/hap/server.rb:62:in `read'
/Users/james/Code/experiments/ruby_home/lib/ruby_home/hap/server.rb:33:in `block in accept'
/Users/james/Code/experiments/ruby_home/lib/ruby_home/hap/server.rb:21:in `block (2 levels) in run'
/Users/james/Code/experiments/ruby_home/lib/ruby_home/hap/server.rb:21:in `select'
/Users/james/Code/experiments/ruby_home/lib/ruby_home/hap/server.rb:21:in `block in run'
/Users/james/Code/experiments/ruby_home/lib/ruby_home/hap/server.rb:20:in `loop'
/Users/james/Code/experiments/ruby_home/lib/ruby_home/hap/server.rb:20:in `run'
/Users/james/Code/experiments/ruby_home/lib/ruby_home.rb:32:in `block in start'
*** 192.168.0.49:60727 disconnected

On the phone it shows an error message: "Couldn't add RubyHome - Home couldn't connect to this accessory".

I've tried the other examples from the README, and get the same results. I'd really love to get this working -- anything I can do to help debug it, please let me know.

Hey @lazyatom sorry to hear RubyHome isn't working for you.

A couple of suggestions. Can you please reset the server by deleting the files accessory_info.yml and identifier_cache.yml

After you've done that could you please try running again with

DEBUG=true bin/rubyhome 

This will give a more verbose output. If you still receive an error please copy and paste the full stack trace.

Cheers

I've been clearing those files; same result with DEBUG=true, but here's the full trace output:

$ DEBUG=true bin/rubyhome                   
Please enter this code with your HomeKit app on your iOS device to pair with RubyHome
                       
    ┌────────────┐     
    │ 882-50-725 │    
    └────────────┘     
                       
Listening on 0.0.0.0:4567
*** 192.168.1.99:61095 connected
[2018-11-06 18:30:19] INFO  WEBrick 1.4.2
[2018-11-06 18:30:19] INFO  ruby 2.5.1 (2018-03-29) [x86_64-darwin17]
D, [2018-11-06T18:30:19.900209 #56241] DEBUG -- : Cache
D, [2018-11-06T18:30:19.900281 #56241] DEBUG -- : {:controller_to_accessory_count=>0, :accessory_to_controller_count=>0}
D, [2018-11-06T18:30:19.901016 #56241] DEBUG -- : Request
D, [2018-11-06T18:30:19.901056 #56241] DEBUG -- : {:method=>0, :state=>1}
D, [2018-11-06T18:30:19.959471 #56241] DEBUG -- : Response
D, [2018-11-06T18:30:19.959592 #56241] DEBUG -- : {:salt=>"$\x86\f9\xAC\xF3\xBE\xA93\xE5d&v^\xFA7", :public_key=>"\x85\x15\x86\xCB\x844l\xE3\xFF\xFE\xB9\xE7\x0E\v(p\x83}\xE5\x19 \xCEA\ne\x80m\xE7\x842{\xDC\xC2\x9DC\xCF\xE5\x1A\xD5\x85\xF1\xCE\xD12h\xBE\xE5`\x9B\a\xDD\xA7F\xFE\x9Cs\xE8&,\xC7\n.Qs\x97~$>\x93\xEAG\xF7\x8AhQW\b\xE4r))\xD7Z/E2\x8B\xE9\xB0\xC1\xE5)\xFAk\xF8\v\x89\xF8v\xA8\xD2\x84\xE3kJ}\x18\x19\x15zq!\x90STx\xEDDo\xCFi\xE6\x14\x04+\xD2\xD3\xCE\xFE]\x7Fj|\xDC\xCA\xFA\xBD\x9B?\xE4l1!\t\xC5pP\xE4\xAB\xD3\xD5v\x03\xD6&\xF1\xE0qF=O\xA4xE\xC4zvT8\xD6\x19Ut\xA2\xA4\xA2\x873|\xE6\xBD7\xFF?\xEB<w\x0E\x9Bz\xA7\xCF\n\xEB\xB8)\x8Amlr\r\x8C\xDE\xA2\xD9\xBE\xCF\x05\xE6\xB0}\x86\a\x90\xC8MT\xB2\xDC\xE9|\xCC@\x88\v\xE0\xFCs\xA9!\xCB5C\x01\x12\xFB\x90\x84\xD2\xB0\x10\xC6{\x03\n\xCF\x1C\xF6\x91\x1F\xD6\xD0\xB0\x90\x95!\x1Eg\xF5\xF2Ef\xD7%f\x91\xE5S\x82>X\xD0Y\xF8\tG@\xB1\x9DY\xBE*\xDA\xC8\x1DX.Z\xF2\xBD\x00\x11!\xDEY\xB2\xD3\xA3\x90\xFB\xCA\v\r\x1F\xDE\xBEY\x19`:\xBA\xA8\r\n\\\e\a\x98\t\xA5\x13c3>M\x96#\xDD\xA8\xC4I\xC7\xB8*\x83\x90\xD7;\x8F\xC7\x8E\xD5dp\xB7\f+\xBB\x98(ux\xA1\xBF{qq\xBA\xF3Q\xB1\xA8\xC9\x91%\x8A\xBF\xE1Z\"\x91\xE46\x86\f\xB2v#\x1C\xB5\xB4j\xCA\x9F", :state=>2}
192.168.1.99 - - [06/Nov/2018:18:30:19 +0000] "POST /pair-setup HTTP/1.1" 200 409 0.0704
D, [2018-11-06T18:30:27.456291 #56241] DEBUG -- : Cache
D, [2018-11-06T18:30:27.456374 #56241] DEBUG -- : {:controller_to_accessory_count=>0, :accessory_to_controller_count=>0, :srp_session=>{:B=>"851586cb84346ce3fffeb9e70e0b2870837de51920ce410a65806de784327bdcc29d43cfe51ad585f1ced13268bee5609b07dda746fe9c73e8262cc70a2e5173977e243e93ea47f78a68515708e4722929d75a2f45328be9b0c1e529fa6bf80b89f876a8d284e36b4a7d1819157a712190535478ed446fcf69e614042bd2d3cefe5d7f6a7cdccafabd9b3fe46c312109c57050e4abd3d57603d626f1e071463d4fa47845c47a765438d6195574a2a4a287337ce6bd37ff3feb3c770e9b7aa7cf0aebb8298a6d6c720d8cdea2d9becf05e6b07d860790c84d54b2dce97ccc40880be0fc73a921cb35430112fb9084d2b010c67b030acf1cf6911fd6d0b09095211e67f5f24566d7256691e553823e58d059f8094740b19d59be2adac81d582e5af2bd001121de59b2d3a390fbca0b0d1fdebe5919603abaa80d0a5c1b079809a51363333e4d9623dda8c449c7b82a8390d73b8fc78ed56470b70c2bbb98287578a1bf7b7171baf351b1a8c991258abfe15a2291e436860cb276231cb5b46aca9f", :b=>"6f435e090e6cec216eb3633e33c86862dcae67f4620f6d9c45f42ebf446e4dbb", :I=>"Pair-Setup", :s=>"24860c39acf3bea933e56426765efa37", :v=>"46a04371af3ca5283870a5456b12bd8e60752fe23438c1a784396dd3ae4330a5ca79b7da68dbb1b24e3e7a2f5c4ed44bdfab86692dd20aff137420992d2c2acd6d7a8cc33d8e5a4eb4f2f1bcaed676862f2fae58d76a580e28ea74ac2ff4d7ea2d2dc9cc5b05f624fd359b171c5c69c42455d10a8ecb09cfa1009183b9885e1300936fb8e5bdee57e39da067bf27d631182a26819337e59c0e7ec5b38d64704d5ccf98b1c799b5d66d57cdb5a412ef195f8fdc6c984e36fdb55de07d9536f6ddffc4cc86ae1b052c8ac1d69f1f11852b70cc1ea7b80b62283ffbef059262317cde4d4b91eb4b3969213d9bd61f7df67aa4820b084336da1d6bf9b126c91211946eaf2328394f839c5ac0bf713a578683d49e4c80d723b9534ea111f480c987a325ead2ff213a43135bc3dcca04b85e156cd3b45bc2ff1e054cb37a22cb5d48aad9f939447fdc5162b5c169c798257de1311b2ed45e807949c8db47b5ded77956207b52e0df7872eadd106e39c2601c653b2c2e560ae31b09b436ef173b7d78cd"}}
D, [2018-11-06T18:30:27.457094 #56241] DEBUG -- : Request
D, [2018-11-06T18:30:27.457181 #56241] DEBUG -- : {:state=>3, :public_key=>"f\xF8\xAD\n\xB4\x9B\x84\xF5\xD4\x97\xB8\x16.D\xDDi\x01\xAE8\x05\xF2#\xE1\xB4\xFB^v\xEB)\xE1 \x93\x81*\xFB}\xBD\x80\x04\xE7\x01C\xC1g\xAE_\e#\xD0\xB4\xB9\v\x82\xF0\x915\xC7\xD5E\xBF\xAD\x8A\xB7%T\xCB\x045\xAC\xCF\x14\x05oH.G\xF7xr\xB9\xB7p\x9E'\xDEg\xE30\xDD6\x84\xE6\x86A\xDF\x9F\v\xC6\x8E\x9A\xA6\xA9\xE6\\\xB7\x8C\xC1^P#\xAA1>\xBB\x80\xA9\xA8U\xE2\xB15\x191^\x84\fg\xDD\xD3\xCC\x16\v\xC1\xAA\xA6\xACX\xC4\x06\xA6\xEB\x14\xF1\xCDnm\xB9\xDD\xF7\x8E\x914\x80\x0E=ha\xCA[\xAC0\xCE\x9A\xCE\xA7m\x8F\x16\xEA\xC7\x03\f|\xB0Y\xA2\xEF\xF4\xB7\x9C8\x90\xDA5*\xE2\xBD\xA8\xF6m\"\xA9&wf\x974Ja;\xF3\xF5S\xF3\xD5\x847\xCF!|.\f_4\x7F=\x9D&\xF0\xDB\xCB$\xF1\x92=\xBE\xE8}r\x98\x88\xA7\xE4\x1F,\xB2]T9^\xB0R\x18\r\xAF6\x9F\x12\xA3\xB6\xF9,\xC3\x8A\x86\xD2G\xC0d\x85\xF9\x06!\xC9\x91\xADCS\xE7\xA6\x1C\x7F\x14\xF41&k\x95\x16\xCE\x93u\xD5H\xE7\xF8\x88\xB2d\vM.\x03qCR,\x12\xE01K\x94\x18\xE7J|\xE8o8K~(\x89V|\xB1.\x0E>g\xE5\xB1\xCA]*\xE0\x9A\xD7\x0E\x17\x1Dp\xF2\x15\xFC0\b\xB4\n>9\xCE\xA1f\x04\xA2\x85[[\x02&\xB4\xA7Q6Y\xEDT\xBF!\x11m\xAC\xF69\xED\xBD\x84D\xD2\x89\x12\xA3\xC1R7WHW\xC3'\xA9\x18", :proof=>"\x1D\x80S\x1C\xAF\xFD\x95m\x88\x95?\x19J^1}0+\xB3Mx:\xE8\xB3Jc\ee%\xDD\x9F\xB0\x99\x1ES\xC3^&o\xF2\xEE\x90e\xDE\xDFR\xC0(\xBB?\x92\b\x9EG\xCA\x00\x80\x1A,\xF8\x90\x9Dy5"}
D, [2018-11-06T18:30:27.482917 #56241] DEBUG -- : Response
D, [2018-11-06T18:30:27.483002 #56241] DEBUG -- : {:state=>4, :proof=>"\x9Br\xC3\xD2V\x14\xBCt<q#\xC6\xA4\xEA\xF2uK\x10i\x18\xAC(tp)]\xA9\xF9\xD0w\xB2\b\x84\x1F+\x95O@\xDE\x8D\x04)\xFF\xEFb\xD6(|\xBA\xEF\xAFD<\xD9\xE5\x91\xF9\xF6\x0Eu\xEA\xAC-\xB9"}
192.168.1.99 - - [06/Nov/2018:18:30:27 +0000] "POST /pair-setup HTTP/1.1" 200 69 0.0275
D, [2018-11-06T18:30:27.585568 #56241] DEBUG -- : Cache
D, [2018-11-06T18:30:27.585625 #56241] DEBUG -- : {:controller_to_accessory_count=>0, :accessory_to_controller_count=>0, :session_key=>"9c7aa853c61148b1fe5406830366503d95a9ebb32d5b31b41538b3b2b6aecc42c8b9d756a1248c658e8b5e86c1bf5597427e57be8fab95ba6a4920926b43d30b"}
D, [2018-11-06T18:30:27.585977 #56241] DEBUG -- : Request
D, [2018-11-06T18:30:27.586028 #56241] DEBUG -- : {:encrypted_data=>"\x86\x8D\x9A\xC5D%g\x9F\xE12\xDBf\xE6\xDC&\x13\xA6^q\xB0\t(a;1\xCD\xBE9\x10\x19Do\xD2\xA8fZ\xD9\r\xFA\xFCi\xCA\x11\xCA\xD5[\xF6\x01\xF0\xF4\x19\x9BdV\xFD\xD1*\x9Ev>\xCD\x189\xC0b\xA5:\xCA\x1C\xC4\xEC-\x1C\x7F\xC4\xB7\x06\x9E\x83S\xA8\v\xC3r\xCF\xD4z\f\b(\"\xEF\xFC\xFD\fW|$n\xC9\xFBh\xDD\xA1/>\x96\xBF\x9B\x9A\x06\xC0]\x90\xB5\x17\r\x06\xF2Z\\Q\t\xDB\xF2r\a\xBF\xA6\x89\xB3S\xAC\xB3\x9C\x1A\xC0\x80\xDA\xB0\xE0\xB7\x13'\x0E0\xC8|\xB3\x18\x99\xFB\x80\xDE", :state=>5}
D, [2018-11-06T18:30:27.588779 #56241] DEBUG -- : Response
D, [2018-11-06T18:30:27.588844 #56241] DEBUG -- : {:identifier=>"CC:60:E2:58:E9:E0", :public_key=>"\x92+\x9C\xA0}\x92\x00\xAB\xFF\xF9\xBF!\xAA\x12\xD9\x1C\x81\x17\xFA\xA4c\xE5\f\xB7\xEB\xF7\xC0\xEDQu\x85\x03", :signature=>"\t\xB6\xBE\x06\xBB\x90\xAF\xEF\xDF\x01`\x88\xFCs\x91\xD4%\xDA\xFD\xBCPv\t\xA6g$\x8A\xFD\x8D\x87.\x15\xAA\x84oR\xC2\xC5fb\x92\xD1d\xD9\xD9\xFD\x15->M;\x99\xBB^\xDD\xBFD\x94y\xE7\x80\xB5o\b"}
D, [2018-11-06T18:30:27.590709 #56241] DEBUG -- : Response
D, [2018-11-06T18:30:27.590761 #56241] DEBUG -- : {:state=>6, :encrypted_data=>"\x81\xD1\t6\xA9\xDB\x9E\x1C&\xC2\bk\xEE\xDF;\xEF\xA84T\xEF|k\xEByu\xE3\xF0\x87hQ\xA2\x95.\xE0\xA4\x1FA\x9F{\xA7\x80\x00h\x0F\x82\a\xCAZO\xB9\x99b\xF4?\xD8\x98\xFDYoQ\x8Bw\xCF\xE9\x02\xF1\xF5\"\xCE\xF0c\xF9I+\xBB\xD3\xE5\xAE\xD9\xD1\"0\x15@\xA5\x18\xC8\xB9wMps!\xD4\xC3\x17\xF4X\xBBr\xD1\xB0\xF2\e\xD5{c3\x16;\xEC.\xA4$\xC0_\xE5%\xB5\xBF\xA19Z\xA2\xF7\x11T\x92\x12\x01\xFF \xF6#\x96"}
192.168.1.99 - - [06/Nov/2018:18:30:27 +0000] "POST /pair-setup HTTP/1.1" 200 140 0.0058
*** 192.168.1.99:61095 disconnected
*** 192.168.1.99:61096 connected
D, [2018-11-06T18:30:27.770073 #56241] DEBUG -- : Cache
D, [2018-11-06T18:30:27.770187 #56241] DEBUG -- : {:controller_to_accessory_count=>0, :accessory_to_controller_count=>0}
D, [2018-11-06T18:30:27.770820 #56241] DEBUG -- : Request
D, [2018-11-06T18:30:27.770913 #56241] DEBUG -- : {:state=>1, :public_key=>"\xCA\x876VZ\x9E\x86C\xB3\x0F\x14\xF9t\xF8\x06\xB5\xE7\xF5Kc\xE3\x9Eoq\xDB-\xD6x\x9C\xEF\x90y"}
D, [2018-11-06T18:30:27.773450 #56241] DEBUG -- : Response
D, [2018-11-06T18:30:27.773610 #56241] DEBUG -- : {:identifier=>"CC:60:E2:58:E9:E0", :signature=>"\xCF(\xB1DNW\xAC\xF2\xF8\xCC\x9C~\x84\x13\xF5W\xB6\x7F)a.\x85\x81\xD1a|\x8A7\t\x82Il\xE6\xDE\x00;F1(,J?\x16\x99V(\r\xE7Kt\x98T\x87\xA4(\x8F\xD8\xC2?\xB4\x8F\x9FE\x0E"}
D, [2018-11-06T18:30:27.774758 #56241] DEBUG -- : Response
D, [2018-11-06T18:30:27.774884 #56241] DEBUG -- : {:state=>2, :public_key=>"\xADi\xEDA\xD6\n&\xE6\xE7L\xEB\x03Q\x0F\x1A\e5g\x00\x90\x80\xD2\xA0\xE2N\xB0a;\x1E-\x04\n", :encrypted_data=>"\xA1\x04\xA3XF\xC3C$\xE88\xA1\x9C\xFC\xB8\x1C\xBA\xA7\xF1M\xAB\xB9\xCEz\x00:X\x04\xE5\xD8\x95-\x9A\x11\xBF\xC6\x0E\xC6\xFC\xA1\x10\xCE\x82\xB4')\xA4\x9B\x91@\x1F\x8C\xFC\xD0?f+\xAF\xDD\xFA0\xBAF\xB21^\xF1\xB5j\xC6\xC0\x8Dw\xCF\xE5\x7F\x1C\xFD\x80\v8\x95\xD1\xF7\xD5#\x8C\tb\x8A\x18w\xC2\x81)\xA9\xC5\x17)M\f\xDD"}
192.168.1.99 - - [06/Nov/2018:18:30:27 +0000] "POST /pair-verify HTTP/1.1" 200 140 0.0064
D, [2018-11-06T18:30:27.968152 #56241] DEBUG -- : Cache
D, [2018-11-06T18:30:27.968229 #56241] DEBUG -- : {:controller_to_accessory_count=>0, :accessory_to_controller_count=>0, :shared_secret=>"\xE2T^V\x1Es\x02o\xF7\xB9t\xEC\xF1\x04\xB1\x11\\\xD8\xA1\a\xBF\x15\xF3\xDE\xEE\xD55\x8D5J\xAA\x01", :session_key=>"J]J\xD3\xD3\xEA\xF6\xC5@\xAFe-JIfP\x15\x1D\xFC\x88\xEENa<e\x1D\xAE\r\xF9\xFB_n"}
D, [2018-11-06T18:30:27.968692 #56241] DEBUG -- : Request
D, [2018-11-06T18:30:27.968732 #56241] DEBUG -- : {:encrypted_data=>"\f\x84)\x16\v\xDA\xD1\xB0\xE3 \x10u\x1A\xF9\x18I\xE4\x99\xDA\xFD\xE6\xD8\xEA\xB0iISz=H0'`\xE9\x97\x02\xA6\x89b\x9A>\xBD\x83|li\x9E\xAF<#~<\x8B\xD3\xDD\xD7t\xB9R\xD5\x88\x8B\xC71\xF2\xEFuk\x9D2\xD7\x1C\x82\f\x8Br\x97yv\xFD\xFD\xC0\xF2\xD3f`\x17\x14\x10=\x80gpo\xE2\x10\xA9jnFdH\nG^?\xB4\xF9\x1C\xB6\xC8juu\xA7(\x1D\xEDts", :state=>3}
D, [2018-11-06T18:30:27.969123 #56241] DEBUG -- : Response
D, [2018-11-06T18:30:27.969170 #56241] DEBUG -- : {:state=>4}
192.168.1.99 - - [06/Nov/2018:18:30:27 +0000] "POST /pair-verify HTTP/1.1" 200 3 0.0015
D, [2018-11-06T18:30:28.258412 #56241] DEBUG -- : Cache
D, [2018-11-06T18:30:28.258622 #56241] DEBUG -- : {:controller_to_accessory_count=>1, :accessory_to_controller_count=>0, :controller_to_accessory_key=>"K\xE7\xF7\xB1\xC8\xEA\xFA39w\xF8\x909~\xD2X\flh\xC7f\x15J\xEC\xBC\xA8\x1A\x8E\x80}n\xFC", :accessory_to_controller_key=>"\x02AD\xDF\xB7\xA3\xD8^\xC8\xE3\xF0\xF3gh\x81\x9AF\xB9\x118b\xF4z\x87\x1DTi{\xB1\xB63\xB0"}
- - - [06/Nov/2018:18:30:28 +0000] "GET /accessories HTTP/1.1" 200 2138 0.0051
E, [2018-11-06T18:30:28.264268 #56241] ERROR -- : undefined method `write' for "":String (NoMethodError)
/Users/james/.rubies/ruby-2.5.1/lib/ruby/2.5.0/webrick/httpresponse.rb:298:in `send_header'
/Users/james/.rubies/ruby-2.5.1/lib/ruby/2.5.0/webrick/httpresponse.rb:210:in `send_response'
/Users/james/Code/experiments/ruby_home/lib/ruby_home/hap/hap_response.rb:14:in `send_response'
/Users/james/Code/experiments/ruby_home/lib/ruby_home/hap/server.rb:62:in `read'
/Users/james/Code/experiments/ruby_home/lib/ruby_home/hap/server.rb:33:in `block in accept'
/Users/james/Code/experiments/ruby_home/lib/ruby_home/hap/server.rb:21:in `block (2 levels) in run'
/Users/james/Code/experiments/ruby_home/lib/ruby_home/hap/server.rb:21:in `select'
/Users/james/Code/experiments/ruby_home/lib/ruby_home/hap/server.rb:21:in `block in run'
/Users/james/Code/experiments/ruby_home/lib/ruby_home/hap/server.rb:20:in `loop'
/Users/james/Code/experiments/ruby_home/lib/ruby_home/hap/server.rb:20:in `run'
/Users/james/Code/experiments/ruby_home/lib/ruby_home.rb:32:in `block in start'
*** 192.168.1.99:61096 disconnected

Thanks for reporting the bug @lazyatom I believe I have now fixed it 6f80855