theindranet



the internet?
no, the indranet!



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
The Code: theindranet at github


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
other required equipment:
  • 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
software requirements
  • 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 with sudo 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)
  • 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
theindranet parts
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)
To use:
  • 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
note: Arduino files are created in folders because the Arduino app freaks out if they're not folder-enclosed when compiling

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
shortcuts/aliases
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
Note that many of these components can obviously be purchased elsewhere. Amazon has many of these for a higher price, usually with faster shipping. We had no overt issues with any of the suppliers outside the USA.

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
bugs
  • 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)
progress
  • 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
software license
Creative Commons License 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
contact

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

mQINBFV2qywBEAC04rLpFP8Y0hsBbIniICR2vF+sRLdYxboRuPfZSgJwwDhYtecVGqLSJ6p3
QT66vr+kvsoPKoz7fWiOAkbK9dMZXumvmZ8YHX4lBs6zdzYFGg9KVaSVH9dIJSV+LcAfcMac
sFIELeWBDMinLeEUEXFdb/2Q7jv/ioRZRPpC6Gfyq4ZhqvxHb5EtxnUGscDwxiNtkZVt8nT1
t3XX3prkW7HvsVm32bixq9eTk9o8zlacZPNJyY0z7Qwbagk0PruDcKKPFmt4tT/1Lyg3aHoG
CGph4oWrQzf2XVVLIYbzwhLBIXf8ZAeZ5JCj8kn9PBcyQEGFc334O2y9KNFBMFanHh3aV5Zu
ktvhok68MVVAw90i8azAM2P/vkveCMY42vg9aNSBY19uG9WV4d+RN5KAgfEDXScUyerr9gUy
hUKOrl6HB1p0wya6W5oCZEsRVoBgROAmmXOgvsxw5a/wujJOFHix0Wp+WiAyULNq+SoU0C7r
P1fsc5IK5ZFM2J+XHEdR9Wf3qktgBax6qbYX7tBFyLQW9KoFTEgicJaEIRJpD37wSn01OhJv
9t8CRWPb1YzaJhy6V8tPTyB3yDMQABUDWNrn3DssM0ZUE3Ui5xwPOXJg+qQZ1EzY+bCEMETU
/UpGGU545l7en7+sQ3XQ0xuHLrrgI6GhbWr0DsRl98e9PZUzNwARAQABtB1qYW51NSA8amFu
dTVAdGhlaW5kcmFuZXQuY29tPokCPgQTAQIAKAUCVXarLAIbAwUJB4YfgAYLCQgHAwIGFQgC
CQoLBBYCAwECHgECF4AACgkQ4zSjJZ3uBS5a0Q/+Kk7S6qp5rGpJeNxpm57IbCvaa6NbrgjL
6QpAmWzvbnwcF0aDCNgrrhWDUrkfCI5RwfcLFfCTGjLvnbQ+yxvrhI7grfbPAl7yyoHN3TNS
92quCiFnHksGIdyWcTVkRP/aR/+rgR/j3eGTXZag2fN9ozsC/tca23l+4UCLHrbtSJBQQ8fN
1TYEEDyvCz4COVk2GkmyJbrYbi1Bm8ccJwgrMG90FHxwF0TB7Ps6lZGQhCnmFtwz285GAIQN
WCltyydsiYvK60QDaaTpaTjf/xXWeHshNXd9G45veshuBz9Fj4lXOP5OgQMUXiVRoynXtnor
/sMxcRe5lFmycb1SAzwlU9R0qA6pjsMmfPGaTphONJ3F6U81VPpQlYsRIxtqtqZGrBZfuC4E
w4XsCyisXynbGqNMyg0uJjWUpEoTlO2swverSHxObyXTE3cQct7H6rTZYx36knzSK055cLHg
y30uyUy+prKTRD+RhV4lX/6Nf8hgTeRBY3cefrt5Fl6pod3x/RgJlgUDCGt4rJVbfdbD82xA
HuijDc+jBMw4cmxB6GdOkWi4ifojcOnMbsP7onZgC+bc7qfz2TUbGZThmHxTcBL+pufzi14C
6cRhduyG8d3ii8LSCQ02qOR2xEOuEQ1g1l5dPKmPtSg51dnWJbIO2bk005yalMoBv/Dr5w5E
/Ou5Ag0EVXarLAEQAJl5t/SaFDNdzt+/Ck7TO50cDSjKNza4wpWVfck/PI7zbUA6QEFR6qQc
PGZwKEyrDXRjCf0ZlzlXN1ZPcIOTeyoKtuoTq3GKa6d3Y3vru5Ua3HODbWyisduL/pjIc+wC
zcuFfMNfcFsY580ZEnRBGtqZF42Ubq44Wjcb5tFZqaVL04Inl6vtaL8An1AGXTnDuApN/OrW
DaZinL5iaS9iCzjzPwDlUK6ElpH7GtaiL+sNnpN1/RV35+inIjYne5HbBlBoW9zId80IZi65
NXTNETkMkxoqgI/A56+tb7iUS5VzXUVAbZbuu7mP+eMj0JFq3gXKtc3z2hC1dQUocA8b0Cp+
p/1q9pHtCZTWwbN4nYhMEvvX3ll4+5shjuIbjBr4YwbH/aYcymvQn5CpXKGmEXyqcydl3G3p
JUxNwB1PCryhk08qwpQ81JdR5d0/OXjg9KaNjGFgCbtk9XTprvfXlWZ81VwgvvD+UYsjns0S
Ago8mFsR1UumYhiIG6SmlbCoGESxfFsnex7AhEhTCK/Yq1C627ipIUST8wEB8BSQH1qOxLXU
gkAtCaIPni3AqfBjjI4Pd82IgG20jFC/rClNXCAN4dpKOaTv3ISJgznW/pQ6g9hhVWJAu10+
hFYMDlIa4lzssWlfzUy5nL9hjef5S2qJbBzguOEHzcWJMY9z8WgzABEBAAGJAiUEGAECAA8F
AlV2qywCGwwFCQeGH4AACgkQ4zSjJZ3uBS5T0w//cOarmb0Fjy196aKRskcd27tTUIvrHby5
WO3tzNyoRuLInrmct2EVLuVee72944VDz2mUP7xg5/pCoR20Es5YalXwHahsw4f76LRJykkJ
1NFH355cwSbxT76ROgTl6LJlBOeGTixGS5jsaHYXWMcQtteES4fz5QmFVIOutHUKaRnoQuCA
mHNb0axtSANXuLBSJAt7t6pw/EqwTQ38a1TWoD9FAWyjh7xEkwE5ISFLf3yf4e02WWpKOhm6
8vfIxiMIcJ8s379aMQU2jwfQ+rEjHYJAp9KzBp7OrhN/6crAwQVZ4tbM2pV7owKf60sUs9LK
O+GBktpYtZye0A24OncsRJ92EXx0FDw8PkLR5hTXTXQLD3ojjsR7j+nBOnmebv5kSzDmMuDL
IL5z9AtCGi9578xXqPU+Do0uwlqr3gObEU5WvSYeV/Wro5VSVmnZftnNJNzp4oD4fedSJavE
owL9jd5sscEppyNgi/6+sYXkk7mchIA9P03k6ipVEk5PZZ+FnZjiXu+kCFOnfea4y864czWT
yjDusbYQ3tvLeiDsR4czJynfEd7NTtt9y1SNbHsXV9WbXGOln5v3cib482f4g3hv4EFmVl3k
BpYu8QOo/qN4csyQQr6L/2f4clJywxjRjJh2Gl/H8DHN7hvNfq67K+VVzTYDWvxVsq7Tt7WE
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

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
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-----