After yesterday’s hardware hookup, the next step is to set up the proper software for this.
There are a number of design and implementation decisions involved:
- how to format the data as a wireless packet
- how to generate and send out that packet on a JeeNode
- how to pick up and decode the data in Node.js
Let’s start with the packet: there will be one every 10 seconds, and it’s best to keep the packets as small as possible. I do not want to send out differences, like I did with the otRelay setup, since there’s really not that much to send. But I also don’t want to put too many decisions into the JeeNode sketch, in case things change at some point in the future.
The packet format I came up with is one which I’d like to re-use for some of the future nodes here at JeeLabs, since it’s a fairly convenient and general-purpose format:
(format) (longvalue-1) (longvalue-2) ...
Yes, that’s right: longs!
The reason for this is that the electricity meter counters are in Watt-hour, and will immediately exceed what can be stored as 16-bit ints. And I really do want to send out the full values, also for gas consumption, which is in 1000th of a m3, i.e. in liters.
But for these P1 data packets that would be a format code + 8 longs, i.e. at least 25 bytes of data, which seems a bit wasteful. Especially since not all values need longs.
The solution is to encode each value as a variable-length integer, using only as many bytes as necessary to represent each value. The way this is done is to stored 7 bits of the value in each byte, reserving the top-most bit for a flag which is only set on the last byte.
With this encoding, 0 is sent as
0x80, 127 is sent as
0xFF, whereas 128 is sent as two bytes
0x80, 129 is sent as
0x81, 1024 as
Ints up to 7 bits take 1 byte, up to 14 take 2, … up to 28 take 4, and 32 will take 5 bytes.
It’s relatively simple to implement this on an ATmega, using a bit of recursion:
The full code of this p1scanner.ino sketch is now in JeeLib on GitHub.
Tomorrow, I’ll finish off with the code used on the receiving end and some results.