OneM2M Platform Implementation

I just finished integrating a demonstrator system that implements the OneM2M standards for connected devices, using the oneMPOWER platform. It’s a very complex, enterprise-level protocol and suite of specifications, and is designed for seriously large systems.

In my personal engineering approach, I tend toward reducing problem sets toward simplicity, much along the lines of Chuck Moore’s philosophical underpinnings of the Forth language. (I’ll dig into more of that in another post…) But there are certain use cases out there for complexity, too.

You can read about this here, but beware! It’s not for the faint of heart:


Warding Off Winter With TI CC2650, Beaglebone Black, and a Nest Thermostat

Winter is coming, and the Northeastern United States where I live can get cold! And the houses are often old and drafty. So I built a wireless sensor system tied to a Nest thermostat to keep me cozy, wherever I am in the house, instead of keeping my thermostat cozy, bolted to its wall.

I did this with Texas Instruments’ Sensortags, a Beaglebone Black, DeviceHive for device registration and management, and a Nest thermostat.

This one was coded up using Python to speak Bluetooth LE to the Sensortags, and JavaScript on Node.js to do the device registration and telemetry messaging.

Yeah, they call it Bluetooth Smart now, but I don’t like that name! LE for me. 😉

DeviceHive managed the device registration for Sensortags, to make it easy to add new tags and wrangle them, and the data service exchange piped the messaging to scriptr for some transform logic in a convenient cloud service. did visualization and Nest control, and Circonus handled data logging and analytics.

Read the articles here:

…and here:

And the code is on GitHub!

This is the video I made to go along with the rest:


Delicious Coffee with a Kinoma Create and PubNub

Update: I have a forthcoming three-part series of articles on Texas Instruments’ e2e blog that dives into some of the hardware engineering behind this, too. I’ll link them here when it’s finally published!

Updated Update, here are the links:
Part 1
Part 2

I’m a coffee snob. I admit it. I’m proud of it. Although, upon reflection I really think it boils down to appreciating deliciousness. And who wouldn’t?


Anyhow, I was able to weave my love of coffee together with another Internet of Things demonstration project, this time coding JavaScript and XML on a Kinoma Create, and building a Pyrex-cased temperature probe with a Texas Instruments LM-35 military-grade analog temperature sensor. The Kinoma reads the temperature sensor, and asynchronously publishes telemetry messages to PubNub. From there, the data service exchange subscribed to the messages and routed them to a number of data services I used for analytics and alerting, including,, and Circonus. As with all these prototypes, it was up and running very fast, and I could iterate rapidly as new insights formed. Powerful stuff, that can really hit your bottom line and time-to-market in good ways.

I discovered my drip coffee maker sucks at temperature regulation, and my pourover and French press technique has improved quite a bit. So has the coffee!

You can read the full article I wrote here. And the code is on GitHub, as well.

This setup was at World Maker Faire 2015 in New York City, at the Kinoma booth. Cool to have some of my creations featured there =)


Novena Laptop Linux Samsung 840 EVO Hard Drive Temperature Sensor Fix

The Novena laptop’s Linux build doesn’t support the Samsung 840 EVO hard drive that it ships with. While this isn’t a problem specific to the Novena by any means, it will affect the users. It’s a simple fix, just edit the hddtemp.db file and add the proper ID string and temp code to it. You can just echo-append it, or if you are fussy open it in an editor and put it neatly in the Samsung section!

echo '"Samsung SSD 840 EVO 250G B" 190 C "Samsung SSD 840 EVO 250GB"' >> /etc/hddtemp.db
                               ^---that space needs to be there; see below

If you want to find how to add this to hddtemp.db yourself, or on a different model drive that’s not in the db file, use smartctl and hddtemp --debug. The -A flag on smartctl lists the drive’s attributes. Look for the ID# for the temperature sensor. It also may indicate Celsius or Fahrenheit, but more likely it will be Celcius. Here we can see it’s attribute number 190, and based on the name, it’s in Celsius.

[email protected]:~# smartctl -A /dev/sda
smartctl 6.4 2014-10-07 r4002 [armv7l-linux-3.19.0-00268-g04e9d08] (local build)
Copyright (C) 2002-14, Bruce Allen, Christian Franke,

SMART Attributes Data Structure revision number: 1
Vendor Specific SMART Attributes with Thresholds:
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       0
  9 Power_On_Hours          0x0032   099   099   000    Old_age   Always       -       169
 12 Power_Cycle_Count       0x0032   099   099   000    Old_age   Always       -       12
177 Wear_Leveling_Count     0x0013   100   100   000    Pre-fail  Always       -       0
179 Used_Rsvd_Blk_Cnt_Tot   0x0013   100   100   010    Pre-fail  Always       -       0
181 Program_Fail_Cnt_Total  0x0032   100   100   010    Old_age   Always       -       0
182 Erase_Fail_Count_Total  0x0032   100   100   010    Old_age   Always       -       0
183 Runtime_Bad_Block       0x0013   100   100   010    Pre-fail  Always       -       0
187 Uncorrectable_Error_Cnt 0x0032   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0032   067   064   000    Old_age   Always       -       33
195 ECC_Error_Rate          0x001a   200   200   000    Old_age   Always       -       0
199 CRC_Error_Count         0x003e   100   100   000    Old_age   Always       -       0
235 POR_Recovery_Count      0x0012   099   099   000    Old_age   Always       -       8
241 Total_LBAs_Written      0x0032   099   099   000    Old_age   Always       -       39490266

You can get the drive’s name with hddtemp --debug and also make an educated guess as to the sensor ID#. Notice the space in “250G B” below – you’ll want to use this exact model string in the db file. Not sure precisely why that space should be there, but from the hddtemp source it seems that’s how the drive identifies itself via SATA command. Perhaps other utils like smartctl get the name in other ways, or fix it up. I don’t have time to dig further on that…

[email protected]:~# hddtemp --debug /dev/sda

================= hddtemp 0.3-beta15 ==================
Model: Samsung SSD 840 EVO 250G B              �@

field(5)	 = 0
field(9)	 = 170
field(12)	 = 12
field(177)	 = 0
field(179)	 = 0
field(181)	 = 0
field(182)	 = 0
field(183)	 = 0
field(187)	 = 0
field(190)	 = 34
field(195)	 = 0
field(199)	 = 0
field(235)	 = 8
field(241)	 = 50

If one of the field value seems to match the temperature, be sure to read
the hddtemp man page before sending a report (section REPORT). Thanks.

Novena Laptop Thermal Imaging

I’ve been wondering how much heat the CPU on the Novena puts out, and if the tiny heatsink (no fan) is sufficient to cool it. After letting the machine sit idle for an hour or so, running X with a browser but nothing else with high load, I shot a few images with a Flir E-series camera. Allowed the Flir to stabilize its self-calibration for a few minutes, and then got these images:

Whole laptop innards:

Novena Laptop Thermal Image

Novena Laptop Thermal Image

Close-up image of the PVT2-A board, charger, display adapter, and GPIO breakout board:

Novena PVT2-A Thermal Image

Novena PVT2-A Thermal Image

And the same, with data overlay:

Novena PVT2-A Thermal Image with Data Overlay

Novena PVT2-A Thermal Image with Data Overlay

The CPU heatsink temp was calculated using an emissivity of ε0.83 for red anodized aluminum, and I used ε0.95 for the display board chip’s black plastic. Remember kids, thermal emissivity is important to keep in mind!

The i.MX6 datasheet lists the operating temperature range as 90C typical, with 105C maximum. Even still, it seems to run a bit hot at idle in my opinion, and I need to test it under extended load. Also will test with the lid closed (not sure it was designed to be operated that way) and in different orientations.

I’ve also found a possible power supply issue when running on battery under high CPU load, but I still need to investigate.

Update 3 May 2015: I’ve been compiling KiCad for over an hour, and it’s sitting at near 100% CPU use on all four cores, and running at max clock speed. Figured I should take another thermal pic while it’s hot. Not terribly bad for the hotspots, within the datasheet tolerances. Hotter than I’d prefer, and I don’t think I’d run it this hard for long with the lid closed, but no troubles.

Novena PVT2-A Thermal Image with Data Overlay at 100% CPU

Novena PVT2-A Thermal Image with Data Overlay at 100% CPU

Also, the power supply issue under high load that I suspected, I now think is probably related to a timing issue in the eDP chip as reported here by xobs:


Novena Laptop Assembly Timelapse Video

Recently assembled my shiny new Novena laptop, and decided to make a time-lapse video of the assembly process. Shot in 4k on RED – because one awesome tech deserves another!

In the video, you’ll see that I use threadlocker everywhere. I’m a big fan of the stuff, and in my opinion so very many of the so-called maker projects and kits out there should be recommending it. Especially the ones full of stepper motors and other vibrating bits, that are made of wood or acrylic, which prevents you from pre-tensioning the bolts correctly because you’ll crush or crack the chassis.

I also spill superglue all over my hands, when a tube decides to goosh out everywhere. (was securing one of the peek array threaded inserts, that pulled out while trying to install a speaker) That was fun, trying to not touch anything for a few minutes until it dried, and then going at it with acetone… I do not recommend gooshing superglue all over your hands. Avoid.

Very excited to dive into this phenomenal hardware hacking platform. Thanks, bunnie and xobs!