diff --git a/atom.xml b/atom.xml index 3f3c454347..03d9c72500 100644 --- a/atom.xml +++ b/atom.xml @@ -4,7 +4,7 @@
This is one of the two ways we support OpenWRT. If you encounter problems, try luci.
-This is a presence detection scanner for OpenWRT using ubus.
+This is a presence detection scanner for OpenWRT using ubus. It scans for changes in hostapd.*
, which will detect and report changes in devices connected to the access point on the router.
Before this scanner can be used you have to install the ubus RPC package on OpenWRT:
opkg install rpcd-mod-file
@@ -112,6 +112,103 @@ file
See the device tracker component page for instructions how to configure the people to be tracked.
+If you find that this never creates known_devices.yaml
, or if you need more information on the communication chain between Home Assistant and OpenWRT, follow these steps to grab the packet stream and gain insight into what’s happening.
configuration.yaml
to log more detail for the device_tracker
component
+ logger:
+ default: warn
+ logs:
+ homeassistant.components.device_tracker: debug
+
+ $ tail -f home-assistant.log | grep device_tracker
+
+ 17-04-28 10:43:30 INFO (MainThread) [homeassistant.loader] Loaded device_tracker from homeassistant.components.device_tracker
+17-04-28 10:43:30 INFO (MainThread) [homeassistant.loader] Loaded device_tracker.ubus from homeassistant.components.device_tracker.ubus
+17-04-28 10:43:30 INFO (MainThread) [homeassistant.setup] Setting up device_tracker
+17-04-28 10:43:31 INFO (MainThread) [homeassistant.components.device_tracker] Setting up device_tracker.ubus
+17-04-28 10:43:31 ERROR (MainThread) [homeassistant.components.device_tracker] Error setting up platform ubus
+ File "/opt/homeassistant/venv/lib/python3.4/site-packages/homeassistant/components/device_tracker/__init__.py", line 152, in async_setup_platform
+ File "/opt/homeassistant/venv/lib/python3.4/site-packages/homeassistant/components/device_tracker/ubus.py", line 36, in get_scanner
+ File "/opt/homeassistant/venv/lib/python3.4/site-packages/homeassistant/components/device_tracker/ubus.py", line 58, in __init__
+ File "/opt/homeassistant/venv/lib/python3.4/site-packages/homeassistant/components/device_tracker/ubus.py", line 156, in _get_session_id
+ File "/opt/homeassistant/venv/lib/python3.4/site-packages/homeassistant/components/device_tracker/ubus.py", line 147, in _req_json_rpc
+17-04-28 10:43:31 INFO (MainThread) [homeassistant.core] Bus:Handling <Event service_registered[L]: domain=device_tracker, service=see>
+17-04-28 10:43:31 INFO (MainThread) [homeassistant.core] Bus:Handling <Event component_loaded[L]: component=device_tracker>
+
+ 17-04-28 10:50:34 INFO (Thread-7) [homeassistant.components.device_tracker.ubus] Checking ARP
+
+ These steps require that tcpdump
is installed on your Home Assistant device, and that you have a utility such as Wireshark for viewing the packets. It also assumes that Home Assistant is communicating with your router over HTTP and not HTTPS.
$ sudo tcpdump -nnvXSs 0 -w /var/tmp/dt.out 'host <router_ip> and port 80'
+
+ /var/tmp/dt.out
Got xx
where xx
is an incrementing number. This indicates that it has captured packets that match our filter. After you see this number increment a few times (>20), you can hit Ctrl-C
to cancel the capture./var/tmp/dt.out
to the machine where you’re running Wireshark and either drag/drop it onto the Wireshark window or use File/Open to open the capture file.POST /ubus
. Right click on this line, choose Follow and then HTTP Stream to view just the HTTP stream for this connection.POST
will show Home Assistant logging into ubus and receiving a session identifier back. It will look something like this:
+```
+POST /ubus HTTP/1.1
+Host: 10.68.0.1
+Accept: /
+User-Agent: python-requests/2.13.0
+Connection: keep-alive
+Accept-Encoding: gzip, deflate
+Content-Length: 161{“jsonrpc”: “2.0”, “params”: [“00000000000000000000000000000000”, “session”, “login”, {“password”: “
HTTP/1.1 200 OK +Date: Fri, 28 Apr 2017 12:04:46 GMT +Content-Type: application/json +Transfer-Encoding: chunked +Connection: keep-alive
+{“jsonrpc”:”2.0”,”id”:1,”result”:[0,{“ubus_rpc_session”:”8b4e1632389fcfd09e96a792e01c332c”,”timeout”:300,”expires”:300,”acls”:{“access-group”:{“unauthenticated”:[“read”],”user”:[“read”]},”ubus”:{“”:[“”],”session”:[“access”,”login”]},”uci”:{“*”:[“read”]}},”data”:{“username”:”root”}}]}
+9. In the response above, the portion that reads `"result":[0,` indicates that ubus accepted the login without issue. If this is not `0`, search online for what ubus status corresponds to the number you're receiving and address any issues that it brings to light.
+10. Otherwise, back in the main Wireshark window click the `x` in the right side of the filter bar where it reads `tcp.stream eq 0`. Scroll down until you find the next `POST /ubus` line and view the HTTP stream again. This request is Home Assistant actually requesting information and will look something like the following:
+
+POST /ubus HTTP/1.1 +Host: 10.68.0.1 +Accept: / +User-Agent: python-requests/2.13.0 +Connection: keep-alive +Accept-Encoding: gzip, deflate +Content-Length: 114
+{“jsonrpc”: “2.0”, “params”: [“8b4e1632389fcfd09e96a792e01c332c”, “hostapd.*”, “”, {}], “method”: “list”, “id”: 1}
+HTTP/1.1 200 OK +Date: Fri, 28 Apr 2017 12:04:46 GMT +Content-Type: application/json +Transfer-Encoding: chunked +Connection: keep-alive
+{“jsonrpc”:”2.0”,”id”:1,”result”:{}} +```
+hostapd.*
, which is the access point on the router. In my environment I don’t use the AP on the router, and so it was correctly returning no data. Armed with this information, I know that I cannot use this component for device tracking or presence.When you’re done troubleshooting, remember to reset your logging configuration and delete any capture files that contain sensitive information.