Afficher les données d’un thermostat Nest sur une page web

Afficher les données d’un thermostat Nest sur une page web

Je poursuis le travail pour créer un tableau de bord domotique de ma maison (série d’article . Aujourd’hui, je veux afficher les données de mon thermostat Nest sur une page web.

Ce que je veux faire

J’ai un thermostat Nest auquel j’accède à distance (application android) avec l’email EMAIL et le mot de passe PASSNEST.

Je veux afficher les données de ce thermostat sur une page web hébergée sur Infomaniak. Cette page web est codée en PHP.

J’ai fait de nombreux essais infructueux avant de décider d’essayer d’utiliser le code créé par Guillaume Boudreau sur GitHub. Ca fonctionne à la perfection.

Comment faire ?

La première étape est de télécharger le code de Guillaume Boudreau sous forme d’un fichier zip. Ensuite on le décompresse et on place le fichier nest.class.php  dans le répertoire principal de notre site.

Dans le répertoire /pi/ (en droits 740), je crée le fichier pw.php, avec droits 664.  Il contient les infos suivantes (remplacer les données en majuscules par vos codes d’accès au thermostat) :

<?php
/*************************
Thermostat Nest
*************************/
// mail ety pw de home.nest.com
$nest_user = 'MAIL_NEST@MAIL' ;
$nest_pw = 'NEST_PW' ;

Ensuite, je crée un fichier fichier nest-test.php   dans le répertoire principal de mon site et je lui attribue les droits d’accès 644. Ce fichier contient :

<?php
$path = dirname( __FILE__ );

define( 'ROOT',dirname( __FILE__ ) );
define( 'FILE_URL', "https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]" );
define( 'BASE_URL', "https://$_SERVER[HTTP_HOST]" );

$title = "Test suivi des Pi";
include ROOT . '/header-2016.php';

// contient les infos d'id et mot de passe des différents équipements
include_once ROOT . '/pi/pw.php';
// https://github.com/gboudreau/nest-api
require_once 'nest.class.php';

?>

<section class="capteurs">
	<h2>Nest thermostat</h2>
	<?php
	// see https://github.com/gboudreau/nest-api/blob/master/examples.php
	// Your Nest username and password.
	$username = $nest_user ;
	$password = $nest_pw ;

	// The timezone you're in.
	// See http://php.net/manual/en/timezones.php for the possible values.
	date_default_timezone_set('Europe/Paris');

	// Here's how to use this class:
	$nest = new Nest($username, $password);

	// Location information
	$locations = $nest->getUserLocations();

	// Devices list (thermostats)
	$devices_serials = $nest->getDevices();
	
	// Device information
	$infos = $nest->getDeviceInfo($devices_serials[0]);

	// Last 10 days energy report
	$energy_report = $nest->getEnergyLatest();

	
	function jlog($json) {
		echo json_encode($json, JSON_PRETTY_PRINT) . "\r\n";
	}	
	?>

	<p>Location information : <?php jlog($locations); ?></p>
	<p>Devices list (thermostats) : <?php jlog($devices_serials); ?></p>
	<p>Device information : <?php jlog($infos); ?></p>	
	<h4>température : <?php printf("%.02f °%s\n", $infos->current_state->temperature, $infos->scale); ?></h4>	
	<p>Last 10 days energy report : <?php jlog($energy_report); ?></p>
	
</section>
<!-- div container ENDS here -->	
<?php include_once ROOT . '/footer-2016.php';	?>

Quant à header-2016.php , il contient :

<!DOCTYPE html>
<html lang="fr">
<head>
   <meta charset="utf-8">
   <title><?php echo $title ; ?></title>


	<?php
	// http://blog.lavoie.sl/2013/02/php-document-root-path-and-url-detection.html
	$base_dir  = __DIR__; // Absolute path to your installation, ex: /var/www/mywebsite
	$doc_root  = preg_replace("!${_SERVER['SCRIPT_NAME']}$!", '', $_SERVER['SCRIPT_FILENAME']); # ex: /var/www
	$base_url  = preg_replace("!^${doc_root}!", '', $base_dir); # ex: '' or '/mywebsite'
	$protocol  = empty($_SERVER['HTTPS']) ? 'http' : 'https';
	$port      = $_SERVER['SERVER_PORT'];
	$disp_port = ($protocol == 'http' && $port == 80 || $protocol == 'https' && $port == 443) ? '' : ":$port";
	$domain    = $_SERVER['SERVER_NAME'];
	// $full_url  = "${protocol}://${domain}${disp_port}${base_url}"; # Ex: 'http://example.com', 'https://example.com/mywebsite', etc.
	$full_url  = "${protocol}://${domain}${base_url}";
	// echo $full_url . "\n" ;
	?>
   <link rel="stylesheet" href="<?php echo $full_url . '/css/pi-stylesheet.css' ; ?>">
   <!--
   <script src="script.js"></script>
   -->
</head>

<header>
	<a data-flickr-embed="true"  href="https://www.flickr.com/photos/mattwareham/9109691433" title="Raspberry Pi"><img src="https://c2.staticflickr.com/3/2888/9109691433_292d2aac49_m.jpg" width="240" height="160" alt="Raspberry Pi"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
	<h1><a href="<?php echo $full_url ?>">suivi des Pi</a></h1> 
</header>

<body>
	<div class="container">

et footer-2016.php contient

	</div> <!-- END container div -->
<footer>
<p>2017 Suivi des alertes et autres infos Pi</p>
</footer>
</body>
</html>

Le résultat

Tableau de bord NEST

Ca n’est pas très lisible en l’état, sauf la température du couloir car il s’agit de données au format Json. Si je passe la première chaine de caractère dans https://jsonlint.com/, le texte devient plus lisible :

{
	"name": "Lzo",
	"address": null,
	"city": "Tr\u00e9ogat, FR",
	"postal_code": "29720",
	"country": "FR",
	"outside_temperature": 13.3,
	"outside_humidity": 88,
	"away": false,
	"away_last_changed": "2015-03-16 17:51:33",
	"thermostats": ["0XXXXXXXXXXXK"],
	"protects": []
}

Et si je veux par exemple afficher la température et l’humidité extérieure selon le Nest, je place le code suivant dans ma page web :

	<h4>température et humidité ext  : <?php printf("%.02f °%s\n", $locations[0]->outside_temperature, $infos->scale); ?>, <?php printf("%.02f %s\n", $locations[0]->outside_humidity, "%"); ?></h4>

Ca m’affiche :

température et humidité ext : 13.30 °C , 87.00 %

Et voilà !

Et maintenant ?

Avant de voir comment stocker les données dans une base de données, je vais continuer à explorer la manière d’afficher les mesures de tous les capteurs de la maison. Les prochains articles à ce sujet seront également dans la série .