Hallo zusammen,
Hat sich eigentlich schon jemand damit beschäftigt die NETATMO Wetterstation ans ips zu bringen?
Meine aktuellen bei mir eingesetzten Scripte sind ab sofort immer hier im Ersten Beitrag:
[i]Aktueller Stand: 2014/01/03
- keine Zusätzlichen Module implementiert, Nur basis mit Aussenfühler
Danke an alle Anmerkungen und Hinweise zur Verbesserung
[/i]
Step 1: Zugangsdaten anlegen
Auf dev.netatmo.com anmelden und eine neue App anlegen.
Interessant hierbei ist der Client secret und die Client id. Diese am besten notieren.
Step 2: Scripte erstellen
Nun sind in IPs einige Scripte anzulegen und anzupassen.
Quelle http://dev.netatmo.com/doc/sdk/php
You can download the PHP SDK from github.
Ich wollte hier nicht die Scripte 1:1 bereiotstellen, da sie ja von netatmo sind und …
Ich habs wie folgt gelöst:
Dabei sollten am besten alle Scripte mit entsprechendem Namen in ein Unterverzeichnis gespeichert werden.
Script AppliCommonPublic.php
aus der Quelle 1:1 übernehmen
Script NAApiClient.php
aus der Quelle fast 1:1 übernehmen und Folgendes ergänzen:
<?php
require_once 'AppliCommonPublic.php.ips'; ## Diese Zeile ggf auf deinen Scriptname anpassen
define('CURL_ERROR_TYPE', 0);
....
Folgende Block suchen
curl_setopt_array($ch, $opts);
$result = curl_exec($ch);
if ($result === FALSE)
{
$e = new NACurlErrorType(curl_errno($ch), curl_error($ch));
curl_close($ch);
throw $e;
}
curl_close($ch);
durch
curl_setopt_array($ch, $opts);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
if ($result === FALSE)
{
$e = new NACurlErrorType(curl_errno($ch), curl_error($ch));
curl_close($ch);
throw $e;
}
curl_close($ch);
$result = str_replace('HTTP/1.0','HTTP/1.1',$result);
$result = str_replace("HTTP/1.1 200 Connection established
",'',$result);
ersetzen
Wichtig ist dabei die Zeile: curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); Im Moment noch keine andere Lösung mit SSL
Script login.php:
Zugangsdaten aus Step 1 sowie die normalen Netatmo Zugangsdaten eintragen
<?
require_once("NAApiClient.php.ips");
$config = array();
$config['client_id'] = 'XXXX'; // XXX ersetzen
$config['client_secret'] = 'XXXX'; // XXX ersetzen
$client = new NAApiClient($config);
$username = "xx@yy"; //xx@yy ersetzen
$pwd = "xxxx"; // xxxx ersetzen
$client->setVariable("username", $username); //hier nichts ändern
$client->setVariable("password", $pwd); //hier nichts ändern
try
{
$tokens = $client->getAccessToken();
//echo $client;
$refresh_token = $tokens["refresh_token"];
$access_token = $tokens["access_token"];
}
catch(NAClientException $ex)
{
echo "An error happend while trying to retrieve your tokens : ".$ex->getMessage()."
";
}
Nun solltest du alle Variablen anlegen. Ich habe dabei folgende angelegt:
Auslesen Script
Die Vaiablen müssen nun ein einem Auslesen Script eingetragen werden. Dieses Script ist wohl das Schwierigste. Um die abrufbaren Werte zu ermitteln, kann man sich die dev.netatmo für seine Wetterstation passende Antwortdatei ansehen.
dev.netatmo.com → Private API → Device List
Hier einfach mal mein Script: auf Basis/Quelle des Use API methods von dev.netatmo.com
<?php
// Login und laden der Funktionen
require_once 'login.php.ips';
// First retrieve user device list
try
{
$deviceList = $client->api("devicelist");
echo "Station: " . $deviceList["devices"][0]["station_name"] . "; Device ID: " . $deviceList["devices"][0]["_id"] . "; Modulname: " . $deviceList["devices"][0]["module_name"] ."
";
echo "Aussenmodule: ID: ". $deviceList["modules"][0]["_id"]. "; Modulname: " . $deviceList["modules"][0]["module_name"] ."
";
echo "
";
$carport = $deviceList["modules"][0]["_id"];
//echo $Carport;
// "a": 20.1,
// "b": 63
if(isset($deviceList["devices"][0]))
{
$device_id = $deviceList["devices"][0]["_id"];
// Ok now retrieve last temperature and humidity from indoor/base
$params = array("scale" =>"max",
"type"=>"Temperature,Humidity,Co2,Pressure,Noise",
"date_end"=>"last",
"device_id"=>$device_id);
$res = $client->api("getmeasure", $params);
if(isset($res[0]) && isset($res[0]["beg_time"]))
{
$time = $res[0]["beg_time"];
$t = $res[0]["value"][0][0];
$h = $res[0]["value"][0][1];
$co2 = $res[0]["value"][0][2];
$pres = $res[0]["value"][0][3];
$noise = $res[0]["value"][0][4];
echo "Temperature is $t ° Celsius @".date('c', $time)."
";
echo "Humidity is $h % @".date('c', $time)."
";
echo "CO2 is $co2 ppm @".date('c', $time)."
";
echo "Luftdruck is $pres hPa @".date('c', $time)."
";
echo "Lärm is $noise db @".date('c', $time)."
";
SetValueInteger(17709 /*[Hardware\Netatmo\Wetterstation\indoor_humility]*/, $h);
SetValueFloat(32058 /*[Hardware\Netatmo\Wetterstation\indoor_temp]*/, $t);
SetValueFloat(15088 /*[Hardware\Netatmo\Wetterstation\indor_co2]*/, $co2);
SetValueFloat(39806 /*[Hardware\Netatmo\Wetterstation\indor_noise]*/, $noise);
SetValueInteger(30103 /*[Hardware\Netatmo\Wetterstation\indor_airpressure]*/, $pres);
}
}
{
$device_id = $deviceList["devices"][0]["_id"];
// Ok now retrieve last temperature and humidity from outdoor
$params = array("scale" =>"max",
"type"=>"Temperature,Humidity,Co2",
"date_end"=>"last",
"device_id"=>$device_id,
"module_id"=>$carport);
$res = $client->api("getmeasure", $params);
if(isset($res[0]) && isset($res[0]["beg_time"]))
{
$time = $res[0]["beg_time"];
$t = $res[0]["value"][0][0];
$h = $res[0]["value"][0][1];
$co2 = $res[0]["value"][0][2];
echo "Aussentemperature is $t Celsius @".date('c', $time)."
";
echo "Aussen-Humidity is $h % @".date('c', $time)."
";
SetValueInteger(15937 /*[Hardware\Netatmo\Wetterstation\outdoor_humility]*/, $h);
SetValueFloat(42373 /*[Hardware\Netatmo\Wetterstation\outdoor_temp]*/, $t);
}
}
}
catch(NAClientException $ex)
{
echo "User does not have any devices
";
}
?>
Leider hab ich es im Moment nicht einfacher geschafft!
Über Rückmeldung, Verbesserungen würde ich mich freuen!