netatmo wetterstation

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:
netatmo.PNG

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:
netatmo2.PNG

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!

Hallo,
es gibt eine API dafür.
Sollte also machbar sein.

http://dev.netatmo.com/doc/

Hallo,
Ja danach hätte ich auch suchen können ;-). Jetz bleibt nur noch die Frage ob alles klappt.

Ich hab mit mal nen Account angelegt und ne Station des Herstellers als „Freund“ eingetragen.

Mal Schaun, ich Berichte …

Hallo!

hat zufälligerweiße jemand schon die Netatmo Wetterstation in IPS angebunden bekommen?

Unter Verwendung des Netatmo PHP SDKs bekomme ich je nach Authentifzierungsmethode folgende Fehlermeldung:

„An error happend while trying to retrieve your tokens SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed“
(CLI_ClientCredential_Example.php)

Hinweise jeglicher Art sind willkommen :slight_smile:

Beste Grüße,

Timo

Hallo Timo,
Ich hab’s vor ein paar Tagen hinbekommen! Muss aber noch die Lösung Posten!
Ich hab im curl noch ne Option verwendet um https zu umgehen!
Code folgt!
Stuzi

würde mich auch interessieren

Achtung, Bitte immer aus Beitrag 1 die aktuelle Version verwenden!!

netatmo.PNG

netatmo2.PNG

Ich habe gerade mal bei NetAtmo auf der Seite geschaut, aber nichts dazu gefunden.

Kann man eigentlich mehrere dieser Wohnungssensoren einsetzen, oder ist man nur auf einen begrenzt?
Sonst wären ja diese http://cubesensors.com besser geeignet, um das Haus komplett zu überwachen.

Hallo, im Moment gibt’s das Grundsatz bestehend aus innenstation und ausseneinheit! Gerade ist auch noch ein zusatzinnenmodul herausgekommen! Weitere sollen folgen. Infos gibt’s auch unter forum.netatmo.com
Stuzi

Hallo Stuzi,

vielen Dank für Deine Anleitung. In der Zwischenzeit haben wir ebenfalls auf die Netatmo Station zugreifen können und fast genau den gleichen Ansatz wie Du gewählt.

Zum Erfolg führte insbesondere folgende Zeile Code:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Ideal wäre natürlich wenn man die SSL Verschlüsselung anlassen könnte - haben aber selbst noch keine Lösung hierfür.

Werden die nächsten Tage auch ein Zusatzinnenmodul bestellen. Werde gern berichten wie gut es ist - soll ja Batterie betrieben 1 Jahr halten (für ein CO2 Sensor ist das super…).

Grüße, Timo

Falls die noch jemand haben möchte - bei unserem liebsten Buchversender ist sie heute im Angebot für 119.-€…

Hi

Ich bekomme immer den Fehler:

Notice: Constant CURL_ERROR_TYPE already defined in C:\IP-Symcon\scripts\48415.ips.php on line 8

wo muß Ich noch die Zugangsdaten eintragen = Client secret + Client id

:slight_smile:

Hier steht „Script login.php“ :wink:

Gruß
Bruno

Hi

da habe Ich Sie auch eingetragen aber es kommt die obige Fehlermeldung ???

Gruß

Der Fehler hat ja nix mit dem Login zu tun, notfalls mal übersetzen was da steht :wink:

Das ist aber auch ein Durcheinander mit den Benennungen, mal „login.php.ips“ mal „login.ips.php“, die Erklärung der Zeile

require_once("NAApiClient.php.ips"); ## Referenz auf dein login.ips.php Script

kann wohl auch nicht stimmen.

Gerade mal rumgespielt, die Zeile

define('CURL_ERROR_TYPE', 0);

ist wohl irgendwie doppelt in Deinem Skript

Danke !
Fehler gefunden !! wie genau lautet die Adresse um die device list zu bekommen ??

:slight_smile:

Habe die device list ausgelesen , aber wo kommt was hin …

:confused:

Was soll wo hinkommen?

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;

Wenn ich das Skript richtig verstehe so wird das (bzw. die ausgelesenen Werte) im weiteren Verlauf in die anzulegenden Variablen verteilt