Instructables
Picture of TempBug: internet-connected thermometer
xively_graph.png
Last January, we had some trouble with the heat in my office. Specifically, the kind of trouble wherein the heat is not on, you turn it up, and it still not on. This went on for more than a few days, and finally ended a day or two after we got an email announcing that the heat was broken and speculating that it had probably been down for a few days. My teammates and I laughed a bit at this - we knew exactly when the heat had stopped working. We had a continuous record of the temperature in the office going back months, with 10-minute resolution.

You can do this too, and it's quick, cheap, and easy! This little gadget is built around an electric imp, and you can push the data from the imp out to anywhere you want. In my case, I found it handy to push the data to a neat service called Xively, which stores and graphs the data for free.

This project takes about an hour to two hours, if you've never done a project with an electric imp before, and when you're done you'll have a thermometer that you can toss anywhere with wifi and collect data for months to years on a single battery, depending on how often you check the temperature.
 
Remove these adsRemove these ads by Signing Up
1-40 of 81Next »
Ryan1219785 days ago

Thanks for making this easy to build! but I'm having a problem Xively isn't allowing any new accounts now. so i have this but have no where to sent the info. i tried to use another site thingspeak.com but the code wont work with the way its wired. i was wondering if you have any ides what i can do. thanks for any help you can give!

raydlettca24 days ago

I had the thermometer up on Xively yesterday, but was having trouble with measuring temperature. Then I tried to modify the code, made a mess, and then decided to start from scratch and got rid of everything on electric imp. I started by attempting to relink via BlinkUp and can't get it to link up. Any thoughts on how to get BlinkUp to work again?

tombrew (author)  raydlettca19 days ago

You actually don't need to BlinkUp again; you can just edit the code in the model you've already created. When you hit "build and run" in the IDE, the code you have in the IDE is built and sent to the imp, wiping out the previous code.

BlinkUp is only needed when initially configuring or changing the WiFi credentials on the imp. As long as you're in the same Electric Imp account and on the same WiFi network you were on before, there's no need to do it again.

If you've lost your WiFi configuration and are now having trouble using BlinkUp to get it back, you can take a look at the documentation and tips on BlinkUp here: https://electricimp.com/docs/gettingstarted/1-blinkup/

KRS Test1 month ago

Thanks for a great list of instructions. You really have done an outstanding job making this manageable for a for someone with limited tech skills!

I have been able to setup the code and the integration to Xively but am having trouble with the readings. The readings remain steady at say 50 for quite a while then spike up to 120 or plunge to -119. Sometimes they stay at say -10 for an extended period of time. Attached is a picture of the Xively graph.

Have tested the readings by placing the E-Imp next to hot and cold items but there is little fluctuation in the readings.

No doubt I have made a simple error somewhere but am struggling to find it.

For the moment the power supply is by USB from a laptop. Am planning on soldering on the battery once the readings work properly.

Any feedback or suggestions would be appreciated.

Thanks again!

Electric Imp output.jpg
tombrew (author)  KRS Test19 days ago

Sounds like a flaky connection somewhere in your thermistor circuit. Go back over your solder joints and make sure they're all holding together properly. It might be a good idea to look up a tutorial on soldering if you're unfamiliar; I've covered the basics here but a more in-depth of cold solder joints and how to avoid them might save you some time.

lathyrus1 year ago
Wow! Despite not having soldered anything for about 30 years, I was able to build this thermometer without any real difficulty in a couple of hours, and I understand how it works! Thanks Tombrew for the excellent instructions. The only problem I had was that the guy in Maplins gave me the wrong size fixed resistor, so the first time I built it the reading in my livingroom was a chilly -159 degrees C... but with the correct 100k Ohm resistor everything is fine. I also couldn't get blinkup to work with my Sony Android phone so I had to borrow my wiffe's iPhone to do the setup. And getting Xively (Cosm) to draw graphs was tricky until I figured out that I needed a MASTER API key, available under the Settings tab.
tempbug.png
lathyrus lathyrus3 months ago

Follow-up: The tempbug has been running smoothly in my attic for 9 months now. My first 9 volt battery lasted only a month, checking the temperature every 15 mins. So I changed the interval to 2 hours and my second battery lasted 6 months. I also noticed that the first temperature reading in each cycle is a bit higher than the others (by about 0.5 degree, I don't know why) so I modified the code to ignore the first reading and average the next 10:

2014-07-14 06:00:08 UTC+1[Device]ignore: voltage: 3.315 temp: 19.4 C2014-07-14 06:00:08 UTC+1[Device]loop: 0 voltage: 3.313 temp: 18.9 C2014-07-14 06:00:08 UTC+1[Device]loop: 1 voltage: 3.311 temp: 18.4 C2014-07-14 06:00:08 UTC+1[Device]loop: 2 voltage: 3.311 temp: 18.2 C2014-07-14 06:00:08 UTC+1[Device]loop: 3 voltage: 3.311 temp: 18.1 C2014-07-14 06:00:08 UTC+1[Device]loop: 4 voltage: 3.313 temp: 18.2 C2014-07-14 06:00:08 UTC+1[Device]loop: 5 voltage: 3.309 temp: 18.3 C2014-07-14 06:00:08 UTC+1[Device]loop: 6 voltage: 3.311 temp: 18.2 C2014-07-14 06:00:08 UTC+1[Device]loop: 7 voltage: 3.313 temp: 18.2 C2014-07-14 06:00:08 UTC+1[Device]loop: 8 voltage: 3.311 temp: 18.6 C2014-07-14 06:00:08 UTC+1[Device]loop: 9 voltage: 3.311 temp: 18.1 C

Building and programming the Imp was so much fun that I bought 2 more and made a phone-controlled electric gate opener, and a gizmo for forcibly rebooting my Wowwee Rovio...

Thanks again Tombrew for the great intro and instructions!

how did you change to a 2 hour interval? was it in the code inserted into electric imp? if so where?

Here's the complete Device and Agent code that I'm using. It logs the temperature on odd-numbered hours (1 a.m., 3. a.m. etc). It uploads to Xively the temperature (Celsius), WiFi signal strength, battery voltage, and lag (how long it took to do the measurement cycle).


//KW tempbug device code v2 20nov2013
// April with a 100k resistor from 3V3 to pin9 and 100k NTC Thermistor from pin9 to pin8
// pin8 TEMP_READ_EN_L - drive low to enable temp reading (great for batteries!)
// pin9 ANALOG NTC value
// benchmarking runtime: first tick with hardware.micros
local tick = hardware.micros();
// turn on WiFi powersave to reduce power consumption when awake
// WiFi is not used until line 44 (no communication with agent until end of program)
imp.setpowersave(true);
// Configure Pins
// pin 8 is driven high to turn off temp monitor (saves power) or low to read
hardware.pin8.configure(DIGITAL_OUT);
hardware.pin8.write(1);
// pin 9 is the middle of the voltage divider formed by the NTC - read the analog voltage to determine temperature
hardware.pin9.configure(ANALOG_IN);
// all calculations are done in Kelvin
// these are constants for this particular thermistor; if using a different one,
// check your datasheet
const b_therm = 4450;
const t0_therm = 298.15;
// turn on the thermistor network
hardware.pin8.write(0);
// gather several pin9 ADC and battery voltage readings and average them
// (just takes out some noise)
local val = 0;
local v_high = 0;
//skip first measurement (always low)
imp.sleep(0.01);
local val_now=hardware.pin9.read();
local v_high_now=hardware.voltage();
local v_therm = v_high_now * val_now / 65535.0;
local r_therm = 100000.0 / ( (v_high_now / v_therm) - 1);
local ln_therm = math.log(100000.0 / r_therm);
local t_therm = (t0_therm * b_therm) / (b_therm - t0_therm * ln_therm) - 273.15;
local t_str = format("%.01f", t_therm);
local batt_str = format("%.03f",v_high_now);
server.log("ignore: voltage: " +batt_str +" temp: " +t_str+" C");
//then measure 10 times
for (local i = 0; i < 10; i++) {
imp.sleep(0.01);
val_now = hardware.pin9.read();
v_high_now = hardware.voltage();
v_therm = v_high_now * val_now / 65535.0;
r_therm = 100000.0 / ( (v_high_now / v_therm) - 1);
ln_therm = math.log(100000.0 / r_therm);
t_therm = (t0_therm * b_therm) / (b_therm - t0_therm * ln_therm) - 273.15;
t_str = format("%.01f", t_therm);
batt_str = format("%.03f",v_high_now);
server.log("loop: " +i +" voltage: " +batt_str +" temp: " +t_str+" C");
val += val_now;
v_high += v_high_now;
}
val = val/10;
v_high = v_high / 10.0;
// turn the thermistor network back off
hardware.pin8.write(1);
// scale the ADC reading to a voltage by dividing by the full-scale value and multiplying by the supply voltage
local v_therm = v_high * val / 65535.0;
// calculate the resistance of the thermistor at the current temperature
local r_therm = 100000.0 / ( (v_high / v_therm) - 1);
local ln_therm = math.log(100000.0 / r_therm);
local t_therm = (t0_therm * b_therm) / (b_therm - t0_therm * ln_therm) - 273.15;
// format into a string for the string output port
local t_str = format("%.01f", t_therm);
server.log("Current temp is "+t_str+" C");
// update the current battery voltage with a nicely-formatted string of the most recently-calculated value
local batt_str = format("%.03f",v_high);
server.log("Battery Voltage is "+batt_str);
// benchmarking runtime
local tock = hardware.micros();
server.log(format("Read cycle took %d us", (tock-tick)));
local lag = ((tock-tick)/1000000.0);
local lag_str = format ("%.06f",lag);
//log WiFi signal strength
function ReportRSSI() {
local rssi = imp.rssi();
if (rssi < -87) {
server.log("WiFi signal is: " + rssi + " dBm (0 bars)");
}
else if (rssi < -82) {
server.log("WiFi signal is: " + rssi + " dBm (1 bar)");
}
else if (rssi < -77) {
server.log("WiFi signal is: " + rssi + " dBm (2 bars)");
}
else if (rssi < -72) {
server.log("WiFi signal is: " + rssi + " dBm (3 bars)");
}
else if (rssi < -67) {
server.log("WiFi signal is: " + rssi + " dBm (4 bars)");
}
else {
server.log("WiFi signal is: " + rssi + " dBm (5 bars)");
}
return rssi;
}
local rssi = ReportRSSI();
//attempt to send it to Xively...
agent.send("Xively-temp", t_str); // send data to Xively
agent.send("Xively-lag", lag_str); // send data to Xively
agent.send("Xively-battery", batt_str); // send data to Xively
agent.send("Xively-rssi", rssi); // send data to Xively
// wake up every 2 hours on odd-numbered hours (prevents drifting on slow DHCP)
imp.onidle( function() {
local secsToEvenHour = (1+ 120*60 - (time()%(120*60)) );
local secsToOddHour = secsToEvenHour - (60*60);
if (secsToOddHour < 0) {secsToOddHour += (120*60);}
local snoozelength = secsToOddHour;
server.log("snoozing for " + (snoozelength / 60) + " minutes and " + (snoozelength % 60) + " seconds" );
server.sleepfor(snoozelength);
});
// full firmware is reloaded and run from the top on each wake cycle, so no need to construct a loop
##################### CUT HERE ######################
//KW tempbug agent code v2 20nov2013
//********************BEGIN XIVELY********************
//Code written by @beardedinventor modified for use by Joel Wehr
API_Key <- "pdyL6p9fp9zVtakiNqFGTaKGXPwqnMuxCdfM7258b1D8D6LI"; //Type your Xively API Key
Feed_ID <- "1282406454" //Type your Feed ID
/// Channel_ID <- "thermistor"; //Type your Channel ID -- modified by KW - see bottom of program
Xively <- {}; // this makes a 'namespace'
class Xively.Client {
ApiKey = null;
triggers = [];
constructor(apiKey) {
this.ApiKey = apiKey;
}
/*****************************************
* method: PUT
* IN:
* feed: a XivelyFeed we are pushing to
* ApiKey: Your Xively API Key
* OUT:
* HttpResponse object from Xively
* 200 and no body is success
*****************************************/
function Put(feed){
local url = "https://api.xively.com/v2/feeds/" + feed.FeedID + ".json";
local headers = { "X-ApiKey" : ApiKey, "Content-Type":"application/json", "User-Agent" : "Xively-Imp-Lib/1.0" };
local request = http.put(url, headers, feed.ToJson());
return request.sendsync();
}
/*****************************************
* method: GET
* IN:
* feed: a XivelyFeed we fulling from
* ApiKey: Your Xively API Key
* OUT:
* An updated XivelyFeed object on success
* null on failure
*****************************************/
function Get(feed){
local url = "https://api.xively.com/v2/feeds/" + feed.FeedID + ".json";
local headers = { "X-ApiKey" : ApiKey, "User-Agent" : "xively-Imp-Lib/1.0" };
local request = http.get(url, headers);
local response = request.sendsync();
if(response.statuscode != 200) {
server.log("error sending message: " + response.body);
return null;
}
local channel = http.jsondecode(response.body);
for (local i = 0; i < channel.datastreams.len(); i++)
{
for (local j = 0; j < feed.Channels.len(); j++)
{
if (channel.datastreams[i].id == feed.Channels[j].id)
{
feed.Channels[j].current_value = channel.datastreams[i].current_value;
break;
}
}
}
return feed;
}
}
class Xively.Feed{
FeedID = null;
Channels = null;
constructor(feedID, channels)
{
this.FeedID = feedID;
this.Channels = channels;
}
function GetFeedID() { return FeedID; }
function ToJson()
{
local json = "{ \"datastreams\": [";
for (local i = 0; i < this.Channels.len(); i++)
{
json += this.Channels[i].ToJson();
if (i < this.Channels.len() - 1) json += ",";
}
json += "] }";
return json;
}
}
class Xively.Channel {
id = null;
current_value = null;
constructor(_id)
{
this.id = _id;
}
function Set(value) {
this.current_value = value;
}
function Get() {
return this.current_value;
}
function ToJson() {
local json = http.jsonencode({id = this.id, current_value = this.current_value });
server.log(json);
return json;
}
}
client <- Xively.Client(API_Key);
//********************END XIVELY********************
device.on("Xively-temp", function(v) {
channel1 <- Xively.Channel("temperature");
channel1.Set(v);
feed1 <- Xively.Feed(Feed_ID, [channel1]);
client.Put(feed1);
});
device.on("Xively-lag", function(v) {
channel1 <- Xively.Channel("lag");
channel1.Set(v);
feed1 <- Xively.Feed(Feed_ID, [channel1]);
client.Put(feed1);
});
device.on("Xively-rssi", function(v) {
channel1 <- Xively.Channel("WiFi");
channel1.Set(v);
feed1 <- Xively.Feed(Feed_ID, [channel1]);
client.Put(feed1);
});
device.on("Xively-battery", function(v) {
channel1 <- Xively.Channel("battery");
channel1.Set(v);
feed1 <- Xively.Feed(Feed_ID, [channel1]);
client.Put(feed1);
});

Here are the graphs on Xively for 3 months

q.jpg

And here's what my code writes to the Electric Imp IDE log window every 2 hours.

qq.jpg
BenC41 month ago

What kind of wireless range does the imp have?

lathyrus BenC426 days ago

Similar to a laptop's wifi card. My Imp in the attic and the router is in the hallway 2 floors below it on the opposite side of the house. When the Imp's battery begins to run out, the WiFi signal it detects drops, and when if falls below about -93 dBm it can't connect anymore.

raydlettca26 days ago

Thanks for the instructions, there were one thing that was not mentioned in putting this together, the 2 pin jumper. I temporarily made one from wire. One problem that I am having is I am not getting temperature reads. The request log is running properly - there are request and responses - but nothing shows up in the graph to the left. Any thoughts?

Try to write the temperature as a server.log() statement in the Imp IDE first, to make sure the thermistor is working correctly, before you try to draw graphs in Xively. Uploading data to Xively is tricky - I eventually got something to work, but I don't really understand how it works!

lenny20205 months ago

I tried to build it--great, thorough, easily understandable instructions, but I am not getting any info posted to Xively. I copied the info for lines 7 and 8, and although the project seems to cycle as expected, the log states:

Posted to Xively: 120.21, got return code: 56, msg: <html>

<head><title>400 Bad Request</title></head>

body bg color="white">

<center><hi>400 Bad Request</hi></center>

<hr><center>nginx/1.1.19</center>

</body>

</html>

I am getting no data posted, and the Request log sits empty with the "waiting for requests area" just cycling. Where have I screwed up? I could send you any additional information you request, if needed

tombrew (author)  lenny20205 months ago

Hi Lenny,

Sorry, that sounds frustrating! Let's look over your code on a direct message.

davemack tombrew2 months ago

I have also just built this and get this message when it tries to send data to Xively. Perhaps I have the same issue as Lenny.

























2014-07-21 14:45:04 UTC-4
[Agent]
Posted to Xively: 71.60, got return code: 56, msg: <html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.1.19</center>
</body>
</html>




davemack davemack2 months ago

Tombrew,

With Lenny's help I found the problem! The Feed ID is a number and should not have quotation marks around it.

My unit now works.

Thanks,

Dave

HandyFrank4 months ago

I've been wanting to create a wifi thermometer for a while, this plan looks perfect! I'm a newbie when it comes to building electronics so I have a few questions if you can share some knowledge.

Are the 2 breakout boards you link to different from each other, or one an older version or something? I noticed one is the April breakout and is green, and the other just lists as a plain breakout board and is red. Any different and is one better than the other? I see in your pics you used the green april breakout board I think.

Any way to add a humidity sensor into the mix? Would that require a whole set of different details, or can it be blended into the existing coding and add either a combo temp/humidity sensor, or a separate humidity sensor?

I can in theory build this on a mini breadboard before doing any soldering, right? Maybe i'll do that and practice my soldering skills on a test board so I don't mess up the breakout board.

Any recommendations on a soldering iron that is decent, but won't break the bank for someone who hardly does soldering? Any tips on resources for getting into learning more about how all of this works? I'm a complete newbie so I can use tips on soldering, recommended entry level equipment, understanding of circuits and all the components, etc. I see that Amazon (and AdaFruit) sell breadboard starter kits that mention Arduino. Is that a good thing to buy to start playing and learning? Is Arduino way harder to use vs. Electric Imp?

Seems like DigiKey has everything needed to build this, I think i'll order from them.

Thanks!!!

tombrew (author)  HandyFrank4 months ago

The green and red breakout boards are identical - use either of the ones I linked to.

This instructable doesn't cover what you need to do temperature and humidity sensing, but you might take a look at the electric imp reference code for the DHT11: https://github.com/electricimp/reference/tree/mast...

You certainly can build this on a breadboard, but you'll need to make sure you get an electric imp breakout board with headers, or put headers on your breakout board. You should check with google for the best soldering iron recommendations; I've got a pretty nice one and am therefore spoiled.

Arduino vs. Electric Imp isn't really harder/easier; they're different device with different purposes. I can't speak to much on Arduinos goals as a project or tool, but I can say the Electric Imp is made specifically to connect things to the internet, and it does that quite well.

Best of luck and have fun!

illiac44 months ago

I have made it but it shows around 80. I assume thies is in fahrenheit. What do i need to change that it will be displayed in celsius? TNX

tombrew (author)  illiac44 months ago
Yep, it defaults to fahrenheit. You can change it to celsius by calling "read_c" instead of "read_f" on line 103 of the device code.
dbehman5 months ago

Excellent article! I'd like to build this for a swimming pool thermometer. Do you think this would work with the sensor submerged?

tombrew (author)  dbehman5 months ago

I think it could (not the imp and power supply, though!) The longer the leads on your thermistor, the less accurate it will be. A creative mechanical design could help, or you could look into thermocouples.

byron1125 months ago

hi im trying to build the temp bug and i have it all wired up and i have used the imp before to turn on and off a light. but now that i have it programed and all hooked up and cap hooked up the right way. the imp card blinks red 3 times then flashes green for half a sec then it turns off. what does this mean??? Ive tried powering it via usb and 9v battery. same thing... any help would be great!

tombrew (author)  byron1125 months ago

That's actually just it working! The three red blinks are the imp attempting to connect to your WiFi, the one green blink happens when it connects. As soon as it connects, it runs the entire firmware and uploads the measurement in about a second, then goes to deep sleep - which is why you see it stop blinking. You should see it do this once every 15 minutes.

ai4px6 months ago

THanks.... just what I was looking for! Didn't even know about IMP.

365nice made it!8 months ago

A quick follow up - I added 3 sensors to measure temperature at several points (which works reasonably well). Note: the imp libraries have been changed - with new agent code that runs on a server to connect to Xively (was Chosm). There are examples on the imp site. This said - this was the article that inspired me - so thanks!

IMG_3890.JPG
ygodnik 365nice7 months ago

Hello,

I saw that you added sensors. I am reasonable at making circuits, but am very poor at coding (basic python and a matlab experience). I have two questions. Could I see a copy of your code? Also, if someone is fairly illiterate in coding, is there a place one can go to get the basics on squirrel? I look online and what I find is squirrel-lang.org, which assumes a solid level of coding knowledge initially. It is like he is trying to explain how to speak chinese to me in swahili. I would really like to learn some nuts and bolts so I can modify things and trouble shoot reasonably intelligently.

For example,

therm_en_l <- hardware.pin8;

In this command, it seems like "therm_en_I" is one piece, but is it an built in command? I see the "<-" piece and I don't know what it means. It seems like the "." links objects together, but I am not sure when it is allowed, how it functions, etc.


Thank you for your time, and thank you to the author for the tutorials.

tombrew (author)  ygodnik7 months ago
Hi ygodnik,

I actually did link to the source code for the project in the instructable - it's all at https://github.com/electricimp/examples/tree/master/tempBug.

The line of squirrel you referenced is not a built in command; that line "aliases" the hardware.pin8 object with the name "therm_en_l".

I don't know of any really good squirrel-specific tutorials, but the language is in many ways similar to javascript. There are a boatload of places online to learn how to write decent javascript for free.

Thanks for the feedback and good luck!
ygodnik tombrew7 months ago

Thanks a bunch Tom. I did get everything working with one sensor, but I am afraid if I tried to change to much in your script with my current knowledge, I would just get myself in trouble. I will learn Javascript for dummies and then come back and see if I can get multiple components and new configurations figured out effectively.

Thank you again for the excellent program (with helpful comments) and for your help here.

discostu9568 months ago
Very nicely written. Answered questions that popped up along the way, and explained why you used what at each step. Learned a lot reading this. Thanks for such a good instructable, look forward to making one
(removed by author or community request)
tombrew (author)  smilesfromnowhere9 months ago
Hi smilesfromnowhere,

I've just pushed a small update to the github code that removes a deprecated call that may have caused errors device-side. I'm running this code on my own tempbug right now and things are working properly.

I also added two things to the agent code:

1. The agent now logs the data sent and the return code and message from Xively when attempting to PUT to the feed.

2. The agent now appends the device ID from the specific tempBug to the Xively channel name. This allows you to have many tempBugs on a single Xively feed, so you can view all the graphs on one page if you want.

Give this a try and let me know if trouble persists. If nothing else, logging the response from Xively should give us something to go on.

Thanks,

-Tom
Tom,
I was an *idiot*. The original problem was from having the feed id and the api key switched.

I get errors with the new code:
"the index 'resp' does not exist"
"at postToXively:152"
"from unknown:159"

...I have multiple thermistors wired up to this board but don't know how to 'instantiate' four different thermistors (yet).

Best Regards,
Miles
tombrew (author)  smilesfromnowhere9 months ago
No worries! I've published things with bigger mistakes than that ;)

Have you pulled the code from github again since you switched the Xively parameters back? I believe I pushed a fix for the error you're seeing above.
petewa9 months ago
built one of these the other day... love it... i have already ordered the supplies to make 3 more. this way i can monitor the temp in different parts of the house... i heat with wood so this is PERFECT! First time ever soldering anything and it worked when i was done! hehe.....thanks
frank5639 months ago
Great project, ordered directly from your list and went through the steps. It's been 30 years since I tinkered with electronics and this took about 2 hrs from start to end. I use this to monitor a summer rental property about a mile away that sits all winter, so with this, I can monitor the heat without making a trip over. Plus, it uses my neighbors wifi near the rental property!
ghwood10 months ago
This is very neat and my first Imp project. Spectacular documentation. (I actually built 2 off the bat using exactly the parts list you provide.)

For both, I seem to get through all the steps successfully but then repeatedly get the following log messages in the Electric IMP IDE (timestamps about 5 sec apart) :

2013-12-21 20:40:48 UTC-5: [Status] Device booting; 4.68% program storage used
2013-12-21 20:40:48 UTC-5: [Device] imp.configure command is deprecated
2013-12-21 20:40:48 UTC-5: [Device] ERROR: the index 'temp_sns_en_l' does not exist
2013-12-21 20:40:48 UTC-5: [Device] ERROR: at main:127

I'm hoping to present one as a Christmas gift to my father-in-law as a wine cellar monitor he can peek in on while he travels, so would welcome any thoughts about what's going on! Thank you.
1-40 of 81Next »