Nest Thermostat Review, Update #7

Update #6, Update #5, Update #4, Update #3, Update #2, Update #1, Install

I received a replacement thermostat earlier this week as promised by Nest Labs. I had time this afternoon to do a swap and reinstall. Nest had asked me to swap the thermostats between two floors experimentally to determine whether a temperature reading issue was related to the location or the thermostat. It was the thermostat.

As part of the swap, I had to reprogram the two thermostats.

I’d swapped the defective thermostat with one from the basement. Apparently, the base has the S/N on it of the thermostat and they’re intended to be “paired” so I decided to return the thermostat to the basement and install the new thermostat on the first floor (replacing the original defective unit).

I removed the old unit and replaced the wires. Depending on the type of wires you’re using, you may find that it’s far more difficult to do than you would expect. I ‘d forgotten how much I hated trying to stick the very stiff HVAC wires into the thermostat’s base!

I replaced everything and activated the unit. You can look at the installation experience post for more information about the general setup.

Past the wifi connection, rebooting, waiting, waiting, waiting, then “ERROR.” “No Rc or Rh” connection.

20111218-IMG_0138

Crud. So, I popped the thermostat off the base and looked at the wires. They all appeared to be fine. So, I reseated the Rc connection and replaced the thermostat. Success! I find that a tiny tug on the wire after you believe it has been seated does the trick. The rest of the install went without issue.

The thermostat switched to the normal temperature display after a few more alerts. The only thing was – the temperature read 76F. Whaaaa? Given the reboot cycles, etc., I really hadn’t handled it much, not enough to cause the temperature to be that high. I waited about 5 minutes for it to start dropping and when it did not, I called Nest to speak with the person who’d handled the replacement, Mark. He was out apparently, so I ended up speaking with someone who went by “DK” for about 30 minutes about a few topics.

We decided the best course of action was to wait and see.

Thankfully, the new thermostat is now reading a temperature that I would expect, so for some reason, this new thermostat took quite a while to acclimate to the room temperature (much longer than the original three thermostats – around 45 minutes).

Ember.JS and EZdata, and Rails

I’ve been trying to do some additional work on my ember.js extension for data management. At the same time though, I’ve been trying (to learn and) build a simple Ruby on Rails web demo application using the new JavaScript library. There have been more than a few things that have mystified me about the framework and the structuring of an application. One aspect in particular was how to best manage foreign keys and join tables with the ActiveRecord class (and the corresponding SQL tables). So many tutorials have the same lame example of: a CART, an ORDER, a CUSTOMER …, that it’s often difficult to apply the same patterns to a more interesting system.

I started simple this time.

I wanted a PERSON class and a GIFT class.

image

A Person has been given gifts and may give gifts (and a few other common attributes).

class CreatePeople < ActiveRecord::Migration
  def change
    create_table :people do |t|
      t.string :first_name
      t.string :last_name
      t.date :date_of_birth
      t.string :email_address

      t.timestamps
    end
  end
end

One of the things that I can’t decide if I like is the automatic pluralization of words, especially People/Person. I would have been content with a Persons table, but when creating a model, by default (as I’m aware it can be overridden), a Person is mapped to a table called “People.”

The second table, Gifts is very simple:

class CreateGifts < ActiveRecord::Migration
  def change
    create_table :gifts do |t|
      t.string :description
      t.integer :from_person_id
      t.integer :to_person_id
      t.timestamps
    end
  end
end

As I thought I might want a richer structure for the Gift class in the future, I did not use the more standard “person_id” name for the foreign key column that maps a gift to a Person. I wanted the column name to be more obvious what it was. Additionally, I needed two columns that both mapped to a “Person", so I couldn’t have both be called “person_id” anyway.

By deviating from the normal pattern, there are a few expectations when defining the ActiveRecord class. It was these expectations that weren’t clear to me (especially with examples).

The Ruby class for Gift is defined like so:

class Gift < ActiveRecord::Base
  belongs_to :from_person, :class_name => "Person", :foreign_key => "from_person_id"
  belongs_to :to_person, :class_name => "Person", :foreign_key => "to_person_id"
end

and the Person:

class Person < ActiveRecord::Base
  has_many  :gifts_given , :class_name => "Gift", :foreign_key => "from_person_id"
  has_many  :gifts, :foreign_key => "to_person_id"
end

The key (and the ‘ah ha’ moment for me) was the use of the foreign_key parameter to the on the has_many and belongs_to associations.

In the Gift class, I included the belongs_to association macro. In this case, :from_person is the name of the rich accessor method (which looks like a property in other languages) that will be added to the Gift class. Using the symbol :class_name is like a class finding assistant. Without it, the Rails framework assumes that there would be a class named “FromPerson.” Of course, that would fail. By specifying “Person,” I’ve indicated to Rails that the class it should map to is called “Person” which I defined earlier. The :foreign_key symbol and value indicates which column in the backing table has the value which will map to an instance of a Person. In the SQL table, I added a “from_person_id” column and this points at that as the “from_person_id” column is the foreign key to the People table. (The same is true for :to_person.)

Looking at the Person class, it is using another common association macro, :has_many. :Has_many when used here, is indicating that a Person may have zero or more “gifts.” The new accessor method is named gifts (by using :gifts). Here, too, you’ll specify the name of the foreign_key. Again, repeat this for the :gifts_given automatically added accessor method. One interesting thing is that only :gifts_given requires the :class_name to be specified. The reason is that Rails automatically maps :gifts to the Gifts class (by way of naming). The :gifts_given cannot be automatically mapped, so you need to give (sigh) it a little help.

Here’s a little test:

>> jason = Person.find(1)
  Person Load (18.0ms)  SELECT "people".* FROM "people" WHERE "people"."id" = ? LIMIT 1  [["id", 1]]
#<Person id: 1, first_name: "Jason", last_name: "Bourne", date_of_birth: nil, email_address: nil, created_at: "2012-01-06 13:47:40", updated_at: "2012-01-07 03:10:29">
>> jason.gifts_given
  Gift Load (0.0ms)  SELECT "gifts".* FROM "gifts" WHERE "gifts"."from_person_id" = 1
[#<Gift id: 1, description: "Machine Gun", from_person_id: 1, to_person_id: 4, created_at: "2012-01-07 14:39:17", updated_at: "2012-01-07 14:39:17">]
>> jason.gifts_given[0].to_person.first_name
"Magnum"
  Person Load (0.0ms)  SELECT "people".* FROM "people" WHERE "people"."id" = 4 LIMIT 1
>> jason.gifts_given[0].to_person.gifts
  [#<Gift id: Gift Load (1.0ms)1  SELECT "gifts".* FROM "gifts" WHERE "gifts"."to_person_id" = 4
, description: "Machine Gun", from_person_id: 1, to_person_id: 4, created_at: "2012-01-07 14:39:17", updated_at: "2012-01-07 14:39:17">]
>> jason.gifts_given[0].to_person.gifts[0].from_person.first_name
  Person Load (0.0ms)  SELECT "people".* FROM "people" WHERE "people"."id" = 1 LIMIT 1
"Jason"

I added two people: Jason, and Magnum, and one gift before executing the code above. Jason, as you should be able to follow, gave a wonderful gift to Magnum. As you can see, by using the automatically added accessor methods by way of the association macros described above, I was able to traverse the database structure very easily when mapped to a few simple objects.

One plus of experimenting and testing with the console while using Rails/Ruby in this case is that the output includes the SQL commands that are executed when the various method calls are made. Here’s an example where I rolled multiple calls into one chained call:

>> jason = Person.find(1).gifts_given[0].to_person.first_name
  Person Load (19.0ms)  SELECT "people".* FROM "people" WHERE "people"."id" = ? LIMIT 1  [["id", 1]]
  Gift Load (0.0ms)  SELECT "gifts".* FROM "gifts" WHERE "gifts"."from_person_id" = 1
"Magnum"
  Person Load (0.0ms)  SELECT "people".* FROM "people" WHERE "people"."id" = 4 LIMIT 1

Nest Thermostat Review, Update #6

Update #5, Update #4, Update #3, Update #2, Update #1, Install

I didn’t expect to have another post so soon. But, the Nest experience continues to frustrate and baffle.

On the 3rd of January, I took the following screen shot of our basement schedule for heating:

image

Tonight (one day later on the 4th), we headed down to the basement to watch a recorded episode of AMCs Hell on Wheels and it was cold. Frak! What the…

The thermostat reported the temperature in the room was 62F. Seriously? It should have been about 66F at the time I looked.

I brought up the schedule and was disappointed (yet, not shocked given the other problems) to see:

image

All of the evening settings (except Monday?) had disappeared completely. I had not made the change. I don’t understand. I’m no artificial intelligence expert (my wife though has a CS Master’s degree with a specialty in it Smile), but I’m confident any learning algorithm I would write wouldn’t be this stupid and this broken.

If I were a competitor reading this, I’d be laughing just a little. Understand though – Nest still can make this work – don’t rest or expect them to just disappear so easily.

As Nest continues to be silent on these matters, I strongly recommend you not buy a Nest thermostat. It’s an undone expensive piece of hardware, that while shiny and new, isn’t ready for the duties it claims to have mastered.

Update: Janurary 13, 2012 – This happened again. The schedule for Saturday and Sunday was modified to entirely remove the evening set points.  Nest support recommended that I turn off the “learning” feature of the thermostat yesterday and I hadn’t done that yet. But now I will and see if it happens regardless.

Nest Thermostat Review, Update #5

Update #6, Update #5, Update #4, Update #3, Update #2, Update #1, Install

I got my replacement Nest thermostat today via FedEx.

I was surprised to open the box and find a complete sealed package. Honestly, I expected they’d ship just the display and the base (as the support engineer hadn’t set any expectations, I apparently just made up my own!). But, I suppose at this point in the company, they just aren’t setup to ship just the two pieces. It has the unfortunate side effect of producing extra waste (as I can’t imagine that extra wall plates are going to come in handy anywhere). The little screw driver could be given away but the rest likely will end up in a landfill. I’ll ship them all of the unused parts back as I don’t want them – hopefully they don’t just trash them.

There’ve been some really awesome commenters in the past few days and I wanted to take a moment to highlight a few key comments.

From Curt:

I finally called Nest and spoke to a pleasant fellow. First off, it turns out the Nest does NOT anticipate a temperature set point. It will not turn on the furnace ahead of time. If you train it to go from the night setting of 60 to the daytime setting of 68 by turning it to 68 when you get up, it will always be 60 when you get up.

Wow, that’s a super disappointment. Honestly, I really thought it could do that.

Another from Curt:

It does not keep as steady a temperature as the primitive Honeywell round thermostat it replaced.

From Mark:

I’ve had my Nest for about 10 days. I would recommend waiting before buying one.

Kevin:

I’ve been considering replacing my Honeywell programmable t’stat with a Nest…but now I’m not so sure

David shares my disappointment regarding Nest Labs:

I would love to hear what NEST has to say about the variances…I would think they are monitoring these blogs…..If they are not…shame on them.

They seem to be way too quiet. They don’t seem to “get” social media.

And Matt provided a link to a very complete tear-down of the device:

Here is a good site that did a tear-down,lots of comments and people look like they really know what there talking about!

http://www.sparkfun.com/tutorials/334

GregN is still enthused about his Nest thermostat:

You guys are right in all the above posts. But to be honest, I’m happy with setting a schedule that warms the house before I get up in the morning, and saves energy overnight. Yes, I had that functionality at a lower price point before the Nest. But I didn’t have remote adjustments or the great looking hockey puck on my wall before.

Thanks again for all the comments! Keep them coming!image

I won’t replace the poorly functioning Nest thermostat for a few days with the new unit (as it’s a nuisance to adjust all of the schedules, move the units around, etc.).

Today, the system had again auto activated the “away” mode apparently, and then did not activate the normal evening schedule. So, our house was cold when we returned from work, even though it should have been warming for about a half hour. I just don’t understand this feature. I don’t understand why “away” isn’t triggered at night.

I could turn off learning, auto-away … leaving me with remote scheduling.

Update: January 11, 2012 => Something triggered the “auto-away” feature two days in a row now. I don’t understand why it happens. The part that’s annoying is that the schedule doesn’t run when this happens apparently, so we came home to a cold house (and tonight I thought to check before leaving from work to see if it had happened again).

A post not related to Nest thermostat hardware….

I typed in https://www.nest.com this evening and instead of the nice looking Nest.com web site, I got this:

SNAGHTML69c9dbf8

What?! I hadn’t actually noticed that I’d typed https at first, so I was a bit baffled for a moment. After closer investigation, Nest doesn’t have HTTPS apparently for their marketing/support web site setup on their Amazon CloudFront account (which is what cloudfront.net is).

They really should fix that. Smile

I was having some serious performance issues with their remote access web site earlier. It was barely usable.

That inspired me to dig a little to see what JavaScript libraries they might be using, the chatter on the network, etc. Here’s what I dug up.

JavaScript libraries:

  1. Jquery 1.7
  2. Raphael (for doing vector graphics using SVG or VML)
  3. Jquery UI
  4. eve.js (a “javascript events library”)
  5. jquery.ui.spinner
  6. iphone style checkboxes (or maybe a variation on this…it’s very similar)
  7. backbone.js
  8. underscore.js
  9. modernizer (1.6)
  10. jquery-animate-css-rotate
  11. jquery double tap plugin
  12. jquery form plugin
  13. jquery right click plugin
  14. jquery mouse wheel support

An interesting DIV and solution to a problem with web fonts (found on their main page):

<div id="digits">
  <!--  Some browsers suffer unfortunate lag the first time they
        draw text in fonts loaded over the network. We pre-render
        these digits to avoid this lag, and this gets removed at
        the same time the loading message is removed. -->
  1234567890
</div>

And a method for activating DEBUG mode:

N.DEBUG = ('False' == 'True') || (document.location.search.indexOf('debug') > -1) || (C.USERNAME.indexOf('@nestlabs.') > -1);

Thus, to activate DEBUG mode on your nest, simply navigate to here:

https://home.nest.com/home?debug

Brings up a slightly scary option for debugging. Be careful with this – I didn’t try ANY of the options, so it’s at your own risk.

image

Also, interestingly it adds a WEATHER tab:

image