xsensors: theindranet phase 1 summary
Purpose: create stable modular code platform for arduino sensors to communicate via RFM69 radios and MQTT protocol to OpenHab server. Arduinos sense events (e.g. doors opening, people moving, garage doors closing, doorbells ringing) and transmit these events to gateways (a pair of arduinos). The gateways then send event data to a server (e.g. raspberry pi) that updates a website (OpenHab-created) with sensor changes. A user-created configuration file defines sensors used.
Based on: Eric Tsai's home automation code (instructables page, github, related forum). Tsai's code accomplished the bulk of what is described above. Modifications include consolidating the code into a class structure and adding the user-defined configuration file which is processed by a setup script.
Context: In general, open source software and hardware are superior to their closed alternatives for many reasons including: privacy/security, modifiability, and incentive to innovate upon. The easier it is to use open components, the better off we'll be. Making the code easier to use for new users to this space should help this. With specific respect to arduino sensors, a significant amount of coding and tinkering is required to bring a sensor network online. Increased modularity in related sensor code should decrease necessary coding. The classes and setup scripts herein also define part of the platform for subsequent phases of theindranet (the primary impetus for this project).
Implementation: a setup script generates arduino and openhab configuration files from a sensor library and user-defined configuration file to set up a wireless sensor network.
Status: prototype. Works with a small set of sensor types with limited user interface options defined through the configuration file. Testing has been limited (with raspberry pi debian server and desktop ubuntu server running both openhab and mqtt).
Serious issues:
- #1 issue (w openhab main code) = main openhab UI refresh scrolls page, essentially rendering any related code useless for any serious applications
- limited sensor definitions (i.e. handful of sensors like temperature, reed switch, ultrasonic rangefinder)
- limited data-handling options (i.e. reports to openhab and can send xmpp instant messages, though no pre-defined setup for other actions such as email notifications yet)
- limited to no error catching for many parts of the setup and library code
- see below for larger to-do list
hardware
core parts:
- sensor nodes - arduinos clones w 3V modes (ebay search). Note these should be used in 3V mode only given this is the voltage range the radios operate in. One or two will be required for gateway(s), and then one for each sensor node. Note some of the clones are not super well made. One of ours broke when some of the usb-port circuitry came off the board plugging it in, and another would begin having errors and not run code properly after ~1 hr of operation (with the same code working fine on another arduino). Recommend getting a few more arduinos than you anticipate needing.
- prototyping shields (optional; ebay search)
- ethernet shield (ebay search) - for the ethernet gateway component
- radios - RFM69HW purchased via Anarduino
- sensor components - see below
- gateways - 2 arduinos, but others appear to have been successful in combining the wireless + ethernet gateways into 1 arduino
- server - e.g. raspberry pi, linux server, or whatever can run mqtt and openhab
- soldering tools - at minimum for connecting radios to arduinos
- wiring - recommended assortment of multicolored male-male (mostly these), male-female, female-female
- resistors - recommend at least a few ~1k resistors
- python - tested with python version 2.7.9, to check your version execute "python -V"
- java - see if installed with
java -version
, on some linux systems install withsudo apt-get install default-jre
- openhab
- download core, addons, and demo setup at the openhab website
- run the demo by copying the demo files into the respective folders of the core distribution folder, then run ./start.sh (if on linux-based system). Make sure openhab works by pointing your browser to http://localhost:8080/openhab.app?sitemap=demo
- you'll need the following add-ons (copy them from the downloaded add-ons folder to your main active openhab folder):
- binding.http
- binding.mqtt
- persistence.logging
- persistence.mqtt
- action.xmpp
- when running openhab recommend running in a screen so openhab can be more easily monitored/controlled remotely:
- execute
screen -S openhab
- in the opened new screen run
./start.sh
- detach the screen by (on osx) holding down control and hitting "a" and then "d"
- to resume/attach the screen execute
screen -r
(or designate the screenname if using multiple screens)
- execute
- mosquitto (mqtt) server - on many linux systems via:
sudo apt-get mosquitto mosquitto-clients python-mosquitto
- you should be able to get by with default mqtt configuration if openhab and mosquitto are installed on the same computer
- monitor mqtt posts via:
mosquitto_sub -t '#' -v
(subscribes to all topics in verbose mode on localhost) - test post to mqtt via:
mosquitto_pub -t yo -m 'helloooo'
(posts to localhost w topic "yo" and message "helloooo") - when test posting the above mosquitto_pub command while having another terminal window monitoring mqtt posts, you should see the test post appear
- C++ library dependencies for arduinos
- RFM69 - radio library at github: lowpowerlab
- NewPing - if using ultrasound sensor, library at google
- DHT - if using temperature/humidity sensor, library at github
The code including the following can be downloaded from the github page.
- xsensor library - classes/subclasses for various arduino sensors as well as methods to relay sensor data to OpenHab server
- configuration file (config.json) - arduino/MQTT/openhab setup information including pin/sensor configurations for arduino nodes on the defined networks
- setup.py script - takes the config.json file as input and generates arduino files for the arduino gateway (presently 2 arduino files, one for ethernet arduino gateway, and another for wireless arduino gateway), arduino node files (one for each node defined in config), and OpenHab configuration files (items, sitemap, rules)
- place the xsensor folder in your arduino libraries folder
- edit the configuration file for your network, nodes, and sensors
- execute the setup script by typing "python setup.py" from the directory containing the setup file
- upload the arduino and openhab files to the arduino nodes and openhab server, respectively
output files generated by setup.py:
- arduino files - using the arduino software upload to the respective gateway and node arduinos
- arduino wireless gateway
- arduino ethernet gateway
- arduino node files - 1 for each node defined in config
- openhab configs - upload to the openhab server in the appropriate corresponding folders
- items
- sitemap
- rules
useful for dealing with tweaks to server files from a local machine (i.e. to put in a .profile file):
#upload openhab config files to remote server - recommend setting up ssh keypairs for easier logins, replace bracketed content:
alias updatehab='scp -P [REMOTE_PORT] "[LOCAL_MACHINE_DIR]/openhabsite.rules" username@ip_address_openhab_server:[SERVER_OPENHAB_DIR]/configurations/rules/openhabsite.rules; scp -P [REMOTE_PORT] "[LOCAL_MACHINE_DIR]/openhabsite.items" username@ip_address_openhab_server:[SERVER_OPENHAB_DIR]/configurations/rules/openhabsite.items; scp -P [REMOTE_PORT] "[LOCAL_MACHINE_DIR]/openhabsite.sitemap" username@ip_address_openhab_server:[SERVER_OPENHAB_DIR]/configurations/rules/openhabsite.sitemap'
getting radios into arduino circuits
The spacing on the arduinos is smaller than that found on pin-headers and breadboards. However, since not all the radio pins are required, pin headers can be bent such that the radio can be plugged into a breadboard. Take needle-nose pliers and carefully bend pin headers to get each used radio pin into a breadboard space before soldering the headers to the radio. This can reduce space and wiring (and it looks nicer). Following are images of the radios first without header pins soldered to them (just with soldering wires that are plugged into proto-board), followed by two images of the radios soldered into header pins that are directly plugged into the proto-board.
sensor dying note
Note on debugging: if a sensor or gateway seems to simply die after a certain amount of time, try swapping out the arduino base unit running the node. It has been discovered that this resolves the issue, pointing to faulty arduino hardware (in our case, an arduino ethernet gateway). This should warrant some caution re circuit work with arduino clones - the clones are great re cost and lower-voltage applications, but expect some quality variation and order more units than anticipated in the event some units are faulty or die.
supported sensors
- reed switch
- our source: ebay (link, search term)
- also tested: larger enclosed reeds from adafruit (link)
- wiring: one lead to power, other lead to digital in (default to pin 3) AND ~10k resistor to ground
- dht temperature/humidity sensor
- DHT11 and DHT22 tested
- our source: ebay (DHT11 link, DHT22 link)
- wiring (from left to right facing the front/grill): power, digital in (default to pin 6) AND ~10k resistor to power, ground, (unused)
- ultrasonic rangefinder
- our source: ebay (HC-SR04 model, generic search)
- wiring (left to right facing front): vcc to power, trig to digital in (default to pin 5), echo to another digital in (default to pin 3), gnd to ground
- sound sensor
- our source: ebay (think our model is LM393, generic search)
- wiring: out pin (center) directly to digital in (default to pin 7)
- pir motion sensor
- our source: ebay (general pir search)
- wiring: output (center) directly to digital (default to pin 4)
- calibration: recommend googling specific model purchased for tweaking time/sensitivity potentiometers
supported actions
In addition to monitoring sensors via the default openhab interface, xmpp notifications are supported only for reed-switch opening via the configuration file. Replace the dummy-xmp code provided in the config file with your settings. Note that in the xmpp message field
****sensorname****
will be parsed and replaced with the sensor name. To get the tlspin, go to xmpp.net, input the server being used (consider setting up an account with dukgo.com), and get the SHA-256 hash from the #0 certificate (see e.g. this page or this page for more information).
to do
- dual-gateway integration (combine ethernet and wireless gateways)
- integration of any improvements in Tsai's code (there was long delay between xsensor library creation/development and release)
- support alternative interfaces (aside from default openhab interface, given bugs)
- add sensors (e.g. buzzers/soundmakers)
- add action modules - i.e. for more than just xmpp notifications for reed switch open
- consider voltage regulation when using any compoenents w >3V output - afaik higher V can leak through arduino
- instead of have time_since_blah w increasing w set to millis() do time_elapsed_since and reset counters to zero (should allow smaller vars re reducing memory overhead)
- radio struct complete re-design
- previously considered moving out of fn, though keeping it there might reduce memory overhead if deconstructed post-fn-call
- consider dynamic number of variables, w an initial var indicating how many are going/coming
- consider switching to more clear/verbose variables names per comment section in respective code
- more verbose debugging mode, w e.g. routing Serial.print notifications to radio/server/openhab
- include persistence configurations in config setup
- scrub code of unused variables
- redundancy backup gateways
- relay nodes - for redundancy as well as for increasing sensor range
- order of items in config file does not match order of items loaded to site
- page refresh scrolls page (in main openhab interface; is a bug with openhab itself)
- generation of openhab main configuration file from JSON config file
- broken icons go away if groups/items are assigned icons - seems an openhab bug
- json config handles openhab config
- verify works w new oh version - appears to
- verify functional with multiple nodes - seems ok
- library appears to work
- setup script appears to generally work
- fixed dying eth gateway (was hardware issue)
- fixed update times
- humidity fixed
- headers work
- config handles network (non-node specific) configs
- single node w gateways appear to stay live > 24 hrs
CC-BY-SA
theindranet by ak1n, janu5, keystroke, arrguile is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License
xsensors project originally based on Eric Tsai's work as noted above.
contributors
- ak1n
- janu5
- keystroke
- arrguile
Please note that sending what we deem to be spam means you consent to be slapped with a trout and read Vogon poetry while being amputated by luggage, then being drawn and quartered while being forced to watch a CSPAN-televised congressional session on the merits of simultaneously bombing and arming both sides of the Syrian conflict.
PGP keys
ak1n (see mit keys):
Public Key Server -- Get "0xdaec87bcc47b78a6 " -----BEGIN PGP PUBLIC KEY BLOCK----- Version: SKS 1.1.5 Comment: Hostname: pgp.mit.edu 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 EOE2yvU= =h45/ -----END PGP PUBLIC KEY BLOCK-----
janu5 (see mit keys):
Public Key Server -- Get "0xe334a3259dee052e " -----BEGIN PGP PUBLIC KEY BLOCK----- Version: SKS 1.1.5 Comment: Hostname: pgp.mit.edu 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 pnA= =+7vT -----END PGP PUBLIC KEY BLOCK-----
keystroke (see mit keys):
Public Key Server -- Get "0x3f416abcfcca82c5 " -----BEGIN PGP PUBLIC KEY BLOCK----- Version: SKS 1.1.5 Comment: Hostname: pgp.mit.edu mQINBFV2sB4BEADXybvHOf8FcwGYPEDj3QWTOFNBG6LXxjQmAumt3vkvf4G+9pNK3yqfviZ0 Am1nl/HCkentIInp4yHsSXUK46SNfrycUmr2BW8FPnTPGUc9AUgAkc68b0lIwXV7vq2RQ9Ny 3JiBmCoM7Hk3Sat0NqUOT0XON0bmICLQ3mkFLipzka832FcZXA8yUmN6SAw1pr82+8rooWEj L+lqyNy6c79DB9/mOdAvQs/mYDGlwlnfZ9M6S+qz9r5I+WwQ/xSAK5qE+wjPLDdbasmYaQ+w Rus2WUzEVhvGqFRfuCYJW5p84jIOZsRr87TfUNhQlvzsV/QQL5tXmpiiWxGHVCB5KTjDNbx8 ZQ5ZLgu5dr+kkI0mskqO0N0dzXnvOs9YrHUGBFs45tqRtUveSZWSj1xnlZRgt02SriMTuM0s 009EgAN7tjAjDBlR7ymOXwQ7yCfJ7V3bn3BDNu4PNOZt/Et8tC2XDKIIP0XNkmZzudGQyAHX eOlbJUIWznAYassA1KDZ+3KILCG/+EXEi88ogUcEVHD/DZSxdFphDiquFTvdUUOIjDhsFSFM 42796M8Zgl2Cl36t2I+azbWvpdpRh5gOhJ5JVQBqBeDqUBXetTtxQSKu7zQ4njHt3YNNWAzd ZgtptONtwuBP4GiFjPGdsiXhOOpqAwIuj0fR/RKkjsXM1SAhawARAQABtCVrZXlzdHJva2Ug PGtleXN0cm9rZUB0aGVpbmRyYW5ldC5jb20+iQI+BBMBAgAoBQJVdrAeAhsDBQkHhh+ABgsJ CAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRA/QWq8/MqCxVmUD/4rNiOMygCaXyu9yHtb2O0+ 8t4NZXws04adA1h4UZE1PiQNzIdcmrFez+dpk/oCl7mFHQC6CaGFg/0XFKkOdj4ijLjZygHJ s4wqbtH3GabvUKKe7V7rpWpfJY840GNd7JHlDCzmNABsNOt7D3poILCaHHO3a6WKK3aCq5me KwtxD7+uUrPEJjLpjL/N2dkoN+tMZtS/JlXefL/6dYeuO3jkCaNUHn53XIzK7Ttc+PhwsyGL yI04jfePRm6V3vYzsFBRu3s3iI/79LfgDPHP7m7ponk74wZflz72ZjTOd9el8I3u+xQ2w+WW FIwp4Ek9uLdK99mmUrX5enWCMrMVnEAtbtDpcplCOvoM0rihCurjBPETOuByJ33ka0K/uu7G iP3vWzGA4u8UVzMGeRvk/4mv4riIkCuQgAGPGe8xRvGh57U8NqbtL39ylF90elqxWSU9WXS7 BWxwa0oPv4wEz6KVTb3OC5dz/A36a0Ga0xJEjdHFFZmT6nl0c3WDLB74dHhfAH75VQ8Q3rhw IIlwwdvsiBBwuSJOODgF2W4bj52UO2CqTdlaT9jiJg5QycNnxpNca/uxKcGEuPAcaDUicg++ EbuBeaDE3yldMelSnhIR/V9hER0GqeCZSA4a146ltmzW7mqkg1UtrvuNG/qK052ctoKsbmMc Xu2/w+Q0y7LJo7kCDQRVdrAeARAAyDx0+wqtOFe6HeWaEzznYjAjaSwFKGoWkpkuaZElaH0k IHHeXSuX3maN4NsnJet9vRy4ANkimAVv5Bziic2iBhrR4UboZPRmZyIGMrq/GQhdhhJ3FWXl 1TFoWqfk1lFghpgZchuF+qoI1uTZlnQqo+Q0+S/7sufpkgdegHrCGCchAB2gjIXBKWdn/0Fx TSscpghPGHnVvRIW8pTmeixTgd3jFBO6+MMRRSaAYbCqsxQ8ENUd8f+hEjL8FlAZv/34EjJI qLTgEZEZwgSA4JWbpiQP9s5473tm1tAB/hccYeoR98UqECChqPamZFb7kdFEwzWgaG3jNCJB UnhtLDkG5ULBrsLwzHYeqMj2ztFjf35feMKQlfDqAXPzQtajYkN+hsDYNYkknO8nY6X0aEdx mKYapgkh02udunLC9GOJrirxTAWvTSygzM6rmWIBqJ4a8ufT40vB3yUv7A16Jfj4IvMpJmbD O5MQnSeGajmTuMt4jkup/v1J2qyJbm4EsOchV0lyNqUm9e0HDlsmFJxZODydMnaaAhqEkYvN K14KL+0DC5iKnKDYWMqhGF4x+EwyspjQLoI0tQNZQmc7vrP0Jpz+X+CMRtt5eYQnvT6y3igY nHppMakQgJh9ve8JKahivC10StKYmFC7K2v7uHbRSz7TLC+gQuzolYAFU8BNnvsAEQEAAYkC JQQYAQIADwUCVXawHgIbDAUJB4YfgAAKCRA/QWq8/MqCxQcPD/9o9DHJgNnQGvbOpjtDJTsc hWu8aKHmbXjpOuazvGTdDgZ48gID556KagkPuD/qsRYhCP74hjbg44eiAbvaLrsKdYByAkpS IZRzh6fOgrRr0pr4WPrMmKSOcjMru/xDDMn+6saO5rtQv2gPP6oxecpDPf3wlXY0oEbLUM2X ucPd/3RN0KFvBnM4qYckzrwRoj93lW2RnybkNp9M1a+wxUH8pVBL6yldML9jd7LZfn4epMWU 0/RMAMM6G6dTCDEkx3+iMXyuuOX4lnGGqVina/TtCkxoYrV3iOr/+wPhuYc3FFxAr0mbB9EI YASHjoL7JNmDphn4wRVSU5xWi2QA6pcp+XYmH2KDcdWYfuUoOcRQX7FBAytaHeqE58wUMt/u BPdeG4NVfxZdMSigZeuuvbdHu4M6jEB/M4lKJXQDeI40BLRZD++YUpmr/UwjajLuWEzvcUTx 1pm38Fc4JFT8eCWL+vyua2W4x1VXLqOKn5qy+4qlf6eODkpW8OGaJAk/bp8sW2bur5icSCHS KMKeUJaU+SegblfdcKy6FI+9YG79gkvnoFhPsqEQzChrLD63k6H6awy2FZxNPaTzFubjR98j fB7Mfyt+6nAjD2NMpoVAQPD9DtGohNaE1/w9iVBWB7OF/VllGqxO8zwIEWinhsXZQ6VsmBRc 8rVlB4bvGigIEA== =LyZX -----END PGP PUBLIC KEY BLOCK-----
arrguile (see mit keys):
Public Key Server -- Get "0x73bb347f8fcad3ee " -----BEGIN PGP PUBLIC KEY BLOCK----- Version: SKS 1.1.5 Comment: Hostname: pgp.mit.edu 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 41SN+lAprMY= =dx/n -----END PGP PUBLIC KEY BLOCK-----