From ba10bbf9c1722acbba395d012b29f494781fdcef Mon Sep 17 00:00:00 2001 From: Richard Thompson Date: Sun, 2 Jun 2013 10:15:23 -0700 Subject: [PATCH 01/36] added cooling, fan, autoaway, manual away, and humidity --- collect.php | 36 ++++++++++++++++++++++++++++++++++-- dbsetup | 5 +++++ fetch.php | 6 +++--- index.html | 14 ++++++++++++-- insert.php | 4 ++-- test.php | 15 ++++++++------- 6 files changed, 64 insertions(+), 16 deletions(-) diff --git a/collect.php b/collect.php index cb91aa9..b5555e0 100644 --- a/collect.php +++ b/collect.php @@ -11,10 +11,42 @@ function get_nest_data() { $nest = new Nest(); $info = $nest->getDeviceInfo(); + + if (preg_match("/away/", $info->current_state->mode) || preg_match("/range/", $info->current_state->mode)) { + if ($info->current_state->temperature > $info->target->temperature[1]) { + //Hotter then upper temp + $targetTemp = $info->target->temperature[1]; + } + else if ($info->current_state->temperature < $info->target->temperature[0]) { + //Colder then lower temp + $targetTemp = $info->target->temperature[0]; + } + else { + if (($info->target->temperature[1] - $info->current_state->temperature) < + ($info->current_state->temperature - $info->target->temperature[0])) + { + //Closer to upper temp + $targetTemp = $info->target->temperature[1]; + } + else + { + //Closer to lower temp + $targetTemp = $info->target->temperature[0]; + } + } + } + else { + $targetTemp = $info->target->temperature; + } + $data = array('heating' => ($info->current_state->heat == 1 ? 1 : 0), + 'cooling' => ($info->current_state->ac == 1 ? 1 : 0), + 'fan' => ($info->current_state->fan == 1 ? 1 : 0), + 'autoAway' => ($info->current_state->auto_away == 1 ? 1 : ($info->current_state->auto_away == -1 ? -1 : 0)), + 'manualAway' => ($info->current_state->manual_away == 1 ? 1 : 0), + 'leaf' => ($info->current_state->leaf == 1 ? 1 : 0), 'timestamp' => $info->network->last_connection, - 'target_temp' => sprintf("%.02f", (preg_match("/away/", $info->current_state->mode) ? - $info->target->temperature[0] : $info->target->temperature)), + 'target_temp' => sprintf("%.02f", $targetTemp), 'current_temp' => sprintf("%.02f", $info->current_state->temperature), 'humidity' => $info->current_state->humidity ); diff --git a/dbsetup b/dbsetup index 94901e2..9d7ee0f 100644 --- a/dbsetup +++ b/dbsetup @@ -6,6 +6,11 @@ USE nest; CREATE TABLE `data` ( `timestamp` timestamp NOT NULL, `heating` tinyint unsigned NOT NULL, + `cooling` tinyint unsigned NOT NULL, + `fan` tinyint unsigned NOT NULL, + `autoAway` tinyint signed NOT NULL, + `manualAway` tinyint unsigned NOT NULL, + `leaf` tinyint unsigned NOT NULL, `target` numeric(7,3) NOT NULL, `current` numeric(7,3) NOT NULL, `humidity` tinyint unsigned NOT NULL, diff --git a/fetch.php b/fetch.php index e7eefb6..a8ea5f5 100644 --- a/fetch.php +++ b/fetch.php @@ -15,11 +15,11 @@ if ($stmt = $db->res->prepare("SELECT * from data where timestamp>=DATE_SUB(NOW(), INTERVAL ? HOUR) order by timestamp")) { $stmt->bind_param("i", $hrs); $stmt->execute(); - $stmt->bind_result($timestamp, $heating, $target, $current, $humidity, $updated); + $stmt->bind_result($timestamp, $heating, $cooling, $fan, $autoAway, $manualAway, $leaf, $target, $current, $humidity, $updated); header("Content-type: text/tab-separated-values"); - print "timestamp\theating\ttarget\tcurrent\thumidity\tupdated\n"; + print "timestamp\theating\tcooling\tfan\tautoAway\tmanualAway\tleaf\ttarget\tcurrent\thumidity\tupdated\n"; while ($stmt->fetch()) { - print implode("\t", array($timestamp, $heating, $target, $current, $humidity, $updated)) . "\n"; + print implode("\t", array($timestamp, $heating, $cooling, $fan, $autoAway, $manualAway, $leaf, $target, $current, $humidity, $updated)) . "\n"; } $stmt->close(); } diff --git a/index.html b/index.html index 94c1fa5..b19523e 100644 --- a/index.html +++ b/index.html @@ -142,7 +142,7 @@ // fetch the data d3.tsv("fetch.php?hrs=" + hours, function(error, data) { - color.domain(d3.keys(data[0]).filter(function(key) { return (key == "current" || key == "target" || key == "heating"); })); + color.domain(d3.keys(data[0]).filter(function(key) { return (key == "current" || key == "target" || key == "heating"|| key == "cooling"|| key == "fan"|| key == "autoAway"|| key == "manualAway"|| key == "leaf"|| key == "humidity"); })); data.forEach(function(d) { d.date = parseDate(d.timestamp); @@ -153,7 +153,17 @@ name: name, values: data.map(function(d) { if (name == "heating") - return { date: d.date, val: +d[name] + 60 }; + return { date: d.date, val: +d[name] + 53 }; + else if(name == "cooling") + return { date: d.date, val: +d[name] + 50 }; + else if(name == "fan") + return { date: d.date, val: +d[name] + 47 }; + else if(name == "autoAway") + return { date: d.date, val: +d[name] + 44 }; + else if(name == "manualAway") + return { date: d.date, val: +d[name] + 41 }; + else if(name == "leaf") + return { date: d.date, val: +d[name] + 38 }; else return { date: d.date, val: +d[name] }; }) diff --git a/insert.php b/insert.php index 774091b..2ccbb89 100644 --- a/insert.php +++ b/insert.php @@ -8,8 +8,8 @@ $db = new DB($config); $data = get_nest_data(); if (!empty($data['timestamp'])) { - if ($stmt = $db->res->prepare("REPLACE INTO data (timestamp, heating, target, current, humidity, updated) VALUES (?,?,?,?,?,NOW())")) { - $stmt->bind_param("siddi", $data['timestamp'], $data['heating'], $data['target_temp'], $data['current_temp'], $data['humidity']); + if ($stmt = $db->res->prepare("REPLACE INTO data (timestamp, heating, cooling, fan, autoAway, manualAway, leaf, target, current, humidity, updated) VALUES (?,?,?,?,?,?,?,?,?,?,NOW())")) { + $stmt->bind_param("siiiiiiddi", $data['timestamp'], $data['heating'], $data['cooling'], $data['fan'], $data['autoAway'], $data['manualAway'], $data['leaf'], $data['target_temp'], $data['current_temp'], $data['humidity']); $stmt->execute(); $stmt->close(); } diff --git a/test.php b/test.php index 50d5486..1812361 100644 --- a/test.php +++ b/test.php @@ -11,27 +11,28 @@ $status = $nest->getStatus(); print_r($status); +echo "\n
\n
"; $infos = $nest->getDeviceInfo(); print_r($infos); - +echo "\n
\n
"; stuff_we_care_about($infos); function stuff_we_care_about($info) { echo "Heating : "; - printf("%s\n", ($info->current_state->heat == 1 ? 1 : 0)); + printf("%s\n
", ($info->current_state->heat == 1 ? 1 : 0)); echo "Timestamp : "; - printf("%s\n", $info->network->last_connection); + printf("%s\n
", $info->network->last_connection); echo "Target temperature : "; if (preg_match("/away/", $info->current_state->mode)) { - printf("%.02f\n", $info->target->temperature[0]); + printf("%.02f\n
", $info->target->temperature[0]); } else { - printf("%.02f\n", $info->target->temperature); + printf("%.02f\n
", $info->target->temperature); } echo "Current temperature : "; - printf("%.02f\n", $info->current_state->temperature); + printf("%.02f\n
", $info->current_state->temperature); echo "Current humidity : "; - printf("%d\n", $info->current_state->humidity); + printf("%d\n
", $info->current_state->humidity); } From 987904ca3b1d21b634572293edeefad6c37283df Mon Sep 17 00:00:00 2001 From: Richard Thompson Date: Sun, 2 Jun 2013 10:29:30 -0700 Subject: [PATCH 02/36] added cooling, fan, autoaway, manual away, and humidity --- collect.php | 60 ++++++++++++++++++++++++++--------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/collect.php b/collect.php index b5555e0..185bb51 100644 --- a/collect.php +++ b/collect.php @@ -14,42 +14,42 @@ function get_nest_data() { if (preg_match("/away/", $info->current_state->mode) || preg_match("/range/", $info->current_state->mode)) { if ($info->current_state->temperature > $info->target->temperature[1]) { - //Hotter then upper temp - $targetTemp = $info->target->temperature[1]; - } - else if ($info->current_state->temperature < $info->target->temperature[0]) { - //Colder then lower temp - $targetTemp = $info->target->temperature[0]; - } - else { - if (($info->target->temperature[1] - $info->current_state->temperature) < - ($info->current_state->temperature - $info->target->temperature[0])) - { - //Closer to upper temp - $targetTemp = $info->target->temperature[1]; - } - else - { - //Closer to lower temp - $targetTemp = $info->target->temperature[0]; - } - } + //Hotter then upper temp + $targetTemp = $info->target->temperature[1]; + } + else if ($info->current_state->temperature < $info->target->temperature[0]) { + //Colder then lower temp + $targetTemp = $info->target->temperature[0]; + } + else { + if (($info->target->temperature[1] - $info->current_state->temperature) < + ($info->current_state->temperature - $info->target->temperature[0])) + { + //Closer to upper temp + $targetTemp = $info->target->temperature[1]; + } + else + { + //Closer to lower temp + $targetTemp = $info->target->temperature[0]; + } + } } else { $targetTemp = $info->target->temperature; } $data = array('heating' => ($info->current_state->heat == 1 ? 1 : 0), - 'cooling' => ($info->current_state->ac == 1 ? 1 : 0), - 'fan' => ($info->current_state->fan == 1 ? 1 : 0), - 'autoAway' => ($info->current_state->auto_away == 1 ? 1 : ($info->current_state->auto_away == -1 ? -1 : 0)), - 'manualAway' => ($info->current_state->manual_away == 1 ? 1 : 0), - 'leaf' => ($info->current_state->leaf == 1 ? 1 : 0), - 'timestamp' => $info->network->last_connection, - 'target_temp' => sprintf("%.02f", $targetTemp), - 'current_temp' => sprintf("%.02f", $info->current_state->temperature), - 'humidity' => $info->current_state->humidity - ); + 'cooling' => ($info->current_state->ac == 1 ? 1 : 0), + 'fan' => ($info->current_state->fan == 1 ? 1 : 0), + 'autoAway' => ($info->current_state->auto_away == 1 ? 1 : ($info->current_state->auto_away == -1 ? -1 : 0)), + 'manualAway' => ($info->current_state->manual_away == 1 ? 1 : 0), + 'leaf' => ($info->current_state->leaf == 1 ? 1 : 0), + 'timestamp' => $info->network->last_connection, + 'target_temp' => sprintf("%.02f", $targetTemp), + 'current_temp' => sprintf("%.02f", $info->current_state->temperature), + 'humidity' => $info->current_state->humidity + ); return $data; } From 357253764617a516cc3ee08a5066f46a5338950f Mon Sep 17 00:00:00 2001 From: Richard Thompson Date: Sat, 8 Jun 2013 09:41:34 -0700 Subject: [PATCH 03/36] validate get data is not empty --- fetch.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fetch.php b/fetch.php index a8ea5f5..5e72c42 100644 --- a/fetch.php +++ b/fetch.php @@ -6,7 +6,7 @@ define('DEFAULT_HRS', 72); $hrs = DEFAULT_HRS; -if ($_GET["hrs"]) { +if (!empty($_GET["hrs"])) { $hrs = $_GET["hrs"]; } From d38b9532242b5eb9e3e6d200ca62db2400be8525 Mon Sep 17 00:00:00 2001 From: Richard Thompson Date: Sat, 8 Jun 2013 21:42:10 -0700 Subject: [PATCH 04/36] added energy collection routines and db setup --- collectEnergy.php | 53 ++++++++++++++++++++++++++++++++++++++++++ dbsetup | 43 ++++++++++++++++++++++++++++++++-- insertEnergy.php | 59 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 153 insertions(+), 2 deletions(-) create mode 100644 collectEnergy.php create mode 100644 insertEnergy.php diff --git a/collectEnergy.php b/collectEnergy.php new file mode 100644 index 0000000..dff9b7a --- /dev/null +++ b/collectEnergy.php @@ -0,0 +1,53 @@ +getDeviceInfo(); + $energy = $nest->getEnergyLatest(); + + //Change nulls to 0 + foreach ($energy->days as &$day) + { + foreach ($day->events as &$events) + { + if ( empty($events -> continuation) ) + { + $events -> continuation = 0; + } + if ( empty($events -> touched_by) ) + { + $events -> touched_by = 0; + } + if ( empty($events -> touched_when) ) + { + $events -> touched_when = 0; + } + if ( empty($events -> touched_timezone_offset) ) + { + $events -> touched_timezone_offset = 0; + } + if ( empty($events -> touched_where) ) + { + $events -> touched_where = 0; + } + } + unset($events); + } + unset($day); + + return $energy; +} + +function c_to_f($c) { + return ($c * 1.8) + 32; +} + +?> \ No newline at end of file diff --git a/dbsetup b/dbsetup index 9d7ee0f..b435eaa 100644 --- a/dbsetup +++ b/dbsetup @@ -17,6 +17,45 @@ CREATE TABLE `data` ( `updated` timestamp NOT NULL, PRIMARY KEY (`timestamp`), UNIQUE KEY `timestamp` (`timestamp`) -) -ENGINE=MyISAM DEFAULT CHARSET=latin1; +)ENGINE=MyISAM DEFAULT CHARSET=latin1; +CREATE TABLE `nest`.`cycles_data` ( + `cycleNum` int(10) unsigned NOT NULL, + `cycleDate` datetime NOT NULL, + `start` int(10) unsigned NOT NULL, + `duration` int(10) unsigned NOT NULL, + `type` int(10) unsigned NOT NULL, + PRIMARY KEY (`cycleNum`,`cycleDate`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +CREATE TABLE `nest`.`energy_data` ( + `energyDate` datetime NOT NULL, + `device_timezone_offset` int(11) NOT NULL, + `total_heating_time` int(10) unsigned NOT NULL, + `total_cooling_time` int(10) unsigned NOT NULL, + `total_fan_cooling_time` int(10) unsigned NOT NULL, + `total_humidifier_time` int(10) unsigned NOT NULL, + `total_dehumidifier_time` int(10) unsigned NOT NULL, + `leafs` int(11) NOT NULL, + `whodunit` int(11) NOT NULL, + `recent_avg_used` int(10) unsigned NOT NULL, + `usage_over_avg` int(10) NOT NULL, + PRIMARY KEY (`energyDate`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +CREATE TABLE `nest`.`events_data` ( + `eventNum` int(10) unsigned NOT NULL, + `eventDate` datetime NOT NULL, + `start` int(10) unsigned NOT NULL, + `end` int(10) unsigned NOT NULL, + `type` int(10) unsigned NOT NULL, + `touched_by` int(10) unsigned NOT NULL, + `touched_when` int(10) unsigned NOT NULL, + `touched_timezone_offset` int(11) NOT NULL, + `touched_where` int(11) NOT NULL, + `heat_temp` int(11) NOT NULL, + `cool_temp` int(11) NOT NULL, + `continuation` int(11) NOT NULL, + `event_touched_by` int(11) NOT NULL, + PRIMARY KEY (`eventNum`,`eventDate`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=latin1; diff --git a/insertEnergy.php b/insertEnergy.php new file mode 100644 index 0000000..86d283a --- /dev/null +++ b/insertEnergy.php @@ -0,0 +1,59 @@ +days as $day) + { + foreach ($day->events as $key => $events) + { + if ($stmt = $db->res->prepare("REPLACE INTO events_data (eventNum, eventDate, start, end, type, touched_by, touched_when, touched_timezone_offset, touched_where, heat_temp, cool_temp, continuation, event_touched_by) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)")) + { + $stmt->bind_param("isiiiiiiiiiii", $key, $day->day, $events->start, $events->end, $events->type, $events->touched_by, $events->touched_when, $events-> touched_timezone_offset, $events->touched_where, $events->heat_temp, $events->cool_temp, $events->continuation, $events->event_touched_by); + $stmt->execute(); + $stmt->close(); + } + } + + if ($stmt = $db->res->prepare("DELETE FROM events_data where eventNum > $key AND eventDate = '$day->day'")) + { + $stmt->execute(); + $stmt->close(); + } + unset($key); + + foreach ($day->cycles as $key => $cycles) + { + if ($stmt = $db->res->prepare("REPLACE INTO cycles_data (cycleNum, cycleDate, start, duration, type) VALUES (?,?,?,?,?)")) + { + $stmt->bind_param("isiii", $key, $day->day, $cycles->start, $cycles->duration, $cycles->type); + $stmt->execute(); + $stmt->close(); + } + } + + if ($stmt = $db->res->prepare("DELETE FROM cycles_data where cycleNum > $key AND cycleDate = '$day->day'")) + { + $stmt->execute(); + $stmt->close(); + } + unset($key); + + if ($stmt = $db->res->prepare("REPLACE INTO energy_data (energyDate, device_timezone_offset, total_heating_time, total_cooling_time, total_fan_cooling_time, total_humidifier_time, total_dehumidifier_time, leafs, whodunit, recent_avg_used, usage_over_avg) VALUES (?,?,?,?,?,?,?,?,?,?,?)")) + { + $stmt->bind_param("siiiiiiiiii", $day->day, $day->device_timezone_offset, $day->total_heating_time, $day->total_cooling_time, $day->total_fan_cooling_time, $day->total_humidifier_time, $day->total_dehumidifier_time, $day->leafs, $day->whodunit, $day->recent_avg_used, $day->usage_over_avg); + $stmt->execute(); + $stmt->close(); + } + } + $db->close(); +} catch (Exception $e) { + $errors[] = ("DB connection error! " . $e->getMessage() . "."); +} + +?> \ No newline at end of file From 9fff885193fe11a75a84c21699c330e50acc8fd2 Mon Sep 17 00:00:00 2001 From: Christian Oyarzun Date: Tue, 18 Feb 2014 20:40:40 -0500 Subject: [PATCH 05/36] Added ability to have multiple nests --- collect.php | 4 +- collectEnergy.php | 8 +- dbsetup | 25 +++- fetch.php | 13 +- index.php | 361 ++++++++++++++++++++++++++++++++++++++++++++++ init_devices.php | 28 ++++ insert.php | 25 +++- 7 files changed, 439 insertions(+), 25 deletions(-) create mode 100644 index.php create mode 100644 init_devices.php diff --git a/collect.php b/collect.php index 185bb51..a07f45d 100644 --- a/collect.php +++ b/collect.php @@ -8,9 +8,9 @@ date_default_timezone_set($config['local_tz']); -function get_nest_data() { +function get_nest_data($serial_number=null) { $nest = new Nest(); - $info = $nest->getDeviceInfo(); + $info = $nest->getDeviceInfo($serial_number); if (preg_match("/away/", $info->current_state->mode) || preg_match("/range/", $info->current_state->mode)) { if ($info->current_state->temperature > $info->target->temperature[1]) { diff --git a/collectEnergy.php b/collectEnergy.php index dff9b7a..28de49d 100644 --- a/collectEnergy.php +++ b/collectEnergy.php @@ -8,10 +8,10 @@ date_default_timezone_set($config['local_tz']); -function get_nest_data() { +function get_nest_data($serial_number=null) { $nest = new Nest(); - $info = $nest->getDeviceInfo(); - $energy = $nest->getEnergyLatest(); + $info = $nest->getDeviceInfo($serial_number); + $energy = $nest->getEnergyLatest($serial_number); //Change nulls to 0 foreach ($energy->days as &$day) @@ -50,4 +50,4 @@ function c_to_f($c) { return ($c * 1.8) + 32; } -?> \ No newline at end of file +?> diff --git a/dbsetup b/dbsetup index b435eaa..43b95a6 100644 --- a/dbsetup +++ b/dbsetup @@ -3,7 +3,16 @@ GRANT ALL PRIVILEGES ON nest.* TO 'nest_admin'@'localhost' IDENTIFIED BY 'choose FLUSH PRIVILEGES; USE nest; -CREATE TABLE `data` ( +CREATE TABLE `nest`.`devices` ( + `id` tinyint unsigned NOT NULL AUTO_INCREMENT, + `serial` varchar(16) NOT NULL, + `name` varchar(256), + PRIMARY KEY (`id`), + UNIQUE KEY (`serial`) +)ENGINE=InnoDB DEFAULT CHARSET=latin1; + +CREATE TABLE `nest`.`data` ( + `device_id` tinyint unsigned NOT NULL, `timestamp` timestamp NOT NULL, `heating` tinyint unsigned NOT NULL, `cooling` tinyint unsigned NOT NULL, @@ -15,20 +24,21 @@ CREATE TABLE `data` ( `current` numeric(7,3) NOT NULL, `humidity` tinyint unsigned NOT NULL, `updated` timestamp NOT NULL, - PRIMARY KEY (`timestamp`), - UNIQUE KEY `timestamp` (`timestamp`) -)ENGINE=MyISAM DEFAULT CHARSET=latin1; + PRIMARY KEY (`device_id`,`timestamp`) USING BTREE +)ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `nest`.`cycles_data` ( + `device_id` tinyint unsigned NOT NULL, `cycleNum` int(10) unsigned NOT NULL, `cycleDate` datetime NOT NULL, `start` int(10) unsigned NOT NULL, `duration` int(10) unsigned NOT NULL, `type` int(10) unsigned NOT NULL, - PRIMARY KEY (`cycleNum`,`cycleDate`) USING BTREE + PRIMARY KEY (`device_id`,`cycleNum`,`cycleDate`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `nest`.`energy_data` ( + `device_id` tinyint unsigned NOT NULL, `energyDate` datetime NOT NULL, `device_timezone_offset` int(11) NOT NULL, `total_heating_time` int(10) unsigned NOT NULL, @@ -40,10 +50,11 @@ CREATE TABLE `nest`.`energy_data` ( `whodunit` int(11) NOT NULL, `recent_avg_used` int(10) unsigned NOT NULL, `usage_over_avg` int(10) NOT NULL, - PRIMARY KEY (`energyDate`) USING BTREE + PRIMARY KEY (`device_id`,`energyDate`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `nest`.`events_data` ( + `device_id` tinyint unsigned NOT NULL, `eventNum` int(10) unsigned NOT NULL, `eventDate` datetime NOT NULL, `start` int(10) unsigned NOT NULL, @@ -57,5 +68,5 @@ CREATE TABLE `nest`.`events_data` ( `cool_temp` int(11) NOT NULL, `continuation` int(11) NOT NULL, `event_touched_by` int(11) NOT NULL, - PRIMARY KEY (`eventNum`,`eventDate`) USING BTREE + PRIMARY KEY (`device_id`,`eventNum`,`eventDate`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=latin1; diff --git a/fetch.php b/fetch.php index 5e72c42..7bbedd8 100644 --- a/fetch.php +++ b/fetch.php @@ -3,19 +3,24 @@ require 'inc/config.php'; require 'inc/class.db.php'; +define('DEFAULT_ID', 1); define('DEFAULT_HRS', 72); $hrs = DEFAULT_HRS; if (!empty($_GET["hrs"])) { $hrs = $_GET["hrs"]; } +$id = DEFAULT_ID; +if (!empty($_GET["id"])) { + $id = $_GET["id"]; +} try { $db = new DB($config); - if ($stmt = $db->res->prepare("SELECT * from data where timestamp>=DATE_SUB(NOW(), INTERVAL ? HOUR) order by timestamp")) { - $stmt->bind_param("i", $hrs); + if ($stmt = $db->res->prepare("SELECT * from data where device_id=? and timestamp>=DATE_SUB(NOW(), INTERVAL ? HOUR) order by timestamp")) { + $stmt->bind_param("ii", $id, $hrs); $stmt->execute(); - $stmt->bind_result($timestamp, $heating, $cooling, $fan, $autoAway, $manualAway, $leaf, $target, $current, $humidity, $updated); + $stmt->bind_result($device_id, $timestamp, $heating, $cooling, $fan, $autoAway, $manualAway, $leaf, $target, $current, $humidity, $updated); header("Content-type: text/tab-separated-values"); print "timestamp\theating\tcooling\tfan\tautoAway\tmanualAway\tleaf\ttarget\tcurrent\thumidity\tupdated\n"; while ($stmt->fetch()) { @@ -28,4 +33,4 @@ $errors[] = ("DB connection error! " . $e->getMessage() . "."); } -?> \ No newline at end of file +?> diff --git a/index.php b/index.php new file mode 100644 index 0000000..0d886db --- /dev/null +++ b/index.php @@ -0,0 +1,361 @@ + + + + NestGraph + + + + +res->prepare("SELECT id,name from devices")) { + $stmt->execute(); + $stmt->bind_result($device_id,$device_name); + $options=""; + while ($stmt->fetch()) { + $selected = ($id == $device_id)?"selected":""; + $options .= " "; + } + $stmt->close(); + } + $db->close(); +} catch (Exception $e) { + $errors[] = ("DB connection error! " . $e->getMessage() . "."); +} +?> + + + + + diff --git a/init_devices.php b/init_devices.php new file mode 100644 index 0000000..fc52bf9 --- /dev/null +++ b/init_devices.php @@ -0,0 +1,28 @@ +getDevices(); +if ($stmt = $db->res->prepare("INSERT INTO devices (serial,name) VALUES (?,?) ON DUPLICATE KEY UPDATE name=?")) { + foreach($devices as $serial) { + $name = $nest->getDeviceFriendlyName($serial); + $stmt->bind_param("sss", $serial, $name, $name); + $stmt->execute(); + } + $stmt->close(); +} +$db->close(); +} catch (Exception $e) { + $errors[] = ("DB connection error! " . $e->getMessage() . "."); +} +?> + diff --git a/insert.php b/insert.php index 2ccbb89..fad674f 100644 --- a/insert.php +++ b/insert.php @@ -6,17 +6,26 @@ try { $db = new DB($config); - $data = get_nest_data(); - if (!empty($data['timestamp'])) { - if ($stmt = $db->res->prepare("REPLACE INTO data (timestamp, heating, cooling, fan, autoAway, manualAway, leaf, target, current, humidity, updated) VALUES (?,?,?,?,?,?,?,?,?,?,NOW())")) { - $stmt->bind_param("siiiiiiddi", $data['timestamp'], $data['heating'], $data['cooling'], $data['fan'], $data['autoAway'], $data['manualAway'], $data['leaf'], $data['target_temp'], $data['current_temp'], $data['humidity']); - $stmt->execute(); - $stmt->close(); + if ($result = $db->res->query("SELECT id, serial FROM devices")) { + while ($row = mysqli_fetch_row($result)) { + $data = get_nest_data($row[1]); + $wtf = $data['timestamp']; + //echo "$row[0] $row[1] $wtf\n"; + if (!empty($data['timestamp'])) { + if ($stmt = $db->res->prepare("REPLACE INTO data (device_id, timestamp, heating, cooling, fan, autoAway, manualAway, leaf, target, current, humidity, updated) VALUES (?,?,?,?,?,?,?,?,?,?,?,NOW())")) { + $stmt->bind_param("isiiiiiiddi", $row[0], $data['timestamp'], $data['heating'], $data['cooling'], $data['fan'], $data['autoAway'], $data['manualAway'], $data['leaf'], $data['target_temp'], $data['current_temp'], $data['humidity']); + if (!$stmt->execute()) { + echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; + } + $stmt->close(); + } + } } - } + mysqli_free_result($result); + } $db->close(); } catch (Exception $e) { $errors[] = ("DB connection error! " . $e->getMessage() . "."); } -?> \ No newline at end of file +?> From 213b85ca8b88737d4364b58d5d06a056190e7627 Mon Sep 17 00:00:00 2001 From: oyarzun Date: Tue, 18 Feb 2014 22:23:35 -0500 Subject: [PATCH 06/36] Update README.md --- README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 404bc32..e655f5b 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,12 @@ As root or using a DBA account, run the commands in dbsetup to create the MySQL mysql -u root < dbsetup ``` +Add your nests to the database. + +```bash +php init_devices.php +``` + Create a cron job to poll the website periodically and update the local database. The thermostat does not phone home on a fixed schedule, but typically it updates in 5 to 30 minute intervals. The script will only insert into the database if there is new data available. Obviously, update the path to ```insert.php``` if it's not in ```/var/www/html/nestgraph```. ```bash @@ -77,14 +83,11 @@ Create a cron job to poll the website periodically and update the local database ``` (FYI, the reason we remove the files in ```/tmp``` is because it seems the nest-api library attempts to cache authentication info too aggressively, and after a few days it ends up trying to connect to an AWS server that no longer exists.) -Point web browser to the ```nestgraph``` directory on your webserver! Admire pretty graphs (actually, they won't be all that pretty until it has collected some data). +Point web browser to the ```nestgraph/index.php``` directory on your webserver! Admire pretty graphs (actually, they won't be all that pretty until it has collected some data). ## Known Issues -* Only checks for heating on/off, not cooling (I don't have cooling) -* Only supports a single Nest thermostat (I only have one) -* Heating on/off trendline lazily mapped on to the temperature graph * Assumes you want temperatures displayed in Fahrenheit * Doesn't automatically redraw when you resize the browser window * Labels (current/target/heating) don't follow the trend lines when you pan/zoom From 110a41af9d13db11e4a77e8ddd81aab2b38403b5 Mon Sep 17 00:00:00 2001 From: Christian Oyarzun Date: Sun, 23 Feb 2014 20:40:32 -0500 Subject: [PATCH 07/36] move config.php to config.php.sample. added .gitignore --- .gitignore | 2 ++ inc/{config.php => config.php.sample} | 0 2 files changed, 2 insertions(+) create mode 100644 .gitignore rename inc/{config.php => config.php.sample} (100%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cba464f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +config.php +nest-api-master* diff --git a/inc/config.php b/inc/config.php.sample similarity index 100% rename from inc/config.php rename to inc/config.php.sample From 2011e083de71f5be2fc1c8a69485095b23050ef3 Mon Sep 17 00:00:00 2001 From: Christian Oyarzun Date: Sun, 23 Feb 2014 21:00:15 -0500 Subject: [PATCH 08/36] added range for target temp; use json for fetch.php; split out js and css --- collect.php | 28 +--- dbsetup | 1 + fetch.php | 26 +++- index.html | 2 +- index.php | 323 +------------------------------------------- init_devices.php | 2 +- insert.php | 16 +-- main.js | 343 +++++++++++++++++++++++++++++++++++++++++++++++ nest.css | 22 +++ test.php | 27 ++-- 10 files changed, 413 insertions(+), 377 deletions(-) create mode 100644 main.js create mode 100644 nest.css diff --git a/collect.php b/collect.php index a07f45d..18f4ef2 100644 --- a/collect.php +++ b/collect.php @@ -13,27 +13,8 @@ function get_nest_data($serial_number=null) { $info = $nest->getDeviceInfo($serial_number); if (preg_match("/away/", $info->current_state->mode) || preg_match("/range/", $info->current_state->mode)) { - if ($info->current_state->temperature > $info->target->temperature[1]) { - //Hotter then upper temp - $targetTemp = $info->target->temperature[1]; - } - else if ($info->current_state->temperature < $info->target->temperature[0]) { - //Colder then lower temp $targetTemp = $info->target->temperature[0]; - } - else { - if (($info->target->temperature[1] - $info->current_state->temperature) < - ($info->current_state->temperature - $info->target->temperature[0])) - { - //Closer to upper temp - $targetTemp = $info->target->temperature[1]; - } - else - { - //Closer to lower temp - $targetTemp = $info->target->temperature[0]; - } - } + $targetTemp2 = $info->target->temperature[1]; } else { $targetTemp = $info->target->temperature; @@ -47,14 +28,11 @@ function get_nest_data($serial_number=null) { 'leaf' => ($info->current_state->leaf == 1 ? 1 : 0), 'timestamp' => $info->network->last_connection, 'target_temp' => sprintf("%.02f", $targetTemp), + 'target_temp2' => (isset($targetTemp2) ? sprintf("%.02f", $targetTemp2) : null), 'current_temp' => sprintf("%.02f", $info->current_state->temperature), 'humidity' => $info->current_state->humidity ); return $data; } -function c_to_f($c) { - return ($c * 1.8) + 32; -} - -?> \ No newline at end of file +?> diff --git a/dbsetup b/dbsetup index 43b95a6..b3d475f 100644 --- a/dbsetup +++ b/dbsetup @@ -21,6 +21,7 @@ CREATE TABLE `nest`.`data` ( `manualAway` tinyint unsigned NOT NULL, `leaf` tinyint unsigned NOT NULL, `target` numeric(7,3) NOT NULL, + `target2` numeric(7,3), `current` numeric(7,3) NOT NULL, `humidity` tinyint unsigned NOT NULL, `updated` timestamp NOT NULL, diff --git a/fetch.php b/fetch.php index 7bbedd8..133a4fb 100644 --- a/fetch.php +++ b/fetch.php @@ -14,18 +14,32 @@ if (!empty($_GET["id"])) { $id = $_GET["id"]; } - +$json = array(); try { $db = new DB($config); - if ($stmt = $db->res->prepare("SELECT * from data where device_id=? and timestamp>=DATE_SUB(NOW(), INTERVAL ? HOUR) order by timestamp")) { + if ($stmt = $db->res->prepare("SELECT timestamp, heating, cooling, fan, autoAway, manualAway, leaf, target, target2, current, humidity, updated " . + "from data where device_id=? and timestamp>=DATE_SUB(NOW(), INTERVAL ? HOUR) order by timestamp")) { $stmt->bind_param("ii", $id, $hrs); $stmt->execute(); - $stmt->bind_result($device_id, $timestamp, $heating, $cooling, $fan, $autoAway, $manualAway, $leaf, $target, $current, $humidity, $updated); - header("Content-type: text/tab-separated-values"); - print "timestamp\theating\tcooling\tfan\tautoAway\tmanualAway\tleaf\ttarget\tcurrent\thumidity\tupdated\n"; + $stmt->bind_result($timestamp, $heating, $cooling, $fan, $autoAway, $manualAway, $leaf, $target, $target2, $current, $humidity, $updated); + header('Content-type: application/json'); + $i=0; while ($stmt->fetch()) { - print implode("\t", array($timestamp, $heating, $cooling, $fan, $autoAway, $manualAway, $leaf, $target, $current, $humidity, $updated)) . "\n"; + $json[$i]['timestamp'] = $timestamp; + $json[$i]['heating'] = $heating; + $json[$i]['cooling'] = $cooling; + $json[$i]['fan'] = $fan; + $json[$i]['autoAway'] = $autoAway; + $json[$i]['manualAway'] = $manualAway; + $json[$i]['leaf'] = $leaf; + $json[$i]['target'] = $target; + $json[$i]['target2'] = $target2; + $json[$i]['current'] = $current; + $json[$i]['humidity'] = $humidity; + $json[$i]['updated'] = $updated; + $i++; } + print json_encode($json); $stmt->close(); } $db->close(); diff --git a/index.html b/index.html index b19523e..daef5bb 100644 --- a/index.html +++ b/index.html @@ -141,7 +141,7 @@ } // fetch the data -d3.tsv("fetch.php?hrs=" + hours, function(error, data) { +d3.json("fetch.php?hrs=" + hours, function(error, data) { color.domain(d3.keys(data[0]).filter(function(key) { return (key == "current" || key == "target" || key == "heating"|| key == "cooling"|| key == "fan"|| key == "autoAway"|| key == "manualAway"|| key == "leaf"|| key == "humidity"); })); data.forEach(function(d) { diff --git a/index.php b/index.php index 0d886db..3f7b28b 100644 --- a/index.php +++ b/index.php @@ -2,32 +2,7 @@ NestGraph - + @@ -62,300 +37,6 @@ - - + diff --git a/init_devices.php b/init_devices.php index fc52bf9..de1e469 100644 --- a/init_devices.php +++ b/init_devices.php @@ -14,7 +14,7 @@ $devices= $nest->getDevices(); if ($stmt = $db->res->prepare("INSERT INTO devices (serial,name) VALUES (?,?) ON DUPLICATE KEY UPDATE name=?")) { foreach($devices as $serial) { - $name = $nest->getDeviceFriendlyName($serial); + $name = $nest->getDeviceInfo($serial)->name; $stmt->bind_param("sss", $serial, $name, $name); $stmt->execute(); } diff --git a/insert.php b/insert.php index fad674f..aede4e3 100644 --- a/insert.php +++ b/insert.php @@ -9,16 +9,16 @@ if ($result = $db->res->query("SELECT id, serial FROM devices")) { while ($row = mysqli_fetch_row($result)) { $data = get_nest_data($row[1]); - $wtf = $data['timestamp']; - //echo "$row[0] $row[1] $wtf\n"; if (!empty($data['timestamp'])) { - if ($stmt = $db->res->prepare("REPLACE INTO data (device_id, timestamp, heating, cooling, fan, autoAway, manualAway, leaf, target, current, humidity, updated) VALUES (?,?,?,?,?,?,?,?,?,?,?,NOW())")) { - $stmt->bind_param("isiiiiiiddi", $row[0], $data['timestamp'], $data['heating'], $data['cooling'], $data['fan'], $data['autoAway'], $data['manualAway'], $data['leaf'], $data['target_temp'], $data['current_temp'], $data['humidity']); - if (!$stmt->execute()) { + if ($stmt = $db->res->prepare("REPLACE INTO data (device_id, timestamp, heating, cooling, fan, autoAway, manualAway, leaf, target, target2, current, humidity, updated) " . + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,NOW())")) { + $stmt->bind_param("isiiiiiidddi", $row[0], $data['timestamp'], $data['heating'], $data['cooling'], $data['fan'], $data['autoAway'], $data['manualAway'], $data['leaf'], + $data['target_temp'], $data['target_temp2'], $data['current_temp'], $data['humidity']); + if (!$stmt->execute()) { echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; - } - $stmt->close(); - } + } + $stmt->close(); + } } } mysqli_free_result($result); diff --git a/main.js b/main.js new file mode 100644 index 0000000..5f0bda4 --- /dev/null +++ b/main.js @@ -0,0 +1,343 @@ +var device_id = 1; + +// change this if you want to limit the amount of data pulled +var hours = 24 * 7; + +var fullWidth = window.innerWidth * 0.97; +var fullHeight = window.innerHeight * 0.95; +var upperHeight = window.innerHeight * 0.85; +var lowerHeight = window.innerHeight * 0.10; + +var margin = {top: 20, right: 70, bottom: 30 + lowerHeight, left: 50}; +var margin2 = {top: 20 + upperHeight, right: 70, bottom: 30, left: 50}; + +var width = fullWidth - margin.left - margin.right; +var height = fullHeight - margin.top - margin.bottom; +var width2 = fullWidth - margin2.left - margin2.right; +var height2 = fullHeight - margin2.top - margin2.bottom; + +var parseDate = d3.time.format("%Y-%m-%d %H:%M:%S").parse; + +var x = d3.time.scale().range([0, width]); +var y = d3.scale.linear().range([height, 0]); +var yRight = d3.scale.linear().range([height, 0]); +var x2 = d3.time.scale().range([0, width]); +var y2 = d3.scale.linear().range([height2, 0]); +var yRight2 = d3.scale.linear().range([height2, 0]); + +var color = d3.scale.category10(); + +// d3 x axis object for upper plot area +var xAxis = d3.svg.axis(). + scale(x) + .orient("bottom") + .ticks(width/80); + +// d3 y axis object for upper plot area +var yAxis = d3.svg.axis() + .scale(y) + .orient("left"); + +// d3 y axis object for upper plot area +var yRightAxis = d3.svg.axis() + .scale(yRight) + .orient("right"); + +// d3 x axis object for lower plot area +var xAxis2 = d3.svg.axis() + .scale(x2) + .orient("bottom") + .ticks(width/80); + +// d3 brush object for lower plot area (panning/zooming) +var brush = d3.svg.brush() + .x(x2) + .on("brush", brushUpdate); + +// d3 line object for upper trendlines (basis plot) +var line = d3.svg.line() + .interpolate("basis") + .x(function(d) { return x(d.date); }) + .y(function(d) { return y(d.val); }); + +// d3 line object for upper trendlines (basis plot) +var lineRight = d3.svg.line() + .interpolate("basis") + .x(function(d) { return x(d.date); }) + .y(function(d) { return yRight(d.val); }); + +// d3 line object for lower trendlines (basis plot) +var line2 = d3.svg.line() + .interpolate("basis") + .x(function(d) { return x2(d.date); }) + .y(function(d) { return y2(d.val); }); + +// d3 line object for lower trendlines (basis plot) +var lineRight2 = d3.svg.line() + .interpolate("basis") + .x(function(d) { return x2(d.date); }) + .y(function(d) { return yRight2(d.val); }); +// +// d3 line object for upper trendlines (step function) +var lineStepafter = d3.svg.line() + .interpolate("step-after") + .x(function(d) { return x(d.date); }) + .y(function(d) { return y(d.val); }); + +// d3 line object for upper trendlines (step function) +var lineStepafter2 = d3.svg.line() + .interpolate("step-after") + .x(function(d) { return x2(d.date); }) + .y(function(d) { return y2(d.val); }); + +// create main svg object +var svg = d3.select("body").append("svg") + .attr("width", fullWidth) + .attr("height", fullHeight) + +// create clip path so zoomed-in paths can't extend beyond the zoomed-out frame +svg.append("defs").append("clipPath") + .attr("id", "clip") + .append("rect") + .attr("width", width) + .attr("height", height); + +// append upper +var upper = svg.append("g") + .attr("transform", "translate(" + margin.left + "," + margin.top + ")") + +// append lower +var lower = svg.append("g") + .attr("transform", "translate(" + margin2.left + "," + margin2.top + ")") + +// callback function for d3 brush object +function brushUpdate() { + x.domain(brush.empty() ? x2.domain() : brush.extent()); + upper.select(".x.axis").call(xAxis); + upper.selectAll(".plot path") + .attr("d", function(d) { + if (d.name == "current") + return line(d.values); + else if (d.name == "humidity") + return lineRight(d.values); + else + return lineStepafter(d.values); + }) + upper.selectAll("circle") + .attr("cx", function(d) { return x(d.date); }) + .attr("cy", function(d) { return y(d.val); }) +} + +function fetchData() { +// fetch the data +d3.json("fetch.php?id=" + device_id + "&hrs=" + hours, function(error, data) { + color.domain(d3.keys(data[0]).filter(function(key) { return (key == "current" || key == "target" || key == "target2" || key == "humidity"); })); + data.forEach(function(d) { + d.date = parseDate(d.timestamp); + }); + + var points = color.domain().map(function(name) { + var x = { + name: name, + values: data.map(function(d) { + if(name == "target2") + return { date: d.date, val: d[name] }; + //if( d[name] == null) + //else + //return { date: d.date, val: +d[name] }; + else + var xmode = "black"; + if (d["cooling"] == 1) { xmode = "blue";} else if (d["heating"] == 1) { xmode = "red"; } + return { date: d.date, val: +d[name], mode: xmode }; + }) + }; + //console.log(x); + return x; + }); + + // define the x-domains (i.e. min and max of actual date values) + x.domain(d3.extent(data, function(d) { return d.date; })); + x2.domain(x.domain()); + + // define the y-domains (i.e. min and max of the union of all the trendlines) + y.domain([ + +d3.min(points, function(c) { if (c.name == "target" || (c.name == "target2" && c.values != null) || c.name == "current") { return d3.min(c.values, function(v) { return v.val }); } else { return undefined; } }) - 0.5, + +d3.max(points, function(c) { return d3.max(c.values, function(v) { return v.val }); }) + 0.5 + ]); + yRight.domain([ + +d3.min(points, function(c) { if (c.name == "humidity") { return d3.min(c.values, function(v) { return v.val }); } else { return undefined; } }) - 0.5, + +d3.max(points, function(c) { if (c.name == "humidity") { return d3.max(c.values, function(v) { return v.val }); } else { return undefined; } }) + 0.5 + ]); + y2.domain(y.domain()); + yRight2.domain(yRight.domain()); + + // draw upper x axis + upper.append("g") + .attr("class", "x axis upper") + .attr("transform", "translate(0," + height + ")") + .call(xAxis); + + // draw upper y axis + upper.append("g") + .attr("class", "y axis upper") + .call(yAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("y", 6) + .attr("dy", ".71em") + .style("text-anchor", "end") + .text("Temperature (F)"); + + upper.append("g") + .attr("class", "y axis upper") + .attr("transform", "translate(" + (width+15) + ",0)") + .call(yRightAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("y", -12) + .attr("dy", ".71em") + .style("text-anchor", "end") + .text("Humidity (%)"); + // + // draw lower x axis + lower.append("g") + .attr("class", "x axis lower") + .attr("transform", "translate(0," + height2 + ")") + .call(xAxis2); + + // bind upper current/trendlines + upper.selectAll(".plot.temps") + .data(points.filter(function(f) { return (f.name == 'current' || f.name == 'humidity' || f.name == 'target' || (f.name == 'target2' && f.values != null) ); })) + .enter().append("g") + .attr("class", function(d) { return "plot temps " + d.name; }); + + // bind lower current and target trendlines + lower.selectAll(".plot.temps") + .data(points.filter(function(f) { return (f.name == 'current' || f.name == 'humidity' || f.name == 'target' || (f.name == 'target2' && f.values != null)); })) + .enter().append("g") + .attr("class", function(d) { return "plot temps " + d.name; }); + + // draw upper current/target/furnace trendlines + upper.selectAll(".plot") + .append("path") + .attr("class", "line") + .attr("d", function(d) { + if (d.name == "current") + return line(d.values); + else if (d.name == "humidity") + return lineRight(d.values); + else + return lineStepafter(d.values); + }) + .style("stroke", function(d) { + if (d.name == 'target2') + return color('target'); + else + return color(d.name); + }) + .attr("clip-path", "url(#clip)"); + + // draw lower current/target trendlines + lower.selectAll(".plot") + .append("path") + .attr("class", "line") + .attr("d", function(d) { + if (d.name == "current") + return line2(d.values); + else if (d.name == "humidity") + return lineRight2(d.values); + else + return lineStepafter2(d.values); + }) + .style("stroke", function(d) { + if (d.name == 'target2') + return color('target'); + else + return color(d.name); + }); + + // create a parent element for the circles to live + upper.selectAll(".current") + .append("g") + .attr("class", "circles") + .attr("clip-path", "url(#clip)"); + + // draw the circles with tooltips + var format = d3.time.format("%a %b %-d %Y %-I:%M:%S %p"); + upper.selectAll(".circles").selectAll(".thecircles") + .data((points.filter(function(f) { return f.name == 'current'; }))[0].values) + .enter().append("circle") + .attr("cx", function(d) { return x(d.date); }) + .attr("cy", function(d) { return y(d.val); }) + .attr("r", 5) + .attr("stroke", function(d) { return (d.mode); }) + .attr("fill", function(d) { return (d.mode); }) + .attr("opacity", 0.2) + .append("svg:title").text(function(d) { + return format(d.date) + "\n" + d.val + "\u00B0 F"; + }); + + // draw the d3 pan/zoom "brush" object + lower.append("g") + .attr("class", "x brush") + .call(brush) + .selectAll("rect") + .attr("y", -6) + .attr("height", height2 + 7); + + // draw legend + var legend = svg.append("g") + .attr("class", "legend") + .attr("x", 365) + .attr("y", 325) + .attr("height", 100) + .attr("width", 100); + + legend.selectAll('g') + .data(points.filter(function(f) { return f.name != 'target2'; })) + .enter() + .append('g') + .each(function(d, i) { + var g = d3.select(this); + g.append("rect") + .attr("x", width - 65) + .attr("y", i*25) + .attr("width", 10) + .attr("height", 10) + .style("fill", function(d) { return color(d.name); }); + + g.append("text") + .attr("x", width - 50) + .attr("y", i * 25 + 8) + .attr("height",30) + .attr("width",100) + .style("fill", function(d) { return color(d.name); }) + .text(d.name); + + }); +}); +} +function clearData() { + lower.selectAll("rect").remove(); + lower.selectAll(".plot").remove(); + lower.selectAll(".x.axis").remove(); + lower.selectAll(".y.axis").remove(); + upper.selectAll(".plot").remove(); + upper.selectAll(".x.axis").remove(); + upper.selectAll(".y.axis").remove(); + upper.selectAll(".yRight.axis").remove(); +} + + fetchData(); +window.onload=function(){ + document.getElementById("device_id").onchange= + function () { + var aList = document.getElementById("device_id"); + window.device_id = aList.options[aList.selectedIndex].value; + clearData(); + fetchData(); + if (!brush.empty()) { + brushUpdate(); + } + } +} diff --git a/nest.css b/nest.css new file mode 100644 index 0000000..c3178af --- /dev/null +++ b/nest.css @@ -0,0 +1,22 @@ +body { + font: 11px tahoma, arial, sans-serif; +} + + .axis path, + .axis line { + fill: none; + stroke: #000; + shape-rendering: crispEdges; + } + + .line { + fill: none; + stroke: steelblue; + stroke-width: 2.0px; + } + + .brush .extent { + stroke: #fff; + fill-opacity: .125; + shape-rendering: crispEdges; +} diff --git a/test.php b/test.php index 1812361..490f5c9 100644 --- a/test.php +++ b/test.php @@ -9,34 +9,31 @@ $nest = new Nest(); -$status = $nest->getStatus(); -print_r($status); -echo "\n
\n
"; - -$infos = $nest->getDeviceInfo(); -print_r($infos); -echo "\n
\n
"; -stuff_we_care_about($infos); +$devices= $nest->getDevices(); +foreach($devices as $serial) { + $infos = $nest->getDeviceInfo($serial); + stuff_we_care_about($infos); +} function stuff_we_care_about($info) { + echo "Name : "; + printf("%s\n
", $info->name); echo "Heating : "; printf("%s\n
", ($info->current_state->heat == 1 ? 1 : 0)); + echo "Cooling : "; + printf("%s\n
", ($info->current_state->ac == 1 ? 1 : 0)); echo "Timestamp : "; printf("%s\n
", $info->network->last_connection); echo "Target temperature : "; - if (preg_match("/away/", $info->current_state->mode)) { - printf("%.02f\n
", $info->target->temperature[0]); + if (preg_match("/away/", $info->current_state->mode) || preg_match("/range/", $info->current_state->mode)) { + printf("%.02f %.02f\n
", $info->target->temperature[0], $info->target->temperature[1]); } else { printf("%.02f\n
", $info->target->temperature); } echo "Current temperature : "; printf("%.02f\n
", $info->current_state->temperature); echo "Current humidity : "; - printf("%d\n
", $info->current_state->humidity); - -} + printf("%d\n
\n", $info->current_state->humidity); -function c_to_f($c) { - return ($c * 1.8) + 32; } From 3ddf4a07e040dc253dd7fe086ccdc4293a2d73a6 Mon Sep 17 00:00:00 2001 From: kesslerm Date: Wed, 14 May 2014 10:53:33 -0600 Subject: [PATCH 09/36] Update for new nest api --- collectEnergy.php | 61 ++++++++++++++++++++------------ insertEnergy.php | 90 +++++++++++++++++++++++++++-------------------- 2 files changed, 91 insertions(+), 60 deletions(-) diff --git a/collectEnergy.php b/collectEnergy.php index 28de49d..84b4260 100644 --- a/collectEnergy.php +++ b/collectEnergy.php @@ -14,34 +14,51 @@ function get_nest_data($serial_number=null) { $energy = $nest->getEnergyLatest($serial_number); //Change nulls to 0 - foreach ($energy->days as &$day) + foreach($energy->objects as &$object) { - foreach ($day->events as &$events) + $value = $object->value; + foreach ($value->days as &$day) { - if ( empty($events -> continuation) ) + foreach ($day->events as &$events) { - $events -> continuation = 0; - } - if ( empty($events -> touched_by) ) - { - $events -> touched_by = 0; - } - if ( empty($events -> touched_when) ) - { - $events -> touched_when = 0; - } - if ( empty($events -> touched_timezone_offset) ) - { - $events -> touched_timezone_offset = 0; - } - if ( empty($events -> touched_where) ) - { - $events -> touched_where = 0; + if ( empty($events -> continuation) ) + { + $events -> continuation = 0; + } + if ( empty($events -> touched_by) ) + { + $events -> touched_by = 0; + } + if ( empty($events -> touched_when) ) + { + $events -> touched_when = 0; + } + if ( empty($events -> touched_timezone_offset) ) + { + $events -> touched_timezone_offset = 0; + } + if ( empty($events -> touched_where) ) + { + $events -> touched_where = 0; + } + if ( empty($events -> heat_temp) ) + { + $events -> heat_temp = 0; + } + if ( empty($events -> heat_temp) ) + { + $events -> heat_temp = 0; + } + if ( empty($events -> cool_temp) ) + { + $events -> cool_temp = 0; + } } + unset($events); } - unset($events); + unset($day); } - unset($day); + unset($object); return $energy; } diff --git a/insertEnergy.php b/insertEnergy.php index 86d283a..c2c88be 100644 --- a/insertEnergy.php +++ b/insertEnergy.php @@ -6,50 +6,64 @@ try { $db = new DB($config); - $energy = get_nest_data(); - foreach ($energy->days as $day) - { - foreach ($day->events as $key => $events) + if ($result = $db->res->query("SELECT id, serial FROM devices")) { + while ($row = mysqli_fetch_row($result)) { - if ($stmt = $db->res->prepare("REPLACE INTO events_data (eventNum, eventDate, start, end, type, touched_by, touched_when, touched_timezone_offset, touched_where, heat_temp, cool_temp, continuation, event_touched_by) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)")) + $energy = get_nest_data($row[1]); + + //print_r($energy); + + foreach($energy->objects as $object) { - $stmt->bind_param("isiiiiiiiiiii", $key, $day->day, $events->start, $events->end, $events->type, $events->touched_by, $events->touched_when, $events-> touched_timezone_offset, $events->touched_where, $events->heat_temp, $events->cool_temp, $events->continuation, $events->event_touched_by); - $stmt->execute(); - $stmt->close(); - } - } + $value = $object->value; + foreach ($value->days as $day) + { + foreach ($day->events as $key => $events) + { + if ($stmt = $db->res->prepare("REPLACE INTO events_data (device_id, eventNum, eventDate, start, end, type, touched_by, touched_when, touched_timezone_offset, touched_where, heat_temp, cool_temp, continuation, event_touched_by) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)")) + { + $stmt->bind_param("iisiiiiiiiiiii", $row[0], $key, $day->day, $events->start, $events->end, $events->type, $events->touched_by, $events->touched_when, $events-> touched_timezone_offset, $events->touched_where, $events->heat_temp, $events->cool_temp, $events->continuation, $events->event_touched_by); + $stmt->execute(); + $stmt->close(); + } + } - if ($stmt = $db->res->prepare("DELETE FROM events_data where eventNum > $key AND eventDate = '$day->day'")) - { - $stmt->execute(); - $stmt->close(); - } - unset($key); - - foreach ($day->cycles as $key => $cycles) - { - if ($stmt = $db->res->prepare("REPLACE INTO cycles_data (cycleNum, cycleDate, start, duration, type) VALUES (?,?,?,?,?)")) - { - $stmt->bind_param("isiii", $key, $day->day, $cycles->start, $cycles->duration, $cycles->type); - $stmt->execute(); - $stmt->close(); - } - } + if ($stmt = $db->res->prepare("DELETE FROM events_data where eventNum > $key AND eventDate = '$day->day'")) + { + $stmt->execute(); + $stmt->close(); + } + unset($key); + + foreach ($day->cycles as $key => $cycles) + { + if ($stmt = $db->res->prepare("REPLACE INTO cycles_data (device_id, cycleNum, cycleDate, start, duration, type) VALUES (?,?,?,?,?,?)")) + { + $stmt->bind_param("iisiii", $row[0], $key, $day->day, $cycles->start, $cycles->duration, $cycles->type); + $stmt->execute(); + $stmt->close(); + } + } - if ($stmt = $db->res->prepare("DELETE FROM cycles_data where cycleNum > $key AND cycleDate = '$day->day'")) - { - $stmt->execute(); - $stmt->close(); - } - unset($key); - - if ($stmt = $db->res->prepare("REPLACE INTO energy_data (energyDate, device_timezone_offset, total_heating_time, total_cooling_time, total_fan_cooling_time, total_humidifier_time, total_dehumidifier_time, leafs, whodunit, recent_avg_used, usage_over_avg) VALUES (?,?,?,?,?,?,?,?,?,?,?)")) - { - $stmt->bind_param("siiiiiiiiii", $day->day, $day->device_timezone_offset, $day->total_heating_time, $day->total_cooling_time, $day->total_fan_cooling_time, $day->total_humidifier_time, $day->total_dehumidifier_time, $day->leafs, $day->whodunit, $day->recent_avg_used, $day->usage_over_avg); - $stmt->execute(); - $stmt->close(); + if ($stmt = $db->res->prepare("DELETE FROM cycles_data where cycleNum > $key AND cycleDate = '$day->day'")) + { + $stmt->execute(); + $stmt->close(); + } + unset($key); + + if ($stmt = $db->res->prepare("REPLACE INTO energy_data (device_id, energyDate, device_timezone_offset, total_heating_time, total_cooling_time, total_fan_cooling_time, total_humidifier_time, total_dehumidifier_time, leafs, whodunit, recent_avg_used, usage_over_avg) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)")) + { + $stmt->bind_param("isiiiiiiiiii", $row[0], $day->day, $day->device_timezone_offset, $day->total_heating_time, $day->total_cooling_time, $day->total_fan_cooling_time, $day->total_humidifier_time, $day->total_dehumidifier_time, $day->leafs, $day->whodunit, $day->recent_avg_used, $day->usage_over_avg); + $stmt->execute(); + $stmt->close(); + } + } + } + } + mysqli_free_result($result); } $db->close(); } catch (Exception $e) { From 8a5b035a33c97a1652f136777f707294669ba3ed Mon Sep 17 00:00:00 2001 From: kesslerm Date: Thu, 15 May 2014 08:47:58 -0600 Subject: [PATCH 10/36] Add logging of outside temperature with data --- dbsetup | 1 + inc/config.php.sample | 3 ++- insert.php | 38 +++++++++++++++++++++++++------------- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/dbsetup b/dbsetup index b3d475f..7288a78 100644 --- a/dbsetup +++ b/dbsetup @@ -25,6 +25,7 @@ CREATE TABLE `nest`.`data` ( `current` numeric(7,3) NOT NULL, `humidity` tinyint unsigned NOT NULL, `updated` timestamp NOT NULL, + `outside` numeric(7,3) NOT NULL, PRIMARY KEY (`device_id`,`timestamp`) USING BTREE )ENGINE=InnoDB DEFAULT CHARSET=latin1; diff --git a/inc/config.php.sample b/inc/config.php.sample index 1651efa..71cf636 100644 --- a/inc/config.php.sample +++ b/inc/config.php.sample @@ -6,7 +6,8 @@ $config = array('db_ip' => '127.0.0.1', 'db_name' => 'nest', 'nest_user' => 'your_nest_username', 'nest_pass' => 'your_nest_password', - 'local_tz' => 'America/New_York' // see http://php.net/manual/en/timezones.php + 'local_tz' => 'America/New_York', // see http://php.net/manual/en/timezones.php + 'local_woeid' => '2459115' // Where On Earth ID for Yahoo! Weather (Search woeid lookup to convert zip/city, etc) ); ?> \ No newline at end of file diff --git a/insert.php b/insert.php index aede4e3..ce6b322 100644 --- a/insert.php +++ b/insert.php @@ -3,26 +3,38 @@ require 'inc/config.php'; require 'inc/class.db.php'; require 'collect.php'; +require 'yahoo-api-master/YahooWeather.class.php'; try { $db = new DB($config); + + $yahoo = new YahooWeather((int)$config["local_woeid"]); + $temperature = sprintf("%.02f", $yahoo->getTemperature(false)); + //echo "Temperature:" . $temperature . "\n"; + + if ($result = $db->res->query("SELECT id, serial FROM devices")) { while ($row = mysqli_fetch_row($result)) { - $data = get_nest_data($row[1]); - if (!empty($data['timestamp'])) { - if ($stmt = $db->res->prepare("REPLACE INTO data (device_id, timestamp, heating, cooling, fan, autoAway, manualAway, leaf, target, target2, current, humidity, updated) " . - "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,NOW())")) { - $stmt->bind_param("isiiiiiidddi", $row[0], $data['timestamp'], $data['heating'], $data['cooling'], $data['fan'], $data['autoAway'], $data['manualAway'], $data['leaf'], - $data['target_temp'], $data['target_temp2'], $data['current_temp'], $data['humidity']); - if (!$stmt->execute()) { - echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; - } - $stmt->close(); - } - } + $data = get_nest_data($row[1]); + //print_r($data); + + if (!empty($data['timestamp'])) + { + if ($stmt = $db->res->prepare("REPLACE INTO data (device_id, timestamp, heating, cooling, fan, autoAway, manualAway, leaf, target, target2, current, humidity, outside, updated) " . + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,NOW())")) + { + $stmt->bind_param("isiiiiiidddii", $row[0], $data['timestamp'], $data['heating'], $data['cooling'], $data['fan'], $data['autoAway'], $data['manualAway'], $data['leaf'], + $data['target_temp'], $data['target_temp2'], $data['current_temp'], $data['humidity'],$temperature); + if (!$stmt->execute()) + { + echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; + } + $stmt->close(); + } + } } mysqli_free_result($result); - } + } $db->close(); } catch (Exception $e) { $errors[] = ("DB connection error! " . $e->getMessage() . "."); From c57ce97f7596e4af37d1b88eb029c5a27201a1c8 Mon Sep 17 00:00:00 2001 From: kesslerm Date: Sun, 18 May 2014 22:04:14 -0600 Subject: [PATCH 11/36] Add support for energy plotting and multi data visualization --- README.md | 10 + fetch.php | 126 +++++-- index.html | 295 ---------------- index.php | 3 +- main.js | 991 +++++++++++++++++++++++++++++++++++------------------ 5 files changed, 763 insertions(+), 662 deletions(-) delete mode 100644 index.html diff --git a/README.md b/README.md index e655f5b..34922a0 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,16 @@ wget https://github.com/gboudreau/nest-api/archive/master.zip unzip master.zip rm -f master.zip ``` +or +``` +git clone https://github.com/gboudreau/nest-api.git nest-api-master +``` + +Grab a copy of the yahoo weather api. +``` +git clone https://github.com/phront/Yahoo-Weather-API-PHP-class.git yahoo-api-master +``` + Open ```inc/config.php``` in a text editor and update the ```nest_user``` and ```nest_pass``` variables with your username and password for nest.com. Update the ```local_tz``` variable to reflect your time zone. Run the test script to make sure that the API is able to pull your thermostat data correctly from nest.com. diff --git a/fetch.php b/fetch.php index 133a4fb..0415d9e 100644 --- a/fetch.php +++ b/fetch.php @@ -5,8 +5,9 @@ define('DEFAULT_ID', 1); define('DEFAULT_HRS', 72); +define('DEFAULT_DATA', "log"); -$hrs = DEFAULT_HRS; +$hrs = DEFAULT_HRS; if (!empty($_GET["hrs"])) { $hrs = $_GET["hrs"]; } @@ -14,33 +15,110 @@ if (!empty($_GET["id"])) { $id = $_GET["id"]; } + +$data_type = DEFAULT_DATA; +if(!empty($_GET["data"])) { + $data_type = $_GET["data"]; +} + +$start_and_end = false; +if(!empty($_GET["start"]) && !empty($_GET["end"])) { + $start_and_end = true; + $time_start = $_GET["start"]; + $time_end = $_GET["end"]; +} + + $json = array(); try { $db = new DB($config); - if ($stmt = $db->res->prepare("SELECT timestamp, heating, cooling, fan, autoAway, manualAway, leaf, target, target2, current, humidity, updated " . - "from data where device_id=? and timestamp>=DATE_SUB(NOW(), INTERVAL ? HOUR) order by timestamp")) { - $stmt->bind_param("ii", $id, $hrs); - $stmt->execute(); - $stmt->bind_result($timestamp, $heating, $cooling, $fan, $autoAway, $manualAway, $leaf, $target, $target2, $current, $humidity, $updated); - header('Content-type: application/json'); - $i=0; - while ($stmt->fetch()) { - $json[$i]['timestamp'] = $timestamp; - $json[$i]['heating'] = $heating; - $json[$i]['cooling'] = $cooling; - $json[$i]['fan'] = $fan; - $json[$i]['autoAway'] = $autoAway; - $json[$i]['manualAway'] = $manualAway; - $json[$i]['leaf'] = $leaf; - $json[$i]['target'] = $target; - $json[$i]['target2'] = $target2; - $json[$i]['current'] = $current; - $json[$i]['humidity'] = $humidity; - $json[$i]['updated'] = $updated; - $i++; + + if($data_type == "energy") + { + if($stmt = $db->res->prepare("SELECT energyDate, total_heating_time, total_cooling_time, " . + "total_fan_cooling_time, total_humidifier_time, total_dehumidifier_time, leafs " . + "from energy_data where device_id=? order by energyDate")) + { + $stmt->bind_param("i", $id); + $stmt->execute(); + $stmt->bind_result($energy_date, $heating, $cooling, $fan, $humid, $dehumid, $leafs); + + header('Content-type: application/json'); + $i=0; + while ($stmt->fetch()) { + $json[$i]['timestamp'] = $energy_date; + $json[$i]['heating'] = $heating; + $json[$i]['cooling'] = $cooling; + $json[$i]['fan'] = $fan; + $json[$i]['humid'] = $humid; + $json[$i]['dehumid'] = $dehumid; + $json[$i]['leaf'] = $leafs; + $i++; + } + print json_encode($json); + $stmt->close(); + } + } + else if($data_type == "cycles") + { + if($stmt = $db->res->prepare("SELECT cycleDate, cycleNum, start, " . + "duration, type " . + "from cycles_data where device_id=? order by cycleDate")) + { + $stmt->bind_param("i", $id); + $stmt->execute(); + $stmt->bind_result($cycle_date, $num, $start, $duration, $type); + + header('Content-type: application/json'); + $i=0; + while ($stmt->fetch()) { + $json[$i]['timestamp'] = $cycle_date; + $json[$i]['cycle_num'] = $num; + $json[$i]['start'] = $start; + $json[$i]['duration'] = $duration; + $json[$i]['type'] = $type; + $i++; + } + print json_encode($json); + $stmt->close(); + } + } + else + { + $where_stmt = "timestamp>=DATE_SUB(NOW(), INTERVAL " . $hrs. " HOUR)"; + if($start_and_end) { + //$where_stmt = "timestamp BETWEEN \"" . $time_start . "\" AND \"" . $time_end . "\""; + $where_stmt = "timestamp BETWEEN " . $time_start . " AND " . $time_end; + } + + $sql_query = "SELECT timestamp, heating, cooling, fan, autoAway, manualAway, leaf, target, target2, current, humidity, outside, updated from data where device_id=? and " . $where_stmt . " order by timestamp"; + //print $sql_query; + + if ($stmt = $db->res->prepare( $sql_query)) { + $stmt->bind_param("i", $id); + $stmt->execute(); + $stmt->bind_result($timestamp, $heating, $cooling, $fan, $autoAway, $manualAway, $leaf, $target, $target2, $current, $humidity, $outside, $updated); + header('Content-type: application/json'); + $i=0; + while ($stmt->fetch()) { + $json[$i]['timestamp'] = $timestamp; + $json[$i]['heating'] = $heating; + $json[$i]['cooling'] = $cooling; + $json[$i]['fan'] = $fan; + $json[$i]['autoAway'] = $autoAway; + $json[$i]['manualAway'] = $manualAway; + $json[$i]['leaf'] = $leaf; + $json[$i]['target'] = $target; + $json[$i]['target2'] = $target2; + $json[$i]['current'] = $current; + $json[$i]['humidity'] = $humidity; + $json[$i]['outside'] = $outside; + $json[$i]['updated'] = $updated; + $i++; + } + print json_encode($json); + $stmt->close(); } - print json_encode($json); - $stmt->close(); } $db->close(); } catch (Exception $e) { diff --git a/index.html b/index.html deleted file mode 100644 index daef5bb..0000000 --- a/index.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - NestGraph - - - - - - - diff --git a/index.php b/index.php index 3f7b28b..73877ea 100644 --- a/index.php +++ b/index.php @@ -5,7 +5,8 @@ - + + -var upper = svg.append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")") - -// append lower -var lower = svg.append("g") - .attr("transform", "translate(" + margin2.left + "," + margin2.top + ")") - -// callback function for d3 brush object -function brushUpdate() { - x.domain(brush.empty() ? x2.domain() : brush.extent()); - upper.select(".x.axis").call(xAxis); - upper.selectAll(".plot path") - .attr("d", function(d) { - if (d.name == "current") - return line(d.values); - else if (d.name == "humidity") - return lineRight(d.values); - else - return lineStepafter(d.values); - }) - upper.selectAll("circle") - .attr("cx", function(d) { return x(d.date); }) - .attr("cy", function(d) { return y(d.val); }) -} - -function fetchData() { -// fetch the data -d3.json("fetch.php?id=" + device_id + "&hrs=" + hours, function(error, data) { - color.domain(d3.keys(data[0]).filter(function(key) { return (key == "current" || key == "target" || key == "target2" || key == "humidity"); })); - data.forEach(function(d) { - d.date = parseDate(d.timestamp); - }); - - var points = color.domain().map(function(name) { - var x = { - name: name, - values: data.map(function(d) { - if(name == "target2") - return { date: d.date, val: d[name] }; - //if( d[name] == null) - //else - //return { date: d.date, val: +d[name] }; - else - var xmode = "black"; - if (d["cooling"] == 1) { xmode = "blue";} else if (d["heating"] == 1) { xmode = "red"; } - return { date: d.date, val: +d[name], mode: xmode }; - }) - }; - //console.log(x); - return x; - }); - - // define the x-domains (i.e. min and max of actual date values) - x.domain(d3.extent(data, function(d) { return d.date; })); - x2.domain(x.domain()); - - // define the y-domains (i.e. min and max of the union of all the trendlines) - y.domain([ - +d3.min(points, function(c) { if (c.name == "target" || (c.name == "target2" && c.values != null) || c.name == "current") { return d3.min(c.values, function(v) { return v.val }); } else { return undefined; } }) - 0.5, - +d3.max(points, function(c) { return d3.max(c.values, function(v) { return v.val }); }) + 0.5 - ]); - yRight.domain([ - +d3.min(points, function(c) { if (c.name == "humidity") { return d3.min(c.values, function(v) { return v.val }); } else { return undefined; } }) - 0.5, - +d3.max(points, function(c) { if (c.name == "humidity") { return d3.max(c.values, function(v) { return v.val }); } else { return undefined; } }) + 0.5 - ]); - y2.domain(y.domain()); - yRight2.domain(yRight.domain()); - - // draw upper x axis - upper.append("g") - .attr("class", "x axis upper") - .attr("transform", "translate(0," + height + ")") - .call(xAxis); - - // draw upper y axis - upper.append("g") - .attr("class", "y axis upper") - .call(yAxis) - .append("text") - .attr("transform", "rotate(-90)") - .attr("y", 6) - .attr("dy", ".71em") - .style("text-anchor", "end") - .text("Temperature (F)"); - - upper.append("g") - .attr("class", "y axis upper") - .attr("transform", "translate(" + (width+15) + ",0)") - .call(yRightAxis) - .append("text") - .attr("transform", "rotate(-90)") - .attr("y", -12) - .attr("dy", ".71em") - .style("text-anchor", "end") - .text("Humidity (%)"); - // - // draw lower x axis - lower.append("g") - .attr("class", "x axis lower") - .attr("transform", "translate(0," + height2 + ")") - .call(xAxis2); - - // bind upper current/trendlines - upper.selectAll(".plot.temps") - .data(points.filter(function(f) { return (f.name == 'current' || f.name == 'humidity' || f.name == 'target' || (f.name == 'target2' && f.values != null) ); })) - .enter().append("g") - .attr("class", function(d) { return "plot temps " + d.name; }); - - // bind lower current and target trendlines - lower.selectAll(".plot.temps") - .data(points.filter(function(f) { return (f.name == 'current' || f.name == 'humidity' || f.name == 'target' || (f.name == 'target2' && f.values != null)); })) - .enter().append("g") - .attr("class", function(d) { return "plot temps " + d.name; }); - - // draw upper current/target/furnace trendlines - upper.selectAll(".plot") - .append("path") - .attr("class", "line") - .attr("d", function(d) { - if (d.name == "current") - return line(d.values); - else if (d.name == "humidity") - return lineRight(d.values); - else - return lineStepafter(d.values); - }) - .style("stroke", function(d) { - if (d.name == 'target2') - return color('target'); - else - return color(d.name); - }) - .attr("clip-path", "url(#clip)"); - - // draw lower current/target trendlines - lower.selectAll(".plot") - .append("path") - .attr("class", "line") - .attr("d", function(d) { - if (d.name == "current") - return line2(d.values); - else if (d.name == "humidity") - return lineRight2(d.values); - else - return lineStepafter2(d.values); - }) - .style("stroke", function(d) { - if (d.name == 'target2') - return color('target'); - else - return color(d.name); - }); - - // create a parent element for the circles to live - upper.selectAll(".current") - .append("g") - .attr("class", "circles") - .attr("clip-path", "url(#clip)"); - - // draw the circles with tooltips - var format = d3.time.format("%a %b %-d %Y %-I:%M:%S %p"); - upper.selectAll(".circles").selectAll(".thecircles") - .data((points.filter(function(f) { return f.name == 'current'; }))[0].values) - .enter().append("circle") - .attr("cx", function(d) { return x(d.date); }) - .attr("cy", function(d) { return y(d.val); }) - .attr("r", 5) - .attr("stroke", function(d) { return (d.mode); }) - .attr("fill", function(d) { return (d.mode); }) - .attr("opacity", 0.2) - .append("svg:title").text(function(d) { - return format(d.date) + "\n" + d.val + "\u00B0 F"; - }); - - // draw the d3 pan/zoom "brush" object - lower.append("g") - .attr("class", "x brush") - .call(brush) - .selectAll("rect") - .attr("y", -6) - .attr("height", height2 + 7); - - // draw legend - var legend = svg.append("g") - .attr("class", "legend") - .attr("x", 365) - .attr("y", 325) - .attr("height", 100) - .attr("width", 100); - - legend.selectAll('g') - .data(points.filter(function(f) { return f.name != 'target2'; })) - .enter() - .append('g') - .each(function(d, i) { - var g = d3.select(this); - g.append("rect") - .attr("x", width - 65) - .attr("y", i*25) - .attr("width", 10) - .attr("height", 10) - .style("fill", function(d) { return color(d.name); }); - - g.append("text") - .attr("x", width - 50) - .attr("y", i * 25 + 8) - .attr("height",30) - .attr("width",100) - .style("fill", function(d) { return color(d.name); }) - .text(d.name); - - }); -}); -} -function clearData() { - lower.selectAll("rect").remove(); - lower.selectAll(".plot").remove(); - lower.selectAll(".x.axis").remove(); - lower.selectAll(".y.axis").remove(); - upper.selectAll(".plot").remove(); - upper.selectAll(".x.axis").remove(); - upper.selectAll(".y.axis").remove(); - upper.selectAll(".yRight.axis").remove(); -} - - fetchData(); -window.onload=function(){ - document.getElementById("device_id").onchange= - function () { - var aList = document.getElementById("device_id"); - window.device_id = aList.options[aList.selectedIndex].value; - clearData(); - fetchData(); - if (!brush.empty()) { - brushUpdate(); - } - } -} + nestGraph = { + 'init': function() { + device_id = 1; + + // change this if you want to limit the amount of data pulled + hours = 24 * 7; + + var graph_info = { + fullWidth : window.innerWidth * 0.97, + + fullHeight : window.innerHeight * 0.95, + + plot_info_arr : [ + { + name : "Energy", + height : window.innerWidth * 0.80 * .25, + width : window.innerWidth * 0.80, + margin : {top: 60, right: 60, bottom: 0, left: 50}, + hasRightAxis : false + }, + + { + name : "Energy Brush", + height : 100, + width : window.innerWidth * 0.80, + margin : {top: 60, right: 60, bottom: 0, left: 50}, + hasRightAxis : false + }, + + { + name : "Cycles", + height : 40, + width : window.innerWidth * 0.80, + margin : {top: 60, right: 60, bottom: 0, left: 50}, + hasRightAxis : false + }, + + { + name : "Log Data", + height : window.innerWidth * 0.80 * .5, + width : window.innerWidth * 0.80, + margin : {top: 60, right: 60, bottom: 0, left: 50}, + hasRightAxis : true + }, + + { + name : "Events", + height : 400, + width : window.innerWidth * 0.80, + margin : {top: 60, right: 60, bottom: 0, left: 50}, + hasRightAxis : false + }, + ], + + set_x_y_scale : function() { + var i; + for( i = 0; i < this.plot_info_arr.length; i += 1) { + var this_plot = this.plot_info_arr[i]; + var x = d3.time.scale().range([0, this_plot.width]); + var y = d3.scale.linear().range([this_plot.height, 0]); + + this_plot.x = x; + this_plot.y = y; + this_plot.y2 = y2; + this_plot.xAxis = d3.svg.axis(). + scale(x) + .orient("bottom") + .ticks(this_plot.width/80); + + this_plot.yAxis = d3.svg.axis() + .scale(y) + .orient("left"); + if(this_plot.hasRightAxis === true) { + var y2 = d3.scale.linear().range([this_plot.height, 0]); + this_plot.y2 = y2; + this_plot.yRightAxis = d3.svg.axis() + .scale(y2) + .orient("right"); + } + } + this.calc_height(); + }, + + calc_height : function() { + var total_height = 0; + for( i = 0; i < this.plot_info_arr.length; i += 1) { + this.plot_info_arr[i].height_offset = total_height; + total_height += this.plot_info_arr[i].margin.top + this.plot_info_arr[i].height; + + } + this.fullHeight = total_height + 50; //Leave a margin of on the bottom + }, + + append_plots : function(svg) { + var i; + var total_offset = 0; + for( i = 0; i < this.plot_info_arr.length; i += 1) { + var this_plot = this.plot_info_arr[i]; + total_offset += this_plot.margin.top; + + this_plot.svg_plot = svg.append("g") + .attr("transform", "translate(" + this_plot.margin.left + "," + total_offset + ")"); + total_offset += this_plot.height; + } + }, + + clearData : function() { + var i; + var total_offset = 0; + for( i = 0; i < this.plot_info_arr.length; i += 1) { + var this_plot = this.plot_info_arr[i]; + this_plot.svg_plot.selectAll("rect").remove(); + this_plot.svg_plot.selectAll(".plot").remove(); + this_plot.svg_plot.selectAll(".x.axis").remove(); + this_plot.svg_plot.selectAll(".y.axis").remove(); + } + } + + }; + + graph_info.set_x_y_scale(); + + console.log("Length: " + graph_info.plot_info_arr.length); + parseDate = d3.time.format("%Y-%m-%d %H:%M:%S").parse; + + color = d3.scale.category10(); + + // d3 brush object for lower plot area (panning/zooming) + brush = d3.svg.brush() + .x(graph_info.plot_info_arr[1].x) + .on("brush", brushUpdate); + + // create main svg object + svg = d3.select("body").append("svg") + .attr("width", graph_info.fullWidth) + .attr("height", graph_info.fullHeight) + + // create clip path so zoomed-in paths can't extend beyond the zoomed-out frame + svg.append("defs").append("clipPath") + .attr("id", "clip") + .append("rect") + .attr("width", graph_info.plot_info_arr[0].width) + .attr("height", graph_info.plot_info_arr[0].height); + + graph_info.append_plots(svg); + + + // callback function for d3 brush object + function brushUpdate() { + brush_main_plot = graph_info.plot_info_arr[0]; + brush_small_plot = graph_info.plot_info_arr[1]; + brush_main_plot.x.domain(brush.empty() ? brush_small_plot.x.domain() : brush.extent()); + + console.log(brush.extent()); + brush_domain = brush.extent(); + brush_domain_time = []; + var short_date_format = d3.time.format("%Y-%m-%d"); + brush_domain_time[0] = short_date_format(brush_domain[0]); + brush_domain_time[1] = short_date_format(brush_domain[1]); + //console.log(brush_domain_time); + fetchData(brush_domain_time); + + /* + brush_main_plot.svg_plot.select(".x.axis").call(brush_main_plot.xAxis); + brush_main_plot.x.domain(brush_domain); + + //brush_main_plot.svg_plot.focus.select(".x.axis").call(xAxis); + + brush_main_plot.rect.selectAll("rect") + .data(function(d) { return d.values; } ) + .enter() + .append("rect") + .attr("x", function(d) { return brush_main_plot.xAxis(d.date); }) + .attr("y", function(d) { return brush_main_plot.y(d.val); }) + .attr("width", function(d) { return (brush_main_plot.width / data.length) - 1; }) // - 1 for paeeing + .attr("height", function(d) { return brush_main_plot.height - brush_main_plot.y(d.val); }) + .attr("fill", function(d) { return d.color; }) + .attr("fill-opacity", .5); + */ + /* + brush_main_plot.svg_plot.selectAll("rect") + .attr("transform", "translate(" + d3.event.translate[0] + + ",0)scale(" + d3.event.scale + ", 1)"); + */ + /* + brush_main_plot.svg_plot.selectAll(".plot path") + .attr("d", function(d) { + return brush_main_plot.line(d.values); + }) + + */ + } + + function fetchEnergy() { + // fetch the data + d3.json("fetch.php?id=" + device_id + "&hrs=" + hours + "&data=energy", function(error, data) { + this_plot = graph_info.plot_info_arr[0]; + this_brush_plot = graph_info.plot_info_arr[1]; + //console.log(data); + + color.domain(d3.keys(data[0]).filter(function(key) { return (key == 'heating' || key == 'cooling' || + key == 'fan' || key == 'humid' || key == 'dehumid' ); })); + data.forEach(function(d) { + d.date = parseDate(d.timestamp); + }); + + points = color.domain().map(function(name) { + x = { + name: name, + values: data.map(function(d) { + xcolor = "black"; + if (name == "cooling") { + xcolor = "blue"; + } + else if (name == "heating") { + xcolor = "red"; + } + else if (name == "fan") { + xcolor = "yellow"; + } + else if (name == "humid") { + xcolor = "green"; + } + else if (name == "dehumid") { + xcolor = "cyan"; + } + + return { date: d.date, + val: +d[name], + color: xcolor + }; + }) + }; + //console.log(x); + return x; + }); + + // define the x-domains (i.e. min and max of actual date values) + var date_domain = d3.extent(data, function(d) { return d.date; }); + console.log (date_domain); + date_domain[1] = new Date(+date_domain[1] + 86400000); //add an extra day + this_plot.x.domain(date_domain); + this_brush_plot.x.domain(date_domain); + + // define the y-domains (i.e. min and max of the union of all the trendlines) + var y_domain = [0, + +d3.max(points, function(c) { return d3.max(c.values, function(v) { return v.val }); }) * 1.1]; + this_plot.y.domain(y_domain); + this_brush_plot.y.domain(y_domain); + + // draw nest_data_plot x axis + this_plot.svg_plot.append("g") + .attr("class", "x axis nest_data_plot") + .attr("transform", "translate(0," + this_plot.height + ")") + .call(this_plot.xAxis); + + // draw nest_data_plot y axis + this_plot.svg_plot.append("g") + .attr("class", "y axis nest_data_plot") + .call(this_plot.yAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("y", 6) + .attr("dy", ".71em") + .style("text-anchor", "end") + .text("Duration (Sec)"); + + // draw the brush plot x-axis + this_brush_plot.svg_plot.append("g") + .attr("class", "x axis brush") + .attr("transform", "translate(0," + this_brush_plot.height + ")") + .call(this_brush_plot.xAxis); + + // draw the brush plot y-axis + this_brush_plot.svg_plot.append("g") + .attr("class", "y axis brush") + .call(this_brush_plot.yAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("y", 6) + .attr("dy", ".71em") + .style("text-anchor", "end") + .text("Duration (Sec)"); + + // bind the energy data current/trendlines + this_plot.rect = this_plot.svg_plot.selectAll(".plot.energies") + .data(points.filter(function(f) {return (f.name == 'heating' || f.name == 'cooling' || + f.name == 'fan' || f.name == 'humid' || f.name == 'dehumid' ); })) + .enter() + .append("g") + .attr("class", function(d) { return "plot duration " + d.name; }); + + this_plot.rect.selectAll("rect") + .data(function(d) { console.log (d); return d.values; } ) + .enter() + .append("rect") + .attr("x", function(d) { return this_plot.x(d.date); }) + .attr("y", function(d) { return this_plot.y(d.val); }) + .attr("width", function(d) { return (this_plot.width / data.length) - 1; }) // - 1 for paeeing + .attr("height", function(d) { return this_plot.height - this_plot.y(d.val); }) + .attr("fill", function(d) { return d.color; }) + .attr("fill-opacity", .5); + + // bind data to the brush plot + this_brush_plot.svg_plot.selectAll(".plot.energies") + .data(points.filter(function(f) {return (f.name == 'heating' || f.name == 'cooling' ); })) + .enter() + .append("g") + .attr("class", function(d) { return "plot brush duration " + d.name; }) + .selectAll("rect") + .data(function(d) { console.log (d); return d.values; } ) + .enter() + .append("rect") + .attr("x", function(d) { return this_brush_plot.x(d.date); }) + .attr("y", function(d) { return this_brush_plot.y(d.val); }) + .attr("width", function(d) { return (this_brush_plot.width / data.length) - 1; }) // - 1 for paeeing + .attr("height", function(d) { return this_brush_plot.height - this_brush_plot.y(d.val); }) + .attr("fill", function(d) { return d.color; }) + .attr("fill-opacity", .5); + + // draw the d3 pan/zoom "brush" object + this_brush_plot.svg_plot.append("g") + .attr("class", "x brush") + .call(brush) + .selectAll("rect") + .attr("y", -6) + .attr("height", this_brush_plot.height + 7); + + } //End fetchEnergy() + )}; + + function fetchData (timeRange) { + var fetch_string; + if(typeof(timeRange) !== "undefined") { + fetch_string = "id=" + device_id + "&start=\"" + timeRange[0] + "\"&end=\"" + timeRange[1] + "\""; + } + else { + fetch_string = "id=" + device_id + "&hrs=" + hours; + } + // fetch the data + //console.log(fetch_string); + d3.json("fetch.php?" + fetch_string, function(error, data) { + this_plot = graph_info.plot_info_arr[3]; + events_plot = graph_info.plot_info_arr[4]; + + + this_plot.svg_plot.selectAll(".plot").remove(); + this_plot.svg_plot.selectAll(".x.axis").remove(); + this_plot.svg_plot.selectAll(".y.axis").remove(); + svg.selectAll(".legend").remove(); + + events_plot.svg_plot.selectAll(".plot").remove(); + events_plot.svg_plot.selectAll(".x.axis").remove(); + events_plot.svg_plot.selectAll(".y.axis").remove(); + + color.domain(d3.keys(data[0]).filter(function(key) { return (key == "current" || key == "target" //|| key == "target2" + || key == "humidity" || key == "outside" + || key == 'heating' || key == 'cooling' || key == 'fan' || key == 'autoAway' + || key == 'manualAway' || key == 'leaf'); })); + data.forEach(function(d) { + d.date = parseDate(d.timestamp); + }); + + points = color.domain().map(function(name) { + x = { + name: name, + values: data.map(function(d) { + var xcolor = "black"; + var xval = +d[name]; + switch(name) { + case "heating": + xcolor = "red"; + xval += 12; + break; + case "cooling" : + xcolor = "darkblue"; + xval += 10; + break; + case "fan" : + xcolor = "violet"; + xval += 8; + break; + case "autoAway" : + xcolor = "skyblue"; + xval += 6; + break; + case "manualAway" : + xcolor = "steelblue"; + xval += 4; + break; + case "leaf" : + xcolor = "darkgreen"; + xval += 2; + break; + case "target2": + case "target" : + xcolor = "HotPink"; + break; + case "current" : + xcolor = "black"; + break; + case "humidity": + xcolor = "green"; + break; + case "outside": + xcolor = "blue"; + break; + default: + break; + } + if(name == "target2") { + return { date: d.date, val: d[name] }; + } + //if( d[name] == null) + //else + //return { date: d.date, val: +d[name] }; + else + xmode = "black"; + if (d["cooling"] == 1) { + xmode = "blue"; + } + else if (d["heating"] == 1) { + xmode = "red"; + } + + return { date: d.date, + val: xval, + mode: xmode, + color: xcolor + }; + }) + }; + //console.log(x); + return x; + }); + + + // define the x-domains (i.e. min and max of actual date values) + var x_domain = d3.extent(data, function(d) { return d.date; }); + this_plot.x.domain(x_domain); + + // define the y-domains (i.e. min and max of the union of all the trendlines) + this_plot.y.domain([ + +d3.min(points, function(c) { if (c.name == "target" //|| (c.name == "target2" && c.values != null) + || c.name == "current" || c.name == "outside") { return d3.min(c.values, function(v) { return v.val }); } else { return undefined; } }) - 1, + +d3.max(points, function(c) { return d3.max(c.values, function(v) { return v.val }); }) + 1 + ]); + this_plot.y2.domain([ + +d3.min(points, function(c) { if (c.name == "humidity") { return d3.min(c.values, function(v) { return v.val }); } else { return undefined; } }) - 1, + +d3.max(points, function(c) { if (c.name == "humidity") { return d3.max(c.values, function(v) { return v.val }); } else { return undefined; } }) + 1 + ]); + + //Setup the events plot axis + events_plot.x.domain(x_domain); + events_plot.y.domain([0, 14]); // Fixed number of events all 0/1 + + // draw nest_data_plot x axis + this_plot.svg_plot.append("g") + .attr("class", "x axis nest_data_plot") + .attr("transform", "translate(0," + this_plot.height + ")") + .call(this_plot.xAxis); + + // draw nest_data_plot y axis + this_plot.svg_plot.append("g") + .attr("class", "y axis nest_data_plot") + .call(this_plot.yAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("y", 6) + .attr("dy", ".71em") + .style("text-anchor", "end") + .text("Temperature (F)"); + + this_plot.svg_plot.append("g") + .attr("class", "y axis nest_data_plot") + .attr("transform", "translate(" + (this_plot.width+15) + ",0)") + .call(this_plot.yRightAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("y", -12) + .attr("dy", ".71em") + .style("text-anchor", "end") + .text("Humidity (%)"); + + // draw events x axis + events_plot.svg_plot.append("g") + .attr("class", "x axis events") + .attr("transform", "translate(0," + events_plot.height + ")") + .call(events_plot.xAxis); + + // draw events y axis + events_plot.svg_plot.append("g") + .attr("class", "y axis events") + .call(events_plot.yAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("y", 6) + .attr("dy", ".71em") + .style("text-anchor", "end") + .text("Event"); + + // bind nest_data_plot current/trendlines + this_plot.svg_plot.selectAll(".plot.temps") + .data(points.filter(function(f) { return (f.name == 'current' || f.name == 'outside' || f.name == 'humidity' || f.name == 'target' || (f.name == 'target2' && f.values != null) ); })) + .enter().append("g") + .attr("class", function(d) { return "plot temps " + d.name; }); + + + // bind date for events + events_plot.svg_plot.selectAll(".plot.temps") + .data(points.filter(function(f) { return (f.name == 'heating' || f.name == 'cooling' || f.name == 'fan' || f.name == 'autoAway' || + f.name == 'manualAway' || f.name == 'leaf'); })) + .enter().append("g") + .attr("class", function(d) { return "plot temps " + d.name; }); + + + + //Create the line objects once + if (typeof this_plot.line === 'undefined') { + this_plot.line = d3.svg.line() + .interpolate("basis") + .x(function(d) { return this_plot.x(d.date); }) + .y(function(d) { return this_plot.y(d.val); }); + + this_plot.lineStepafter = d3.svg.line() + .interpolate("step-after") + .x(function(d) { return this_plot.x(d.date); }) + .y(function(d) { return this_plot.y(d.val); }); + + if(this_plot.hasRightAxis === true) { + this_plot.lineRight = d3.svg.line() + .interpolate("basis") + .x(function(d) { return this_plot.x(d.date); }) + .y(function(d) { return this_plot.y2(d.val); }); + } + } + + //All events are step after (logical 0/1) + if (typeof events_plot.lineStepafter === 'undefined') { + events_plot.lineStepafter = d3.svg.line() + .interpolate("step-after") + .x(function(d) { return events_plot.x(d.date); }) + .y(function(d) { return events_plot.y(d.val); }); + } + + // draw nest_data_plot current/target/furnace trendlines + this_plot.svg_plot.selectAll(".plot") + .append("path") + .attr("class", "line") + .attr("d", function(d) { + if (d.name == "current" || d.name == "outside") + return this_plot.line(d.values); + else if (d.name == "humidity") + return this_plot.lineRight(d.values); + else + return this_plot.lineStepafter(d.values); + }) + .style("stroke", function(d) { + return d.values[0].color; + }); + //.attr("clip-path", "url(#clip)"); + + // draw events plots + events_plot.svg_plot.selectAll(".plot") + .append("path") + .attr("class", "line") + .attr("d", function(d) { + return events_plot.lineStepafter(d.values); + }) + .style("stroke", function(d) { + return d.values[0].color; + }); + + // create a parent element for the circles to live + this_plot.svg_plot.selectAll(".current") + .append("g") + .attr("class", "circles") + .attr("clip-path", "url(#clip)"); + + // draw the circles with tooltips + format = d3.time.format("%a %b %-d %Y %-I:%M:%S %p"); + this_plot.svg_plot.selectAll(".circles").selectAll(".thecircles") + .data((points.filter(function(f) { return f.name == 'current'; }))[0].values) + .enter().append("circle") + .attr("cx", function(d) { return this_plot.x(d.date); }) + .attr("cy", function(d) { return this_plot.y(d.val); }) + .attr("r", 5) + .attr("stroke", function(d) { return (d.mode); }) + .attr("fill", function(d) { return (d.mode); }) + .attr("opacity", 0.2) + .append("svg:title").text(function(d) { + return format(d.date) + "\n" + d.val + "\u00B0 F"; + }); + + // draw legend + legend = svg.append("g") + .attr("class", "legend") + .attr("x", 365) + .attr("y", this_plot.height_offset + this_plot.height) + .attr("height", 100) + .attr("width", 100); + + legend.selectAll('g') + .data(points.filter(function(f) { return f.name != 'target2'; })) + .enter() + .append('g') + .each(function(d, i) { + g = d3.select(this); + g.append("rect") + .attr("x", this_plot.width + 90) + .attr("y", this_plot.height_offset + this_plot.height + i*25) + .attr("width", 10) + .attr("height", 10) + .style("fill", function(d) { return d.values[0].color; }); + + g.append("text") + .attr("x", this_plot.width + 105) + .attr("y", this_plot.height_offset + this_plot.height + i * 25 + 8) + .attr("height",30) + .attr("width",100) + .style("fill", function(d) { return d.values[0].color; }) + .text(d.name); + + }); + }); + }; + + fetchEnergy(); + fetchData(); + + + window.onload=function(){ + document.getElementById("device_id").onchange= + function () { + aList = document.getElementById("device_id"); + window.device_id = aList.options[aList.selectedIndex].value; + graph_info.clearData(); + fetchEnergy(); + fetchData(); + if (!brush.empty()) { + brushUpdate(); + } + } + }; + } +}; + +nestGraph.init(); +//document.write("Device ID: " + nestGraph.device_id); From 2b9413181a89bf3bb41253617a35a30520d40c61 Mon Sep 17 00:00:00 2001 From: kesslerm Date: Mon, 19 May 2014 22:16:47 -0600 Subject: [PATCH 12/36] Cleanup energy plotting, insert more outside weather into database --- dbsetup | 4 +- fetch.php | 6 +- insert.php | 10 +-- main.js | 133 ++++++++++++++++++--------------------- nestgraph-screenshot.png | Bin 151250 -> 103489 bytes 5 files changed, 73 insertions(+), 80 deletions(-) diff --git a/dbsetup b/dbsetup index 7288a78..4df9005 100644 --- a/dbsetup +++ b/dbsetup @@ -25,7 +25,9 @@ CREATE TABLE `nest`.`data` ( `current` numeric(7,3) NOT NULL, `humidity` tinyint unsigned NOT NULL, `updated` timestamp NOT NULL, - `outside` numeric(7,3) NOT NULL, + `outsideTemperature` numeric(7,3) NOT NULL, + `outsideHumidity` numeric(7,3) NOT NULL, + `outsidePressure` numeric(7,3) NOT NULL, PRIMARY KEY (`device_id`,`timestamp`) USING BTREE )ENGINE=InnoDB DEFAULT CHARSET=latin1; diff --git a/fetch.php b/fetch.php index 0415d9e..af53020 100644 --- a/fetch.php +++ b/fetch.php @@ -91,13 +91,13 @@ $where_stmt = "timestamp BETWEEN " . $time_start . " AND " . $time_end; } - $sql_query = "SELECT timestamp, heating, cooling, fan, autoAway, manualAway, leaf, target, target2, current, humidity, outside, updated from data where device_id=? and " . $where_stmt . " order by timestamp"; + $sql_query = "SELECT timestamp, heating, cooling, fan, autoAway, manualAway, leaf, target, target2, current, humidity, outsideTemperature, updated from data where device_id=? and " . $where_stmt . " order by timestamp"; //print $sql_query; if ($stmt = $db->res->prepare( $sql_query)) { $stmt->bind_param("i", $id); $stmt->execute(); - $stmt->bind_result($timestamp, $heating, $cooling, $fan, $autoAway, $manualAway, $leaf, $target, $target2, $current, $humidity, $outside, $updated); + $stmt->bind_result($timestamp, $heating, $cooling, $fan, $autoAway, $manualAway, $leaf, $target, $target2, $current, $humidity, $outsideTemperature, $updated); header('Content-type: application/json'); $i=0; while ($stmt->fetch()) { @@ -112,7 +112,7 @@ $json[$i]['target2'] = $target2; $json[$i]['current'] = $current; $json[$i]['humidity'] = $humidity; - $json[$i]['outside'] = $outside; + $json[$i]['outsideTemperature'] = $outsideTemperature; $json[$i]['updated'] = $updated; $i++; } diff --git a/insert.php b/insert.php index ce6b322..4b60372 100644 --- a/insert.php +++ b/insert.php @@ -10,6 +10,8 @@ $yahoo = new YahooWeather((int)$config["local_woeid"]); $temperature = sprintf("%.02f", $yahoo->getTemperature(false)); + $humid = sprintf("%.02f", $yahoo->getHumidity(false)); + $pressure = sprintf("%.02f", $yahoo->getPressure(false)); //echo "Temperature:" . $temperature . "\n"; @@ -20,11 +22,11 @@ if (!empty($data['timestamp'])) { - if ($stmt = $db->res->prepare("REPLACE INTO data (device_id, timestamp, heating, cooling, fan, autoAway, manualAway, leaf, target, target2, current, humidity, outside, updated) " . - "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,NOW())")) + if ($stmt = $db->res->prepare("REPLACE INTO data (device_id, timestamp, heating, cooling, fan, autoAway, manualAway, leaf, target, target2, current, humidity, outsideTemperature,outsideHumidity,outsidePressure, updated) " . + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,NOW())")) { - $stmt->bind_param("isiiiiiidddii", $row[0], $data['timestamp'], $data['heating'], $data['cooling'], $data['fan'], $data['autoAway'], $data['manualAway'], $data['leaf'], - $data['target_temp'], $data['target_temp2'], $data['current_temp'], $data['humidity'],$temperature); + $stmt->bind_param("isiiiiiidddiiii", $row[0], $data['timestamp'], $data['heating'], $data['cooling'], $data['fan'], $data['autoAway'], $data['manualAway'], $data['leaf'], + $data['target_temp'], $data['target_temp2'], $data['current_temp'], $data['humidity'],$temperature, $humid, $pressure); if (!$stmt->execute()) { echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; diff --git a/main.js b/main.js index e2f0087..2af526c 100644 --- a/main.js +++ b/main.js @@ -121,7 +121,7 @@ graph_info.set_x_y_scale(); - console.log("Length: " + graph_info.plot_info_arr.length); + //console.log("Length: " + graph_info.plot_info_arr.length); parseDate = d3.time.format("%Y-%m-%d %H:%M:%S").parse; color = d3.scale.category10(); @@ -152,14 +152,14 @@ brush_small_plot = graph_info.plot_info_arr[1]; brush_main_plot.x.domain(brush.empty() ? brush_small_plot.x.domain() : brush.extent()); - console.log(brush.extent()); + //console.log(brush.extent()); brush_domain = brush.extent(); brush_domain_time = []; var short_date_format = d3.time.format("%Y-%m-%d"); brush_domain_time[0] = short_date_format(brush_domain[0]); - brush_domain_time[1] = short_date_format(brush_domain[1]); + brush_domain_time[1] = short_date_format(new Date(+brush_domain[1] + 86400000)); //console.log(brush_domain_time); - fetchData(brush_domain_time); + setTimeout(function() { fetchData(brush_domain_time); }, 250); /* brush_main_plot.svg_plot.select(".x.axis").call(brush_main_plot.xAxis); @@ -199,53 +199,52 @@ this_brush_plot = graph_info.plot_info_arr[1]; //console.log(data); - color.domain(d3.keys(data[0]).filter(function(key) { return (key == 'heating' || key == 'cooling' || - key == 'fan' || key == 'humid' || key == 'dehumid' ); })); + var data_array = []; data.forEach(function(d) { + for( var key in d) { + var xcolor = "black"; + var xval = 0; + if (key == "cooling") { + xcolor = d3.rgb('#84c4fa'); + xval = d.cooling / 60; + } + else if (key == "heating") { + xcolor = d3.rgb('#993300'); + xval = d.heating / 60; + } + else if (key == "fan") { + xcolor = d3.rgb('#fce692'); + xval = d.fan / 60; + } + else if (key == "humid") { + xcolor = d3.rgb('#608f1b'); + xval = d.humid / 60; + } + else if (key == "dehumid") { + xcolor = d3.rgb('#ffe4c4'); + xval = d.dehumid / 60; + } + + data_array.push( { name: key, + color: xcolor, + val: xval, + date: parseDate(d.timestamp) + } ); + } d.date = parseDate(d.timestamp); }); - - points = color.domain().map(function(name) { - x = { - name: name, - values: data.map(function(d) { - xcolor = "black"; - if (name == "cooling") { - xcolor = "blue"; - } - else if (name == "heating") { - xcolor = "red"; - } - else if (name == "fan") { - xcolor = "yellow"; - } - else if (name == "humid") { - xcolor = "green"; - } - else if (name == "dehumid") { - xcolor = "cyan"; - } - - return { date: d.date, - val: +d[name], - color: xcolor - }; - }) - }; - //console.log(x); - return x; - }); + // define the x-domains (i.e. min and max of actual date values) var date_domain = d3.extent(data, function(d) { return d.date; }); - console.log (date_domain); + //console.log (date_domain); date_domain[1] = new Date(+date_domain[1] + 86400000); //add an extra day this_plot.x.domain(date_domain); this_brush_plot.x.domain(date_domain); // define the y-domains (i.e. min and max of the union of all the trendlines) var y_domain = [0, - +d3.max(points, function(c) { return d3.max(c.values, function(v) { return v.val }); }) * 1.1]; + d3.max(data_array, function(d) { return d.val; } ) * 1.1 ]; this_plot.y.domain(y_domain); this_brush_plot.y.domain(y_domain); @@ -264,7 +263,7 @@ .attr("y", 6) .attr("dy", ".71em") .style("text-anchor", "end") - .text("Duration (Sec)"); + .text("Duration (Minutes)"); // draw the brush plot x-axis this_brush_plot.svg_plot.append("g") @@ -281,43 +280,33 @@ .attr("y", 6) .attr("dy", ".71em") .style("text-anchor", "end") - .text("Duration (Sec)"); + .text("Duration (Minutes)"); // bind the energy data current/trendlines - this_plot.rect = this_plot.svg_plot.selectAll(".plot.energies") - .data(points.filter(function(f) {return (f.name == 'heating' || f.name == 'cooling' || - f.name == 'fan' || f.name == 'humid' || f.name == 'dehumid' ); })) - .enter() - .append("g") - .attr("class", function(d) { return "plot duration " + d.name; }); - - this_plot.rect.selectAll("rect") - .data(function(d) { console.log (d); return d.values; } ) + this_plot.svg_plot.selectAll(".plot.energies") + .data(data_array.sort(function(a, b){return b.val-a.val})) //Sort the data so smaller rects are drawn over larger. .enter() .append("rect") + .attr("class", function(d) { return "plot duration"}) .attr("x", function(d) { return this_plot.x(d.date); }) .attr("y", function(d) { return this_plot.y(d.val); }) .attr("width", function(d) { return (this_plot.width / data.length) - 1; }) // - 1 for paeeing .attr("height", function(d) { return this_plot.height - this_plot.y(d.val); }) .attr("fill", function(d) { return d.color; }) - .attr("fill-opacity", .5); + .attr("fill-opacity", 1); // bind data to the brush plot this_brush_plot.svg_plot.selectAll(".plot.energies") - .data(points.filter(function(f) {return (f.name == 'heating' || f.name == 'cooling' ); })) - .enter() - .append("g") - .attr("class", function(d) { return "plot brush duration " + d.name; }) - .selectAll("rect") - .data(function(d) { console.log (d); return d.values; } ) + .data(data_array.sort(function(a, b){return b.val-a.val})) .enter() .append("rect") + .attr("class", function(d) { return "plot duration"}) .attr("x", function(d) { return this_brush_plot.x(d.date); }) .attr("y", function(d) { return this_brush_plot.y(d.val); }) .attr("width", function(d) { return (this_brush_plot.width / data.length) - 1; }) // - 1 for paeeing .attr("height", function(d) { return this_brush_plot.height - this_brush_plot.y(d.val); }) .attr("fill", function(d) { return d.color; }) - .attr("fill-opacity", .5); + .attr("fill-opacity", 1); // draw the d3 pan/zoom "brush" object this_brush_plot.svg_plot.append("g") @@ -355,7 +344,7 @@ events_plot.svg_plot.selectAll(".y.axis").remove(); color.domain(d3.keys(data[0]).filter(function(key) { return (key == "current" || key == "target" //|| key == "target2" - || key == "humidity" || key == "outside" + || key == "humidity" || key == "outsideTemperature" || key == 'heating' || key == 'cooling' || key == 'fan' || key == 'autoAway' || key == 'manualAway' || key == 'leaf'); })); data.forEach(function(d) { @@ -370,40 +359,40 @@ var xval = +d[name]; switch(name) { case "heating": - xcolor = "red"; + xcolor = d3.rgb('#d50002'); xval += 12; break; case "cooling" : - xcolor = "darkblue"; + xcolor = d3.rgb('#84c4fa'); xval += 10; break; case "fan" : - xcolor = "violet"; + xcolor = d3.rgb('#fce692'); xval += 8; break; case "autoAway" : - xcolor = "skyblue"; + xcolor = d3.rgb('#003399'); xval += 6; break; case "manualAway" : - xcolor = "steelblue"; + xcolor = d3.rgb('#cc6600'); xval += 4; break; case "leaf" : - xcolor = "darkgreen"; + xcolor = d3.rgb('#005500'); xval += 2; break; case "target2": case "target" : - xcolor = "HotPink"; + xcolor = d3.rgb('#9c399c'); break; case "current" : xcolor = "black"; break; case "humidity": - xcolor = "green"; + xcolor = d3.rgb('#608f1b'); break; - case "outside": + case "outsideTemperature": xcolor = "blue"; break; default: @@ -443,7 +432,7 @@ // define the y-domains (i.e. min and max of the union of all the trendlines) this_plot.y.domain([ +d3.min(points, function(c) { if (c.name == "target" //|| (c.name == "target2" && c.values != null) - || c.name == "current" || c.name == "outside") { return d3.min(c.values, function(v) { return v.val }); } else { return undefined; } }) - 1, + || c.name == "current" || c.name == "outsideTemperature") { return d3.min(c.values, function(v) { return v.val }); } else { return undefined; } }) - 1, +d3.max(points, function(c) { return d3.max(c.values, function(v) { return v.val }); }) + 1 ]); this_plot.y2.domain([ @@ -502,7 +491,7 @@ // bind nest_data_plot current/trendlines this_plot.svg_plot.selectAll(".plot.temps") - .data(points.filter(function(f) { return (f.name == 'current' || f.name == 'outside' || f.name == 'humidity' || f.name == 'target' || (f.name == 'target2' && f.values != null) ); })) + .data(points.filter(function(f) { return (f.name == 'current' || f.name == 'outsideTemperature' || f.name == 'humidity' || f.name == 'target' || (f.name == 'target2' && f.values != null) ); })) .enter().append("g") .attr("class", function(d) { return "plot temps " + d.name; }); @@ -549,7 +538,7 @@ .append("path") .attr("class", "line") .attr("d", function(d) { - if (d.name == "current" || d.name == "outside") + if (d.name == "current" || d.name == "outsideTemperature") return this_plot.line(d.values); else if (d.name == "humidity") return this_plot.lineRight(d.values); @@ -579,7 +568,7 @@ .attr("clip-path", "url(#clip)"); // draw the circles with tooltips - format = d3.time.format("%a %b %-d %Y %-I:%M:%S %p"); + format = d3.time.format("%a %b %-d %Y %-I:%M:%S %p"); this_plot.svg_plot.selectAll(".circles").selectAll(".thecircles") .data((points.filter(function(f) { return f.name == 'current'; }))[0].values) .enter().append("circle") diff --git a/nestgraph-screenshot.png b/nestgraph-screenshot.png index 4a7ebe2f550a29c8476a36a0dd9a31e0bfe31b58..ed688edd1fa945b00644d7e2d11946ce34b14542 100644 GIT binary patch literal 103489 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%0AanV<*E&To_2iOj5NXwC}Obb}Lu43Z!4Uu@o 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 RM>OOlH3AEdi~as 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
    1tU@Uy!2tB<50YXDFE*iI6!9AjM0UR(N65I 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 z zC7s?skCVUGJH05b^86{|&~HAa%m{d}HIn3oJG0p?K34&zU3xRl5=kv=RJ}z9d;;#z z|Hhvwgu_g*wMf#z{B|M7D^gqp(FWm~Sh5>=@PgA&*5ASuj9o8SFWaiuPwD2vbvWt? zxQ1G(^O>o}lcc-VrpldXXfXY<8*rKMkWdeiLlb{79kv{XA2<9xR&Wg`alIWMsWl?8 z>Wfsqy&0WJ-(cmt74EmR1%-;H*ttppE%>i^*lQA9-_txBo~V!pCk6O#|E6vftFke3 zV_YlCmnT# z#La%hd}|?dGK4e*x%FTzsXQb|HAs301<+3fJV+&cJ9pqOfI^0=hFKZ_2CG|w%k#iP zdJ_s0>7e-dDA7wpQlTFGvQLnyQm?( zy!Hq2>*M2qOMT;-Pc)uC(iiCsCOL`nTeiB5krLU1CKtjE6yiYCl}-H28=lt7qn~wJ zRkIbAQO~jCdBY2~v+Ru6AVE}WlGfQ&mZQ7~@sP>~mu~y1tD625rhKOiJ}XJ|8@E7e zYDXP>^$M*7KT+_YUaZ=zmiHT1ZRhDP3P`VY6wgObOBl~j7~+@Ljb_eTuA(Y|J+y?o{rwpi@*pWgg` zIb7ouZDPLDB?|@7P3PnrUotgiRdyMH@`5;9&vVv+HJrZ9+HeISXlv|~x&GxWE?Isx zimEB~i2KzG7btF$N0(tRYwKj>0+4^D8f(N^_c<49p5*AT@A)g)d4OuDA}wpx=~|@K zbk(9w2ZM@->$lj|*^oShDK4sOs*|WxJJxx@>+yFfKqNl#e!BN@%~J#iBsh!Ydd9PW zk@;9aK&HrLke&oDjGBUp-PL~K$RD&s&pRc$f_~ft5uv*vudn6Br zxlGQ5kk4x}7h>G;Zvw0H1>f8(%cYdJWru;9RixEuS{(hLlaoIN=+7mLXC+K;y_u5H zF6ObGUQBREDhf@0V8JXUYDp*i!Qf>2M@D4LO-j_I-Q}IIrN0xxPiJMN zt=GoO=i97GpFYLYk@Lbwl#iA$11RPrL2iPwbO-^j%XrVk+Uymz&}yAc8#U5KEpAV| zWj`}gpd0AwX~9RvL;=OdI)j;ngN@0ioAO>(Dxmvh7EG6+VD{{|k~uB-_1#i4KnXO< zPMuHsE%7J9f{qNr$!WQqjI?i8Wf@tQ^!G1HVnF|To}z8gWF0X(&U~`g8=;Flj*LwQ zw{+mMRG}ayg%~rK%-)*0hJMvOHwm_gjm>Q3dMReT3yZWQxe8U=QIaSlY;W(!1^W#X z-SN;YF_h63Y{N?czAk;uPaDfT5s^lVa{>Z!0)=6TxV)?f8iNJZPe38oX8Zdw>t!88 zKHZCg50DY(oO?SS@%XuqK_E~L6ENeNM^Ua?_-Wy?n18dc#4IgsNCw#I91AP$rqpQr z@$p~MwWec~#6iM|Ew`<6^YdNPblo;fgmF7)vo zR>O1$IMEuo7~=cPo}}>~l(RECaTt*P2e79D`f)Y1t>o=}8CwgYaJmR;qjkI0Y&;Qi zpJ6v2W#XcR@FNwnuY8-|wO^_;86hbyg>&FCJvUAG<}#~T@*J+Cr=XCbuV9xr?Tm@I zLrq;nN-1v=cu|y~Eb8p&&)C4@k`o)dV$FNaSw_=Auy7Z-Ir`Iug*v$fdg_B(@96sY zUc^LoL69QgvV~iARIa@2{mk0qCOotviqo%T^|*4-@#S-!8^Os*QAL6mKQeLJFlPl7 zi!@u5MM-Y%bCL@Z(pa-+;;<=xR&^b-=RS8ivsW9wq0CQ|Tqtb1s3=}xC;c4gfYgFn zl?~G55m|jx5ug9td$sT~NCa`!5!=X8QaMDVCY!J|b5M7q^C73B=>smfKL`=2Hff9! zs}<0}5T3_stBl$Y(YuFIzfaUigb4f|sM_OzsG-QH={8|w`BP1|ROs`UygnLG4kc@*?r3gJ7vX0!tzJ)F>r>qP zZ+(Ufdv0l}eGli_%u>r3+VfDj=w&u9D3`4IA%W!(?)<4Io0 zLqA&8usc59nT2QHzl!Bkn>^M}<_*Wn%4#J;5`x@#&24sF9v^0sk~EA1CnYf8$Qf|S z;@0POOBWWfkb7yWm(GZ*u!F#{`l)GHCZ!61rMvZr8*DeAYZoyeOHB-P9_aadK!q!DeVZM3(zEsd-AY7eY3sbw9?9La(P6;)=A zt=qYJpurGR*Tytg`lZFPBKCZBI)OH^>7uCp=E?6@Bdt0sJU~+)y@iJ+PB)=TRYKpn zcIbPhMoZ_IO}mTLp>fJI)HX3`vhFQK+_a6xK*Pqy7_X_4hYdPXQ8;E>@R6#@kHAVorj<=SinU?Oz z3JjzQ)!@RuPmx8ru*gF&Nt>0p%}5$wLB=B8bHx}YDw&Awvq)i@$T+RT30hh>${!7C-i!=I13jdAE(xC+}|CNgYT)p(NOljFFA0 z{k~TLfIMw|y3|jhp?!53(}cioq578PvYDQ)=Xr zZI2v;oKBZ$9yJI#xZHK3c&voh^bD# zkJB$x?^(GQ6EIc&UlUx!K5o!$>*6g!`qxki;xaxwt4`zn_@nctDxozLC=m4rAWjmZ zEZYrDlmITA0v^+yn?RI{?ufJv!w1+u^^vF~}KmyP*F zs zY7AX?t!+`V1F(<<|2)qA6^s!>f{?*;FsG-RiyqD?nO5td&1~ zxS7#Ilo%!%|E>^O|ICC?0e;#yR5Gy<%*5_2Kz{qwPw_-uP4A9eBL&u~$6j(V*@6?W zLb}T0D=ahXB7A<%cyNhkGarEGa!2o|bTO+!`ZBfMdq&KFAzU^&EXr|Hq=L50=BTNh z^o`^2n#BFS{CcsI{rVJvVJnkI!q?U+pg21i>?S$szpcpU^S6~V|(>ba6A#v@e&%GIIFgBIjQv=UdOp_`nL?Ph0erVfF!nmOj zMSOcw89zmN0@J!FZb{Hp*h3mg~H=q!R9h?3BidTMJ0D6I?oiM zpLbqfA;COyfc*h7__I^Ilfc!gPmT5x|C>mth%1u@MoG)*eH??)BP?UJR4cUqAxo;FENw3Gc1%Og0V`>J{VTEr)L-ubeQ$!&D{-G$7%ZLZf*g(c+zC`r1|@3fMjuQ z(_oTi;VBWm(Og8Eh414L*nw`3vFkCDoYTeHT4GS{?+SI}Nj{j$N-|m(MoA;4B2rwM z{W+=??bBEgCKNP`#=zhGEzXj;Hb5OmNfAxc^O8q6(@%5K5qy%4ZqiH!A%hPASQINm zL?onqy~`uNqni28rJt8G$G_WmYC!|joipP!PL~^8A<#nVru;+k6w|>-WEoW_C#Vs` zL+V^_ZzZLr17G4ug{b?vM{j~9N?P}>5|l@$X>v}itMLvPapW?!W^j0Ta;s55TXz=b z))|}|8_~?4s<^(f)$t^YY%`v^A_7Dzm1$OB2q**KY>FhConM>=jHk<}pFMj>7B0;i zRV29KomlaeHRgdFFLf`j)V)pE&+`l_y*o)mmdf^aYZVVIv}bUdZG&=&L4F80IR+%? zf%g3rndcob9Jnee6LVNi za*MOrF(}o-!$~zc@=-4!Azvcx*JoVj!_o;cw4b0_K7^RnzTv`v8)Y?^EkYL$F*g@{ z;#EP91gx8Ko0>j%Nr-72AR|E!5{s4A*$;e$;%a}0b%(WQ9Kbt}VD6Af&t-xS+Il)1 zS4U*G&EU+U>ht0UgyzMp*h{L-;xPldjUT@u8g<%tpXx+6zWlWZOuEmhyE-z9fU1w_ zyEM57hi%36(Pf?Nt-GnSR+bB7F1(Qpdh5fn1KtS;3K?PCS;mFK+9J2QU06c==wclM zre1U8l49E2xxsjqJQ(c$p0*zH<0=i^)45*`CcYkD(@MBxb3qjP*z2hc8p&e7VQ2f- zdKoempIE1k3M&07Vk%#Cm|`tyrA;i#$BB}Ks!)dop}Scyx_gvvuGa+-@K->Av*Knf zO{FcO$1-M1ev^=i7KcMH>iJkUgdp%VGrK%e|IRzU>yD0w`ue@E@|2K#d}m*lb!h!>!cNrM$z@(8AOVr;{s)X4o~(NYHgJd+yotgk(i1R<+qpSQp(XWw$VQ+ z-*fFa9EMgrH_@a~g?TC3nSVHa(yK1tEykz%+_GR=s#&ovBEpJpFpKfA3y5x6O-&PA z+<(2yOJilTyk;ycs0M$`P79Trcp~L951V#hR==%&Q>~$WXh;qy@+Sqd0(?ueMo}ot z-tJHgH}}%v?Zcji`{?h!jkH8YOegnu95cE0f&$v^D9@>x|t#BK=fW} z+Y?x|h%*2}NsEyk0rs>5&&{XP)gT<)I1K%{56)pfasSsk5|Sa2V3vop8A@y|?~FyL zsO3L)ER$5JYTW36G6k30I+Dt_B&ZNhUTn}-&yan3h0}5}4LPZht@&2C7*PRy#n3b* z;PD2O+`wa0%w;$`fD~F8dxVp=(9?pU- z_OS7CiRFF&`G6n%^GZxOI}?;Hv>y@@&hmt`_c%+?Z&DAiKZhdT-lMFi3G&qnJhw(M z`y#|FxC!bghKwLTGgZb#*(herkO$r-PnC9s@8_GrWK&-UM2n{&(y#N@$2V*aAw2g7VkIDnst zAhU%dUJMhA9~G2zCeoKc1}}p`hW7V;J?4K;+3p(T2`hmqNm#BK1J&M@sm_ESd%YZ7 zPjcgS@FJ*!Va!a5n({{1-Suwu?ApZwxH+9$slLZ}kzTz&dWzZCGC%vnFaye{xFg z*z{4Wq!JvcEF7*BAf_b-FKT%oJNOBcaMV21tun2j|Mk93RwIzmWPHk_*P!kBN0ujf|bE##EIN_L=tq5`LQMaaid@Zx8pSafb?j+@76E{@ZZ$w z@vlB;#0j!>ewL@1+uP1)4Xa{F#F^x0xeV*nO5UC8cn8*I=Yt%=_)-aAf_o;yYM%vb za?G%X5kRr91H=g)xwYr9MqZ1D+KP^)Q-OM#6wv<{I%p0+sfa5BG%9RQVpkef`&f6(mW*+H2s z;)rNgW21GyUPmg_XpC!`5N#ay>~-3IDI7%Swxuu)@TZZz8OmVxZFGab zL{UJ-5pbgmYORoU_c_IIAUA??YD8rE1*^hh7!rj2-j-JfA7kTTvG9KDESTzK6Y&3* z5+1l${c~hUbAAQ0H^ao%#$o1F-2p#gFgA{lRa}fX2$$$fk#K-oe8Nov8ZQdl;u$`{0*KYt9r+yYtwY;@{IfYBt5o^~3Atgis1`XAemqgXhz zAWmk%A1}|y*%m*%rQg`v=*~N~(y>8>jXxVWFmR9F&4-$E%v$flfYh5~iUs|7pRrmi zs4;ncE@eCw_C>@gn0Wsh3!(C+`+Yc410xu8-Lh7iqI7@PG?-;dSLXlu zhbT^E{DEw60vKIAL8*|g2i*0m7j`B9Zk`!aDCC_)fp0&4l{50GI!*KUcg7s(OI)Xo z8&(DcGLy>fa<&*b68PJIt;gZA@`QB1yglXJu`Woxntc=B%R(2d?T=jJmx z{0sONMMqnXv*9BL6xE6@pQgS0tSmG|Z@5{n!2%FgZ(cA!N$xSYS#y+GQcWGF$NL(j6kGPf7zy8& z3lp=xi4Vo;LD*_~r#>#-A)UB>8f%sfC8VyONQfwGcbV{&kI(#c!IBL(L^wgCZIMev z#A!6inN&ne(``0TxZ5fWKk|J#d#+iwPEX3OQ6X=>Q!-V_#qIzdBjJOojR|tj|C(1u zgSh*N>yO$jZ*;w5UmFL+aQrFh85aV33z}WS$8(yKb-kS%%aR7fr|l(k^=l_;_=y9H zlz;3e?zFa^4v0VZAe@m+q66AO4KBCstO?xBO(sB#%-Dc+FIyx7OA|n+>*|m5h9xw$ zwx14hd|3JT_I4t0Ru3L8$N-)DK;*dLoFr`1&QfJSqzO$p#4ZP>ZR=>;6B*w;>%zH* zGT`ijoAX4$;R93sze5yF0Hvg@e`ao#Zg}pq6K1HBIXgw9dZ_~gzBl%Xyls(6;3c)z zptltx=L`F<-9bQJ8$1ch5Q~1Cvu{5eyM{+jhcHh$=xC2C1E7fgY z#89mf0_(xM4_$V#nhqJmjc~PZ2QQ~2dYD)xs_ZP29Bc^Jf?QcV0N4Q%_sB6T-!3z+ zxLbnZF4333v7ZIa4m+V@=8%(h4m8^iRW<+?<>pHk93wXrU#YA}TU^q6D|_mE9NxY6W2&DY4>1r_IL81)0DE3_{vzlN={hGu=FoO7E$W#0TsW>IcdfN=QG|qa?;7Y7 ztQ@y)Z-|6=USt&v*!^#Uzz}%@NQ?ic&Hx@t;Bz#!(bi_h1C9ZQPgRLFI5kKZ^7J(o z^hb`PbduL-&Epg*8|CnJV0Dwg=a45r)q64fwct6#m-A{$#A1+1&Jh;Gh%H(R1ptw# zc?l#SSt_s}PTq|1{t8}(r}(a{HSa1NOYAMT6F$O6ZJYS5xAL1FZEvSlx7_mAO{>AG z&Q6eyc)P&R=JF|)`f3W+Y=!jlxRKAz-d%Q#_x4;6Mn{;y+uuw*8m&)p{V95%*6l)> zE`Kd^VDY}r2@nXpebX{W7=WcD!}a?KXrBTgA`>WgQP*K{zRfoCK}>0{^9Jh)$u88L z7eguu&Ee2QnCghzeUQfs2AP&Fdpv|6^R*l0H%FJdVq6IiTc}|{n`b?xydHa>;nr;} zy>g;x+a-@zZ}*$rf5R9r+yI1p*>UiG;p%#6mqz=5TbR6_nK_sy@p9QAVZK-)VJT^& zK>OJ0cZgF1fK3zv8jr&Y3t)a#t94^)FFJrxn+S>x-iytuFySUF=+et9uY=G2X`j~k zTjR|`GX)^>smMsVCsd()n}2CDWAPUAUUF4w=l(5`>QZB>p{&8&0neBI zx#H#aM;%8JpX(LM`_rbc<7GUBuhad+>WE6P7ykzC%GvuFYI%;CsSkP5?6gsRZVN#Ya;H$%W9R%7>QyijSpTr1*r zOcr~eO}$?%Fy7cWEGM_&yy~a(G3N>yaAT$0>wRv;ZADOTh^ux?8GNvDew)jjp88~w99w`D`yuF1jsS*84&}o+YcNVt2&<}r$Zd(`a z89MsPOz4+&GVR;YHc*$(-!mq}0yaEA=7`pkhcF}GgT0vMKd+p;)560Kj@Nm88h%(z zmUXEn;c@v9Bfzi2UNAd%Y36_RU(y+Bk(Y11c(D^IN|b3juUOe8e1=uQxg zKdY`fM&2e=HDS}7rom_f0lE<%sSXB4{;em!n0)RMpTU9DRo<_aBoD;Ao1>l4CM>;G z6Dk9|w}LPziU?&36}|ab)R=H(T^KZ6W>2flWPnqx7INeM9cf;g7db*9qqb_P1tS{I zAm9%zCj5M>4SgEFNGSwJjP5x0D+u+v`P27q^8KM?%+Y(#f-voilwBtl4w-w)RBi<< z+9170?#5=EW%g9+Hk|Z-ae&RNaU8HS5jAK8`A~ym^JXnIZ9cb+v4Z6%o?m{Ss%*6{TtcfR#bd$=y zDvu?q#T93f#4i}R)WW8-*Zvjw0RCk9Sf>#f80qRL!NJ0IkERs;RmJ839k7DRC_08i zC9Jy;0Vj1n*?dK!Zhh6N1_X~42U-v#?fBQls9`-o4}J8y8rDn7QiIdkl6{&D0wjsYMpgv;VFA zJ|+)P?br6&`?^t_-6Sra(!I(i9$6)b4(B;rRQ64+^!3;2>N)BvPgA23mUmFyS=n4< zfnFuyzrcu*(o(9x)+h!sELoLqdFIsN8P+Lyx z&pkLjt4*a9rU%<17TlS?pAHTN1|-=w#4?+Q?K9ew zFag0{SS3ZauPVsPHV3C(7{tIy* z#Q%}K&eYnpx-!tF+ZX=7F=zL%T>kvRU)lnA=$fum04iGWO zM$Kl)i4zUKSW!n9Dpgbys(z7mWXSS<2`tXmU5t9d>GG4IFAb7yNGe=yGSO^hq*92Y zegV4LS}MvdC4b6!vl#8J)kR?^Q#|U*K9>x%nxv(F)ca4I$m<>HPc97E(a8MSW^`qB zQ>+u0W~n&IvX1rW$h(7tdR_8YhZFW%%?rY#QU@?pORcGgoEE|ihNb37y!V2wsPTbR z@~gZDHiH=(Qc)G!HVZ&q11zL86Qa{QFAEGkq0$~FGFiN}r<~ZZ?cQze_YORE8_mVs zs63^m-?iAbqDk$6oJB@gZiZOfN_l0Aj2NLbNNl6;1jpzyxP6$(5 z!{a6+Q<0UOo#kb)V5vB3O?{+vt{D7?UeyfYVso35q`TpYn3CigY~N6e;B*QY3HHO9V}?Fgk%i?NDWR3ropCssLbA$Kd>y9=MB&hI5!?Dmm6lk{ zmKk64$EtP+aoCwITwoE8D(X`?QN#5LIy(cQGDI#NQcmQly#x93tp{r7eql&oeQFla zgk|cJqOu?rnvaY_Q4KOA&taF1UH@s#Jv)n^(sb~+P){)UQEzt+9V*cdK#qj}BBjLs z_^nA$-9!->t+FI&ZcqF7zcCexg-R1k_FGkdl-Mjo3sA*{(Rzq=?%8Xy@)S#}2q#=+ zaME$L1KMi1k`=saZ+5I7_A<|QN>Kpt4b0J#%n3bX>xMGCbIQnII@QQXcvb% zN|gPSEtk1DfHOt%Oqt--Fllw{$GskT9t++t)ka+(gys`B%LT}**Ll8~V`9dze0(3I zaasj3O^`5{o9VGG7#&?hmoFcE|E+sL8QV;(w{)nYA%+Yp`FC_)3J}pMmCX`a?+A=H z(kwD{ov#CGVtY~&6w0a9N6wIB)v?cjVY% zDe1hV1UBciy>*B>c-D?;kC85e{Q%x5Q$W^noz?-?Y}SuUdfZPz!~fm1vm|*yorY-D)bMYeXviw}>#4vyy=tmTG}zb##eXjd2CxJ!yA0%PlHH#tXYqIPi`2 z`Yg2L#6=>N7W8v?*w(AG+j$&>DrB2uyX>{JW+X2bLJBk_s|v#(yZk<6s#H5f+eo9+ ziVHpKp7^z`yH{7QI`T&fAoJEL(_VJ^4b`&XD^Fitn2jd1fQ1Yh=qkfJfmzAqyG*I_ zj{|#+EBT2O71p|}(rJ0z{}vEjD90ZZA4$`*E0i{nM4u?kjReM?TOD~|%IWT~j)V}b z#G^$`HZ4*j651;lg*)V!XY++DVZHyT!eiy@6UB?mskl7$@=nUf2J=}0IvldhRj^`U zt3X;oMH-Ka3!W z8q@Y_RTuyc6F*3Lm9rlF+l=bm7vx!@;ai%97yZ_ zqvm{?ZIZdOtqE8BT)hp9SQ;-x9anBy84j~T`Pl_$+?sTXzx<4SkR%Q3c^W`}i?$^Lji!>e=$;XXVMY`sS)5hJ^aieK_+7D>7IO=b! zM%nN6)E-#S-?=O6fC7%#V^?2!W0-{HpNPyKTVR!~jf`rTw1TyL|I?(_QXK-2G`*Y7 ze~$6#8#5)_rn3Vi@yC+^%fo}JF8((6+a9GPf#>PFejK1leaSNr^P2r{_7R}8Jl|%c zeD8l#*5r{V$2AH;A8g`cwdu?c)+wWfnEn={P?dhKPdvRqI%@)f=Or#&yh$t{!2dAOn~(O9w@o!gz#wGp9_6o<4$ z-q!WOcn?rcr&ANS7YyC*zz8fcJ#7{9&%ck*%=})J3Nl)4jHibojz$jw#X>sY*!!zh z#1)Q)nR&dOoH_K0DZWJsLuGh3YPR>>n}c?Av4ySIlp1T4NUT3-8!^O+igHS^erN{~ss<0zLxM@u^mD@$36rukOJ8vXOHk@82Sqhd2QAHS4vZvfMrE z)nLO~sNm3gGrGv!d?W11BLJ*bP;g$OBL1^DGC+uY8*S4Q>CFSqpd~Lwl8V__VY<)G zp~riwr@G8=ZOA*zfh%yBVk$A)Utz|yknlgKBmZrE`v0{0r#^HKVF1zosdj+S9|*kj zEoWzXX7($<<3w+P^1=k5KG>`de2*kE>xJ%SB~Hz-TfDlR6pZGlqt4AM_y zGd@3noTa}~PvL(eu1J?zQhw^$a*TQ8fB*Zm$-8o!z9D8a&4yY z?~Bf^W2d*Z3>hHFuy<#1u-XA%LT$`k@p%NOb9h{8 zEGc1PVfox0I{TkeSsL<<9#F1$tIG2k+7+Q})nVrqNiqHu+354GdnouHH1?4w+@$09 zTxDMVd%}qE+CAFc^thR}d%u1BSK#`0PMeTGGTXLnm34A?1L)TwMz`1HUzc&{z6dQ8 zG$H(+0|Nz3v_~>k#>~|CHq+ zva;uG=(^39AGqTkJ)a)FTFD@AJ3`a96wKJwCuPWjh}TEpUhnP%NUCvF>c5>d`8>Z) zuWRWBOgjb4wd7K4{7dp|Zqhk^e~vHi^vFBpz(-m&?a*g+-VTn?W7(7jZ3_roIWMH+ zT7eg0xcC>zb52DfgFt^eBq-~xllxKs;O^d8^xeujR%1%#Ez{o4QxP6c2vPQx<;pfR z3h8Zn5#kaAXYv5Q%abRAM-8gkVwFgWjTzTLov10Q80H*W>W(tc^(Gc!I=S=uG@y4F zfki=?QRN(|ZO|9VQxo3QVPW*RNp}t-T`OgfJ^%9&H|K#0GnZ*I&G4fu3kn9H=2eLU z<$v6tm`7QnZd{&x!^9|fdZOM&hw+6Sz%jY3UiPF$PYZqiW!MpL^Blf-^qbrMWV-T- z8bb!B03WnZN%z5vnB`S~t>yih!J#tCpE`o#7#iOn2FfH*$TY<^?a;QnbI;bC^nm{_ z{Q(n2n~&t#{Y*02pr}t>f)rQqmjQO?dR9V0vX8}M1K&16TzTuaxk>VtD9I1OA=J0 z@i{i9Khf6j<17IZhA$78y-gw9JSKsWxsq-B?c0~aj&^H`#vlA?5g-rG3WQ;Bi&XGV`!6gbbieHz`kMMvF+r716@dn73jme1AN0$sZ#>bA=k)3}IXNV!Z;l>56mL!A_I zU?hsBxaE@r7Z6@|&NMV9eU*0 zcP72fmU!N0^L_qC?dTzgb5`ms92-lS8>jU#10gi;_!z~VtM&@5*+=P>CjN1JD3GXb z#&LAqBKoZI74WbO7#crvW@f$=5rjT`Xq9M0IA5=Bk|-JH>U{SvB0s&_P84UUwJ9RU zDXN}aZWuPWS2Wdq(Y!SiNUyuTsD7t*U3ZRP)8BN$aDP}1ce9LU8NK0*uQgsSOAYCF z1kY{qD}HggRS*5UN%oe$I2Isk-DkZ^w1RKoWTi&@s;c{PZLlHb&8jwt^& z9+Cg;3YenqQ1*iW0A7?53KWS-9%zV|&`LL0b52soKIsYO7Dx$#%6WVHn*BU?z;kJ= z8+VHq(JjZpbgJ3X@_e$@9T3FPo;!HD59YQ?e(4@_DQBlyvC#@BFAv7Q94k0BZ?q<% zpTAuaN|90yf(g%^7X+H8v8PBMKd!r4jPugQs)dR`31#|d|0-^=Uv28OuMf2dFz=cB z4Gd($ml-I;xGS^HQUl{KxRGR|z|fP?cz)XR#@7Y}5HbN5Z&{rL%3SaY!Jxe&?Z8U! z$<$iK>mCJ7lm+0O?YjkWkm*`?k`XUKI9@NxWz|oX>_*_TRDV{z>45NjtgyYH1qd`{ z{}sJxJFx1+CP=H4Lf^(E z&zgCB$#K)4Kmw(4sn3Y($P{AV43G&+>^S&1%W4NZItG#Fuv?K!F|AOr0w*a(n0*f- zC&~=zCo+5G#XSn$@)8%O&zXSgFT~TCAKH(N4wWGu^efNJq1NO$4HA zD2B4E5BIS;$EIJbR>JD`rV%u+)`XY!Wyk_&P}$`1S!D6pd9hZo zX>F$Gq*!yg4vOz#X+@OQ`-Ez3xg}b2;_&?n2FK3lerz{0Dp@_6>%IIuB@VMDjO*Me zP&1BoU47y<&qU#0fh{)X!Rk2R`E{m?Ix0LVF!|F(4ZE9&aWdOolJtio%W2R22#^`x z9XGmr6)T9?Ttw)RfHNp;2ue|2OX?2VTN^68t51)~uy_I1Q%z^b3^c4Xhe|&y41q@$ z2>c@#X(J)pUm(FLQ;n^1xrX<1In6VbKU95XTvX5d_EM5ciP8v2r*wmWAT8Z3T}n47 zE#2MC(zWygA|28VO6QVG$8+%e`@eYh4IlQLoij7{oS8eX>;D=wT0E~EN{N>-!+nvj z_9HC7<1??d{gZdvcAm*iR$H=b8D9&F4fzm=_;ahJx8zpQfSx1M38N&C5fn>c3uMM34YcPd&a*05i4{M$o z96Y~!1bG>xF5xn{5;dCf-pql&u?(@-wg*WaYfiOdne>(W+mv`jM-q)Lrm;9-f9Z+( z9)Th|oVEVELB^yf$8|d>N&*0DRisV)K#$x^3Zxivav&NcCFc+B9t3uDI2v*ho3U6V z$EAg0qcTX6KKK2N(eQkHMxzVZXtC}yHcr!S zth}SA&Yw9F`hT-W^_vUGv9T^;Mno8Gd_Rj0{sELl0mL4{uML?K{N}>?tlo6493X(M zrb87nP7KNV)@tbAbfpv&ll5h!=HY>a;%3tr`@*F(@BlE?f89e|EQ&=-|H1eo8r9_8 zh2B%%DKYV%d5a<9;kWU|Gce^g$56$j<*C2?v9C7C2~Od8UhH-h4$7}RhEAk zv&~WmAN9HPw#C_D(ue3ntw6=LaHce(*e6RKSj^!7k75+cRGE+vIq{Q+in(BNSUu;} zTvKe8sNu|Z%D``3?v(C^|1SOM+s6@1^{Cn(l!b9jYUfK8`A!4H-(%|_L=ne&Wd;0z#;@+VqU1m{qi zAB-U$Ls@*5S|~z&l3}=2=|N#XxX)_)KlA=m9dRv*^M*lc9#{83HJ^1#kardjS2e9J z{9uK}nwX57XNbO)vWKIk>1VhOHhT+V4OuwiFSPJBF8(<5LbVL)myoyg@%a0M8Y|R5 z(ae9MeG_&@X|BRy)AOsu$`=s`H1Rv;6 zj8QZhGALw@L$vi^tGXl|-^1C3lkEh+ApECuA{72HMKb>|2$K(1|H+&}YiAX!B|HV1 zHIR!YXIV`X%?|06YK%nzbvj}#6T7U_{xOO|0vW{69o5y72CQ2gS=N^9%t)FeOfquV z@a8W7*$Tw#9r+*-fG%f>df_Imjq+|@pV5{CC~g0du*{Wd?m*euSga*s=*h4TCob2q z4$yT_=O6+Ksxi!(Gz1iozo}o-hkiGX)Bw&~(l4MlU-CE^IC8A^Nz;51yN#98>#0@i ze$@W4Xc#PEoc1A%`XtLxD1lAh3g9&Vo~&~_?~iRqg_(DIP5;&O{gM5cp@IQfQd#zL zwoTV=Wdaz*Hy!ue@eDj=1l`%eWsU1833%cMTIJhWUKfbfXy3WJbyvip_jUkA1P%0) zkYc+*W47ZPFD(LoUkIe3L)=7=aaG@};eA|s_f?sEKRM@d*X zvutCmA~Iec5^u?K{N> zKX#qru@2L9fCDTjL56pE$1SrSvYxqW7;Od@Hvm)|ra^ebO+4RJE*elhg2KTN5@r92 zz{-`Rv1cgl-8`iAPolOnrPMU;6E@+W-|f;nU6l+W|HuMYd-g06jTLG0wO&1edrBbf z+_Y4FTfLKNI^@}URJ(11xm+bfnXmmbWNT(U@xP=%`tD>%`(9R~0f-pDCL>Qzb4nU3 z@2*I$M6E>sHFPsJH6A^G&k|r-V`%?-{L&DXf5|QC+;@MQx>qSVUr{EhF4LeHXv{vZ zA9m$U3fgcSZK?R?w0#VOVtG2JMIcLg=kULhdG+97+gECd>K7>m&wfXY3&%FvQAHq# zb#`x*AH59iAL)Rpn?bFjVEx0d@ZtPw)i?xUW!?S#0_~S)+X`9Iv1m4F``<^>|MEf^D%M>XQGCr~$g&^VCx*vA%DiZJ zw}#-q{Xv$_oGYF0JG&R^Oa6Jnv%^svbZsL{VkrW4@@8bfcXAo2-4spUVPR-dOfnE? z1shCSPRKinK$?~l8T;%Ow06>Yd<;C0(*ig{?fiAwY?pr+cof!03#J#6W1k(8f9S*` zPDdu|dyj?$iuORnubL(8`*U*O6hL*`i-bmO9=kpNvbzLvhY<983LP~~AJ_Le>F&xZ z@>9w1cL`HeZLF?o3xY^hm~7F{68(){qd~ArKT$rci|++^yJvg8K?x zZH4F&zqYrhwYPN&&sQQBN91}^zoc`OQ;m(m{OM21xa|*TRDblhZ4pgNJ@J?*iu|sJ zro)cR2~-6%x)vgFXbPSoGo8ApXxHGOKcmbvD83Zo5SO5AB-RtH)&2NZ)(c%f1Qh<2 z7tp|Bqats5DAB&c-Y=%2z0vwzhsfIsus}o2qMwN~>}jiih6!Rl%RjGOY;e=``CznX zd~3`YCkBceaPd3}LOi{lxBfylK836#VwDKH+vN%rFHe*H%YMYSj)2U9g$8n0bfl#T z;XU}?KTzkZpNO=j)tH%=nD~|rtnw^C*>Qg4>r^9n<&7piXpFPYga+@01Y?8Zk?_+= z1pgq1DeTh{sH8WEQ|GD_w=6#19|aV#{^c7G4y7H55aRtC%AxNn=Q~N>5dOL$;-6Dk zis&=%7toD2)SHes6!)!S~9WJV?A;yOJ6Jnc5!BRcWLLlFQ3HY#$`}iX%H@ z>&WywNkJdK+eUBxMgT?d`@WbzRQ?_;Y<|eYNlw#Wme6IC@ZL2*AAW+=Ra-LFH~b^< zqbc>^=b6&;&sk0Tk#>tlU#bJQc@$cF9Z5r@x8lz8JJV7THUykO3ij7Zmi?$CsA416<*&7=;IQEe=;0P>l9e49SWQX z8ag;^@Db@|^dS8f@2>d8uhBOCX9iOdLX7a%ik;T4X24G*wkFKa@*I>Fd&z{WQ3y1> zQLC#SYo-n{ns)jAZp~wuSP}&<>^MQ3*0c&jGV8MV^$qDOEfOtFF77VQv4qc>o5$=! ziJS_qL!{)9Dgg2x#iGD~an{5*T&9t5`y_)Xf`B20jTWJ^w!uG{C6)+FYS#=hCe2;Z z5*a(sJSFCPOH7NC^P06>FaSt@jWyf4s)t!x<+4Hb;A+Gp+YbQH_ zp}0IOBlq)^jc@6lGT#&Uc(9l)1Ru`5S3>&VnmD`+sMK_0DNsou`o@?V{A_1e+s%zE z@_Y2=s+Qlu9D>DY!p86kU-f}p{NEZhXJ;~TfB6DksnAa(Ao;~(2Fi%-^I*+QF@tbA z$AH>S#NQl*5w-oW-rh2|_7U^aG7jobn-fb|0Gc1HG9<)`y+3WU#dM5(VNo}3n>-u= z)0E?b>scP>mb`c2a*fm- zSl-4DZ`S0^*N2^7Rtd7@d_y39!8zX!n`=>D^SHS?13$iaM@*BMIh<}kaTjv^)dsRT z=gv%0*oj_Lh~#f<^KxrH;Jt&y%Euzi8vj93Kqr#Y2D~6#+_7=y8cf__$mq}JZPl6& z<|S@#XEQj3+eC^M%tHh zF-PK9WN`+z*?9;j4!)ZQ?2$qG*2{x;FUVx^Ymto$_J^?K|MG#^pwFHSf9x@?$ThKY zNERjsXalS6Nl%LS7ha&}7Awv>c*YNBJqT<_P^e`4F1T-{#;OZ#2VhI->MFddvKqV# z;ggk0=6yl41XN}8o!Ix1_BFn=>fp`IRA|NY6iD5-!LT!f12ME$frg27ZMVxVE-p)% zZZ8HnE;Em&FuM_{Z$m_dNTcyJi>Lz`K7arg$xnfNvbcSb_I9~1=?g)jD&KK(U$RT3 zNkJdrEn8dD%5NXT6~`4J`RVw>!Ue0VzdjVz}Y}JQ+|K3KB;vM5e^> z$6W*Ah$rBDkC9+N{E|+D;_s{j-Od8Qq{}3usQ`Q1YxQFdS|ARHE}a`7!V3y3a2bN$ z>mKVL{jgeK7l#pk#K}YZnzY%rPL|aQOUwGO3pP}EyxV@&`%=Lclk}0ACXf-s`z+md zarGs#Vpg^5A`e}(QfMe24=5#y6@BlH4xO$BwRT%W%^%2`I ztwm#O(*KJNvqS2O9f;a zfIC^{{_$Yh!&^_&hxcKu+3kYpFi!ZC(IIS|FRYfz>@Th^VnHrz{dj27Obp&aZRz2p z2BNQm6~eAI)1V5P!T=KXINGWI8wJX5D(^#S`iq!XOm!P+Y-|sQKBgUJtpX0@O!ZpZ zp&u-MD{RoXRIt}r#%=qm6U?o$(!8jc4*GZ>8L`-mq7C_lzjYY0?m^O5^OQ^~5?mGJxsF{$1h5BtWsX~^wj7Ai~Pa3M!AI^&}>SdUP_$+O#j7NM% zZPQqYvpEY8-o%D3#QCX|T8aC_$#98m^DR!>gM#dRS*dZ`aRDGksG+l)^fsFl9F_cw z!4=)wSXQVC8d?f$#l#4fi^l_HedTu4|;N zY}dFQbsHvy9lSj9d>y|n^lOc?=8Du`lB$yKu>en8^L4Xn4L{^(A3g3kN8++@g*fu} z+>M`aos8mMo#Z}Su~*pHixlsY%qR@N)QY9|u8s$`2vp2Qw>FMg#Ju6n) z)?S(A7385^J$-el;?iC@D$Mm(T8g#AJuPDcLSq;P%-3d{k-Hjgy*+$5k+>o`gs3c#KFs4>gDS*@pXc2 zvZEMb;pCpnqqg&j2%OWK{beC~XT^tO>~Nsm-(~gA96{nMWnP#TGdV&`OetH)taIy) zQJ1@rIpn17EG#J$`mkr@GoDBm&}QaV00UW-*@-Hmm8(Uc#x&; zbmSfHgBAT@C0D4JeJiiABtp-cQ`E-&+cX@Ndl@q-Ytwm!1oJlaRl0K@anXrunPZ!DAM z9IM+qI(*pITin#u@5NbeyjzNl-TBt*6anVOaT14!N}Yxt-ht_vS88fKK*0L!@w7XY zNLg?At22$~Q9e1zX6X<1T+>?nGc#J577Kz9JxK z({rXNt6AA5Arwu$nacDQGWPtAiLai^|sazn}_S=b$}=#3;icU_tFkb zd~q>ZO5}oTmsIOqF09l$S9t|Aka*;4hFk+o|H>iwJ|;kUu0oEP$NR&+4m@_q6A?HW z+Xm5fD`Sg{Cc$0#EUuZ8JLbdcc^3$;U*pVn1&S3w@aV)@5U8xo8I-&J)!SOlo6+O& z472Y2%OHUl8Xc=`_mGDg^r?+z@LNdcP2U~2rljp_eOFC&xJH_~s~n_!K+{h5NBGwp zE>{>=w#Y+Md&dLSis*f8G+)Qb^J`#iqa?vU(e+XNmI&HX9G%6^N0Ar z4sBftq^gvaGMr4QCSnnf%dS;7Z|8A>Olm?Gl@pj-4{NlL#hA%!_U}ZvTh`=#A5mkI zJu8X}DLimUwy(u2Z~A76Rx8Q&__XGCiREq2k$}A+GTaMTVaR2bF>_fJYv-un_g=); zlPIN)UPKiXAm?t3tV%}>M@28LTr`GXK`wy(zHZ*u>tZ--KNuhX%NMCa(j)f}r!jJ` zo46w%CFq&r7RI=2zKtt2ZaAHZIR1-P4`baB^5nf082@W1Yl!6v-q-w!_4}W~+Cf*9 zCZZsDXO|+8)4Y6#T)c`cD4(D}p9FL3n5HsrZ|`s)^scb!W-t6fnR3>E$@hNW$v5%j zYtz-O#Nf%OTT2w#P*dwcC&FQr;ME6zNv5iU8Pk)U;U)JQb-R#dGEUK9L0J8nQ)}2( zMKT0S*HK*s#qPr-Qr-k%M%#tG>A5;O$J;|ikj1EE zxAE6|xS~|BWl+ujDDoO-Y&AT08FavNJFJH#wiMcI+qR(aSz}BS)rtHT0AVD`u2Y^$ zIOg57wPv})2hk7O6>mAX_Cpc;vmP6(Y}PRzV!FarT&oNsx3hUEE-%Be{jTzkdPjKo z?d-Pi7;IHlCq|;>io9p4UZcMFbFqlHq+H4${38!J2ro*g>*-~pVL$p#!06#U;^_6hOw65TPTNNcp-lBOy` zQ+w>)zzz}7Bww?^Dav_?;9~Wuv`u?Ch;5mSu8D{t`Gfatzh*(WqXPsU$zRp>-KJ6?7e zZC)_$W%G5Ab^UiRjMbSAT385SArx1#snFq=ThU!y_=%=ZZU*VgZ(ZIwiiSQ2us&4L z#yKS3@qJxe;z1A5c2)IVga~#UzY`%xV&`ij^?M~RIW(5rN;TemlFDh|wugU?srRAo zBsF#ZUHT|=Cx@V-h{5B1YgJW#%i!wd^pc7u66m2tAKvcs`sOc{#0lFYExAbso9q1Z zoIG)IeyV8l#96&MdB3_Q`%EF1y(I%1YYdTx2CNa&L!I*rDstZ5-X8wtHc823%;e?Q za>EK^Q7^qzvj+hVBnIMCqD+DHug4^xt$tymAc==owv_A2-lyV4GDrMq1_?~h2ESv;CH~GA=#3~c~lb+G!#cyvS8f?;-_V$x$@N=mE%MTMSnp_;5 zLQb9%^V6j|OIx-3Sw3`G@P%+9DxKY_+1e?WFtKB*#9o5N=wA^}HKiv3lI2UICqQOv($H5$>-;Jt!yB0L7>y1t-P1*81_!soPT8ulBb}AB$F2X+=BY-%VVUSUF*s!;__1K(!)Kg7MMBz)lj7$6#f%idgJY% z28mhZn5)axk7^5|?fmNBU#l;OHWKBw*GPM=^Qx^chHxa8k9fDIkTO90T8R0GZ|}Yc z)f0&-R94BJF?D@l4hPQcICXFm9A9Z@@XNs*|B?lVFbfkSAIvhVCO540hzHo>QZL)1 zDVF5wO*UtiFl_8~PVUq#OJ0hjQCg3aVO=RtPDSdR%&z)YnjR)U6m8wG2~#{yoSjSp zbTbmC^gV(+biCx@|hBQCAPdArnw5yWu7%(K2%`r7US=Hp>^|M8j35Gz+GBODW z2=0<((`J!?D(YMPl@LiuNhW25czM}}_ht(53A`)r>yB+VYNr=?Nz2Kl4L0xCtLGA> zrA>L#nVC1})P9Tq2v4Pylyv?D#!092v-Wu}i}J%{Yw|Y{|6c;$4OZ=@t`QRn`3^p3 zvk&8qajxe38rR*J;riDbG6T`?D5Ic_e~E~ql|aMV8101t;tX3*Z8Fxc z*R1bFKM~#D<<7~4fIt^aYq#$L6PUJHF@MH9e;ykZ^eHh@CXz#I4R82gR~8ECEr z(ORUYr0l3>*2JQ_beh<8LBosfbOcx0G&}occ4cG5l|*&k#ivP0v%-_J>@h%*ws<@p zpq9qF>vaHrp67hD+AQy;*|9`&3#q==(r2@n_epKuOzJm{9_YDKbjHtZPb+(6Kh{kv#gExB_4^6tmhAH3zg$T?+r? zdZdK)KpfQS!e;7`#TD!y3VcSXND(nmY+#rk+dsj}Km(FY(5==S@bWEwfT$c#J^sad zs3HOg<5QDvpC4@z=#cv@==fEF$2=h-&?uG8Z*EUx`gbUQ{p5Nx@zz(B0xy4J_Rs#g zYBIoz@DqJ^nf+{~n}kuz75`~aZ4srb{XGeAwX0(n-9KJhfhCT+8mvKyx#H}?a@LfOwpoi6@>HDU^5QM^r{B2 zQy)>puk~sBe?8(l(v`fDb3AT92Klh8e|>SJaV10hzk%s4(WUl;EKE9Zj1R(IM@>hp z#8vD6IWa{J1EzwN;Vf}hW3y50zT(stHsc>6 zpRt28jsm?hO!;Of^kojXUD)C<$r%m$DuzrmuMw>_E(7o5E;q}T$7KS88+!2)$K_$U z*`j!1t`~T#ee{OT8GC3`F7Los;=Fz)PnYJ4gPl#Z&f8%#4#Hy#2b{eK1nOOW$QEVSa}+{!gF<@n|#KAK=UsGpF4`Sx;f zPe?V2L7KTWxor<-ZC?sT0QoIf-mG-s{GOa%6q!@w93yG{q)F#`SP6!GOeZhfb4{)L zFqZ#(y497%?)CjQqu%s|w4%@3Wn~k+@uap&!lk7)yPtk-{n}q_4zl;SeU{TQn2lTY ziT#bdwIc=!$v;~wer)@>`-0H&%+f@PS9eqYSJS~v>7Aq+hwH`Rcn5^s(OfYl8`p`E zY!@O*=!B~MyhYp)!{&rzWrMWvbL4;u@nxi#;r45jmDyQin3c|Us$;VAU^^}ypcAww zjrgSC!ffq>v*fo>e%QL71paAm7y}iNH%Qb6 zB+ckNG!IE@N!nT%RxDuEans}#T0pu&vfEOi?fRuYAso$<APoBSMiNx+IwX-isf!5idgcu7(Z1$~Yi4pZD=Vhr`X6AvX6>baswA>~(F8M5&WMVHchm z@XsyIssWZ@;^Aglo8_&<>-g{$$cI2!b+#-D9#x%=5ueaNr$!QV z-!mjHn?HD~x?EC~*}J5cJ@XgEA+(++m5ZP8ik424*2P^*I@8iMN z@T0?Y$zMT)nC(57`7%6=7rli@?+zZKVE2g-AyRh}!k=Tv!|?3t72m)Xr8U?>OWE!y z>~H<^Z+|Tix2%75MT?Hd-#QY$@V)yxqp8k`syh=K z@E1HtHVK~DHH+dTC=A7Jn);G-?L2Vns+g<0(h>9>VgH9ex6^bwlo!jz#kGKy zfEo6xx3KMLXkiS=i{>5P;Q8ehUEM{mnM;R9ox#nlcnO7&IGv0SzwzONDSBP{WxJusV~+R3`|FYK!H-Vtt3{jNLMltE+Rcxz zQ3Ea`>pPtM;Jg$GW1@Ulzts*ORrayngd_DEHo4t2U4`03k#oG&T`t`zaP~yBm;Ea> z5hBiWn;6H25>d&^ZGCUvfZ9Aun*VNz@ejewN?Oxfl)=7L8q3RS0q2H|>aH-^N5SAv znie-GO7Q(^&LIvGwKTuG*@gVkwNk-$#IE0FI4x#dRg2TQHqSoZ_x`4^Eax$unbXwI z&PXBFO|x+_Ng?=hCRFd7+>+|Z#J=e`>fv!Z(x#=J4JjCi@KBgEYEA8yt1*;sPRw@v zxEV1$?ev4+Q|D}{q7zu3EJ0o(7f1Um_hkF4Od--E6k3{9qI{tpoEGRe$Ehm|Hm-)K zpoaxG{4m5b2ga^#sQE(AOtwu@C{RttpC1ze*1V-7(hKUx!nO5gdCJ~9&>(k%UXiR zU!o2^t)A=;ixQT1%nKdP$=X!lzGmzxrB(iwt2-ZcB_WOLc`NYdO~?vKTb0mxk7=~V zazx13!NUZ%KE+X`CystoRVl~zCh${=oohpEx8-}o<1Pu8u~j$zj>7R214+qiFsw5C z%Ay%i`coI+E}I}gY*s4~v%)JO!!$G9r|Q$ow-i3y*OS3uYxX7hx$_V&h5U+u$%@5V zm40-H;ZFN4vFPAFOlo$rq%325(?3nLrRXvMy5m#QxOIw^8>uZRnV_ir5qo)tY``J+^c-gah;07_gQGmQLe zA@EgU(PiLSRcl${ZBV5#@}Oq!?M7wDAi@>+_nq^J5x;*%GUp=HT=P(7D#@@&c|+mf zVg0#fJ71~e^ri%UUdjf&y|FV(mfbe+5f{=EDuL-6|ED83zdOIH3TcJ;R`0e9H9Ru6 zJ{{wstO5@*G=O%1+ny`lmHf!VH&~ng^u6W0_3=+XCIhW7b-tm0x^6KJJi+^({_0d(M+s4E=XkX-Yk2Y_@Hed;(eq-ne)zw~ zuzD1G9s1EaJWM9d``HJ29^e0=|8z6@XT&g>*H3@tu6R0r6@dGhd|tCSjpvl9=g}zp z>WbRyPw7P!w4J7-*yg1_bkMhj4J+cpb-|%ijm^JVdx->9JF(o)}H%y zk>=ukz+DUJlWN3~>3Qlj9=kp>Ip`(2&b){Q0=p$%BdE=5Xr^Kh3-Di^N<9AxcXzp^ z_n$s|um<@#Fa7j~2y$GtChRJ-?riXVX?ZsGP6yo^)1>>LVxK!qv~U?brMc(=5r8FU}h~j_=D9{3rkf zvX;iqOxU-<;1^SnqtWu_#osDp32&bi?J&mG`_!xR82D68XXJ8nLA+Pm@=;=8^5@kp zme%`kIpvE4mc#Tti)GIOT=aJ_pWXz^U-Zqp?a3~WvyZ85pKlxIy#8~ZyW5~Yy&mJg z0B5>>CK;gah@&ab{~jOzM1&ShCY!6oKbsO9p|T&C0fAvSWM z72rkA@&k53;NtJ=@1LX_)dA)f#0mief#V5&yvQEYc5H=Zx-Uc;^;s_yua*L6uOl6ez`-la8 z>v=(OvbTf>h+f^jjTd8o#Qq*`)eK<^Bwh&<2Rh(>F4%og$&uhy<#my_#5^tmrry1Ww_<7ki$m<=lOQaEmUtLe@jIc z``sigo~KDM+sqnUJyS8<+jq>e@qi_<3{(yAPXh2nTelUSRfV|6+33$i%r(Bx&5VXu zzHT_kx~%1Un#~IO#Rb$!Hq)oeGtK)$98I$NkLLcb@>sOxge$0!jt-x!FrD`r>gp8s z?p*tv2#~`vT@+C6%IJ$=%lC~m*2TpQjS!ztr>x{p5+Eom+8sLl7EL4i(_Z)X&o)w| zdfw^7GZ6g9veY8*)!PESxT@a=Rs{MkwWYzhG{8?Kd5J4_=^<2)aEVgaPytBQRHI*BaQ<$fyvjohjbT&CV+8 z_py!qGs(Y6W!*1*+cnHTyFlttI`S0sow>fY0{J`K;=|qk%twtGFZUv$cI-oK#@aO_ zg%-cABEU`CtZpm)+VYtjdLZ{|ma0;CzHwa(#C;*h z;Nu3(Kc#rY?L2;bSj{(l7`!=p6m@ff&le9=`3cXg9zBNm842x{=lS>`Vf(&)$5sE} zwd!KOJm`<3oK`C+QrG_I1TD`9zk^~N>BjF&~R35;nEvFVH2rFfjXK8fahBdJ-G+;KhO zY`Ng6)85*WQ~SoNFk*lH7d2?5zTLd|X8iX#K&I_uaWg0}i6-oHOFfn{c26xfPe7!* zIKjP%jcoP@uVYMdr^RVq>T)zw6|6ydea(_qDad2{hcI7`%j(ee(q$ImV?;Fdb)ivO z<-S>XW>sJjx`OFjtJs5IzdYX~tcy9*?CfBW2No=HY`GXIu78K zEtkft-)_l0HZG*e-#JJ&@2$`^Dv4h8Q$s{g`wydq@`~sE?VeJAO72KHVaHRLBrPS zrSrkg$>%mFfw|#nJglnedp!C^n3{jg4$N3vZPE&CP57QJgq~_&DKUEKR6ygfP>{M4 zu9M@1EAkrX+}h_34`(tG|n0|((MD_LI-8Fh8xx`3yrSTYR4u2-X+T}(8|9>2r^-|S#aOs2K1 zHo*t#!zcH|UFZqXo(%2KnXL1^k5FZP9IVuR)Ofp88!jGaXD+qM^CSP7Os5_uUEKI+CI#QgqiHM1R{4$xDJUw*``H2wt{hN-noOV2O12nVFOj^P) zKLHO7MKyYSQfGda-t3dzG-0`ooNisQdOa|&NZ%SS6m#qf{VvY=pQ7`5K!}>@Ew_S- zZ*?gVDC31>9>{1CHybDW@ou-&3e>%s;DlRI@;fC3`Hi;$KUw3963eCMXLl(k2AJmsbVWGly|?PTC`7BMlRHrp{Pmd+%kwmP098UWm<|?;1XwI;++h zsF3>HyX>^o@8>G{Nxj7b{c$v5MHFj~so!lGvxrbCxOf42BV^Cd2_|?=w2r@9WfBp& zPxC8mUORW6Lx|eNr^Eb%P%J^9n&7Vwy;p$^wK|o=kUY8{;Tu_!mES4!ALo*(|Yq9@CNq?l=of2z!KXTJvJDf0_jaDxrh*ccQeB5lkHLw`jKFeqy< z78i3z_Ysn4j{L|IM|j(9jH^_VSZ840v4T-0&6nA`lS0oN6R-MZ4mVOpVRET5Vnu+A zBhe^KjeY`;d0(rfcy|O5$2C3TS0RqLEK_VP9`p3*-H7>Ht<#voQ;kiFt=wUEeuV(z z0uIV~VWuvVd!!hSYdx{hNrjQ_bskz;qq>p1E#6!uA05KrYo}z@(GMW8+1QU-(n2C! zpCz|~JC0FI9U1c>latN)=pb93o^_2CjAVTOF9H>B3NES;@NzKSXeL+YS7S9OUUk>Qrm^a6F`7*?J!1lXyv9O7ciywA#h`lS zq}UJqHPhkYc>Jmg){Vn@S;SxY-+#JJoi3jaX`VHhl#_kSeh-`_*qKsP)M(Z7fq*~I zLVMa4}~!IFSAI9jW|!g^?5;WDeVR70(b>1Q=2*0`|1j5Lj(T^Wb*2*}mP zU;49p<$i1~Ww?yWk|AD>ygPcX0zF=R%(iwcItePW0VIwVP4XfHr<;%@Ij!h5!Jxa|++pt$ zsku3Pjfw%;ne3$L9cR8*d+(CojSQ-5x`x_ktmx2Fj?z=1RP-5gZE77RRt|HEky5Ed ze5*+p4m5$aun8sar4I9v>%`#8C8setw)W4$KCtF(`{vD8fD2@NrSX`Tat3l#Ip9IM zxBtPZ?xTK^oh?}Q{v4y#$z$Bijh?XNV2L~B(JoX&4NYwBaDo8ojk7*2UiW%z+A}de z(uv)vxK;8p520X2Ke87@kr>%Z%ez!d_EvRP8KYx!!E)ubcg%z*|Hw8laaEd-`GQK!bQTxSeyf=SV;vlo zcKEf?C<=M0RhiFUxOFh45P9i7qe$?cx@VpL@iiBN`sJ{rf-JZFh&|Y-Ow(E5?-w*N zxwi$Catf2e;v@DiyA=6d&h4zy{Tb4!mBet-La=Sq9Y@7F!#=-zy32MsK^XU z1+2L@oS6gx{rRHxzJG3VSlOIR8?4QjDZZJzprAjyWDkEOuG-MhNA0X1`4yO@7pQ9| zQ;N-c6ZX7L1G`hs!qmYc*|dT4G-B3iAR|I;Rap(&pg!tpa7iCy&?${p?;CZG{WBTL z@}G8*v~`;sTN(>CBH5luvBYg@=FbiIGCze`ut1*qF2r(7{@k8)EFy**PJcHq1nY1p z;i&nVbKAhXocaz6{cei8{}SHL`f+y~6H0mF1df=Kx7N#77p2_=OzkI%TV8W?9f&F7 z1WwabY0A9?O5wN^FmeeBe`!Q!*0)W!8T>R4FivTAX^nK(a}uB|qy$(HYEi4wDyQF? z{+hApU3(hbNz?JQBo!sM!gEyaqzaI%m>kKA=8$3H+pV1A>%e7JvKNV!r4m~J&KGAQ z_n1~i>81y5XL%R6*H_VYB<>wQLYX|fm)Y}`&vU9H=86ov7T+Q$s}L;-cYpQ_B9E-& zifgGVFq%#a47@41PfRP?LY?-N!ijVEH6mH-X)_|O;c!Ni!o6OYjUrilKcyB=Dxy7k zB|h1JWBsy(68on=PFf%JbBQ_IZu?|cL2nTRw1$ciT0PbgdnM7`PV>n&gC3La{luD- z)G_gtR@;t4nIr*&s_OY+`D6F;yWx~lwdY0q$)9SpSF@BwgTHGYIN;f0CeA-60|B{J zIxU;9j?ov+&T6h)8<<8PoX$2I7R@N`EpJqh^xZs;TEd~4d2*>ohYpwR_lKpV4|SrZ z@;fFYF%-9i0b-IwcP_1;t}T^v23oR~$7f#$QlJ4YS0l~EHWCeWw<(c@l*Yf_anCD_ zFn!}>R8$puRT*fYmzhsW&0uLOlHFl@!vHkkKu*}^0Bmq96`NMnH5GjJFi;@+du~Fn zb>gu=<>UUA@{{e;QoHOlCS28VQwBe$6TKdQ&l-+ZSO1HR5QF4%N^AHkOz|8+T!sc%C%dg|Qo z%*xv#boDVTx61o?7rJ%%kQ~#7+UfzXE69;Q6`n0YQe>JyCV-cTo!@*)U&RUSq?dNWmLTEnDq> zMr-VD(Cp)V&u;^OCLZo*l(amwQ6xCqzO8v{J-+I_eN>*O7=QFKWi_HRy9TD>R_0AY|NUk4F0(Vs3v_NK91I|J)Sxm)%K}^ z$7>x)BsMopnkKd$4gc)+oxJsIwI}}(?*GEM1hj!-pj;-~;{T>${1VLiE+fUTeFCd`F7XK5)+0Fn?P zNkRW&+_GF;Z&9DAJmx8%Q6K3rDK9@~csCcdFmt!~Y+)EY)g{2ilcOsx>#Uj2*8F`s zlvL8kQ6`@&*_mex+DbhpKvrTMa3JNxl0#l!$dbGj?YTAISoK0B@7Xcxo5E(_pZTe+ z)l7z(6OH=vW3T_uq{%LCX-(7Jvj%k% zj(Ai#kspTOl=M_~MSzdwCQsuM{{`ZmKb+*ZAVpt*#7Z#9SV|CL+ImR#WLHY;Sg>-r zEnlr3!gmDYtqYhE8fA3q!aa7Keg|xMPU-tK+Qn=3ogH+03%Vn;3tZL;PR;5Xs{gv9 ze%h!^xSr=hUWw<_A}lNTQ`jAD>A#Bf8Ib$s%hi~p@#Z%QSBjtgTr=i3^#Q4t@lUBW zVbkT;eaV;|=ZO1S1WsnBMX|6qcbE?Q(xwf~zAO6ubphM6-~tpVsmMz#t~?gPV|z(B|!MoF!V(p^kts?bsu9DAAS-DBO~QUPOTW0q6~~yHu`2Jx_@{&q{Uw^?)`pFP z0@qVA;{AyZ9is`eV)rpVJQgfzh4M>eWF?V=vkOs&>#a>C%-a?!eeAE%CXzv$UgY4F zGM_YHonM?Xcp0jyT04barJ9kE;L9d%?0(=#OY2M-u21FTR3#CdUy59ZHz3cRO_-5H z@}nLfKUiQ*gSLPdv(v8677I~DTq`Ug(P*YdD`);3x$Z@3BBV^)#zSL8C!}`}xeDoT z2C}a18!7WmJ<=H)g4VzxT8YWIPodu!Qe(CV)!qXpG7hhb^wLp4U+@>bj8XaOaqU!* zj}->|&XV}0Z7g39{l~H}y3-Id(!_5%bg@BdP4BqUtsCcPdMDFd_G*VKtcZ>JAFM$1 zmnM9+QD33hs>;K?M*R_QO7s{VyUl*?vX`$^vf!k34#;Tl0;#q5IPBRk%oWKP8}~vr z-PsAa157uKSAdR366iJ%g9wmqxEN-TEeqSHZ3JW^6v`vYp|svvf*%9)wA%#&1mx1oH4HgKkSR(o^UGlknb=pXp%HT3#*2qo;_s3;d4{Jv5_Tp$- zn`c9w&E=|Do-VDla>5I{!^lY0xgW!cRHm^RW6J@HOsjnaFkd5*eP7YLg+IthWTM2W zM)G^#iQuLgOgUF1B{u~wKBHu3r*Wawyp`lafGEg+*l6uUi)i<)9^o?m;D&yKb7S3{jY``c5D-ZCJ;9Qm*3vr6*jlKY2C34b z@nWV#KtpH{6OM^N+~boGd;4f3+%PkylhwY!UkMeXF6AY$0;e7cbB!b|kvQQ``%zBW zW7r(Uy>jQbX+N)UO#d*dXyztJ^fSni$!FwXv+RD!9^h!)tB?;@$pWCgal}iC#Y-S| zL?LkUmOSrdfaKlJ6I#-b|mbPMI5} zKu)~_7!foFWUZJy)Y#+dQnh-V?L=Z!Fmh$A&~i(ACyH!Ry7=9>(f!cO}R%Gr~EG(;{4IzsK-wZ%ZL<^H!O=P;;WGpy`etc-l|8 zm}hNgNlntxH$+phuuP_NgPya;UA`%x%J6EcYY|?>h3I!G^e73tq`sU_&PA#EpX*=c z&;O@iP?`J}VwL<~Q1!nIuKy_?R8&Ap|I_Dx7emdS&h!6MaR2XOJsMB&pC2@lq3^Ec zBo?^(7?-{5dZY0;d$0UHqK|mBZ>^*}P*W4f{hcj%2PT-YzBrAb7$N5|R}vrH`{h8; zl8#%%EM>ct;!BQ`c56M-z{*KtfsgNHBw3%wYr|uB6OA`nMd_)B5n^y|p3ASA{_!Vp zYmMUu$0-7G<}0J%n^4C9MJi0un=)g94Ju5YiwpbjT1=5>hH4DKJBb(hVaZozg>h z3hEF;he&@nKF{-A-#OR$&h`HB@*m9H+_Cq)_uA{X*4o5NCPk-(qJv*iogITYiNI#p zXjIseDb9XV6$>AL?ad$_DkX zXDzWPLPoP*IE3T~qGl&3wGZ*?MYF}f<|X2^HS2j)Yr8ZT^gBBZ+c(Dz0}h^>{W15X zLxst#H!05XY0$=)6nBwUuwmflk_acH&g}nv-$`{K{rZ-(d!2DFe!KcH ztTx%Q#W5Hrpi3&gZ32o;?Dy5U)@smWNsBY#9kb znJ|e22F9PIYI?gOZGXWXw@QwgKhrr5kQYz<-ShrlJ^jj7}!T)gc)qRCq zDpwzTwtL$+Ge2td)`j;cp!HK}|0GAoa@Em?mj$*Qyzfj+%q~pex3CjY+#F&Acz1h) zhUgtLkPgI@GC2s8JrpViQsoRyq^VQHUF!qGYHfZ+j-*ht3k zG=nwtvq8_yVlixAAQ|^2_UG71B!%J)kVOaW(m8H;D82_MlDt(P_!CO`g{$w8^|Ki# zKKYE41%9z{eohWfD^Ruu#|;q}g(7$Mbx8L1;aMXcqRLxjnkD;vZEY39zAa>+qT4~d zs@Bsklu8FC;m8_tj6|!IZ#3vN($sa=_y;Q`WLW5|#u8US+|BVh@X3f-d$Q3eh8`F> zZ|D$*b*B~=52BS8*xs<&b9>?@vtn5=FeDn^UYxdCID@ZeKXnbzXGo^Omp zVvK8DH^0Xk62DLVWsl9Y*%3@JsOy#(zkRC=FBLn;5L$dN(4(zH!kJA~r^^&ikAHa2 zR=GEA+I;{wwwndmbRykWtD6WxH4;Qc%wO$8P&UND#R0W<9TX1e7?s;xu!N($>(1nqh*GUo5O%%%PPTwYAW5U55M%d}Jr;$2G zx)d6v${UIaO%wG)zDdIqAz2Ded(>!BIGqwi@L*J{MG8%l%8Fl9(}st-Uj=1j6zvJ4 z;2=?SjvsfLagTUhlzJ_=RLjU7DP!|Yng5I4)SKv?zDVuV#_@EJ^)oG@I#P%PcjhZH z+YbHx)h1&cdkqDl==`CLdoVQY@Fvd z2M(fq7Vx37xfB6L+}U8q@jE(d`_;Tjs)p#?n6GDOT>A+5{aAEzCX-O|laDzAicG|q z@TmMA=~My=MMdT8ot6~pHlxMTg!6kPq>) z0gELt9Nu)ugFSMy{lq+mg=<+{+?li@WQuALR8NQ^H2NLFsvz(iw9P?7A|V$1lMR!7 zzw@bI3ZyECcYg_0p91#G9PgYXW|E>g$g_w&I_QMHxb)ue-!mz2u|ZC*qiQ;Q$(k z6iqCJOd!6&Q7OU+9`Bb>#pzb{;?Cyooa0E5({6eLg%Db7aj++s4QuSuxi;^WB--s+Q-$!~ZQ(_M?_ph(Q9v)V?~-lVo~!n1M`)lD3nGHtvR zuly8lUQ|251^dM*Phr)%6bt?pMi>d{)YI=5g>t=$m8FFBTkLBE9TU3p0rImb;+^8u zSh<{hymZfSJz{PTM%46*DJ$c%@DuCw1UGJSyYoic>K4r(W8wSJ8;q0m*Qb3d83fWs~*>v-X| z)3v*Bp-~{VVV0aVsIEq)1^Jf%?S0c-OXIQ!ZHz1#J$AJFo0yPBG=ny0$Bdp??jl#|<$;HVTrZT5}IU_x4Y>9OBbAkh~o;8sJ751-y=0prH7hd6UlO zzx7zWHj9sylIIg~KMY~-97qXfqvLjKr&VPo>ihStT-b8a0_$l>MxyYrF(&#pqtWk` zN!O))?(mlNYkc(Ix`tW`(9Fvokw-uQCc9c$}x#*@h-4~(k(v*7^cHRzhnK8Rq z4qjp|Rz&E`pp|7*bf{f~*-9u82H=YiV_qV7|yn8u()H>)j|NPt`sRlm$VAg!$BG|9Y z=nJL^P(|t|*7;J#fTpT}Y_gu$(T*e(htYu-pK1br1jx`&RiE=jC|oRNdP*OF=@y_$ zOW2yEX^&0dzKtj8fVTcz(~z$6gXW+$;$pvRo=4(0DZzjS-p-c|QMj-pu8HvyD@Hq#uiYf9SCJFBqwsb;QjYc$ZG7O&}9ZsK}TuPAnm6o5t^^&dmP)ueq>i>pyTmLSC1@GZ*yCmN7UvCJpi)US$pP zzxK-(z0tYxbk*jUM~jr_zo!!zM%s#0x)cs(XBEz5CQYKYzyWKMLhNjo(*eAGKuS>8 z*5dKBLhVDj^UTGUwMRqUgj=R|2|G?s7I)5&uFVpT$H_8gem{3s+k}qxmWG?pTFBAt z4Z@Dcj%DvABrc;OzK#JtaYd%abNM-DE>3!QAe?`Il&jy1&W3QvnB%GmC!4{Fh ze-1Nhco^scIREn>)+BI$k`-Sg-M;U%T)4{v1y49Cze3IaW1ReWj%U z#PHHGh0L!&9HEaDntmNggA%VxcIDm#HMsb_5U;k^T&jR3fO_AWw9~@>dJAz|2%5Ja z*xgXH&vNu|cbPr;*v`WPDlXZfAPXy-)@`_)k_-Y~yLV(7Mtvo)BEEotSEC^Pq%Q+e zIpPL@u%c|w$NU>px*{U-e!fmFEAL0z z0VYluPw`;|+)ftP0&3G*(aQU76yrHf(ioHEy#aJ=Gigcxz)@{ZVL4iv=e{%clj6Gc zpp=w1X-r7G4<8#}CT;&nU1LS6{bFUVw=`Zm&^YUE`9VIbWfGy!fwY*qAt+& z7c5ZGC#I31iTXEfxTdO*>PKv>*UA-9pyHpiMQRiW(K#z64!_o;9}>RPej29{D1|Kj zN*mr~k9^&MbN!fwcJztk5r3cDt9H>@3HnS~T8hC=P`+S^peMr%ma-#llX@U2a(DM> z+hc4I2gq&ez)tqbw`y&4C&`;Ds;pI+%a?X5=ZjScQ`2>MIcY~Q z_W2CZOkPfWXt_D#Nd~!-j$j%2F{X^@t^}E!ka8<{Ptzx>B6SnmrKvpjFTCEfH#6JU zhPGT!3S!;2D|U-{zrHDvUPkhf0;998n|SfBbV)fm^AN*`&Nn5VZhBM`@BIkEZHrx= z(tfMcTeuLl1kH+HXO$PmQQT}(Zr*-jccW#T`3*%z%2U&2X*qE~V4;s%qfJhV0GdWN(Y31l_irIE4k!H6~-CjD)OzI=fJf30i|mTcoXxC$0mnZd^a({W(zNhITe# z>-TCYry1;d!dmKMLkts3YQ?h@Px`6K>Y;nq_F4OoT-=(`>gu`r{flj*iYhFk_iXH& z=b8`;W78(yqCw;Qml+9pRzp+FquWup@Sx24$69H^gA@gfE_@4qPX5ldT`N`Wvho#h z_?n5B*|(}@54RsD&N*c)Y>mEF&&3du;*vSxuWt151pz%sEx1udnL*MTa6(kfSJYa+ zaQfAs;=`xGTB*r(8WUZBSLfrrG#va0G^tCsz0F($V+6ml`DweA__4Fev%44{+E+ph zFn8-ov1@0Q1SD&X=rWPe!(xpdLM#0E8+M#U|x>o2kOap=}L|RO% zo;&n+kwOFK`6_8Jw&s1)QL}u`Iw3gcX=Bw#=feqvLovreCb4;aj)&A>32<_S-?iq6 z^tCEH7y=bowd>spkEPG{s3%r#k`2{uGP3f>mm|Dxvt@;RzLu9eng+>@FWm5hlK!YX zPJq5{tGqIH2MSd?@hA!TfCxBiZnQehrFmbQe1kK`WDWr&id1IdDFO~VKr;P%x+p>g zq^NeAbT?`ebejWzOr2Pj*s>(kNU)z^Br{i`oWSzp5RKvB5>v&)Rh4^ut|J#mg9yr! z=I0!(Pc-2%eI5*NT&%fCd71V7`|wi;NC!b(PGR8^i~jJ4SW}glGY4I2-tfek(S31v zxIrpbR;Nckk1J(8yXv(X2)^HccD+sGqJj8*hSWZo)LLjTAyf65xNTVfaPoX()IoK; z;q8c+@rdKS2_p(sqPPmEJ#i+uc+c6z#UlDfRj$KkowLmvc3VaSaqkB%nxq?CI zzZGi_S6@(iFV(AiYJZ&eyjuiTc%aeE;^Bj`32x<&<53uW_r!%e+s3{Vv&Ne&f1Hiz z?+x`ARn&ipNoVtRL9>0&Q-Otd!uBb0KHCk-;HX)=S~Sr8W>QUyowBz6*8e$H2cn8C zE>t5|${i8ee4IaTWMKj8XX{ah>xkVV0tS{^Q}H1iQ91auOHI-`lq0cU9NV-?Upju=VhM{>*C*!y7#qg*zn2^*U8}9{TKo zZCELDT>167SYl8cCVp26gg~`KYTTdV_znt1^M0pB>sj|}u4ascI&_()rLYoykRhds zUdvT-Q&W3pgspKbPBbSU$_850^ZY8a=yTzGqf>RT=BBM#va(6K2}luz)iU>onGmH)XZfko zh+2U>ye*%3(F7qJbZke)Ue9uVf8tn+*-?Zm5?Og^K;UK5hF->sb`8akd{zUGyaT)L z+}&siY#y!kMa~;=dep<-0LUn~ zUfnr<-l>wZZE4&C3G*hdS4YW&$sN0Ey&H0J*sl#X;5I*fz9w*#>1`boxT5_m;nhH8 zGz_JcIm8N?1Wp4#x%$`q2eOUhqJBkEatO3Qf8%KA{HN)S(TG55q^xQArXcJam*Y-P zGbKCrd0GAapU%I3@1yX97zAE~M8zDkU-bHslr^e2f1D10OnT-?_@CA83}-AeZy8(6 z1`lWt{%YRXbDd;i1D}W?@gR(F=qv4u^Yxm55CHCbtgWtD(C1)Z@WP%qFDRF=Z~(Azg`DAYyaVw1A0b~_8e z_giBNO|Ei}-Nun&=qxQk#C(p_9HN~xc#gIX=50@rIrRAlv9u?5)!u{yPwgB(&?{eh&da`CAL|uP0yn-;b-1BB`F&dp;Q< zqLEvli^J|Tyc?Qez9-pu2i!tVa4yNhQmR-3svx4#ho29 z4ZHBW@SXOuTunCr{yf_!@4;Wr_T?=(;%PI382d7i)b6yWsUJJ#k>?qO}050J0 za(*99^8IZEZBK~Eq^8kP!%@PelGZKO>(`?S<<8EE`GA9@(&-MpUOn|A_3fmDeRpk^ z70e-Zo(hu7m6F5=AxhOCLlf)|<%!(SdA8nNNC;7^dN0&EqGPuJ!^wYu8~c7U)u(9f z-rfpoJt&b1x4`n*W)r}RXAfC2V#;++amgY1@*LC#v$?K<3E$P6Z4?9B9$>tZS%b7Yzl6xZ&V}SEl>o{M1OMV6i>6-R_QWKeEh; zswmg)-=oZ=XTlzRdAsN0*n!EVxKvXkVj2|nOo7G*B{Fepmc$CRx>INZbhB5FY@%W( zetxI=$^AhSg;RTsL#j_wT!i84Wa$q*hbS7b1kv%R%&lNBBTZfS0|+@aKT#|$f=ao~ z-?NG#RR$SAPgO^aY}}b{iToN54d%{{TTiO;R+g2QllA$aE+CN&?Dh#sz-?1y)ERxS zw-GDNI~5wGZU?j(jSi|{_!HA}rB#H6Y8D=qh$RJ~W<*>$E>V)xK6~ZZlmXUG+@28^ z^8g`j4T%6l?=y6#3F`8oAKPMVGoZIcC=4g|#tJlvcoUp+wc@627m9fw3Jk6{s4)_8 z(oW|MST_|c!3bL4#7`S_LWv(JYe}k2+Gdhwr%4}>?PVN6Q`0t_-3u#1s92?Mjtd(J zio~TzpCG%ZK-oZ@8#fjg0=W?cOSdHF730jgKICbct^7HOxIj*As}k&&_c2b~G|x8D z_Pan`Uzf;{h(P^5Z4dn7;_?Cpsw?6Umbj(}{}Q#D_UVPQhd(H2i&v{ZN=8jWS>+vG zIm59PEhk9a+tS}_XJ$Q_G_n>B!BgT@EA#c@h;m= z+NCG9Unja(iEn=ddAL5hDNE2|*1#?PQfXVf#e^=dx+a9rd@Ow6GSu+_9x+(+zIqv||= zbHLH-u1kk+DwH^Gi7t^b8AEdqJ2xH}ai_et=6*UIzS>QEbsa<4^+@AX3n4>xW|;yh ze`SvwL6{xJ;Z$oMdu|>5kODHCtL33dQT0H&4{OjTf2fD#Emu9%KxJXKY9?LJK{72Q zVT8&nISP$4l-~5fdS)h|zD!nJZsTsz8_lq&RTj`V7qUhJ?)&KzPa2)^$6H-FmKkTd zR3N)Lv}#A#{4Fa{&;}RQ(;!P&f|?bpO&(#5n&8kp?8U_H-tmZ#Vv+p{Out!l_$t%6 ztKGt&m^T7&ywjSq2_^kZb=QJS>4W~3cWi2o)pyz0DiCyD$!O!I_07OIzb|i#0&SNS zC)YC1yl+Y0O7N^D3Hjs?_xPQ^B|xXR=Da;PKk=lgU}wE<$(9}Gf%U5DL}EO>F^;O= zF5<qED#99d21@R4OV<>jnB+Yun=YenCoc{o$*5*^CgpvUzV{Do24 zWVmkcoui^yCL42J@8pBWp8}#*6Bt_|0DhIguebscMom&89%H?;a~%1m-466Yp54G* zFOPou^>KW+B0>3P1{*$li>6La+E*thK!oV$?wTck__S?syk|yqO`X1Zz{=I8u{8ItqPxzA_=?i^}n8GHVNE*>;WN#Du2iDZ6F zuOjJnBn)sx$$tZO8IktrHq^Jd{jp*f>L8i_lnd_*9YlG6MGDJ_dWJ2YN=spS8__jZ za1R?>!29({gP`<+D_T?^g}Ks-z_fXLDl%oQd;To$hWhcxi#|(nI_CBwbmE2QSeT?8 zoO1{YFoKa}tSGJYwNE{U6};lYcA8+)!J;A7x^@(%=At=DM5*R@aW`3M&|hhs(m}1l z*AZ;@*Rrl7H(bAYGojDN#q>O;nbB|eITCnlWvDaRyx!|Q$|6RZc7A$Yz-he1mqZK_ ztM7|M6W4b=sTQW0*)D8=xwt8SfR(0PrSfM~F&`V7aNZ4YPPXPGhV$yBHyLNYc)K;z zDRQK9%X;Qo^}{98g}-LL#=m)Sc*p-5FaCEO*pAvsedG=HTo82eEYMCC|3f!aOjz{! zd^pxjZkI2pD#wvfnb2k0zi(e9ld#-sJ|^J&6!csDEURKj6Y1i+JM|V+eO$vz!CE@4 zKMMas*h0?i`r`O^--LV7wBw|C{m~CI5Vmh3lSRtjxfG#?T&y^cv89wH{Wh@aeX-tB z1{!lJVq#(TuRQK4Niv3?1|BKQowvm?v<=@2I?Tap$7JBU&7S}lbL@~+@3y~=))rSV z)PG#v7IVIk;J0`f=Iw0Ss0WFO=sKd@IFfFdEUqVLS$jRoqoRfTczB@+b{Y&NbSNv_ zlphP|((^w1J*wa}#mZ3cr+p-UJ{)+QFHOIGr;OJS?y!-VM67?a03V9YW`E94TUb=+ zck0Ve!WW(!4oW;xQ^`~D)YN7qzH;#Nt7TmSXz!JA;1<4>fg0?w$d~6QWuyE0U_b1H zai-t76o34hknO1R?t_LQQ%NZq;twCopV_&0&zuWf2$WGaHPyQuO)Bhp4nUJb3Gc%x1nxt{naZ%oTmv3n+EeuD?@Djgf8>$Shz~Y?9-;* z-#gD83m*;M78kP2U#cE!q(JCdtB~77PgFAFIr*hXaodx#n|zN;X=qag3I z%>(y7Mk-ulGSB)l$6Si$70MS233V3+B+7hQ7sekJHDB&)vYU&q6a^^(b-`N^D+h9isd+97?)x;qmWB$H$}(OY27tG}uNtS? z98F1dfrvP>6DRO^bEt5GjumllTJgir`+rX8@0VuUG@(%w@q6BvN84NMQ<*gz7i;_q z>E{DZ`riwAIXlP$J=;@Xivn4PFW08jYs@`QB`!CROw{7HV_AStUVbYJJS{8v#zK|I_5ft(n=cm3}>% zXsu25slcYMG| zbvu7(*JkPc!XyJ;qzY&XY0Qb1ywU?#-v{2*>+;==FrM_Fh~+2z+lc*dON@UdIR2>; z_C3AQQ(KbYEB!4+d3dM(%F#J)y8wg_{a=9#P%JRj(u5`)=NG;)Py3^0@emw1U)Z_| zWg0(blK!*4_$oaq6tQhz0=T6Zt;hdJ-aX=aw=(pH^}&o}CK(UCEAoCDn=bkm9u*8d zurpn&yBNNx;&RMe$>o9ZOeB|@TeORqPn-K=h4kr4NmSY<+Gt#Rp1yE$?wJX$2>yHI zvjEG0Wo$;BKP^3}hrMGG28ETj_0$5Q-)nSAP$i0aYRv~YFVYv>Zf^+vis)3*mnk#^ z6_FUEr^zV5f6rGYiCr`IBD)8 z;@09+Wk1r8DFRb~J3w=^VRx`fpLNEUhab8wyL)R5>sWi1l?!SY;$!Q zO`(;_v__Y9fi_P7x8|rA=={^UgBZ?ZH13Y1tmrTk4ksrtBjm#Jblr-Fv-d_<4m4GA z^?uyijRdReIlaq}KZ$U?XirLa=W2?7g-3Y#?QP&={l{Lu%N}!)d4#R@-ZNszUO4~( z6exck!tR8B0w7cosR1b`gf?qV<1w1P_ANJz$9)B#zxC|l%X*hdvCXSto?tYrRAjMt zws*Prb?WOEH%k!$LU%G#k-U5KOe2zV&+Gb)#c9}jWK5HN)lI!73wEJc^~o+8;bio< z#7Iq+NBiqxTE{n&9W)hL1)N|O-7bBGQhg<2#f2pcxpFUSy`{p0TRa8~WoACa&>y_g zUYIGK%fkdbE4+z=Qjw*pHLH4;dCyYvQa+=@=*!=oKl*?43@5C=c%)P+WE{wu?lEl& zAp*x0CXj+^=1uh#l%+sg z?aJLfd@p~v3~in|daG%JjEQDJX`QdL5Hpzv*Ppg+8rgZ zs~$dQ!~`=ck4M=N3lq{Dw6i5()hOhMkJy_*rqd`~yzr%Ogg4ah_D9rwpIAG^aYzH(iO zG3w8VDw-B2`nJ+p993RD-24Z6MblzPPV)A9#p!D7Hh_ZLPMArZ9gGX{eAI{^biig* zR;m^4aCb@!Y02ml@rn+guCe$&$+rMk-%P$OgYwLVgM=NEsodFTuT!M0^{K?N?sEiO zXkh75OQ%u|bbWt=qK6Rh#Q{)q zW_hu4j|Q`roS6~bpPLz_8`+?>T@T3be8he?Zf)B%ZqL`gTmfTCYh$&%*f-?CzG|%I z;9p=nuX(oDNN9d9KX$6XR8{+4k~^T+_i;h0Pe#db&R=FB z>S3Sn|J&U9zY$}9dENfu?Em@jKTm1uCRep?z=UM^r_f!;cx6obSFaHDFfh&e)%}Ze zr~41XCg3@p-f6A}82q~a`h)2|ClmCYW?jdYlokHX&CzSB@-m>zw2M{?6Ewj@*YJ`8 zqALpsf~Z2MuS7a^*>@}JKG{@H70rV+=kw_xk-g#TTe&x|ADXD^jQh2!JXY=&xw31R z(*-5I+B~#ZV00=QoELLMajjWT@MAnE6$AKM1m^pOYaT`jmJIfd)%bi&Y#eA%P`@Vo zX*)H*EId)&Gnm&~Fv~c%N#Hrs$ExY}k})Um5kdcL{+mBB3XQp6Ww$d#ehMxn8e^I& zS{fVrTt4Ii3{}s^Q}XzgPh@^ZVYM0rco!Sw5Yu!!`}?-Zhr9fT0s@WB_YcLcI{~+9 zKEf9M$81%y5)d$sNm(y-u_Mb3B#HX}B|ge`DNLhDfY=?4%r?QZ_jhvV-l)}bIsBK% zNB;bcrUyTc@3dzCs<+lNSAy)stWvFw8B>G#IB_}M@l6riw;3wTh2EP+GlD00tx*zH zV9lNZJ-wW09;vB}U%9!ZU(ftg-cHuQN$2-|kt=#8Dcmvxg8t4zxU;zP9+y{S0rC1G z$NmdJdFWARv_Nz%Pt;o$iQGA#P#31t_swY8WBT$Y=HfiC%o=8}E-Kc1jkjh)wC87{ zyS)^UHJ3pU(yE`ewa|a=8`Yn3bm*DlhnVomo#RS(ckOtc^wdk}=N(;kn<*f3dHAu^ zqJbU2yjBzqm_sMyh2`*X6fv`H5?`D3o%Nm+Fo-}maRdgWH1O541Q_eCzDKzNsl({1 z)O1zT&s(J~FMzCi!kK=gM#$TuY(F+<#nY`Dxhzn@BBI_&Scbo&ll|8Eql~8vFHbR) z_{^tcFM)_Whx(x!UyWLRj-S3p{LF=@(s(bigYnenJVzH9>@_DWvshu_`<+>_6nFlW z4mBWV@I4UjSZkhTPu^X;c7NOlh=+_;_YRRYrk+Ch$!o=+f#}Xx1xD^tr{VyvtZ~K2 zX?U6zyzZ^Lt~(pGFPV22o#O(usz$B9GX`U33xk0LQCoI?UN%ddTv;Iu^(Sz4d;c0W0S+pu&Xl4}$?aA+-1J z&A_a+DC=jj&nFVrMl{K&9&gZ-6co-2jWA0OPY>;h*#xwWPM^A+Yksm&6L= z$-FgtTE!ier?_QI`Q~R=jCtXIPG2<1P@p8ghUb$Pj_S`-U#NkT09{SsI@wbL{NmK2 zg|kLW;M#9_7Fay5xhMGZ>H(=~)Xs_T|1?H#{aTorSwJ-f?i=VCPkv!&2GR!krGOAo z?y>Rd=NEJacc!N94Qc{c#xL_T(&lL7#|z+b17w7NvGT7W`D0&DC)HJW?thmb{^c_LpBX*=8F2rqi3}%wyJQD(jZVdh U=2q7M`|pAtJ=A(o3b6?JKdl3{e*gdg literal 151250 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 Date: Mon, 19 May 2014 22:25:49 -0600 Subject: [PATCH 13/36] update readme --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 34922a0..601337d 100644 --- a/README.md +++ b/README.md @@ -20,12 +20,14 @@ I also wanted an excuse to play with the [D3](http://d3js.org) (Data-Driven Docu * Lower mini-chart is interactive pan-and-zoom of the upper chart * Hover over the gray circles to get the exact timestamp and temperature -![nestgraph screenshot](https://github.com/chriseng/nestgraph/raw/master/nestgraph-screenshot.png) +![nestgraph screenshot](https://github.com/mycon/nestgraph/raw/master/nestgraph-screenshot.png) ## Dependencies * LAMP stack * Unofficial [nest-api](https://github.com/gboudreau/nest-api) library by Guillaume Boudreau +* Yahoo Weather API (https://github.com/phront/Yahoo-Weather-API-PHP-class.git yahoo-api-master) +* D3 Js Library (https://www.d3js.org) ## Getting Started @@ -54,6 +56,8 @@ Grab a copy of the yahoo weather api. git clone https://github.com/phront/Yahoo-Weather-API-PHP-class.git yahoo-api-master ``` +Grab a copy of d3js from http://d3js.org/ + Open ```inc/config.php``` in a text editor and update the ```nest_user``` and ```nest_pass``` variables with your username and password for nest.com. Update the ```local_tz``` variable to reflect your time zone. Run the test script to make sure that the API is able to pull your thermostat data correctly from nest.com. From 9e897bf1436578e4ab73200824a29b26c2034c01 Mon Sep 17 00:00:00 2001 From: kesslerm Date: Tue, 20 May 2014 22:30:20 -0600 Subject: [PATCH 14/36] 1st pass cleanup color. Add outside humidity and pressure to ui. --- fetch.php | 6 ++-- main.js | 85 +++++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 68 insertions(+), 23 deletions(-) diff --git a/fetch.php b/fetch.php index af53020..cef26d6 100644 --- a/fetch.php +++ b/fetch.php @@ -91,13 +91,13 @@ $where_stmt = "timestamp BETWEEN " . $time_start . " AND " . $time_end; } - $sql_query = "SELECT timestamp, heating, cooling, fan, autoAway, manualAway, leaf, target, target2, current, humidity, outsideTemperature, updated from data where device_id=? and " . $where_stmt . " order by timestamp"; + $sql_query = "SELECT timestamp, heating, cooling, fan, autoAway, manualAway, leaf, target, target2, current, humidity, outsideTemperature, outsideHumidity, outsidePressure, updated from data where device_id=? and " . $where_stmt . " order by timestamp"; //print $sql_query; if ($stmt = $db->res->prepare( $sql_query)) { $stmt->bind_param("i", $id); $stmt->execute(); - $stmt->bind_result($timestamp, $heating, $cooling, $fan, $autoAway, $manualAway, $leaf, $target, $target2, $current, $humidity, $outsideTemperature, $updated); + $stmt->bind_result($timestamp, $heating, $cooling, $fan, $autoAway, $manualAway, $leaf, $target, $target2, $current, $humidity, $outsideTemperature, $outsideHumidity, $outsidePressure, $updated); header('Content-type: application/json'); $i=0; while ($stmt->fetch()) { @@ -113,6 +113,8 @@ $json[$i]['current'] = $current; $json[$i]['humidity'] = $humidity; $json[$i]['outsideTemperature'] = $outsideTemperature; + $json[$i]['outsideHumidity'] = $outsideHumidity; + $json[$i]['outsidePressure'] = $outsidePressure; $json[$i]['updated'] = $updated; $i++; } diff --git a/main.js b/main.js index 2af526c..0471982 100644 --- a/main.js +++ b/main.js @@ -118,6 +118,35 @@ } }; + + var line_colors = { + colors: { + heating: d3.rgb('#993300'), + cooling: d3.rgb('#84c4fa'), + fan: d3.rgb('#fce692'), + humid: d3.rgb('#608f1b'), + dehumid: d3.rgb('#ffe4c4'), + autoAway: d3.rgb('#003399'), + manualAway: d3.rgb('#cc6600'), + leaf: d3.rgb('#005500'), + target: d3.rgb('#9c399c'), + current: "black", + humidity: d3.rgb('#608f1b'), + outsideTemperature: "blue" + + }, + + random_color: d3.scale.category10(), + + get_color: function(key) { + var color = this.colors[key]; + if( color == undefined) { + color = this.random_color(key); + } + return color; + } + + }; graph_info.set_x_y_scale(); @@ -205,28 +234,23 @@ var xcolor = "black"; var xval = 0; if (key == "cooling") { - xcolor = d3.rgb('#84c4fa'); xval = d.cooling / 60; } else if (key == "heating") { - xcolor = d3.rgb('#993300'); xval = d.heating / 60; } else if (key == "fan") { - xcolor = d3.rgb('#fce692'); xval = d.fan / 60; } else if (key == "humid") { - xcolor = d3.rgb('#608f1b'); xval = d.humid / 60; } else if (key == "dehumid") { - xcolor = d3.rgb('#ffe4c4'); xval = d.dehumid / 60; } data_array.push( { name: key, - color: xcolor, + color: line_colors.get_color(key), val: xval, date: parseDate(d.timestamp) } ); @@ -294,6 +318,30 @@ .attr("height", function(d) { return this_plot.height - this_plot.y(d.val); }) .attr("fill", function(d) { return d.color; }) .attr("fill-opacity", 1); + + // draw some transparent full height rectangles that have a tooltip for each day with all the values + var rect_tooltip_date_format = d3.time.format("%Y-%m-%d (%a)"); + this_plot.svg_plot.selectAll(".plot.energies") + .data(data) + .enter() + .append("rect") + .attr("class", function(d) { return "plot tooltips"}) + .attr("x", function(d) { return this_plot.x(d.date); }) + .attr("y", function(d) { return 0; }) + .attr("width", function(d) { return (this_plot.width / data.length) - 1; }) // - 1 for paeeing + .attr("height", function(d) { return this_plot.height; }) + .attr("fill-opacity", 0) + .append("svg:title") + .text(function(d) { + var tooltip_string = rect_tooltip_date_format(d.date) + "\n" + + "heating: " + d.heating/60 + "\n" + + "cooling: " + d.cooling/60 + "\n" + + "fan: " + d.fan/60 + "\n" + //fan doesn't ever seem to have non-zero values + "humidifier: " + d.humid/60 + "\n" + + "dehumidifier: " + d.dehumid/60+ "\n" + + "leaf: " + d.leaf; + return tooltip_string; + }); // bind data to the brush plot this_brush_plot.svg_plot.selectAll(".plot.energies") @@ -344,7 +392,7 @@ events_plot.svg_plot.selectAll(".y.axis").remove(); color.domain(d3.keys(data[0]).filter(function(key) { return (key == "current" || key == "target" //|| key == "target2" - || key == "humidity" || key == "outsideTemperature" + || key == "humidity" || key == "outsideTemperature" || key == "outsideHumidity" || key == "outsidePressure" || key == 'heating' || key == 'cooling' || key == 'fan' || key == 'autoAway' || key == 'manualAway' || key == 'leaf'); })); data.forEach(function(d) { @@ -355,45 +403,35 @@ x = { name: name, values: data.map(function(d) { - var xcolor = "black"; var xval = +d[name]; switch(name) { case "heating": - xcolor = d3.rgb('#d50002'); xval += 12; break; case "cooling" : - xcolor = d3.rgb('#84c4fa'); xval += 10; break; case "fan" : - xcolor = d3.rgb('#fce692'); xval += 8; break; case "autoAway" : - xcolor = d3.rgb('#003399'); xval += 6; break; case "manualAway" : - xcolor = d3.rgb('#cc6600'); xval += 4; break; case "leaf" : - xcolor = d3.rgb('#005500'); xval += 2; break; case "target2": case "target" : - xcolor = d3.rgb('#9c399c'); break; case "current" : xcolor = "black"; break; case "humidity": - xcolor = d3.rgb('#608f1b'); break; case "outsideTemperature": - xcolor = "blue"; break; default: break; @@ -416,7 +454,7 @@ return { date: d.date, val: xval, mode: xmode, - color: xcolor + color: line_colors.get_color(name) }; }) }; @@ -432,7 +470,9 @@ // define the y-domains (i.e. min and max of the union of all the trendlines) this_plot.y.domain([ +d3.min(points, function(c) { if (c.name == "target" //|| (c.name == "target2" && c.values != null) - || c.name == "current" || c.name == "outsideTemperature") { return d3.min(c.values, function(v) { return v.val }); } else { return undefined; } }) - 1, + || c.name == "current" || c.name == "outsideTemperature" + || c.name == "outsideHumidity" || c.name == "outsidePressure" + ) { return d3.min(c.values, function(v) { return v.val }); } else { return undefined; } }) - 1, +d3.max(points, function(c) { return d3.max(c.values, function(v) { return v.val }); }) + 1 ]); this_plot.y2.domain([ @@ -491,7 +531,9 @@ // bind nest_data_plot current/trendlines this_plot.svg_plot.selectAll(".plot.temps") - .data(points.filter(function(f) { return (f.name == 'current' || f.name == 'outsideTemperature' || f.name == 'humidity' || f.name == 'target' || (f.name == 'target2' && f.values != null) ); })) + .data(points.filter(function(f) { return (f.name == 'current' || f.name == 'outsideTemperature' + || f.name == "outsideHumidity" || f.name == "outsidePressure" + || f.name == 'humidity' || f.name == 'target' || (f.name == 'target2' && f.values != null) ); })) .enter().append("g") .attr("class", function(d) { return "plot temps " + d.name; }); @@ -538,7 +580,8 @@ .append("path") .attr("class", "line") .attr("d", function(d) { - if (d.name == "current" || d.name == "outsideTemperature") + if (d.name == "current" || d.name == "outsideTemperature" + || d.name == "outsideHumidity" || d.name == "outsidePressure" ) return this_plot.line(d.values); else if (d.name == "humidity") return this_plot.lineRight(d.values); From 9491a6b1a171996978251e7ef02ad51617983b2c Mon Sep 17 00:00:00 2001 From: kesslerm Date: Wed, 21 May 2014 23:04:29 -0600 Subject: [PATCH 15/36] Add daily temp info to store with energy and query and php to populate it --- dbsetup | 3 +++ fetch.php | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++----- main.js | 70 +++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 143 insertions(+), 10 deletions(-) diff --git a/dbsetup b/dbsetup index 4df9005..f33b90a 100644 --- a/dbsetup +++ b/dbsetup @@ -54,6 +54,9 @@ CREATE TABLE `nest`.`energy_data` ( `whodunit` int(11) NOT NULL, `recent_avg_used` int(10) unsigned NOT NULL, `usage_over_avg` int(10) NOT NULL, + `daily_temp_avg` numeric(7,3), + `daily_temp_min` numeric(7,3), + `daily_temp_max` numeric(7,3), PRIMARY KEY (`device_id`,`energyDate`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=latin1; diff --git a/fetch.php b/fetch.php index cef26d6..db8816f 100644 --- a/fetch.php +++ b/fetch.php @@ -36,12 +36,12 @@ if($data_type == "energy") { if($stmt = $db->res->prepare("SELECT energyDate, total_heating_time, total_cooling_time, " . - "total_fan_cooling_time, total_humidifier_time, total_dehumidifier_time, leafs " . + "total_fan_cooling_time, total_humidifier_time, total_dehumidifier_time, leafs, daily_temp_avg, daily_temp_min, daily_temp_max " . "from energy_data where device_id=? order by energyDate")) { $stmt->bind_param("i", $id); $stmt->execute(); - $stmt->bind_result($energy_date, $heating, $cooling, $fan, $humid, $dehumid, $leafs); + $stmt->bind_result($energy_date, $heating, $cooling, $fan, $humid, $dehumid, $leafs, $temp_avg, $temp_min, $temp_max); header('Content-type: application/json'); $i=0; @@ -53,18 +53,86 @@ $json[$i]['humid'] = $humid; $json[$i]['dehumid'] = $dehumid; $json[$i]['leaf'] = $leafs; + $json[$i]['temperature_avg'] = $temp_avg; + $json[$i]['temperature_min'] = $temp_min; + $json[$i]['temperature_max'] = $temp_max; $i++; } print json_encode($json); $stmt->close(); } } + else if($data_type == "dailyTemp") + { + if($start_and_end) { + //$where_stmt = "timestamp BETWEEN \"" . $time_start . "\" AND \"" . $time_end . "\""; + $where_stmt = "timestamp BETWEEN " . $time_start . " AND " . $time_end; + + $sql_query = "SELECT outsideTemperature from data where device_id=? and " . $where_stmt . " order by timestamp"; + //print $sql_query; + + if ($stmt = $db->res->prepare( $sql_query)) { + $stmt->bind_param("i", $id); + $stmt->execute(); + $stmt->bind_result($outsideTemperature); + header('Content-type: application/json'); + $i=0; + $temp_min = 1000; //initial value that temp will always be less than + $temp_max = -1000; + $temp_total = 0; + while ($stmt->fetch()) { + $temp_total += $outsideTemperature; + $temp_min = min($temp_min, $outsideTemperature); + $temp_max = max($temp_max, $outsideTemperature); + $i++; + } + $stmt->close(); + if($i > 0) + { + $temp_avg = $temp_total/$i; + $temp_avg = sprintf("%.02f", $temp_avg); + $temp_min = sprintf("%.02f", $temp_min); + $temp_max = sprintf("%.02f", $temp_max); + + $json['temperature_avg'] = $temp_avg; + $json['temperature_min'] = $temp_min; + $json['temperature_max'] = $temp_max; + + //print json_encode($json); + $insert_time = str_replace('"', '', $time_start); + $insert_time = $insert_time . ' 00:00:00'; //Make a new time string (append all 0s for time after date + + $sql_query = "UPDATE energy_data SET daily_temp_avg=?, daily_temp_min=?, daily_temp_max=? " . + "WHERE device_id=? and energyDate=?"; + //print $sql_query; + if ($stmt = $db->res->prepare($sql_query)) + { + //print "Time: $insert_time \n"; + $stmt->bind_param("iiiis", $temp_avg, $temp_min, $temp_max, $id, $insert_time ); + if (!$stmt->execute()) + { + echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; + } + $stmt->close(); + } + + print json_encode($json); + } + } + } + } else if($data_type == "cycles") { - if($stmt = $db->res->prepare("SELECT cycleDate, cycleNum, start, " . - "duration, type " . - "from cycles_data where device_id=? order by cycleDate")) - { + $where_stmt = "cycleDate>=DATE_SUB(NOW(), INTERVAL " . $hrs. " HOUR)"; + if($start_and_end) { + //$where_stmt = "timestamp BETWEEN \"" . $time_start . "\" AND \"" . $time_end . "\""; + $where_stmt = "cycleDate BETWEEN " . $time_start . " AND " . $time_end; + } + + $sql_query = "SELECT cycleDate, cycleNum, start, duration, type from cycles_data where device_id=? and " . $where_stmt . " order by cycleDate"; + //print $sql_query; + + if($stmt = $db->res->prepare( $sql_query)) { $stmt->bind_param("i", $id); $stmt->execute(); $stmt->bind_result($cycle_date, $num, $start, $duration, $type); diff --git a/main.js b/main.js index 0471982..8901b55 100644 --- a/main.js +++ b/main.js @@ -17,7 +17,7 @@ height : window.innerWidth * 0.80 * .25, width : window.innerWidth * 0.80, margin : {top: 60, right: 60, bottom: 0, left: 50}, - hasRightAxis : false + hasRightAxis : true }, { @@ -175,6 +175,7 @@ graph_info.append_plots(svg); + var brush_update_in_progress = false; // callback function for d3 brush object function brushUpdate() { brush_main_plot = graph_info.plot_info_arr[0]; @@ -188,7 +189,13 @@ brush_domain_time[0] = short_date_format(brush_domain[0]); brush_domain_time[1] = short_date_format(new Date(+brush_domain[1] + 86400000)); //console.log(brush_domain_time); - setTimeout(function() { fetchData(brush_domain_time); }, 250); + + if(brush_update_in_progress === false) { + brush_update_in_progress = true; + setTimeout(function() { + fetchData(brush_domain_time); + brush_update_in_progress = false;}, 250); + } /* brush_main_plot.svg_plot.select(".x.axis").call(brush_main_plot.xAxis); @@ -219,7 +226,20 @@ }) */ - } + }; + + function computeAverageTemp(timeRange) { + var fetch_string; + var parsed_data; + if(typeof(timeRange) !== "undefined") { + fetch_string = "id=" + device_id + "&start=\"" + timeRange[0] + "\"&end=\"" + timeRange[1] + "\"" + "&data=dailyTemp"; + + d3.json("fetch.php?" + fetch_string, function(error, data) { + parsed_data = data; + }); + } + return parsed_data; + }; function fetchEnergy() { // fetch the data @@ -229,6 +249,13 @@ //console.log(data); var data_array = []; + var temperature_array = { + daily_temperature_average : [], + daily_temperature_max : [], + daily_temperature_min : [] + }; + + data.forEach(function(d) { for( var key in d) { var xcolor = "black"; @@ -255,7 +282,40 @@ date: parseDate(d.timestamp) } ); } - d.date = parseDate(d.timestamp); + + //Parse the date + d.date = parseDate(d.timestamp); + + //Simply reload to get the appropriate values + if(d.temperature_avg == null) + { + var date_range = []; + var short_date_format = d3.time.format("%Y-%m-%d"); + date_range[0] = short_date_format(d.date); + date_range[1] = short_date_format(new Date(+d.date + 86400000)); + value_array = computeAverageTemp(date_range); + + if(value_array != undefined) + { + temperature_array.daily_temperature_average.push( { date: d.date, + val: value_array.temperature_avg}); + temperature_array.daily_temperature_max.push( { date: d.date, + val: value_array.temperature_max}); + temperature_array.daily_temperature_min.push( { date: d.date, + val: value_array.temperature_min}); + } + + } + else + { + temperature_array.daily_temperature_average.push( { date: d.date, + val: d.temperature_avg}); + temperature_array.daily_temperature_max.push( { date: d.date, + val: d.temperature_max}); + temperature_array.daily_temperature_min.push( { date: d.date, + val: d.temperature_min}); + } + }); @@ -271,6 +331,8 @@ d3.max(data_array, function(d) { return d.val; } ) * 1.1 ]; this_plot.y.domain(y_domain); this_brush_plot.y.domain(y_domain); + + // draw nest_data_plot x axis this_plot.svg_plot.append("g") From 15ea25632d569eaf7fc4c8f3850127d6b56099b2 Mon Sep 17 00:00:00 2001 From: kesslerm Date: Thu, 22 May 2014 22:50:43 -0600 Subject: [PATCH 16/36] Add daily min/max/avg temperature to energy plot. Begin work on cycles plot. --- main.js | 157 +++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 121 insertions(+), 36 deletions(-) diff --git a/main.js b/main.js index 8901b55..2ebf303 100644 --- a/main.js +++ b/main.js @@ -132,7 +132,12 @@ target: d3.rgb('#9c399c'), current: "black", humidity: d3.rgb('#608f1b'), - outsideTemperature: "blue" + outsideTemperature: "blue", + outsideHumidity: d3.rgb('#e98f1a'), + outsidePressure: d3.rgb('#00bdb6'), + daily_temperature_average: d3.rgb('#621d30'), + daily_temperature_min: d3.rgb('#4169e1'), + daily_temperature_max: d3.rgb('#cd0000') }, @@ -190,6 +195,7 @@ brush_domain_time[1] = short_date_format(new Date(+brush_domain[1] + 86400000)); //console.log(brush_domain_time); + //Prevent multiple redraws/queries while brush is moving if(brush_update_in_progress === false) { brush_update_in_progress = true; setTimeout(function() { @@ -249,7 +255,7 @@ //console.log(data); var data_array = []; - var temperature_array = { + var temperature_array = { daily_temperature_average : [], daily_temperature_max : [], daily_temperature_min : [] @@ -276,11 +282,14 @@ xval = d.dehumid / 60; } - data_array.push( { name: key, + if(xval !== 0) + { + data_array.push( { name: key, color: line_colors.get_color(key), val: xval, date: parseDate(d.timestamp) } ); + } } //Parse the date @@ -298,22 +307,22 @@ if(value_array != undefined) { temperature_array.daily_temperature_average.push( { date: d.date, - val: value_array.temperature_avg}); + val: parseInt(value_array.temperature_avg)}); temperature_array.daily_temperature_max.push( { date: d.date, - val: value_array.temperature_max}); + val: parseInt(value_array.temperature_max)}); temperature_array.daily_temperature_min.push( { date: d.date, - val: value_array.temperature_min}); + val: parseInt(value_array.temperature_min)}); } } else { temperature_array.daily_temperature_average.push( { date: d.date, - val: d.temperature_avg}); + val: parseInt(d.temperature_avg)}); temperature_array.daily_temperature_max.push( { date: d.date, - val: d.temperature_max}); + val: parseInt(d.temperature_max)}); temperature_array.daily_temperature_min.push( { date: d.date, - val: d.temperature_min}); + val: parseInt(d.temperature_min)}); } }); @@ -331,6 +340,12 @@ d3.max(data_array, function(d) { return d.val; } ) * 1.1 ]; this_plot.y.domain(y_domain); this_brush_plot.y.domain(y_domain); + + var y_temperature_domain = [-50, //d3.min(temperature_array.daily_temperature_min, function(d) { return d.val;} ), + d3.max(temperature_array.daily_temperature_max, function(d) { return d.val;} ) ]; + y_temperature_domain[0] -= y_temperature_domain[0]*.1; + y_temperature_domain[1] += y_temperature_domain[1]*.1; + this_plot.y2.domain(y_temperature_domain); @@ -350,6 +365,18 @@ .attr("dy", ".71em") .style("text-anchor", "end") .text("Duration (Minutes)"); + + // draw the temperature y axis + this_plot.svg_plot.append("g") + .attr("class", "y axis nest_data_plot") + .attr("transform", "translate(" + (this_plot.width+15) + ",0)") + .call(this_plot.yRightAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("y", -12) + .attr("dy", ".71em") + .style("text-anchor", "end") + .text("Temperature (degrees F)"); // draw the brush plot x-axis this_brush_plot.svg_plot.append("g") @@ -398,8 +425,9 @@ var tooltip_string = rect_tooltip_date_format(d.date) + "\n" + "heating: " + d.heating/60 + "\n" + "cooling: " + d.cooling/60 + "\n" + - "fan: " + d.fan/60 + "\n" + //fan doesn't ever seem to have non-zero values - "humidifier: " + d.humid/60 + "\n" + + //fan doesn't ever seem to have non-zero values + "fan: " + d.fan/60 + "\n" + + "humidifier: " + d.humid/60 + "\n" + "dehumidifier: " + d.dehumid/60+ "\n" + "leaf: " + d.leaf; return tooltip_string; @@ -425,6 +453,21 @@ .selectAll("rect") .attr("y", -6) .attr("height", this_brush_plot.height + 7); + + var line = d3.svg.line() + .interpolate("basis") + .x(function(d) { return this_plot.x(d.date); }) + .y(function(d) { return this_plot.y2(d.val); }); + + for (var key in temperature_array){ + if (temperature_array.hasOwnProperty(key)) { + this_plot.svg_plot + .append("path") + .attr("class", "line") + .attr("d", function(d){ return line(temperature_array[key]); }) + .style("stroke", line_colors.get_color(key)); + } + } } //End fetchEnergy() )}; @@ -533,13 +576,13 @@ this_plot.y.domain([ +d3.min(points, function(c) { if (c.name == "target" //|| (c.name == "target2" && c.values != null) || c.name == "current" || c.name == "outsideTemperature" - || c.name == "outsideHumidity" || c.name == "outsidePressure" + || c.name == "outsidePressure" ) { return d3.min(c.values, function(v) { return v.val }); } else { return undefined; } }) - 1, +d3.max(points, function(c) { return d3.max(c.values, function(v) { return v.val }); }) + 1 ]); this_plot.y2.domain([ - +d3.min(points, function(c) { if (c.name == "humidity") { return d3.min(c.values, function(v) { return v.val }); } else { return undefined; } }) - 1, - +d3.max(points, function(c) { if (c.name == "humidity") { return d3.max(c.values, function(v) { return v.val }); } else { return undefined; } }) + 1 + +d3.min(points, function(c) { if (c.name == "humidity" || c.name == "outsideHumidity" ) { return d3.min(c.values, function(v) { return v.val }); } else { return undefined; } }) - 1, + +d3.max(points, function(c) { if (c.name == "humidity" || c.name == "outsideHumidity" ) { return d3.max(c.values, function(v) { return v.val }); } else { return undefined; } }) + 1 ]); //Setup the events plot axis @@ -610,24 +653,21 @@ //Create the line objects once - if (typeof this_plot.line === 'undefined') { - this_plot.line = d3.svg.line() - .interpolate("basis") - .x(function(d) { return this_plot.x(d.date); }) - .y(function(d) { return this_plot.y(d.val); }); + var line = d3.svg.line() + .interpolate("basis") + .x(function(d) { return this_plot.x(d.date); }) + .y(function(d) { return this_plot.y(d.val); }); + + var lineStepafter = d3.svg.line() + .interpolate("step-after") + .x(function(d) { return this_plot.x(d.date); }) + .y(function(d) { return this_plot.y(d.val); }); + + var lineRight = d3.svg.line() + .interpolate("basis") + .x(function(d) { return this_plot.x(d.date); }) + .y(function(d) { return this_plot.y2(d.val); }); - this_plot.lineStepafter = d3.svg.line() - .interpolate("step-after") - .x(function(d) { return this_plot.x(d.date); }) - .y(function(d) { return this_plot.y(d.val); }); - - if(this_plot.hasRightAxis === true) { - this_plot.lineRight = d3.svg.line() - .interpolate("basis") - .x(function(d) { return this_plot.x(d.date); }) - .y(function(d) { return this_plot.y2(d.val); }); - } - } //All events are step after (logical 0/1) if (typeof events_plot.lineStepafter === 'undefined') { @@ -643,12 +683,12 @@ .attr("class", "line") .attr("d", function(d) { if (d.name == "current" || d.name == "outsideTemperature" - || d.name == "outsideHumidity" || d.name == "outsidePressure" ) - return this_plot.line(d.values); - else if (d.name == "humidity") - return this_plot.lineRight(d.values); + || d.name == "outsidePressure" ) + return line(d.values); + else if (d.name == "humidity" || d.name == "outsideHumidity" ) + return lineRight(d.values); else - return this_plot.lineStepafter(d.values); + return lineStepafter(d.values); }) .style("stroke", function(d) { return d.values[0].color; @@ -718,6 +758,51 @@ }); }); + }; + + function fetchCycles (timeRange) { + var fetch_string; + if(typeof(timeRange) !== "undefined") { + fetch_string = "id=" + device_id + "&start=\"" + timeRange[0] + "\"&end=\"" + timeRange[1] + "\"" + "&data=cycles"; + } + else { + fetch_string = "id=" + device_id + "&hrs=" + hours + "&data=cycles"; + } + + // fetch the data + //console.log(fetch_string); + d3.json("fetch.php?" + fetch_string, function(error, data) { + this_plot = graph_info.plot_info_arr[2]; + + this_plot.svg_plot.selectAll(".plot").remove(); + this_plot.svg_plot.selectAll(".x.axis").remove(); + this_plot.svg_plot.selectAll(".y.axis").remove(); + + var data_array = []; + + + data.forEach(function(d) { + + if(d.duration !== 0) + { + var start_date = parseDate(d.timestamp); + var start_timestamp = +start_date + (d.start * 1000); + var end_timestamp = start_timestamp + (d.duration * 1000); + + data_array.push( { name: d.type, + color: line_colors.get_color(d.type), + start: new Date(start_timestamp), + end: new Date(end_timestamp) + } ); + } + + //Parse the date + d.date = parseDate(d.timestamp); + + + }); + + }); }; fetchEnergy(); From 710dad5a4fcb108eb5291e71549052dde06b55c2 Mon Sep 17 00:00:00 2001 From: Jan Collijs Date: Mon, 9 Jun 2014 18:42:34 +0200 Subject: [PATCH 17/36] Added nest-api as submodule --- .gitmodules | 3 +++ nest-api-master | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 nest-api-master diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..26442be --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "nest-api-master"] + path = nest-api-master + url = https://github.com/gboudreau/nest-api.git diff --git a/nest-api-master b/nest-api-master new file mode 160000 index 0000000..f31b80c --- /dev/null +++ b/nest-api-master @@ -0,0 +1 @@ +Subproject commit f31b80c2d48ded7cd3f86f6eb65c4e146dcbda63 From 60c68c50aa3ee6f10d18d6c4f506ccd3a7261bac Mon Sep 17 00:00:00 2001 From: kesslerm Date: Mon, 23 Jun 2014 22:28:56 -0600 Subject: [PATCH 18/36] Add gneration of daily temp values to insertEnergy script --- collectEnergy.php | 62 +++++++++++++ fetch.php | 56 +----------- insertEnergy.php | 5 ++ main.js | 216 +++++++++++++++++++++++++++++++++++----------- 4 files changed, 237 insertions(+), 102 deletions(-) diff --git a/collectEnergy.php b/collectEnergy.php index 84b4260..4eaad7c 100644 --- a/collectEnergy.php +++ b/collectEnergy.php @@ -3,6 +3,7 @@ require 'inc/config.php'; require 'nest-api-master/nest.class.php'; + define('USERNAME', $config['nest_user']); define('PASSWORD', $config['nest_pass']); @@ -63,6 +64,67 @@ function get_nest_data($serial_number=null) { return $energy; } +function compute_daily_temps(&$db, $time_start, $id) +{ + $json = array(); + + //$where_stmt = "timestamp BETWEEN \"" . $time_start . "\" AND \"" . $time_end . "\""; + $where_stmt = "timestamp BETWEEN " . $time_start . " AND DATE_ADD(" . $time_start . ", INTERVAL 24 HOUR)"; + + $sql_query = "SELECT outsideTemperature from data where device_id=? and " . $where_stmt . " order by timestamp"; + //print $sql_query; + + if ($stmt = $db->res->prepare( $sql_query)) { + $stmt->bind_param("i", $id); + $stmt->execute(); + $stmt->bind_result($outsideTemperature); + header('Content-type: application/json'); + $i=0; + $temp_min = 1000; //initial value that temp will always be less than + $temp_max = -1000; + $temp_total = 0; + while ($stmt->fetch()) { + $temp_total += $outsideTemperature; + $temp_min = min($temp_min, $outsideTemperature); + $temp_max = max($temp_max, $outsideTemperature); + $i++; + } + $stmt->close(); + if($i > 0) + { + $temp_avg = $temp_total/$i; + $temp_avg = sprintf("%.02f", $temp_avg); + $temp_min = sprintf("%.02f", $temp_min); + $temp_max = sprintf("%.02f", $temp_max); + + $json['temperature_avg'] = $temp_avg; + $json['temperature_min'] = $temp_min; + $json['temperature_max'] = $temp_max; + + //print json_encode($json); + $insert_time = str_replace('"', '', $time_start); + $insert_time = $insert_time . ' 00:00:00'; //Make a new time string (append all 0s for time after date + + $sql_query = "UPDATE energy_data SET daily_temp_avg=?, daily_temp_min=?, daily_temp_max=? " . + "WHERE device_id=? and energyDate=?"; + //print $sql_query; + if ($stmt = $db->res->prepare($sql_query)) + { + //print "Time: $insert_time \n"; + $stmt->bind_param("iiiis", $temp_avg, $temp_min, $temp_max, $id, $insert_time ); + if (!$stmt->execute()) + { + echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; + } + $stmt->close(); + } + + return json_encode($json); + } + } + return ""; +} + function c_to_f($c) { return ($c * 1.8) + 32; } diff --git a/fetch.php b/fetch.php index db8816f..aabdb7d 100644 --- a/fetch.php +++ b/fetch.php @@ -2,6 +2,7 @@ require 'inc/config.php'; require 'inc/class.db.php'; +require 'collectEnergy.php'; define('DEFAULT_ID', 1); define('DEFAULT_HRS', 72); @@ -65,60 +66,7 @@ else if($data_type == "dailyTemp") { if($start_and_end) { - //$where_stmt = "timestamp BETWEEN \"" . $time_start . "\" AND \"" . $time_end . "\""; - $where_stmt = "timestamp BETWEEN " . $time_start . " AND " . $time_end; - - $sql_query = "SELECT outsideTemperature from data where device_id=? and " . $where_stmt . " order by timestamp"; - //print $sql_query; - - if ($stmt = $db->res->prepare( $sql_query)) { - $stmt->bind_param("i", $id); - $stmt->execute(); - $stmt->bind_result($outsideTemperature); - header('Content-type: application/json'); - $i=0; - $temp_min = 1000; //initial value that temp will always be less than - $temp_max = -1000; - $temp_total = 0; - while ($stmt->fetch()) { - $temp_total += $outsideTemperature; - $temp_min = min($temp_min, $outsideTemperature); - $temp_max = max($temp_max, $outsideTemperature); - $i++; - } - $stmt->close(); - if($i > 0) - { - $temp_avg = $temp_total/$i; - $temp_avg = sprintf("%.02f", $temp_avg); - $temp_min = sprintf("%.02f", $temp_min); - $temp_max = sprintf("%.02f", $temp_max); - - $json['temperature_avg'] = $temp_avg; - $json['temperature_min'] = $temp_min; - $json['temperature_max'] = $temp_max; - - //print json_encode($json); - $insert_time = str_replace('"', '', $time_start); - $insert_time = $insert_time . ' 00:00:00'; //Make a new time string (append all 0s for time after date - - $sql_query = "UPDATE energy_data SET daily_temp_avg=?, daily_temp_min=?, daily_temp_max=? " . - "WHERE device_id=? and energyDate=?"; - //print $sql_query; - if ($stmt = $db->res->prepare($sql_query)) - { - //print "Time: $insert_time \n"; - $stmt->bind_param("iiiis", $temp_avg, $temp_min, $temp_max, $id, $insert_time ); - if (!$stmt->execute()) - { - echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; - } - $stmt->close(); - } - - print json_encode($json); - } - } + print compute_daily_temps($db, $time_start, $id); } } else if($data_type == "cycles") diff --git a/insertEnergy.php b/insertEnergy.php index c2c88be..c9b2964 100644 --- a/insertEnergy.php +++ b/insertEnergy.php @@ -58,6 +58,11 @@ $stmt->bind_param("isiiiiiiiiii", $row[0], $day->day, $day->device_timezone_offset, $day->total_heating_time, $day->total_cooling_time, $day->total_fan_cooling_time, $day->total_humidifier_time, $day->total_dehumidifier_time, $day->leafs, $day->whodunit, $day->recent_avg_used, $day->usage_over_avg); $stmt->execute(); $stmt->close(); + + //Envoke the function to actually generate the daily averages so that + // we don't need to do it as part of the loading of the webpage + //Add " around the date so sql parses properly + print compute_daily_temps($db, '"'.$day->day.'"', $row[0]) . "\n"; } } } diff --git a/main.js b/main.js index 2ebf303..3078cc3 100644 --- a/main.js +++ b/main.js @@ -1,15 +1,26 @@ nestGraph = { 'init': function() { - device_id = 1; + var device_id = 1; // change this if you want to limit the amount of data pulled - hours = 24 * 7; + var hours = 24 * 5; + var first_date = "2014-05-16 00:00:00"; + var graph_info = { fullWidth : window.innerWidth * 0.97, fullHeight : window.innerHeight * 0.95, + + get_plot_info_var : function(name){ + var i; + for( i = 0; i < this.plot_info_arr.length; i += 1) { + if(this.plot_info_arr[i].name === name) { + return this.plot_info_arr[i]; + } + } + }, plot_info_arr : [ { @@ -27,15 +38,7 @@ margin : {top: 60, right: 60, bottom: 0, left: 50}, hasRightAxis : false }, - - { - name : "Cycles", - height : 40, - width : window.innerWidth * 0.80, - margin : {top: 60, right: 60, bottom: 0, left: 50}, - hasRightAxis : false - }, - + { name : "Log Data", height : window.innerWidth * 0.80 * .5, @@ -50,6 +53,13 @@ width : window.innerWidth * 0.80, margin : {top: 60, right: 60, bottom: 0, left: 50}, hasRightAxis : false + }, + { + name : "Cycles", + height : 80, + width : window.innerWidth * 0.80, + margin : {top: 60, right: 60, bottom: 0, left: 50}, + hasRightAxis : false }, ], @@ -152,6 +162,10 @@ } }; + + String.prototype.capitalizeFirst = function() { + return this.charAt(0).toUpperCase() + this.slice(1); + } graph_info.set_x_y_scale(); @@ -200,6 +214,7 @@ brush_update_in_progress = true; setTimeout(function() { fetchData(brush_domain_time); + //fetchCycles(brush_domain_time); brush_update_in_progress = false;}, 250); } @@ -250,8 +265,8 @@ function fetchEnergy() { // fetch the data d3.json("fetch.php?id=" + device_id + "&hrs=" + hours + "&data=energy", function(error, data) { - this_plot = graph_info.plot_info_arr[0]; - this_brush_plot = graph_info.plot_info_arr[1]; + this_plot = graph_info.get_plot_info_var("Energy");; + this_brush_plot = graph_info.get_plot_info_var("Energy Brush"); //console.log(data); var data_array = []; @@ -298,22 +313,25 @@ //Simply reload to get the appropriate values if(d.temperature_avg == null) { - var date_range = []; - var short_date_format = d3.time.format("%Y-%m-%d"); - date_range[0] = short_date_format(d.date); - date_range[1] = short_date_format(new Date(+d.date + 86400000)); - value_array = computeAverageTemp(date_range); - - if(value_array != undefined) - { - temperature_array.daily_temperature_average.push( { date: d.date, - val: parseInt(value_array.temperature_avg)}); - temperature_array.daily_temperature_max.push( { date: d.date, - val: parseInt(value_array.temperature_max)}); - temperature_array.daily_temperature_min.push( { date: d.date, - val: parseInt(value_array.temperature_min)}); - } - + var earliest_date = parseDate(first_date); + if(+d.date > +earliest_date) + { + var date_range = []; + var short_date_format = d3.time.format("%Y-%m-%d"); + date_range[0] = short_date_format(d.date); + date_range[1] = short_date_format(new Date(+d.date + 86400000)); + value_array = computeAverageTemp(date_range); + + if(value_array != undefined) + { + temperature_array.daily_temperature_average.push( { date: d.date, + val: parseInt(value_array.temperature_avg)}); + temperature_array.daily_temperature_max.push( { date: d.date, + val: parseInt(value_array.temperature_max)}); + temperature_array.daily_temperature_min.push( { date: d.date, + val: parseInt(value_array.temperature_min)}); + } + } } else { @@ -395,7 +413,7 @@ .style("text-anchor", "end") .text("Duration (Minutes)"); - // bind the energy data current/trendlines + // draw the energy data stacked histogram this_plot.svg_plot.selectAll(".plot.energies") .data(data_array.sort(function(a, b){return b.val-a.val})) //Sort the data so smaller rects are drawn over larger. .enter() @@ -417,7 +435,7 @@ .attr("class", function(d) { return "plot tooltips"}) .attr("x", function(d) { return this_plot.x(d.date); }) .attr("y", function(d) { return 0; }) - .attr("width", function(d) { return (this_plot.width / data.length) - 1; }) // - 1 for paeeing + .attr("width", function(d) { return (this_plot.width / data.length) - 1; }) // - 1 for 1px padding .attr("height", function(d) { return this_plot.height; }) .attr("fill-opacity", 0) .append("svg:title") @@ -441,7 +459,7 @@ .attr("class", function(d) { return "plot duration"}) .attr("x", function(d) { return this_brush_plot.x(d.date); }) .attr("y", function(d) { return this_brush_plot.y(d.val); }) - .attr("width", function(d) { return (this_brush_plot.width / data.length) - 1; }) // - 1 for paeeing + .attr("width", function(d) { return (this_brush_plot.width / data.length) - 1; }) // - 1 for 1px padding .attr("height", function(d) { return this_brush_plot.height - this_brush_plot.y(d.val); }) .attr("fill", function(d) { return d.color; }) .attr("fill-opacity", 1); @@ -483,8 +501,8 @@ // fetch the data //console.log(fetch_string); d3.json("fetch.php?" + fetch_string, function(error, data) { - this_plot = graph_info.plot_info_arr[3]; - events_plot = graph_info.plot_info_arr[4]; + this_plot = graph_info.get_plot_info_var("Log Data"); + events_plot = graph_info.get_plot_info_var("Events"); this_plot.svg_plot.selectAll(".plot").remove(); @@ -689,10 +707,11 @@ return lineRight(d.values); else return lineStepafter(d.values); - }) + }) .style("stroke", function(d) { return d.values[0].color; - }); + }) + .style('pointer-events', 'none'); //.attr("clip-path", "url(#clip)"); // draw events plots @@ -701,10 +720,11 @@ .attr("class", "line") .attr("d", function(d) { return events_plot.lineStepafter(d.values); - }) + }) .style("stroke", function(d) { return d.values[0].color; - }); + }) + .style('pointer-events', 'none'); // create a parent element for the circles to live this_plot.svg_plot.selectAll(".current") @@ -757,10 +777,41 @@ .text(d.name); }); + + //Add a mouseover event that draws a line and updates the values at this location + /* + var marker = this_plot.svg_plot.append('g') + .attr("class", "mouse circles") + .append("circle") + .attr('r', 20) + .style('display', 'none') + .style('fill', '#000000') + .style('pointer-events', 'none') + .style('stroke', '#FB5050') + .style('stroke-width', '3px'); + + this_plot.svg_plot + .on('mouseover', function() { + marker.style('display', 'inherit'); + }) + .on('mouseout', function() { + marker.style('display', 'none'); + }) + .on('mousemove', function() { + var mouse = d3.mouse(this); + marker + .attr('cx', mouse[0]) + .attr('cy', mouse[1]); + }); + */ + + + //End for data + fetchCycles (timeRange, x_domain); }); }; - function fetchCycles (timeRange) { + function fetchCycles (timeRange, domain) { var fetch_string; if(typeof(timeRange) !== "undefined") { fetch_string = "id=" + device_id + "&start=\"" + timeRange[0] + "\"&end=\"" + timeRange[1] + "\"" + "&data=cycles"; @@ -772,14 +823,19 @@ // fetch the data //console.log(fetch_string); d3.json("fetch.php?" + fetch_string, function(error, data) { - this_plot = graph_info.plot_info_arr[2]; + this_plot = graph_info.get_plot_info_var("Cycles"); this_plot.svg_plot.selectAll(".plot").remove(); this_plot.svg_plot.selectAll(".x.axis").remove(); this_plot.svg_plot.selectAll(".y.axis").remove(); var data_array = []; - + var cycle_type_to_string = { + 1 : "heating", + 65792 : "cooling", + 65536 : "fan", + 81921 : "humidity" + } data.forEach(function(d) { @@ -789,24 +845,88 @@ var start_timestamp = +start_date + (d.start * 1000); var end_timestamp = start_timestamp + (d.duration * 1000); - data_array.push( { name: d.type, - color: line_colors.get_color(d.type), - start: new Date(start_timestamp), - end: new Date(end_timestamp) + data_array.push( { type: d.type, + name: cycle_type_to_string[d.type], + color: line_colors.get_color(cycle_type_to_string[d.type]), + start: new Date(start_timestamp), + end: new Date(end_timestamp), + duration: d.duration } ); } //Parse the date - d.date = parseDate(d.timestamp); - - + d.date = parseDate(d.timestamp); }); + // define the x-domains (i.e. min and max of actual date values) + //if(domain == "undefined") + //{ + var date_domain = d3.extent(data, function(d) { return d.date; }); + //console.log (date_domain); + date_domain[1] = new Date(+date_domain[1] + 86400000); //add an extra day + this_plot.x.domain(date_domain); + //} + //else + //{ + // this_plot.x.domain(domain); + //} + + + //match the x-domain to the events plot so they line up nicely. + //var events_plot = graph_info.get_plot_info_var("Events"); + //var events_x_domain = events_plot.x.domain(); + //this_plot.x.domain(events_x_domain); + + // define the y-domains (i.e. min and max of the union of all the trendlines) + var y_domain = [0, 1]; // This can be fixed since we're only drawing events in time + this_plot.y.domain(y_domain); + + + // draw nest_data_plot x axis + this_plot.svg_plot.append("g") + .attr("class", "x axis nest_data_plot") + .attr("transform", "translate(0," + this_plot.height + ")") + .call(this_plot.xAxis); + + // draw nest_data_plot y axis + /* + this_plot.svg_plot.append("g") + .attr("class", "y axis nest_data_plot") + .call(this_plot.yAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("y", 6) + .attr("dy", ".71em") + .style("text-anchor", "end") + .text("Duration (Minutes)");*/ + + this_plot.svg_plot.selectAll(".plot.energies") + .data(data_array.sort(function(a, b){return b.type-a.type})) + .enter() + .append("rect") + .attr("class", function(d) { return "plot cycles"}) + .attr("x", function(d) { return this_plot.x(d.start); }) + .attr("y", function(d) { return 0; }) + .attr("width", function(d) { return (this_plot.x(d.end) - this_plot.x(d.start) ); }) + .attr("height", function(d) { return this_plot.height; }) + .attr("fill", function(d) { return d.color; }) + .attr("fill-opacity", .8) + .append("svg:title") + .text(function(d) { + var tooltip_string = d.name.capitalizeFirst() + ":\n" + + "Start: " + d.start + "\n" + + "End: " + d.end + "\n" + + //fan doesn't ever seem to have non-zero values + "Duration: " + d.duration/60 + "Minutes \n"; + return tooltip_string; + }); + }); }; fetchEnergy(); fetchData(); + //fetchCycles(); window.onload=function(){ From f13d12ced321fd8ef25cf2cbbe7da9e32d1d83d0 Mon Sep 17 00:00:00 2001 From: Christian Oyarzun Date: Sun, 6 Jul 2014 15:56:56 -0400 Subject: [PATCH 19/36] added textbox to change the hours interval --- index.php | 1 + main.js | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/index.php b/index.php index 3f7b28b..0f98865 100644 --- a/index.php +++ b/index.php @@ -37,6 +37,7 @@ + hours diff --git a/main.js b/main.js index 5f0bda4..a36cf1c 100644 --- a/main.js +++ b/main.js @@ -340,4 +340,16 @@ window.onload=function(){ brushUpdate(); } } + document.getElementById("hours").onkeypress= + function (e) { + var key=e.keyCode || e.which; + if (key==13){ + window.hours = document.getElementById("hours").value; + clearData(); + fetchData(); + if (!brush.empty()) { + brushUpdate(); + } + } + } } From 091d96529e6bc0705fd192dfdf0ea0fb487e648b Mon Sep 17 00:00:00 2001 From: Christian Oyarzun Date: Sun, 6 Jul 2014 16:08:00 -0400 Subject: [PATCH 20/36] Updated to use username and password as members instead of constants --- collect.php | 6 ++--- collectEnergy.php | 66 +++++++++++++++++++++++------------------------ init_devices.php | 4 +-- test.php | 4 +-- 4 files changed, 36 insertions(+), 44 deletions(-) diff --git a/collect.php b/collect.php index 18f4ef2..62f1638 100644 --- a/collect.php +++ b/collect.php @@ -3,13 +3,11 @@ require 'inc/config.php'; require 'nest-api-master/nest.class.php'; -define('USERNAME', $config['nest_user']); -define('PASSWORD', $config['nest_pass']); - date_default_timezone_set($config['local_tz']); function get_nest_data($serial_number=null) { - $nest = new Nest(); + global $config; + $nest = new Nest($config['nest_user'], $config['nest_pass']); $info = $nest->getDeviceInfo($serial_number); if (preg_match("/away/", $info->current_state->mode) || preg_match("/range/", $info->current_state->mode)) { diff --git a/collectEnergy.php b/collectEnergy.php index 28de49d..ead7fda 100644 --- a/collectEnergy.php +++ b/collectEnergy.php @@ -3,51 +3,49 @@ require 'inc/config.php'; require 'nest-api-master/nest.class.php'; -define('USERNAME', $config['nest_user']); -define('PASSWORD', $config['nest_pass']); - date_default_timezone_set($config['local_tz']); function get_nest_data($serial_number=null) { - $nest = new Nest(); - $info = $nest->getDeviceInfo($serial_number); + global $config; + $nest = new Nest($config['nest_user'], $config['nest_pass']); + //$info = $nest->getDeviceInfo($serial_number); $energy = $nest->getEnergyLatest($serial_number); - //Change nulls to 0 - foreach ($energy->days as &$day) + foreach($energy->objects as &$object) { - foreach ($day->events as &$events) + $value = $object->value; + foreach ($value->days as &$day) { - if ( empty($events -> continuation) ) - { - $events -> continuation = 0; - } - if ( empty($events -> touched_by) ) - { - $events -> touched_by = 0; - } - if ( empty($events -> touched_when) ) - { - $events -> touched_when = 0; - } - if ( empty($events -> touched_timezone_offset) ) - { - $events -> touched_timezone_offset = 0; - } - if ( empty($events -> touched_where) ) + foreach ($day->events as &$events) { - $events -> touched_where = 0; + if ( empty($events -> continuation) ) + { + $events -> continuation = 0; + } + if ( empty($events -> touched_by) ) + { + $events -> touched_by = 0; + } + if ( empty($events -> touched_when) ) + { + $events -> touched_when = 0; + } + if ( empty($events -> touched_timezone_offset) ) + { + $events -> touched_timezone_offset = 0; + } + if ( empty($events -> touched_where) ) + { + $events -> touched_where = 0; + } + $events -> heat_temp = $nest->temperatureInUserScale($events -> heat_temp); + $events -> cool_temp = $nest->temperatureInUserScale($events -> cool_temp); } + unset($events); } - unset($events); + unset($day); } - unset($day); - + unset($object); return $energy; } - -function c_to_f($c) { - return ($c * 1.8) + 32; -} - ?> diff --git a/init_devices.php b/init_devices.php index de1e469..c82f8d2 100644 --- a/init_devices.php +++ b/init_devices.php @@ -4,11 +4,9 @@ require 'inc/class.db.php'; require 'nest-api-master/nest.class.php'; -define('USERNAME', $config['nest_user']); -define('PASSWORD', $config['nest_pass']); date_default_timezone_set($config['local_tz']); -$nest = new Nest(); +$nest = new Nest($config['nest_user'], $config['nest_pass']); try { $db = new DB($config); $devices= $nest->getDevices(); diff --git a/test.php b/test.php index 490f5c9..12c792b 100644 --- a/test.php +++ b/test.php @@ -3,11 +3,9 @@ require 'inc/config.php'; require 'nest-api-master/nest.class.php'; -define('USERNAME', $config['nest_user']); -define('PASSWORD', $config['nest_pass']); date_default_timezone_set($config['local_tz']); -$nest = new Nest(); +$nest = new Nest($config['nest_user'], $config['nest_pass']); $devices= $nest->getDevices(); foreach($devices as $serial) { From e7799b0ef194396cd980402ea13f7ae28fe1be47 Mon Sep 17 00:00:00 2001 From: Christian Oyarzun Date: Sun, 6 Jul 2014 16:33:48 -0400 Subject: [PATCH 21/36] updated insert energy for multiple nests --- insertEnergy.php | 94 ++++++++++++++++++++++++++++-------------------- 1 file changed, 55 insertions(+), 39 deletions(-) diff --git a/insertEnergy.php b/insertEnergy.php index 86d283a..894c9a8 100644 --- a/insertEnergy.php +++ b/insertEnergy.php @@ -6,54 +6,70 @@ try { $db = new DB($config); - $energy = get_nest_data(); - foreach ($energy->days as $day) - { - foreach ($day->events as $key => $events) + if ($result = $db->res->query("SELECT id, serial FROM devices")) { + while ($row = mysqli_fetch_row($result)) { - if ($stmt = $db->res->prepare("REPLACE INTO events_data (eventNum, eventDate, start, end, type, touched_by, touched_when, touched_timezone_offset, touched_where, heat_temp, cool_temp, continuation, event_touched_by) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)")) + $energy = get_nest_data($row[1]); + + foreach($energy->objects as $object) { - $stmt->bind_param("isiiiiiiiiiii", $key, $day->day, $events->start, $events->end, $events->type, $events->touched_by, $events->touched_when, $events-> touched_timezone_offset, $events->touched_where, $events->heat_temp, $events->cool_temp, $events->continuation, $events->event_touched_by); - $stmt->execute(); - $stmt->close(); - } - } + $value = $object->value; + foreach ($value->days as $day) + { + foreach ($day->events as $key => $events) + { + if ($stmt = $db->res->prepare("REPLACE INTO events_data (device_id, eventNum, eventDate, start, end, type, touched_by, touched_when, touched_timezone_offset, touched_where," . + "heat_temp, cool_temp, continuation, event_touched_by) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)")) + { + $stmt->bind_param("iisiiiiiiiiiii", $row[0], $key, $day->day, $events->start, $events->end, $events->type, $events->touched_by, $events->touched_when, + $events-> touched_timezone_offset, $events->touched_where, $events->heat_temp, $events->cool_temp, $events->continuation, $events->event_touched_by); + $stmt->execute(); + $stmt->close(); + } + } - if ($stmt = $db->res->prepare("DELETE FROM events_data where eventNum > $key AND eventDate = '$day->day'")) - { - $stmt->execute(); - $stmt->close(); - } - unset($key); - - foreach ($day->cycles as $key => $cycles) - { - if ($stmt = $db->res->prepare("REPLACE INTO cycles_data (cycleNum, cycleDate, start, duration, type) VALUES (?,?,?,?,?)")) - { - $stmt->bind_param("isiii", $key, $day->day, $cycles->start, $cycles->duration, $cycles->type); - $stmt->execute(); - $stmt->close(); - } - } + if (isset($key) && $stmt = $db->res->prepare("DELETE FROM events_data where eventNum > $key AND eventDate = '$day->day' AND device_id = $row[0]")) + { + $stmt->execute(); + $stmt->close(); + } + unset($key); + + foreach ($day->cycles as $key => $cycles) + { + if ($stmt = $db->res->prepare("REPLACE INTO cycles_data (device_id, cycleNum, cycleDate, start, duration, type) VALUES (?,?,?,?,?,?)")) + { + $stmt->bind_param("iisiii", $row[0], $key, $day->day, $cycles->start, $cycles->duration, $cycles->type); + $stmt->execute(); + $stmt->close(); + } + } - if ($stmt = $db->res->prepare("DELETE FROM cycles_data where cycleNum > $key AND cycleDate = '$day->day'")) - { - $stmt->execute(); - $stmt->close(); - } - unset($key); - - if ($stmt = $db->res->prepare("REPLACE INTO energy_data (energyDate, device_timezone_offset, total_heating_time, total_cooling_time, total_fan_cooling_time, total_humidifier_time, total_dehumidifier_time, leafs, whodunit, recent_avg_used, usage_over_avg) VALUES (?,?,?,?,?,?,?,?,?,?,?)")) - { - $stmt->bind_param("siiiiiiiiii", $day->day, $day->device_timezone_offset, $day->total_heating_time, $day->total_cooling_time, $day->total_fan_cooling_time, $day->total_humidifier_time, $day->total_dehumidifier_time, $day->leafs, $day->whodunit, $day->recent_avg_used, $day->usage_over_avg); - $stmt->execute(); - $stmt->close(); + if (isset($key) && $stmt = $db->res->prepare("DELETE FROM cycles_data where cycleNum > $key AND cycleDate = '$day->day' AND device_id = $row[0]")) + { + $stmt->execute(); + $stmt->close(); + } + unset($key); + + if ($stmt = $db->res->prepare("REPLACE INTO energy_data (device_id, energyDate, device_timezone_offset, total_heating_time, total_cooling_time, total_fan_cooling_time," . + "total_humidifier_time, total_dehumidifier_time, leafs, whodunit, recent_avg_used, usage_over_avg) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)")) + { + $stmt->bind_param("isiiiiiiiiii", $row[0], $day->day, $day->device_timezone_offset, $day->total_heating_time, $day->total_cooling_time, $day->total_fan_cooling_time, + $day->total_humidifier_time, $day->total_dehumidifier_time, $day->leafs, $day->whodunit, $day->recent_avg_used, $day->usage_over_avg); + $stmt->execute(); + $stmt->close(); + } + } + } + } + mysqli_free_result($result); } $db->close(); } catch (Exception $e) { $errors[] = ("DB connection error! " . $e->getMessage() . "."); } -?> \ No newline at end of file +?> From 5e0f7b219f98bccad88e297052a481f2da53427f Mon Sep 17 00:00:00 2001 From: Jan Collijs Date: Mon, 9 Jun 2014 18:57:30 +0200 Subject: [PATCH 22/36] Cherrypick 'b54653fde0bf534b159f3aaa018d5b1dde87c616' --- .gitignore | 2 ++ nest-api-master | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index cba464f..42e3fe3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ config.php nest-api-master* +.htpasswd +.htaccess diff --git a/nest-api-master b/nest-api-master index f31b80c..f904929 160000 --- a/nest-api-master +++ b/nest-api-master @@ -1 +1 @@ -Subproject commit f31b80c2d48ded7cd3f86f6eb65c4e146dcbda63 +Subproject commit f904929c9dcddcf0e238468653bfca436ac2aa75 From da5dbd56c0a27445e13dd88de6f43eabf8dbe871 Mon Sep 17 00:00:00 2001 From: kesslerm Date: Sat, 9 Aug 2014 22:37:59 -0600 Subject: [PATCH 23/36] Add yahoo-api to submodules --- .gitignore | 1 + .gitmodules | 3 +++ yahoo-api-master | 1 + 3 files changed, 5 insertions(+) create mode 160000 yahoo-api-master diff --git a/.gitignore b/.gitignore index 42e3fe3..4d2c00b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ config.php nest-api-master* +yahoo-api-master* .htpasswd .htaccess diff --git a/.gitmodules b/.gitmodules index 26442be..8666799 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "nest-api-master"] path = nest-api-master url = https://github.com/gboudreau/nest-api.git +[submodule "yahoo-api-master"] + path = yahoo-api-master + url = https://github.com/phront/Yahoo-Weather-API-PHP-class.git diff --git a/yahoo-api-master b/yahoo-api-master new file mode 160000 index 0000000..a47cf30 --- /dev/null +++ b/yahoo-api-master @@ -0,0 +1 @@ +Subproject commit a47cf30b4369ee5af9edecfc10f180e4dbf43971 From 345d16308e166dd3b58896ba1060e03617af37ff Mon Sep 17 00:00:00 2001 From: kesslerm Date: Sat, 9 Aug 2014 23:10:13 -0600 Subject: [PATCH 24/36] Update website screenshot to show full plots --- nestgraph-screenshot.png | Bin 103489 -> 111714 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/nestgraph-screenshot.png b/nestgraph-screenshot.png index ed688edd1fa945b00644d7e2d11946ce34b14542..a3741ef4d799d6f1844ce76158d9f5ab5b736a41 100644 GIT binary patch literal 111714 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 z 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
    Wi;JtirA7qi*1= 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
      1tU@Uy!2tB<50YXDFE*iI6!9AjM0UR(N65I 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 z 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 U=2q7M`|pAtJ=A(o3b6?JKdl3{e*gdg From 6123e536fdbb071f7872f0cdab62590091a56d62 Mon Sep 17 00:00:00 2001 From: kesslerm Date: Thu, 14 Aug 2014 20:17:57 -0600 Subject: [PATCH 25/36] Rescale Temperatures on Energy plot a tiny bit --- main.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/main.js b/main.js index 3a5ee18..932b8c1 100644 --- a/main.js +++ b/main.js @@ -359,10 +359,10 @@ this_plot.y.domain(y_domain); this_brush_plot.y.domain(y_domain); - var y_temperature_domain = [-50, //d3.min(temperature_array.daily_temperature_min, function(d) { return d.val;} ), + var y_temperature_domain = [-10, //d3.min(temperature_array.daily_temperature_min, function(d) { return d.val;} ), d3.max(temperature_array.daily_temperature_max, function(d) { return d.val;} ) ]; - y_temperature_domain[0] -= y_temperature_domain[0]*.1; - y_temperature_domain[1] += y_temperature_domain[1]*.1; + y_temperature_domain[0] -= y_temperature_domain[0]*.05; + y_temperature_domain[1] += y_temperature_domain[1]*.05; this_plot.y2.domain(y_temperature_domain); From 20f3aea51f2769e13a2f7c139ec3a4a57045162c Mon Sep 17 00:00:00 2001 From: Jonas Zimmermann Date: Sat, 3 Jan 2015 18:41:26 -0800 Subject: [PATCH 26/36] change units to C --- insert.php | 16 +-- main.js | 315 +++++++++++++++++++++++++++-------------------------- 2 files changed, 166 insertions(+), 165 deletions(-) diff --git a/insert.php b/insert.php index 4b60372..f1eacaa 100644 --- a/insert.php +++ b/insert.php @@ -8,26 +8,26 @@ try { $db = new DB($config); - $yahoo = new YahooWeather((int)$config["local_woeid"]); + $yahoo = new YahooWeather((int)$config["local_woeid"], 'c'); $temperature = sprintf("%.02f", $yahoo->getTemperature(false)); $humid = sprintf("%.02f", $yahoo->getHumidity(false)); $pressure = sprintf("%.02f", $yahoo->getPressure(false)); //echo "Temperature:" . $temperature . "\n"; - - + + if ($result = $db->res->query("SELECT id, serial FROM devices")) { while ($row = mysqli_fetch_row($result)) { $data = get_nest_data($row[1]); //print_r($data); - - if (!empty($data['timestamp'])) + + if (!empty($data['timestamp'])) { if ($stmt = $db->res->prepare("REPLACE INTO data (device_id, timestamp, heating, cooling, fan, autoAway, manualAway, leaf, target, target2, current, humidity, outsideTemperature,outsideHumidity,outsidePressure, updated) " . - "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,NOW())")) + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,NOW())")) { - $stmt->bind_param("isiiiiiidddiiii", $row[0], $data['timestamp'], $data['heating'], $data['cooling'], $data['fan'], $data['autoAway'], $data['manualAway'], $data['leaf'], + $stmt->bind_param("isiiiiiidddiiii", $row[0], $data['timestamp'], $data['heating'], $data['cooling'], $data['fan'], $data['autoAway'], $data['manualAway'], $data['leaf'], $data['target_temp'], $data['target_temp2'], $data['current_temp'], $data['humidity'],$temperature, $humid, $pressure); - if (!$stmt->execute()) + if (!$stmt->execute()) { echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; } diff --git a/main.js b/main.js index 932b8c1..a6ef04e 100644 --- a/main.js +++ b/main.js @@ -4,24 +4,24 @@ var device_id = 1; // change this if you want to limit the amount of data pulled - var hours = 24 * 5; - + var hours = 24 * 30; + var first_date = "2014-05-16 00:00:00"; - + var graph_info = { fullWidth : window.innerWidth * 0.97, - + fullHeight : window.innerHeight * 0.95, - + get_plot_info_var : function(name){ var i; for( i = 0; i < this.plot_info_arr.length; i += 1) { if(this.plot_info_arr[i].name === name) { return this.plot_info_arr[i]; } - } + } }, - + plot_info_arr : [ { name : "Energy", @@ -30,7 +30,7 @@ margin : {top: 60, right: 60, bottom: 0, left: 50}, hasRightAxis : true }, - + { name : "Energy Brush", height : 100, @@ -38,7 +38,7 @@ margin : {top: 60, right: 60, bottom: 0, left: 50}, hasRightAxis : false }, - + { name : "Log Data", height : window.innerWidth * 0.80 * .5, @@ -46,7 +46,7 @@ margin : {top: 60, right: 60, bottom: 0, left: 50}, hasRightAxis : true }, - + { name : "Events", height : 400, @@ -62,14 +62,14 @@ hasRightAxis : false }, ], - + set_x_y_scale : function() { var i; for( i = 0; i < this.plot_info_arr.length; i += 1) { var this_plot = this.plot_info_arr[i]; var x = d3.time.scale().range([0, this_plot.width]); var y = d3.scale.linear().range([this_plot.height, 0]); - + this_plot.x = x; this_plot.y = y; this_plot.y2 = y2; @@ -77,7 +77,7 @@ scale(x) .orient("bottom") .ticks(this_plot.width/80); - + this_plot.yAxis = d3.svg.axis() .scale(y) .orient("left"); @@ -91,30 +91,30 @@ } this.calc_height(); }, - + calc_height : function() { var total_height = 0; for( i = 0; i < this.plot_info_arr.length; i += 1) { this.plot_info_arr[i].height_offset = total_height; total_height += this.plot_info_arr[i].margin.top + this.plot_info_arr[i].height; - + } this.fullHeight = total_height + 50; //Leave a margin of on the bottom }, - + append_plots : function(svg) { var i; var total_offset = 0; for( i = 0; i < this.plot_info_arr.length; i += 1) { var this_plot = this.plot_info_arr[i]; total_offset += this_plot.margin.top; - + this_plot.svg_plot = svg.append("g") .attr("transform", "translate(" + this_plot.margin.left + "," + total_offset + ")"); total_offset += this_plot.height; } }, - + clearData : function() { var i; var total_offset = 0; @@ -126,9 +126,9 @@ this_plot.svg_plot.selectAll(".y.axis").remove(); } } - + }; - + var line_colors = { colors: { heating: d3.rgb('#993300'), @@ -148,11 +148,11 @@ daily_temperature_average: d3.rgb('#621d30'), daily_temperature_min: d3.rgb('#4169e1'), daily_temperature_max: d3.rgb('#cd0000') - + }, - + random_color: d3.scale.category10(), - + get_color: function(key) { var color = this.colors[key]; if( color == undefined) { @@ -160,15 +160,15 @@ } return color; } - + }; - + String.prototype.capitalizeFirst = function() { return this.charAt(0).toUpperCase() + this.slice(1); } graph_info.set_x_y_scale(); - + //console.log("Length: " + graph_info.plot_info_arr.length); parseDate = d3.time.format("%Y-%m-%d %H:%M:%S").parse; @@ -192,7 +192,7 @@ .attr("height", graph_info.plot_info_arr[0].height); graph_info.append_plots(svg); - + var brush_update_in_progress = false; // callback function for d3 brush object @@ -200,7 +200,7 @@ brush_main_plot = graph_info.plot_info_arr[0]; brush_small_plot = graph_info.plot_info_arr[1]; brush_main_plot.x.domain(brush.empty() ? brush_small_plot.x.domain() : brush.extent()); - + //console.log(brush.extent()); brush_domain = brush.extent(); brush_domain_time = []; @@ -208,22 +208,22 @@ brush_domain_time[0] = short_date_format(brush_domain[0]); brush_domain_time[1] = short_date_format(new Date(+brush_domain[1] + 86400000)); //console.log(brush_domain_time); - + //Prevent multiple redraws/queries while brush is moving if(brush_update_in_progress === false) { brush_update_in_progress = true; - setTimeout(function() { - fetchData(brush_domain_time); + setTimeout(function() { + fetchData(brush_domain_time); //fetchCycles(brush_domain_time); brush_update_in_progress = false;}, 250); } - + /* brush_main_plot.svg_plot.select(".x.axis").call(brush_main_plot.xAxis); brush_main_plot.x.domain(brush_domain); - + //brush_main_plot.svg_plot.focus.select(".x.axis").call(xAxis); - + brush_main_plot.rect.selectAll("rect") .data(function(d) { return d.values; } ) .enter() @@ -237,66 +237,66 @@ */ /* brush_main_plot.svg_plot.selectAll("rect") - .attr("transform", "translate(" + d3.event.translate[0] + + .attr("transform", "translate(" + d3.event.translate[0] + ",0)scale(" + d3.event.scale + ", 1)"); */ /* brush_main_plot.svg_plot.selectAll(".plot path") - .attr("d", function(d) { - return brush_main_plot.line(d.values); + .attr("d", function(d) { + return brush_main_plot.line(d.values); }) - + */ }; - + function computeAverageTemp(timeRange) { var fetch_string; var parsed_data; if(typeof(timeRange) !== "undefined") { fetch_string = "id=" + device_id + "&start=\"" + timeRange[0] + "\"&end=\"" + timeRange[1] + "\"" + "&data=dailyTemp"; - + d3.json("fetch.php?" + fetch_string, function(error, data) { - parsed_data = data; + parsed_data = data; }); } return parsed_data; }; - + function fetchEnergy() { // fetch the data d3.json("fetch.php?id=" + device_id + "&hrs=" + hours + "&data=energy", function(error, data) { this_plot = graph_info.get_plot_info_var("Energy");; this_brush_plot = graph_info.get_plot_info_var("Energy Brush"); //console.log(data); - + var data_array = []; var temperature_array = { daily_temperature_average : [], daily_temperature_max : [], daily_temperature_min : [] }; - - + + data.forEach(function(d) { for( var key in d) { var xcolor = "black"; var xval = 0; if (key == "cooling") { xval = d.cooling / 60; - } + } else if (key == "heating") { - xval = d.heating / 60; + xval = d.heating / 60; } else if (key == "fan") { xval = d.fan / 60; - } + } else if (key == "humid") { xval = d.humid / 60; } else if (key == "dehumid") { xval = d.dehumid / 60; } - + if(xval !== 0) { data_array.push( { name: key, @@ -306,22 +306,22 @@ } ); } } - + //Parse the date d.date = parseDate(d.timestamp); - + //Simply reload to get the appropriate values if(d.temperature_avg == null) { var earliest_date = parseDate(first_date); if(+d.date > +earliest_date) - { + { var date_range = []; var short_date_format = d3.time.format("%Y-%m-%d"); date_range[0] = short_date_format(d.date); date_range[1] = short_date_format(new Date(+d.date + 86400000)); value_array = computeAverageTemp(date_range); - + if(value_array != undefined) { temperature_array.daily_temperature_average.push( { date: d.date, @@ -342,30 +342,30 @@ temperature_array.daily_temperature_min.push( { date: d.date, val: parseInt(d.temperature_min)}); } - + }); - - + + // define the x-domains (i.e. min and max of actual date values) var date_domain = d3.extent(data, function(d) { return d.date; }); //console.log (date_domain); date_domain[1] = new Date(+date_domain[1] + 86400000); //add an extra day this_plot.x.domain(date_domain); this_brush_plot.x.domain(date_domain); - + // define the y-domains (i.e. min and max of the union of all the trendlines) var y_domain = [0, d3.max(data_array, function(d) { return d.val; } ) * 1.1 ]; this_plot.y.domain(y_domain); this_brush_plot.y.domain(y_domain); - - var y_temperature_domain = [-10, //d3.min(temperature_array.daily_temperature_min, function(d) { return d.val;} ), + + var y_temperature_domain = [-10, //d3.min(temperature_array.daily_temperature_min, function(d) { return d.val;} ), d3.max(temperature_array.daily_temperature_max, function(d) { return d.val;} ) ]; y_temperature_domain[0] -= y_temperature_domain[0]*.05; - y_temperature_domain[1] += y_temperature_domain[1]*.05; - this_plot.y2.domain(y_temperature_domain); - - + y_temperature_domain[1] += y_temperature_domain[1]*.05; + this_plot.y2.domain(y_temperature_domain); + + // draw nest_data_plot x axis this_plot.svg_plot.append("g") @@ -383,7 +383,7 @@ .attr("dy", ".71em") .style("text-anchor", "end") .text("Duration (Minutes)"); - + // draw the temperature y axis this_plot.svg_plot.append("g") .attr("class", "y axis nest_data_plot") @@ -394,14 +394,14 @@ .attr("y", -12) .attr("dy", ".71em") .style("text-anchor", "end") - .text("Temperature (degrees F)"); - + .text("Temperature (degrees C)"); + // draw the brush plot x-axis this_brush_plot.svg_plot.append("g") .attr("class", "x axis brush") .attr("transform", "translate(0," + this_brush_plot.height + ")") .call(this_brush_plot.xAxis); - + // draw the brush plot y-axis this_brush_plot.svg_plot.append("g") .attr("class", "y axis brush") @@ -412,7 +412,7 @@ .attr("dy", ".71em") .style("text-anchor", "end") .text("Duration (Minutes)"); - + // draw the energy data stacked histogram this_plot.svg_plot.selectAll(".plot.energies") .data(data_array.sort(function(a, b){return b.val-a.val})) //Sort the data so smaller rects are drawn over larger. @@ -425,7 +425,7 @@ .attr("height", function(d) { return this_plot.height - this_plot.y(d.val); }) .attr("fill", function(d) { return d.color; }) .attr("fill-opacity", 1); - + // draw some transparent full height rectangles that have a tooltip for each day with all the values var rect_tooltip_date_format = d3.time.format("%Y-%m-%d (%a)"); this_plot.svg_plot.selectAll(".plot.energies") @@ -450,7 +450,7 @@ "leaf: " + d.leaf; return tooltip_string; }); - + // bind data to the brush plot this_brush_plot.svg_plot.selectAll(".plot.energies") .data(data_array.sort(function(a, b){return b.val-a.val})) @@ -463,7 +463,7 @@ .attr("height", function(d) { return this_brush_plot.height - this_brush_plot.y(d.val); }) .attr("fill", function(d) { return d.color; }) .attr("fill-opacity", 1); - + // draw the d3 pan/zoom "brush" object this_brush_plot.svg_plot.append("g") .attr("class", "x brush") @@ -471,12 +471,12 @@ .selectAll("rect") .attr("y", -6) .attr("height", this_brush_plot.height + 7); - + var line = d3.svg.line() .interpolate("basis") .x(function(d) { return this_plot.x(d.date); }) .y(function(d) { return this_plot.y2(d.val); }); - + for (var key in temperature_array){ if (temperature_array.hasOwnProperty(key)) { this_plot.svg_plot @@ -486,7 +486,7 @@ .style("stroke", line_colors.get_color(key)); } } - + } //End fetchEnergy() )}; @@ -503,20 +503,20 @@ d3.json("fetch.php?" + fetch_string, function(error, data) { this_plot = graph_info.get_plot_info_var("Log Data"); events_plot = graph_info.get_plot_info_var("Events"); - - + + this_plot.svg_plot.selectAll(".plot").remove(); this_plot.svg_plot.selectAll(".x.axis").remove(); this_plot.svg_plot.selectAll(".y.axis").remove(); svg.selectAll(".legend").remove(); - + events_plot.svg_plot.selectAll(".plot").remove(); events_plot.svg_plot.selectAll(".x.axis").remove(); events_plot.svg_plot.selectAll(".y.axis").remove(); - - color.domain(d3.keys(data[0]).filter(function(key) { return (key == "current" || key == "target" //|| key == "target2" - || key == "humidity" || key == "outsideTemperature" || key == "outsideHumidity" || key == "outsidePressure" - || key == 'heating' || key == 'cooling' || key == 'fan' || key == 'autoAway' + + color.domain(d3.keys(data[0]).filter(function(key) { return (key == "current" || key == "target" //|| key == "target2" + || key == "humidity" || key == "outsideTemperature" || key == "outsideHumidity" || key == "outsidePressure" + || key == 'heating' || key == 'cooling' || key == 'fan' || key == 'autoAway' || key == 'manualAway' || key == 'leaf'); })); data.forEach(function(d) { d.date = parseDate(d.timestamp); @@ -528,7 +528,7 @@ values: data.map(function(d) { var xval = +d[name]; switch(name) { - case "heating": + case "heating": xval += 12; break; case "cooling" : @@ -562,20 +562,20 @@ if(name == "target2") { return { date: d.date, val: d[name] }; } - //if( d[name] == null) - //else + //if( d[name] == null) + //else //return { date: d.date, val: +d[name] }; else xmode = "black"; if (d["cooling"] == 1) { xmode = "blue"; - } + } else if (d["heating"] == 1) { - xmode = "red"; - } - - return { date: d.date, - val: xval, + xmode = "red"; + } + + return { date: d.date, + val: xval, mode: xmode, color: line_colors.get_color(name) }; @@ -585,24 +585,25 @@ return x; }); - + // define the x-domains (i.e. min and max of actual date values) var x_domain = d3.extent(data, function(d) { return d.date; }); this_plot.x.domain(x_domain); - + // define the y-domains (i.e. min and max of the union of all the trendlines) this_plot.y.domain([ - +d3.min(points, function(c) { if (c.name == "target" //|| (c.name == "target2" && c.values != null) + +d3.min(points, function(c) { if (c.name == "target" //|| (c.name == "target2" && c.values != null) || c.name == "current" || c.name == "outsideTemperature" - || c.name == "outsidePressure" ) { return d3.min(c.values, function(v) { return v.val }); } else { return undefined; } }) - 1, - +d3.max(points, function(c) { return d3.max(c.values, function(v) { return v.val }); }) + 1 + +d3.max(points, function(c) { if (c.name == "target" //|| (c.name == "target2" && c.values != null) + || c.name == "current" || c.name == "outsideTemperature" + ) { return d3.max(c.values, function(v) { return v.val }); } else { return undefined; } }) + 1 ]); this_plot.y2.domain([ - +d3.min(points, function(c) { if (c.name == "humidity" || c.name == "outsideHumidity" ) { return d3.min(c.values, function(v) { return v.val }); } else { return undefined; } }) - 1, - +d3.max(points, function(c) { if (c.name == "humidity" || c.name == "outsideHumidity" ) { return d3.max(c.values, function(v) { return v.val }); } else { return undefined; } }) + 1 + +d3.min(points, function(c) { if (c.name == "humidity" || c.name == "outsideHumidity" || c.name == "outsidePressure" ) { return d3.min(c.values, function(v) { return v.val }); } else { return undefined; } }) - 1, + +d3.max(points, function(c) { if (c.name == "humidity" || c.name == "outsideHumidity" || c.name == "outsidePressure" ) { return d3.max(c.values, function(v) { return v.val }); } else { return undefined; } }) + 1 ]); - + //Setup the events plot axis events_plot.x.domain(x_domain); events_plot.y.domain([0, 14]); // Fixed number of events all 0/1 @@ -622,8 +623,8 @@ .attr("y", 6) .attr("dy", ".71em") .style("text-anchor", "end") - .text("Temperature (F)"); - + .text("Temperature (C)"); + this_plot.svg_plot.append("g") .attr("class", "y axis nest_data_plot") .attr("transform", "translate(" + (this_plot.width+15) + ",0)") @@ -634,7 +635,7 @@ .attr("dy", ".71em") .style("text-anchor", "end") .text("Humidity (%)"); - + // draw events x axis events_plot.svg_plot.append("g") .attr("class", "x axis events") @@ -651,42 +652,42 @@ .attr("dy", ".71em") .style("text-anchor", "end") .text("Event"); - + // bind nest_data_plot current/trendlines this_plot.svg_plot.selectAll(".plot.temps") - .data(points.filter(function(f) { return (f.name == 'current' || f.name == 'outsideTemperature' - || f.name == "outsideHumidity" || f.name == "outsidePressure" + .data(points.filter(function(f) { return (f.name == 'current' || f.name == 'outsideTemperature' + || f.name == "outsideHumidity" || f.name == "outsidePressure" || f.name == 'humidity' || f.name == 'target' || (f.name == 'target2' && f.values != null) ); })) .enter().append("g") .attr("class", function(d) { return "plot temps " + d.name; }); - - + + // bind date for events events_plot.svg_plot.selectAll(".plot.temps") - .data(points.filter(function(f) { return (f.name == 'heating' || f.name == 'cooling' || f.name == 'fan' || f.name == 'autoAway' || + .data(points.filter(function(f) { return (f.name == 'heating' || f.name == 'cooling' || f.name == 'fan' || f.name == 'autoAway' || f.name == 'manualAway' || f.name == 'leaf'); })) .enter().append("g") .attr("class", function(d) { return "plot temps " + d.name; }); - + //Create the line objects once var line = d3.svg.line() .interpolate("basis") .x(function(d) { return this_plot.x(d.date); }) .y(function(d) { return this_plot.y(d.val); }); - + var lineStepafter = d3.svg.line() .interpolate("step-after") .x(function(d) { return this_plot.x(d.date); }) .y(function(d) { return this_plot.y(d.val); }); - + var lineRight = d3.svg.line() .interpolate("basis") .x(function(d) { return this_plot.x(d.date); }) .y(function(d) { return this_plot.y2(d.val); }); - + //All events are step after (logical 0/1) if (typeof events_plot.lineStepafter === 'undefined') { events_plot.lineStepafter = d3.svg.line() @@ -699,30 +700,30 @@ this_plot.svg_plot.selectAll(".plot") .append("path") .attr("class", "line") - .attr("d", function(d) { + .attr("d", function(d) { if (d.name == "current" || d.name == "outsideTemperature" - || d.name == "outsidePressure" ) - return line(d.values); - else if (d.name == "humidity" || d.name == "outsideHumidity" ) - return lineRight(d.values); + ) + return line(d.values); + else if (d.name == "humidity" || d.name == "outsideHumidity" || d.name == "outsidePressure") + return lineRight(d.values); else - return lineStepafter(d.values); + return lineStepafter(d.values); }) - .style("stroke", function(d) { - return d.values[0].color; + .style("stroke", function(d) { + return d.values[0].color; }) .style('pointer-events', 'none'); //.attr("clip-path", "url(#clip)"); - + // draw events plots events_plot.svg_plot.selectAll(".plot") .append("path") .attr("class", "line") - .attr("d", function(d) { - return events_plot.lineStepafter(d.values); + .attr("d", function(d) { + return events_plot.lineStepafter(d.values); }) - .style("stroke", function(d) { - return d.values[0].color; + .style("stroke", function(d) { + return d.values[0].color; }) .style('pointer-events', 'none'); @@ -733,28 +734,28 @@ .attr("clip-path", "url(#clip)"); // draw the circles with tooltips - format = d3.time.format("%a %b %-d %Y %-I:%M:%S %p"); + format = d3.time.format("%a %-d %b %Y %H:%M:%S"); this_plot.svg_plot.selectAll(".circles").selectAll(".thecircles") .data((points.filter(function(f) { return f.name == 'current'; }))[0].values) .enter().append("circle") - .attr("cx", function(d) { return this_plot.x(d.date); }) - .attr("cy", function(d) { return this_plot.y(d.val); }) - .attr("r", 5) + .attr("cx", function(d) { return this_plot.x(d.date); }) + .attr("cy", function(d) { return this_plot.y(d.val); }) + .attr("r", 5) .attr("stroke", function(d) { return (d.mode); }) .attr("fill", function(d) { return (d.mode); }) - .attr("opacity", 0.2) + .attr("opacity", 0.2) .append("svg:title").text(function(d) { return format(d.date) + "\n" + d.val + "\u00B0 F"; }); - - // draw legend + + // draw legend legend = svg.append("g") .attr("class", "legend") .attr("x", 365) .attr("y", this_plot.height_offset + this_plot.height) .attr("height", 100) .attr("width", 100); - + legend.selectAll('g') .data(points.filter(function(f) { return f.name != 'target2'; })) .enter() @@ -767,7 +768,7 @@ .attr("width", 10) .attr("height", 10) .style("fill", function(d) { return d.values[0].color; }); - + g.append("text") .attr("x", this_plot.width + 105) .attr("y", this_plot.height_offset + this_plot.height + i * 25 + 8) @@ -775,9 +776,9 @@ .attr("width",100) .style("fill", function(d) { return d.values[0].color; }) .text(d.name); - + }); - + //Add a mouseover event that draws a line and updates the values at this location /* var marker = this_plot.svg_plot.append('g') @@ -789,7 +790,7 @@ .style('pointer-events', 'none') .style('stroke', '#FB5050') .style('stroke-width', '3px'); - + this_plot.svg_plot .on('mouseover', function() { marker.style('display', 'inherit'); @@ -804,13 +805,13 @@ .attr('cy', mouse[1]); }); */ - - + + //End for data fetchCycles (timeRange, x_domain); }); }; - + function fetchCycles (timeRange, domain) { var fetch_string; if(typeof(timeRange) !== "undefined") { @@ -819,16 +820,16 @@ else { fetch_string = "id=" + device_id + "&hrs=" + hours + "&data=cycles"; } - + // fetch the data //console.log(fetch_string); d3.json("fetch.php?" + fetch_string, function(error, data) { - this_plot = graph_info.get_plot_info_var("Cycles"); - + this_plot = graph_info.get_plot_info_var("Cycles"); + this_plot.svg_plot.selectAll(".plot").remove(); this_plot.svg_plot.selectAll(".x.axis").remove(); this_plot.svg_plot.selectAll(".y.axis").remove(); - + var data_array = []; var cycle_type_to_string = { 1 : "heating", @@ -836,9 +837,9 @@ 65536 : "fan", 81921 : "humidity" } - + data.forEach(function(d) { - + if(d.duration !== 0) { var start_date = parseDate(d.timestamp); @@ -853,9 +854,9 @@ duration: d.duration } ); } - + //Parse the date - d.date = parseDate(d.timestamp); + d.date = parseDate(d.timestamp); }); // define the x-domains (i.e. min and max of actual date values) @@ -870,18 +871,18 @@ //{ // this_plot.x.domain(domain); //} - - + + //match the x-domain to the events plot so they line up nicely. //var events_plot = graph_info.get_plot_info_var("Events"); //var events_x_domain = events_plot.x.domain(); //this_plot.x.domain(events_x_domain); - + // define the y-domains (i.e. min and max of the union of all the trendlines) var y_domain = [0, 1]; // This can be fixed since we're only drawing events in time this_plot.y.domain(y_domain); - - + + // draw nest_data_plot x axis this_plot.svg_plot.append("g") .attr("class", "x axis nest_data_plot") @@ -899,7 +900,7 @@ .attr("dy", ".71em") .style("text-anchor", "end") .text("Duration (Minutes)");*/ - + this_plot.svg_plot.selectAll(".plot.energies") .data(data_array.sort(function(a, b){return b.type-a.type})) .enter() @@ -913,7 +914,7 @@ .attr("fill-opacity", .8) .append("svg:title") .text(function(d) { - var tooltip_string = d.name.capitalizeFirst() + ":\n" + + var tooltip_string = d.name.capitalizeFirst() + ":\n" + "Start: " + d.start + "\n" + "End: " + d.end + "\n" + //fan doesn't ever seem to have non-zero values @@ -927,8 +928,8 @@ fetchEnergy(); fetchData(); //fetchCycles(); - - + + window.onload=function(){ document.getElementById("device_id").onchange= function () { @@ -941,7 +942,7 @@ brushUpdate(); } }; - + }; } From f8fe5e46aeac22d7e78b29dc8f525b6c054ddffa Mon Sep 17 00:00:00 2001 From: Jonas Zimmermann Date: Sun, 4 Jan 2015 00:07:28 -0800 Subject: [PATCH 27/36] change time tick format --- main.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/main.js b/main.js index a6ef04e..dd8dba2 100644 --- a/main.js +++ b/main.js @@ -8,6 +8,17 @@ var first_date = "2014-05-16 00:00:00"; + var customTimeFormat = d3.time.format.multi([ + [".%L", function(d) { return d.getMilliseconds(); }], + [":%S", function(d) { return d.getSeconds(); }], + ["%H:%M", function(d) { return d.getMinutes(); }], + ["%H:%M", function(d) { return d.getHours(); }], + ["%a %-d", function(d) { return d.getDay() && d.getDate() != 1; }], + ["%-d %b", function(d) { return d.getDate() != 1; }], + ["%B", function(d) { return d.getMonth(); }], + ["%Y", function() { return true; }] + ]); + var graph_info = { fullWidth : window.innerWidth * 0.97, @@ -76,7 +87,8 @@ this_plot.xAxis = d3.svg.axis(). scale(x) .orient("bottom") - .ticks(this_plot.width/80); + .ticks(this_plot.width/80) + .tickFormat(customTimeFormat); this_plot.yAxis = d3.svg.axis() .scale(y) From 7bcc3477fe2d042f4a8414d6da865e773d1f90ca Mon Sep 17 00:00:00 2001 From: Jonas Zimmermann Date: Sun, 4 Jan 2015 00:08:51 -0800 Subject: [PATCH 28/36] make humidity/pressure plot --- main.js | 139 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 114 insertions(+), 25 deletions(-) diff --git a/main.js b/main.js index dd8dba2..2a52854 100644 --- a/main.js +++ b/main.js @@ -52,11 +52,18 @@ { name : "Log Data", - height : window.innerWidth * 0.80 * .5, + height : window.innerWidth * 0.80 * .15, width : window.innerWidth * 0.80, margin : {top: 60, right: 60, bottom: 0, left: 50}, - hasRightAxis : true + hasRightAxis : false }, + { + name : "Humidity Data", + height : window.innerWidth * 0.80 * .15, + width : window.innerWidth * 0.80, + margin : {top: 60, right: 60, bottom: 0, left: 50}, + hasRightAxis : true + }, { name : "Events", @@ -390,8 +397,10 @@ .attr("class", "y axis nest_data_plot") .call(this_plot.yAxis) .append("text") - .attr("transform", "rotate(-90)") - .attr("y", 6) +// .attr("transform", "rotate(-90)") +// .attr("y", 6) + .attr("y", -23) + .attr("x", 50) .attr("dy", ".71em") .style("text-anchor", "end") .text("Duration (Minutes)"); @@ -402,8 +411,9 @@ .attr("transform", "translate(" + (this_plot.width+15) + ",0)") .call(this_plot.yRightAxis) .append("text") - .attr("transform", "rotate(-90)") - .attr("y", -12) + //.attr("transform", "rotate(-90)") + .attr("y", -23) + .attr("x", 50) .attr("dy", ".71em") .style("text-anchor", "end") .text("Temperature (degrees C)"); @@ -419,8 +429,9 @@ .attr("class", "y axis brush") .call(this_brush_plot.yAxis) .append("text") - .attr("transform", "rotate(-90)") - .attr("y", 6) + // .attr("transform", "rotate(-90)") + .attr("y", -23) + .attr("x", 50) .attr("dy", ".71em") .style("text-anchor", "end") .text("Duration (Minutes)"); @@ -514,6 +525,7 @@ //console.log(fetch_string); d3.json("fetch.php?" + fetch_string, function(error, data) { this_plot = graph_info.get_plot_info_var("Log Data"); + humid_plot = graph_info.get_plot_info_var("Humidity Data"); events_plot = graph_info.get_plot_info_var("Events"); @@ -522,6 +534,10 @@ this_plot.svg_plot.selectAll(".y.axis").remove(); svg.selectAll(".legend").remove(); + humid_plot.svg_plot.selectAll(".plot").remove(); + humid_plot.svg_plot.selectAll(".x.axis").remove(); + humid_plot.svg_plot.selectAll(".y.axis").remove(); + events_plot.svg_plot.selectAll(".plot").remove(); events_plot.svg_plot.selectAll(".x.axis").remove(); events_plot.svg_plot.selectAll(".y.axis").remove(); @@ -601,6 +617,7 @@ // define the x-domains (i.e. min and max of actual date values) var x_domain = d3.extent(data, function(d) { return d.date; }); this_plot.x.domain(x_domain); + humid_plot.x.domain(x_domain); // define the y-domains (i.e. min and max of the union of all the trendlines) this_plot.y.domain([ @@ -611,10 +628,17 @@ || c.name == "current" || c.name == "outsideTemperature" ) { return d3.max(c.values, function(v) { return v.val }); } else { return undefined; } }) + 1 ]); - this_plot.y2.domain([ - +d3.min(points, function(c) { if (c.name == "humidity" || c.name == "outsideHumidity" || c.name == "outsidePressure" ) { return d3.min(c.values, function(v) { return v.val }); } else { return undefined; } }) - 1, - +d3.max(points, function(c) { if (c.name == "humidity" || c.name == "outsideHumidity" || c.name == "outsidePressure" ) { return d3.max(c.values, function(v) { return v.val }); } else { return undefined; } }) + 1 + + humid_plot.y.domain([ + +d3.min(points, function(c) { if (c.name == "outsidePressure" + ) { return d3.min(c.values, function(v) { return v.val }); } else { return undefined; } }) - 1, + +d3.max(points, function(c) { if (c.name == "outsidePressure" + ) { return d3.max(c.values, function(v) { return v.val }); } else { return undefined; } }) + 1 ]); + humid_plot.y2.domain([0, 100]); +// +d3.min(points, function(c) { if (c.name == "humidity" || c.name == "outsideHumidity" ) { return d3.min(c.values, function(v) { return v.val }); } else { return undefined; } }) - 1, +// +d3.max(points, function(c) { if (c.name == "humidity" || c.name == "outsideHumidity" ) { return d3.max(c.values, function(v) { return v.val }); } else { return undefined; } }) + 1 +// ]); //Setup the events plot axis events_plot.x.domain(x_domain); @@ -631,23 +655,47 @@ .attr("class", "y axis nest_data_plot") .call(this_plot.yAxis) .append("text") - .attr("transform", "rotate(-90)") - .attr("y", 6) +// .attr("transform", "rotate(-90)") + .attr("y", -23) + .attr("x", 0) +// .attr("y", 6) .attr("dy", ".71em") - .style("text-anchor", "end") + .style("text-anchor", "middle") .text("Temperature (C)"); - this_plot.svg_plot.append("g") + // draw nest_data_plot x axis + humid_plot.svg_plot.append("g") + .attr("class", "x axis nest_data_plot") + .attr("transform", "translate(0," + humid_plot.height + ")") + .call(humid_plot.xAxis); + + // draw nest_data_plot y axis + humid_plot.svg_plot.append("g") .attr("class", "y axis nest_data_plot") - .attr("transform", "translate(" + (this_plot.width+15) + ",0)") - .call(this_plot.yRightAxis) + .call(humid_plot.yAxis) .append("text") - .attr("transform", "rotate(-90)") - .attr("y", -12) +// .attr("transform", "rotate(-90)") +// .attr("y", 6) + .attr("y", -23) + .attr("x", 0) .attr("dy", ".71em") - .style("text-anchor", "end") + .style("text-anchor", "middle") + .text("Pressure (hPa)"); + + humid_plot.svg_plot.append("g") + .attr("class", "y axis nest_data_plot") + .attr("transform", "translate(" + (humid_plot.width+15) + ",0)") + .call(humid_plot.yRightAxis) + .append("text") +// .attr("transform", "rotate(-90)") +// .attr("y", -12) + .attr("y", -23) + .attr("x", 0) + .attr("dy", ".71em") + .style("text-anchor", "middle") .text("Humidity (%)"); + // draw events x axis events_plot.svg_plot.append("g") .attr("class", "x axis events") @@ -659,17 +707,24 @@ .attr("class", "y axis events") .call(events_plot.yAxis) .append("text") - .attr("transform", "rotate(-90)") - .attr("y", 6) + .attr("y", -23) + .attr("x", 0) +// .attr("transform", "rotate(-90)") +// .attr("y", 6) .attr("dy", ".71em") - .style("text-anchor", "end") + .style("text-anchor", "middle") .text("Event"); // bind nest_data_plot current/trendlines this_plot.svg_plot.selectAll(".plot.temps") .data(points.filter(function(f) { return (f.name == 'current' || f.name == 'outsideTemperature' - || f.name == "outsideHumidity" || f.name == "outsidePressure" - || f.name == 'humidity' || f.name == 'target' || (f.name == 'target2' && f.values != null) ); })) + || f.name == 'target' || (f.name == 'target2' && f.values != null) ); })) + .enter().append("g") + .attr("class", function(d) { return "plot temps " + d.name; }); + + humid_plot.svg_plot.selectAll(".plot.temps") + .data(points.filter(function(f) { return ( f.name == "outsideHumidity" || f.name == "outsidePressure" + || f.name == 'humidity' ); })) .enter().append("g") .attr("class", function(d) { return "plot temps " + d.name; }); @@ -700,6 +755,22 @@ .y(function(d) { return this_plot.y2(d.val); }); + var lineH = d3.svg.line() + .interpolate("basis") + .x(function(d) { return humid_plot.x(d.date); }) + .y(function(d) { return humid_plot.y(d.val); }); + + var lineStepafterH = d3.svg.line() + .interpolate("step-after") + .x(function(d) { return humid_plot.x(d.date); }) + .y(function(d) { return humid_plot.y(d.val); }); + + var lineRightH = d3.svg.line() + .interpolate("basis") + .x(function(d) { return humid_plot.x(d.date); }) + .y(function(d) { return humid_plot.y2(d.val); }); + + //All events are step after (logical 0/1) if (typeof events_plot.lineStepafter === 'undefined') { events_plot.lineStepafter = d3.svg.line() @@ -727,6 +798,24 @@ .style('pointer-events', 'none'); //.attr("clip-path", "url(#clip)"); + humid_plot.svg_plot.selectAll(".plot") + .append("path") + .attr("class", "line") + .attr("d", function(d) { + if (d.name == "outsidePressure" + ) + return lineH(d.values); + else if (d.name == "humidity" || d.name == "outsideHumidity" ) + return lineRightH(d.values); + else + return lineStepafterH(d.values); + }) + .style("stroke", function(d) { + return d.values[0].color; + }) + .style('pointer-events', 'none'); + //.attr("clip-path", "url(#clip)"); + // draw events plots events_plot.svg_plot.selectAll(".plot") .append("path") From 93f8cde5f62db8badc1eb2fe6d42333ab90c0eef Mon Sep 17 00:00:00 2001 From: Jonas Zimmermann Date: Sun, 4 Jan 2015 10:23:54 -0800 Subject: [PATCH 29/36] change deg F to deg C --- main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.js b/main.js index 2a52854..e76bf62 100644 --- a/main.js +++ b/main.js @@ -846,7 +846,7 @@ .attr("fill", function(d) { return (d.mode); }) .attr("opacity", 0.2) .append("svg:title").text(function(d) { - return format(d.date) + "\n" + d.val + "\u00B0 F"; + return format(d.date) + "\n" + d.val + "\u00B0C"; }); // draw legend From 6b43ffcc7320c92c7f90fa9183e20e90b855a7ba Mon Sep 17 00:00:00 2001 From: Jonas Zimmermann Date: Sun, 4 Jan 2015 10:32:53 -0800 Subject: [PATCH 30/36] fix device id --- main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.js b/main.js index e76bf62..571e2f3 100644 --- a/main.js +++ b/main.js @@ -1035,7 +1035,7 @@ document.getElementById("device_id").onchange= function () { aList = document.getElementById("device_id"); - window.device_id = aList.options[aList.selectedIndex].value; + device_id = aList.options[aList.selectedIndex].value; graph_info.clearData(); fetchEnergy(); fetchData(); From f7dffc786eaaa5a3626dd1f6d1d6460972489081 Mon Sep 17 00:00:00 2001 From: kesslerm Date: Sat, 26 Mar 2016 23:17:07 -0600 Subject: [PATCH 31/36] Update to latest nest/yahoo APIs --- nest-api-master | 2 +- yahoo-api-master | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nest-api-master b/nest-api-master index f904929..605efdd 160000 --- a/nest-api-master +++ b/nest-api-master @@ -1 +1 @@ -Subproject commit f904929c9dcddcf0e238468653bfca436ac2aa75 +Subproject commit 605efddb17c80ac38c86a9c36f6a6705be2d3f8f diff --git a/yahoo-api-master b/yahoo-api-master index a47cf30..2308368 160000 --- a/yahoo-api-master +++ b/yahoo-api-master @@ -1 +1 @@ -Subproject commit a47cf30b4369ee5af9edecfc10f180e4dbf43971 +Subproject commit 2308368cdec15849a0119fbe1e8ab5eb07da1d99 From b866e8a886973c6f97e68c158719b53b7c338d7b Mon Sep 17 00:00:00 2001 From: kesslerm Date: Sun, 27 Mar 2016 00:13:24 -0600 Subject: [PATCH 32/36] Add config option for Temperature C/F Yahoo needs OAUTH to get weather as of 3/25/16. Disable for the short term --- inc/config.php.sample | 3 ++- index.php | 5 +++++ insert.php | 12 +++++++----- main.js | 10 +++++----- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/inc/config.php.sample b/inc/config.php.sample index 71cf636..f78e9c5 100644 --- a/inc/config.php.sample +++ b/inc/config.php.sample @@ -7,7 +7,8 @@ $config = array('db_ip' => '127.0.0.1', 'nest_user' => 'your_nest_username', 'nest_pass' => 'your_nest_password', 'local_tz' => 'America/New_York', // see http://php.net/manual/en/timezones.php - 'local_woeid' => '2459115' // Where On Earth ID for Yahoo! Weather (Search woeid lookup to convert zip/city, etc) + 'local_woeid' => '2459115', // Where On Earth ID for Yahoo! Weather (Search woeid lookup to convert zip/city, etc) + 'temperature_units' => 'F' //The units for temperature either 'C' or 'F' ); ?> \ No newline at end of file diff --git a/index.php b/index.php index 73877ea..2e33c13 100644 --- a/index.php +++ b/index.php @@ -18,6 +18,8 @@ $id = $_GET["id"]; } +$temperature_units = $config['temperature_units']; + try { $db = new DB($config); if ($stmt = $db->res->prepare("SELECT id,name from devices")) { @@ -38,6 +40,9 @@ + diff --git a/insert.php b/insert.php index f1eacaa..4aa8018 100644 --- a/insert.php +++ b/insert.php @@ -7,11 +7,13 @@ try { $db = new DB($config); - - $yahoo = new YahooWeather((int)$config["local_woeid"], 'c'); - $temperature = sprintf("%.02f", $yahoo->getTemperature(false)); - $humid = sprintf("%.02f", $yahoo->getHumidity(false)); - $pressure = sprintf("%.02f", $yahoo->getPressure(false)); + $temperature_units = strtolower($config['temperature_units']); + + //Yahoo now needs Oauth1 to get weather... fix later. + //$yahoo = new YahooWeather((int)$config["local_woeid"], $temperature_units); + $temperature = 0; //sprintf("%.02f", $yahoo->getTemperature(false)); + $humid = 0; //sprintf("%.02f", $yahoo->getHumidity(false)); + $pressure = 0; //sprintf("%.02f", $yahoo->getPressure(false)); //echo "Temperature:" . $temperature . "\n"; diff --git a/main.js b/main.js index 571e2f3..9130a0f 100644 --- a/main.js +++ b/main.js @@ -4,7 +4,7 @@ var device_id = 1; // change this if you want to limit the amount of data pulled - var hours = 24 * 30; + var hours = 24 * 5; var first_date = "2014-05-16 00:00:00"; @@ -52,7 +52,7 @@ { name : "Log Data", - height : window.innerWidth * 0.80 * .15, + height : window.innerWidth * 0.80 * .2, width : window.innerWidth * 0.80, margin : {top: 60, right: 60, bottom: 0, left: 50}, hasRightAxis : false @@ -416,7 +416,7 @@ .attr("x", 50) .attr("dy", ".71em") .style("text-anchor", "end") - .text("Temperature (degrees C)"); + .text("Temperature (" + temperature_units + ")"); // draw the brush plot x-axis this_brush_plot.svg_plot.append("g") @@ -661,7 +661,7 @@ // .attr("y", 6) .attr("dy", ".71em") .style("text-anchor", "middle") - .text("Temperature (C)"); + .text("Temperature (" + temperature_units + ")"); // draw nest_data_plot x axis humid_plot.svg_plot.append("g") @@ -846,7 +846,7 @@ .attr("fill", function(d) { return (d.mode); }) .attr("opacity", 0.2) .append("svg:title").text(function(d) { - return format(d.date) + "\n" + d.val + "\u00B0C"; + return format(d.date) + "\n" + d.val + "\u00B0 " + temperature_units; }); // draw legend From fad4e87b84fa1ff3f88343e273472c50f7303fd3 Mon Sep 17 00:00:00 2001 From: kesslerm Date: Sun, 27 Mar 2016 15:40:33 -0600 Subject: [PATCH 33/36] Get Temperature and Humidity working again with Yahoo's annoyingly useless oauth change. Pressure is in there, but it looks like they've changed the reporting to mmHg (but still claim inches)... to be looked into at some point. I also made a handful of chanages to yosdk so it can use the old forcast api (Didn't want to rework everything for yql at the moment). Overall, all the changes are quick and dirty, but they seem to work. I tried a lot of options for just basic authentication, but didn't have much luck utill pulling in yoskd. It seems callbacks cause errors in the documented yahoo apis and all the examples on the site are still for public use. A lot seems confused at the moment. --- .gitmodules | 2 +- inc/config.php.sample | 10 +++++++++- insert.php | 8 ++++---- yahoo-api-master | 2 +- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/.gitmodules b/.gitmodules index 8666799..666e4ed 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,4 +3,4 @@ url = https://github.com/gboudreau/nest-api.git [submodule "yahoo-api-master"] path = yahoo-api-master - url = https://github.com/phront/Yahoo-Weather-API-PHP-class.git + url = https://github.com/mycon/Yahoo-Weather-API-PHP-class.git diff --git a/inc/config.php.sample b/inc/config.php.sample index f78e9c5..69fbf9a 100644 --- a/inc/config.php.sample +++ b/inc/config.php.sample @@ -8,7 +8,15 @@ $config = array('db_ip' => '127.0.0.1', 'nest_pass' => 'your_nest_password', 'local_tz' => 'America/New_York', // see http://php.net/manual/en/timezones.php 'local_woeid' => '2459115', // Where On Earth ID for Yahoo! Weather (Search woeid lookup to convert zip/city, etc) - 'temperature_units' => 'F' //The units for temperature either 'C' or 'F' + 'temperature_units' => 'F', //The units for temperature either 'C' or 'F' + + // Your consumer key goes here. Get it at https://developer.yahoo.com/apps/create/ + 'yh_consumerKey' => '--', + // Your consumer key secret goes here. + 'yh_consumerKeySecret' => '', + + // Your application ID goes here. Get it at https://developer.yahoo.com/search-sdk/apps/ + 'yh_applicationId' => '' ); ?> \ No newline at end of file diff --git a/insert.php b/insert.php index 4aa8018..9651e2a 100644 --- a/insert.php +++ b/insert.php @@ -10,10 +10,10 @@ $temperature_units = strtolower($config['temperature_units']); //Yahoo now needs Oauth1 to get weather... fix later. - //$yahoo = new YahooWeather((int)$config["local_woeid"], $temperature_units); - $temperature = 0; //sprintf("%.02f", $yahoo->getTemperature(false)); - $humid = 0; //sprintf("%.02f", $yahoo->getHumidity(false)); - $pressure = 0; //sprintf("%.02f", $yahoo->getPressure(false)); + $yahoo = new YahooWeather($config['yh_consumerKey'], $config['yh_consumerKeySecret'], $config['yh_applicationId'], (int)$config["local_woeid"], $temperature_units); + $temperature = sprintf("%.02f", $yahoo->getTemperature(false)); + $humid = sprintf("%.02f", $yahoo->getHumidity(false)); + $pressure = sprintf("%.02f", $yahoo->getPressure(false)); //echo "Temperature:" . $temperature . "\n"; diff --git a/yahoo-api-master b/yahoo-api-master index 2308368..c554243 160000 --- a/yahoo-api-master +++ b/yahoo-api-master @@ -1 +1 @@ -Subproject commit 2308368cdec15849a0119fbe1e8ab5eb07da1d99 +Subproject commit c5542431c961738f257953bce79805996ebe5949 From 91fbce04d5c3d9f20b58b72117fdadce3ec49f42 Mon Sep 17 00:00:00 2001 From: Eli Klein Date: Mon, 22 Aug 2016 15:59:55 -0600 Subject: [PATCH 34/36] Update README Let me know if the yahoo app developer consumer key, secret, and application ID are necessary. If they are, I can document how I got those setup as well. --- README.md | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 601337d..a0dd4a5 100644 --- a/README.md +++ b/README.md @@ -35,31 +35,29 @@ Clone this repo into your web root. ```bash cd [your-web-root] -git clone https://github.com/chriseng/nestgraph.git +git clone https://github.com/mycon/nestgraph.git ``` -Grab a copy of nest-api and unzip into the ```nestgraph``` directory you created in the previous step. It should create a subdirectory called ```nest-api-master```. +Initialize git submodules `nest-api-master` and `yahoo-api-master`: ```bash cd nestgraph -wget https://github.com/gboudreau/nest-api/archive/master.zip -unzip master.zip -rm -f master.zip -``` -or -``` -git clone https://github.com/gboudreau/nest-api.git nest-api-master +git submodule init +git submodule update ``` -Grab a copy of the yahoo weather api. +Grab the minified v3 version of d3js from https://d3js.org/d3.v3.min.js and place it into: + ``` -git clone https://github.com/phront/Yahoo-Weather-API-PHP-class.git yahoo-api-master +[your-web-root]/nestgraph/d3.min.js ``` -Grab a copy of d3js from http://d3js.org/ - -Open ```inc/config.php``` in a text editor and update the ```nest_user``` and ```nest_pass``` variables with your username and password for nest.com. Update the ```local_tz``` variable to reflect your time zone. +Open `inc/config.php` in a text editor and update: +* `nest_user` and `nest_pass` variables with your username and password for nest.com +* `local_tz` variable to reflect your time zone. +* `local_woeid` with the code you find for your local address or city from: http://woeid.rosselliot.co.nz/ + Run the test script to make sure that the API is able to pull your thermostat data correctly from nest.com. ```bash @@ -90,10 +88,11 @@ Add your nests to the database. php init_devices.php ``` -Create a cron job to poll the website periodically and update the local database. The thermostat does not phone home on a fixed schedule, but typically it updates in 5 to 30 minute intervals. The script will only insert into the database if there is new data available. Obviously, update the path to ```insert.php``` if it's not in ```/var/www/html/nestgraph```. +Create a cron job to poll the website periodically and update the local database. The thermostat does not phone home on a fixed schedule, but typically it updates in 5 to 30 minute intervals. The script will only insert into the database if there is new data available. Obviously, update the path to ```insert.php``` if it's not in ```/var/www/html/nestgraph```. Additionally, add an entry for the job that polls energy usage and weather data daily. ```bash */5 * * * * /bin/rm -f /tmp/nest_php_* ; /usr/bin/php /var/www/html/nestgraph/insert.php > /dev/null +2 9 * * * /bin/rm -f /tmp/nest_php_* ; /usr/bin/php /var/www/html/nestgraph/insertEnergy.php > /dev/null ``` (FYI, the reason we remove the files in ```/tmp``` is because it seems the nest-api library attempts to cache authentication info too aggressively, and after a few days it ends up trying to connect to an AWS server that no longer exists.) From b94f8471663bb03619fee189d486aadf80ff4889 Mon Sep 17 00:00:00 2001 From: kesslerm Date: Fri, 13 Oct 2017 21:52:50 -0600 Subject: [PATCH 35/36] update yahoo api --- yahoo-api-master | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yahoo-api-master b/yahoo-api-master index c554243..25c5775 160000 --- a/yahoo-api-master +++ b/yahoo-api-master @@ -1 +1 @@ -Subproject commit c5542431c961738f257953bce79805996ebe5949 +Subproject commit 25c577513d3b7567f81a64366b8bd397963edea8 From b860996b4cea709f04de19e74569432639b00369 Mon Sep 17 00:00:00 2001 From: kesslerm Date: Sat, 14 Oct 2017 00:17:55 -0400 Subject: [PATCH 36/36] update nest to new API --- nest-api-master | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nest-api-master b/nest-api-master index 605efdd..e012b4f 160000 --- a/nest-api-master +++ b/nest-api-master @@ -1 +1 @@ -Subproject commit 605efddb17c80ac38c86a9c36f6a6705be2d3f8f +Subproject commit e012b4f670a3116b12e256dbe5d8a6c4f544b826

    ah+=n>zJ5S12FeZ<;a>i+yY5tS9$l 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%0AanV<*E&To_2iOj5NXwC}Obb}Lu43Z!4Uu@o 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 RM>OOlH3AEdi~as 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