Jump to content
C4 Forums | Control4

Control4 & Nest Thermostat


mensub

Recommended Posts

Here is an anonymized, wrapped, and indented dump of a Nest status with an example 2 setpoints a days schedule, but you can have as many as you want. The rules for schedule setpoints is use 15min(*60sec) increments, keep them an hour or more apart from each other (excluding continuations), and in ascending seconds in each day array. You could probably break these rules and the Nest would internally honor your unaligned or shortly spaced times, but the schedule interfaces view/edit code on the web, mobile app, or the nest might behave erratically since they follow these rules for UI spatial reasons.

jQuery12345678901234567890_EPOCHTIMSTAMP({"status":200,
"headers":{"X-nl-service-timestamp":EPOCHTIMSTAMP},
"payload":{"structure":{"00guid00-for0-some-purp-pose12345678":{
"$version":-1234567890,"$timestamp":EPOCHTIMSTAMP,
"location":"house name","street_address":"in tree","postal_code":"12345",
"name":"The Nest","away":false,"creation_time":1234567890101,
"devices":["device.NESTSERIALNUMBER"],"away_setter":0,"user":"user.1234","away_timestamp":EPOCHTIMSTAMP}},},
"link":{"NESTSERIALNUMBER":{"$version":1234567890,"$timestamp":EPOCHTIMSTAMP,"structure":"structure.00guid00-for0-some-purp-pose12345678"}},},
"schedule":{"NESTSERIALNUMBER":{"$version":1234567890,"$timestamp":EPOCHTIMSTAMP,"name":"The Nest Current Schedule",
"days":{
"0":{"0":{"type":"HEAT","temp":16.778,"time":0,"entry_type":"continuation"},"1":{"type":"HEAT","temp":16.556,"time":12345,"entry_type":"setpoint"},"2":{"type":"HEAT","temp":16.667,"time":12345,"entry_type":"setpoint"}},},
"1":{"0":{"type":"HEAT","temp":16.778,"time":0,"entry_type":"continuation"},"1":{"type":"HEAT","temp":16.556,"time":12345,"entry_type":"setpoint"},"2":{"type":"HEAT","temp":16.667,"time":12345,"entry_type":"setpoint"}},},
"2":{"0":{"type":"HEAT","temp":16.778,"time":0,"entry_type":"continuation"},"1":{"type":"HEAT","temp":16.556,"time":12345,"entry_type":"setpoint"},"2":{"type":"HEAT","temp":16.667,"time":12345,"entry_type":"setpoint"}},},
"3":{"0":{"type":"HEAT","temp":16.778,"time":0,"entry_type":"continuation"},"1":{"type":"HEAT","temp":16.556,"time":12345,"entry_type":"setpoint"},"2":{"type":"HEAT","temp":16.667,"time":12345,"entry_type":"setpoint"}},},
"4":{"0":{"type":"HEAT","temp":16.778,"time":0,"entry_type":"continuation"},"1":{"type":"HEAT","temp":16.556,"time":12345,"entry_type":"setpoint"},"2":{"type":"HEAT","temp":16.667,"time":12345,"entry_type":"setpoint"}},},
"5":{"0":{"type":"HEAT","temp":16.778,"time":0,"entry_type":"continuation"},"1":{"type":"HEAT","temp":16.556,"time":12345,"entry_type":"setpoint"},"2":{"type":"HEAT","temp":16.667,"time":12345,"entry_type":"setpoint"}},},
"6":{"0":{"type":"HEAT","temp":16.778,"time":0,"entry_type":"continuation"},"1":{"type":"HEAT","temp":16.556,"time":12345,"entry_type":"setpoint"},"2":{"type":"HEAT","temp":16.667,"time":12345,"entry_type":"setpoint"}}}}},},
"user_alert_dialog":{"1234":{"$version":-123456789,"$timestamp":EPOCHTIMSTAMP,"dialog_id":"confirm-pairing","dialog_data":""}},},
"shared":{"NESTSERIALNUMBER":{"$version":1234567890,"$timestamp":EPOCHTIMSTAMP,"hvac_fan_state":false,"target_temperature_low":16.12345,"hvac_ac_state":false,"can_cool":true,"auto_away":0,"compressor_lockout_enabled":false,
"name":"The Nest","target_temperature_high":16.12345,"compressor_lockout_timeout":0,"current_temperature":16.5,"target_change_pending":false,"target_temperature":16.12345,
"hvac_heater_state":false,"hvac_aux_heater_state":false,"can_heat":true,"target_temperature_type":"heat"}},},
"metadata":{"NESTSERIALNUMBER":{"$version":123456789,"$timestamp":EPOCHTIMSTAMP,"last_ip":"ip.add.res.s","last_connection":EPOCHTIMSTAMP}},},
"track":{"NESTSERIALNUMBER":{"$version":-123456789,"$timestamp":EPOCHTIMSTAMP,"online":true,"last_connection":EPOCHTIMSTAMP,"last_ip":"ip.add.res.s"}},},
"user":{"1234":{"$version":123456789,"$timestamp":EPOCHTIMSTAMP,"name":"account.email.addy@home.nest.com","structures":["structure.00guid00-for0-some-purp-pose12345678"]}},},
"device":{"NESTSERIALNUMBER":{"$version":-123456789,"$timestamp":EPOCHTIMSTAMP,"backplate_mono_version":"#.#.#","creation_time":EPOCHTIMSTAMP,"backplate_mono_info":"TFE (BP_DVT) #.#.# (ehs@ubuntu) 1234-01-01 01:01:01",
"switch_preconditioning_control":false,"click_sound":"on","leaf":false,"user_brightness":"auto","away_temperature_high":16.12345,"postal_code":"12345","away_temperature_low":16.12345,
"current_version":"1.x.x","temperature_lock":false,"model_version":"Diamond-1.xx","current_humidity":50,"hvac_wires":"Heat,Cool,Fan,Rc","backplate_bsl_info":"BSL","auto_away_enable":true,
"backplate_serial_number":"BACKPLATESNUMBER","fan_mode":"auto","time_to_target":0,"range_enable":false,"temperature_scale":"F","learning_time":0,"hvac_pins":"W1,Y1,Rc,G",
"backplate_bsl_version":"#.#.#,"range_mode":false,"has_fan":true,"target_time_confidence":0.0,"mac_address":"MACADDRESS","switch_system_off":false,"battery_level":3.866,"learning_mode":false,
"serial_number":"NESTSERIALNUMBER","local_ip":"ip.add.res.s","type":"TBD","learning_state":"initial"}}}})

Link to comment
Share on other sites


Chris at Chili Technologies in NYC wrote a Nest ruby plugin for the SiriProxy to read current temp and read/set target temp.

It's based on sniffing the iPhone app traffic and has some Siri say feedback, but its a great starting point for a C4 plugin.

https://github.com/chilitechno/SiriProxy-NestLearningThermostat/blob/master/lib/siriproxy-nestlearningthermostat.rb

Link to comment
Share on other sites

Ok so here is a port of the Siri Nest code to a stand alone ruby script that uses Mac OSX to speak the results.

This is all working for me in Lion 10.7.2. You will need to install json and httparty extensions for ruby first

In terminal

sudo gem install httparty
sudo gem install json

create this file with your nest account email and password

/usr/local/bin/nest

#!/usr/bin/env ruby
require 'rubygems'
require 'httparty'
require 'json'
#>remove lines inbetween comments for non osx systems
require 'osx/cocoa'
include OSX
#>these are just to enable a native osx text to speech say

#do a command line arg
ARGV.each do|ab|
num = ab.to_i
# change user/pass to your nest account
mynest = Nest.new('your.account@nest', 'yourpassword')
if num > 49 and num < 86
mynest.set_temp("#{ab}")
elsif ab == 'home'
mynest.set_away_or_home('home')
elsif ab == 'away'
mynest.set_away_or_home('away')
else
mynest.get_status
end
end

class Nest
attr_accessor :nest_email
attr_accessor :nest_password
attr_accessor :debug

def initialize(u, p)
@nest_email = u
@nest_password = p
@debug = false
end

def say(str)
puts str
#>remove lines inbetween comments for non osx systems
str.gsub!(/"/, '\"') # Put backslash before quotes
src = %(say "#{str}")
script = NSAppleScript.alloc.initWithSource(src)
script.executeAndReturnError(nil)
#>these are just to enable a native osx text to speech say
end

def login_to_nest
loginRequest = HTTParty.post('https://home.nest.com/user/login',:body => { :username => nest_email, :password => nest_password }, :headers => { 'User-Agent' => 'Nest/1.1.0.10 CFNetwork/548.0.4' })

authResult = JSON.parse(loginRequest.body) rescue nil
if authResult
if debug
puts authResult
end
end
return authResult
end

def get_nest_status(access_token, user_id, transport_url)
transport_host = transport_url.split('/')[2]
statusRequest = HTTParty.get(transport_url + '/v2/mobile/user.' + user_id, :headers => { 'Host' => transport_host, 'User-Agent' => 'Nest/1.1.0.10 CFNetwork/548.0.4','Authorization' => 'Basic ' + access_token, 'X-nl-user-id' => user_id, 'X-nl-protocol-version' => '1', 'Accept-Language' => 'en-us', 'Connection' => 'keep-alive', 'Accept' => '*/*'}) rescue nil
statusResult = JSON.parse(statusRequest.body) rescue nil
if statusResult
if debug
puts statusResult
end
end
return statusResult
end

def get_status
#say "Checking the status of the Nest."
#Thread.new {
authResult = login_to_nest
if authResult
access_token = authResult["access_token"]
user_id = authResult["userid"]
transport_url = authResult["urls"]["transport_url"]

statusResult = get_nest_status(access_token, user_id, transport_url)

if statusResult
structure_id = statusResult["user"][user_id]["structures"][0].split('.')[1]
if statusResult["structure"][structure_id]["away"]
say "The Nest is currently set to away."
else
device_serial_id = statusResult["structure"][structure_id]["devices"][0].split('.')[1]
# devices element could contain multiple serial_numbers if multiple thermostats associated to nest account.
# serial number is something like 01AB23CD456789EF

current_temp = (statusResult["shared"][device_serial_id]["current_temperature"] * 1.8) + 32
current_temp = current_temp.round
target_temp = (statusResult["shared"][device_serial_id]["target_temperature"] * 1.8) + 32
target_temp = target_temp.round
thermostat_name = statusResult["shared"][device_serial_id]["name"]
thetime = statusResult["shared"][device_serial_id]["$timestamp"]
time_to_target = statusResult["device"][device_serial_id]["time_to_target"]
if debug
puts time_to_target
puts thetime
end
if time_to_target > 0
time_estimate = (time_to_target - (thetime/1000))/60
time_estimate = time_estimate.round
say "The current temperature is #{current_temp} degrees, #{thermostat_name} is set to #{target_temp} degrees and will reach it in #{time_estimate} minutes"
else
say "The #{thermostat_name} is set to #{target_temp} degrees and the current temperature is #{current_temp} degrees."
end
end
else
say "Sorry, I couldn't understand the response from Nest.com"
end
else
say "Sorry, I couldn't connect to Nest.com."
end

#request_completed #always complete your request! Otherwise the phone will "spin" at the user!
#}
end

def set_away_or_home(home_away)
# away / home operate on structure IDs - presumably a structure is a collection of devices
#say "One moment while I set the Nest to " + home_away + "."
# Thread.new {
authResult = login_to_nest
if authResult
access_token = authResult["access_token"]
user_id = authResult["userid"]
transport_url = authResult["urls"]["transport_url"]
transport_host = transport_url.split('/')[2]

statusResult = get_nest_status(access_token, user_id, transport_url)

if statusResult
structure_id = statusResult["user"][user_id]["structures"][0].split('.')[1]
time_since_epoch = Time.now.to_i
payload = ''
if home_away == 'away'
payload = '{"away_timestamp":' + "#{time_since_epoch}" + ',"away":true,"away_setter":0}'
else
payload = '{"away_timestamp":' + "#{time_since_epoch}" + ',"away":false,"away_setter":0}'
end
begin
awayRequest = HTTParty.post(transport_url + '/v2/put/structure.' + structure_id, :body => payload, :headers => { 'Host' => transport_host, 'User-Agent' => 'Nest/1.1.0.10 C.10 CFNetwork/548.0.4', 'Authorization' => 'Basic ' + access_token, 'X-nl-protocol-version' => '1'})
if debug
puts awayRequest.body
end
rescue
puts 'error: '
end

if awayRequest.code == 200
say "Ok, I set the Nest to " + home_away + "."
else
say "Sorry, I couldn't set the Nest to " + home_away + "."
end
else
say "Sorry, I couldn't understand the response from Nest.com"
end
end
#request_completed #always complete your request! Otherwise the phone will "spin" at the user!
#}
end

def set_temp(temp)
#say "One moment while I set the Nest to #{temp} degrees."
#Thread.new {
authResult = login_to_nest

if authResult
access_token = authResult["access_token"]
user_id = authResult["userid"]
transport_url = authResult["urls"]["transport_url"]
transport_host = transport_url.split('/')[2]

statusResult = get_nest_status(access_token, user_id, transport_url)

if statusResult
structure_id = statusResult["user"][user_id]["structures"][0].split('.')[1]
device_serial_id = statusResult["structure"][structure_id]["devices"][0].split('.')[1]
version_id = statusResult["shared"][device_serial_id]["$version"]
current_temp = (statusResult["shared"][device_serial_id]["current_temperature"] * 1.8) + 32
current_temp = current_temp.round
thermostat_name = statusResult["shared"][device_serial_id]["name"]

target_temp_celsius = (temp.to_f - 32.0) / 1.8
target_temp_celsius = sprintf "%.5f", target_temp_celsius

payload = '{"target_change_pending":true,"target_temperature":' + "#{target_temp_celsius}" + '}'
if debug
puts payload
puts device_serial_id
puts version_id
puts 'POST ' + transport_url + '/v2/put/shared.' + device_serial_id
end
begin
tempRequest = HTTParty.post(transport_url + '/v2/put/shared.' + device_serial_id, :body => payload, :headers => { 'Host' => transport_host, 'User-Agent' => 'Nest/1.1.0.10 C.10 CFNetwork/548.0.4', 'Authorization' => 'Basic ' + access_token, 'X-nl-protocol-version' => '1'})
rescue
puts 'error: '
end
if debug
puts "continuing"
puts tempRequest.code
puts tempRequest.body
end
if tempRequest.code == 200
say "Ok, I set the #{thermostat_name} Nest to #{temp} degrees. The current temperature is #{current_temp} degrees."
else
say "Sorry, I couldn't set the temperature on the Nest."
end
else
say "Sorry, I couldn't understand the response from Nest.com"
end
else
say "Sorry, I couldn't connect to Nest.com."
end

#request_completed #always complete your request! Otherwise the phone will "spin" at the user!
#}
end
end

To run in terminal do

#make nest script executable
sudo chmod +x /usr/local/bin/nest

#get nest status
user$ nest status
The current temperature is 66 degrees, The Nest is set to 68 degrees and will reach it in 21 minutes

#set nest away
user$ nest away
Ok, I set the Nest to away.

#set nest home
user$ nest home
Ok, I set the Nest to home.

#set nest temp
user$ nest 69
Ok, I set the The Nest to 69 degrees. The current temperature is 67 degrees.

Link to comment
Share on other sites

Great post !

Ok so here is a port of the Siri Nest code to a stand alone ruby script that uses Mac OSX to speak the results.

This is all working for me in Lion 10.7.2. You will need to install json and httparty extensions for ruby first

In terminal

sudo gem install httparty
sudo gem install json

create this file with your nest account email and password

/usr/local/bin/nest

#!/usr/bin/env ruby
require 'rubygems'
require 'httparty'
require 'json'
#>remove lines inbetween comments for non osx systems
require 'osx/cocoa'
include OSX
#>these are just to enable a native osx text to speech say

#do a command line arg
ARGV.each do|ab|
num = ab.to_i
# change user/pass to your nest account
mynest = Nest.new('your.account@nest', 'yourpassword')
if num > 49 and num < 86
mynest.set_temp("#{ab}")
elsif ab == 'home'
mynest.set_away_or_home('home')
elsif ab == 'away'
mynest.set_away_or_home('away')
else
mynest.get_status
end
end

class Nest
attr_accessor :nest_email
attr_accessor :nest_password
attr_accessor :debug

def initialize(u, p)
@nest_email = u
@nest_password = p
@debug = false
end

def say(str)
puts str
#>remove lines inbetween comments for non osx systems
str.gsub!(/"/, '\"') # Put backslash before quotes
src = %(say "#{str}")
script = NSAppleScript.alloc.initWithSource(src)
script.executeAndReturnError(nil)
#>these are just to enable a native osx text to speech say
end

def login_to_nest
loginRequest = HTTParty.post('https://home.nest.com/user/login',:body => { :username => nest_email, :password => nest_password }, :headers => { 'User-Agent' => 'Nest/1.1.0.10 CFNetwork/548.0.4' })

authResult = JSON.parse(loginRequest.body) rescue nil
if authResult
if debug
puts authResult
end
end
return authResult
end

def get_nest_status(access_token, user_id, transport_url)
transport_host = transport_url.split('/')[2]
statusRequest = HTTParty.get(transport_url + '/v2/mobile/user.' + user_id, :headers => { 'Host' => transport_host, 'User-Agent' => 'Nest/1.1.0.10 CFNetwork/548.0.4','Authorization' => 'Basic ' + access_token, 'X-nl-user-id' => user_id, 'X-nl-protocol-version' => '1', 'Accept-Language' => 'en-us', 'Connection' => 'keep-alive', 'Accept' => '*/*'}) rescue nil
statusResult = JSON.parse(statusRequest.body) rescue nil
if statusResult
if debug
puts statusResult
end
end
return statusResult
end

def get_status
#say "Checking the status of the Nest."
#Thread.new {
authResult = login_to_nest
if authResult
access_token = authResult["access_token"]
user_id = authResult["userid"]
transport_url = authResult["urls"]["transport_url"]

statusResult = get_nest_status(access_token, user_id, transport_url)

if statusResult
structure_id = statusResult["user"][user_id]["structures"][0].split('.')[1]
if statusResult["structure"][structure_id]["away"]
say "The Nest is currently set to away."
else
device_serial_id = statusResult["structure"][structure_id]["devices"][0].split('.')[1]
# devices element could contain multiple serial_numbers if multiple thermostats associated to nest account.
# serial number is something like 01AB23CD456789EF

current_temp = (statusResult["shared"][device_serial_id]["current_temperature"] * 1.8) + 32
current_temp = current_temp.round
target_temp = (statusResult["shared"][device_serial_id]["target_temperature"] * 1.8) + 32
target_temp = target_temp.round
thermostat_name = statusResult["shared"][device_serial_id]["name"]
thetime = statusResult["shared"][device_serial_id]["$timestamp"]
time_to_target = statusResult["device"][device_serial_id]["time_to_target"]
if debug
puts time_to_target
puts thetime
end
if time_to_target > 0
time_estimate = (time_to_target - (thetime/1000))/60
time_estimate = time_estimate.round
say "The current temperature is #{current_temp} degrees, #{thermostat_name} is set to #{target_temp} degrees and will reach it in #{time_estimate} minutes"
else
say "The #{thermostat_name} is set to #{target_temp} degrees and the current temperature is #{current_temp} degrees."
end
end
else
say "Sorry, I couldn't understand the response from Nest.com"
end
else
say "Sorry, I couldn't connect to Nest.com."
end

#request_completed #always complete your request! Otherwise the phone will "spin" at the user!
#}
end

def set_away_or_home(home_away)
# away / home operate on structure IDs - presumably a structure is a collection of devices
#say "One moment while I set the Nest to " + home_away + "."
# Thread.new {
authResult = login_to_nest
if authResult
access_token = authResult["access_token"]
user_id = authResult["userid"]
transport_url = authResult["urls"]["transport_url"]
transport_host = transport_url.split('/')[2]

statusResult = get_nest_status(access_token, user_id, transport_url)

if statusResult
structure_id = statusResult["user"][user_id]["structures"][0].split('.')[1]
time_since_epoch = Time.now.to_i
payload = ''
if home_away == 'away'
payload = '{"away_timestamp":' + "#{time_since_epoch}" + ',"away":true,"away_setter":0}'
else
payload = '{"away_timestamp":' + "#{time_since_epoch}" + ',"away":false,"away_setter":0}'
end
begin
awayRequest = HTTParty.post(transport_url + '/v2/put/structure.' + structure_id, :body => payload, :headers => { 'Host' => transport_host, 'User-Agent' => 'Nest/1.1.0.10 C.10 CFNetwork/548.0.4', 'Authorization' => 'Basic ' + access_token, 'X-nl-protocol-version' => '1'})
if debug
puts awayRequest.body
end
rescue
puts 'error: '
end

if awayRequest.code == 200
say "Ok, I set the Nest to " + home_away + "."
else
say "Sorry, I couldn't set the Nest to " + home_away + "."
end
else
say "Sorry, I couldn't understand the response from Nest.com"
end
end
#request_completed #always complete your request! Otherwise the phone will "spin" at the user!
#}
end

def set_temp(temp)
#say "One moment while I set the Nest to #{temp} degrees."
#Thread.new {
authResult = login_to_nest

if authResult
access_token = authResult["access_token"]
user_id = authResult["userid"]
transport_url = authResult["urls"]["transport_url"]
transport_host = transport_url.split('/')[2]

statusResult = get_nest_status(access_token, user_id, transport_url)

if statusResult
structure_id = statusResult["user"][user_id]["structures"][0].split('.')[1]
device_serial_id = statusResult["structure"][structure_id]["devices"][0].split('.')[1]
version_id = statusResult["shared"][device_serial_id]["$version"]
current_temp = (statusResult["shared"][device_serial_id]["current_temperature"] * 1.8) + 32
current_temp = current_temp.round
thermostat_name = statusResult["shared"][device_serial_id]["name"]

target_temp_celsius = (temp.to_f - 32.0) / 1.8
target_temp_celsius = sprintf "%.5f", target_temp_celsius

payload = '{"target_change_pending":true,"target_temperature":' + "#{target_temp_celsius}" + '}'
if debug
puts payload
puts device_serial_id
puts version_id
puts 'POST ' + transport_url + '/v2/put/shared.' + device_serial_id
end
begin
tempRequest = HTTParty.post(transport_url + '/v2/put/shared.' + device_serial_id, :body => payload, :headers => { 'Host' => transport_host, 'User-Agent' => 'Nest/1.1.0.10 C.10 CFNetwork/548.0.4', 'Authorization' => 'Basic ' + access_token, 'X-nl-protocol-version' => '1'})
rescue
puts 'error: '
end
if debug
puts "continuing"
puts tempRequest.code
puts tempRequest.body
end
if tempRequest.code == 200
say "Ok, I set the #{thermostat_name} Nest to #{temp} degrees. The current temperature is #{current_temp} degrees."
else
say "Sorry, I couldn't set the temperature on the Nest."
end
else
say "Sorry, I couldn't understand the response from Nest.com"
end
else
say "Sorry, I couldn't connect to Nest.com."
end

#request_completed #always complete your request! Otherwise the phone will "spin" at the user!
#}
end
end

To run in terminal do

#make nest script executable
sudo chmod +x /usr/local/bin/nest

#get nest status
user$ nest status
The current temperature is 66 degrees, The Nest is set to 68 degrees and will reach it in 21 minutes

#set nest away
user$ nest away
Ok, I set the Nest to away.

#set nest home
user$ nest home
Ok, I set the Nest to home.

#set nest temp
user$ nest 69
Ok, I set the The Nest to 69 degrees. The current temperature is 67 degrees.

Link to comment
Share on other sites

Heh. I've seen worse applicants, that's for sure...

Sadly I have got too much on my full time plate already this xmas to even consider notions like that. With 5000 users, 4000 mobiles, 1000 desktops, 500 switches, 200 waps, 100 mobile home servers, 50tb sans, 25 web sites, 15 buildings, 10 hs22v blade vmware hosts, 2 sonic e6500 uplinks doves, and iSeries in a pear tree. I do play on the side with what I find interesting new tech and code integrations between them, but I don't have any C4 gear.

Anyway back to the nest, the more difficult code to make the nest truly an open platform has yet be written. The schedule editor and finding a way to gather energy statistics from the device for custom visualizations.

Link to comment
Share on other sites

I've written a thermostat driver to a thermostat that was HTTP controlled.

It could probably be done for the Nest as well.

That said, it's more likely a dealer or driver partner will do it, as Control4 probably wouldn't without support from Nest.

RyanE

Link to comment
Share on other sites

Control4 has provided (and will continue to provide) thousands of drivers for free.

You're criticizing because Control4 isn't currently making a driver for a 3rd-party product that was just released, that doesn't have an official API? A 3rd-party that could change the interface method (HTTP) at any time, so the driver could possibly just break for no apparent reason?

Wow, you're pretty fast on the trigger finger there, slick.

RyanE

Link to comment
Share on other sites

  • 2 weeks later...
  • 2 months later...

HouseLogix is currently writing a Control4 driver for the Nest Thermostat. Version 1 is about 75% complete. HouseLogix has developed drivers for a variety of devices and systems such as Lutron RadioRA 2.

Link to comment
Share on other sites

HouseLogix is currently writing a Control4 driver for the Nest Thermostat. Version 1 is about 75% complete. HouseLogix has developed drivers for a variety of devices and systems such as Lutron RadioRA 2.

awesome! please post when its available? have a target date?

Link to comment
Share on other sites

I'm going to change my tune about the Control4 stat. I have worked on an algorithm that uses CA relay T sensors to talk back to the thermostat. It's taken a few months of billing to see the savings in gas from the programming but it's there. More importantly, to the family, is better climate control where it is needed. The nice thing about all of this is freedom to place the CA relays anywhere they work best (out of drafty areas, next to seating, etc.).

Aside from Nest, I already own C4 stats and the programming tools are already there. No reason to move away from Control4.

Link to comment
Share on other sites

Not really an algo in the sense of something proprietary or black-box-ish. It depends on how screwed-up the airflow is around the wall stat and cold-air infiltration situation in the living space. T averaging was the worst of it since there is no utility within CHE to do this. Also, many conditions exist that could change or modify the "automatic" operation portion of the routine.

I didn't think anyone was interested when I opened a thread about this but I could post something on C4DYI.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.