Netatmo Modul - 38_netatmo.pm (Support)

Begonnen von Markus M., 17 Mai 2016, 12:37:34

Vorheriges Thema - Nächstes Thema

m.zielinski

Zitat von: Weisswurstverkäufer am 13 Juli 2023, 20:17:33Hast Du hier Evtl einen Zeilenumbruch drin und deshalb ,,re ad" statt ,,read"?
Der Zeilenumbruch ist im Code von Weisswurstverkäufer. Wenn man den Code auswählt/kopiert läuft es erstmal nicht . Erst wenn man den Zeilenumbruch rauslöscht funktioniert der Code .

Danke an Weisswurstverkäufer!

SirMarco

Zitat von: TimoD am 13 Juli 2023, 16:29:42
Zitat von: Weisswurstverkäufer am 13 Juli 2023, 09:03:58Ich habe die Lösung von dieser Python Library lnetatmo quick and dirty für mich adaptiert. Das scheint zu funktionieren (das sollte man aber vermutlich besser nicht nachmachen, ich dokumentiere es aber trotzdem mal):

1. auf dev.netatmo.com bei der App einen Token generieren

2. in 38_netatmo.pm die Zeile 754 anpassen:

data => {grant_type => 'refresh_token', client_id => $hash->{helper}{client_id},  client_secret=> $hash->{helper}{client_secret}, refresh_token => '[b]DER GENERIERTE REFRESH TOKEN[/b]', scope => 'read_station read_thermostat write_thermostat read_camera write_camera access_camera re
ad_presence write_presence access_presence read_homecoach read_smokedetector'},

Also "username" und "password" durch "refresh_token" ersetzen, da man jetzt mit Username und Passwort keinen Token mehr direkt holen kann. Nur noch über OAuth.

Damit wird ein eigener(!) Refresh-Token hart in den Quellcode geschrieben. Es sollte natürlich eher so sein dass dieser Token statt username/passwort gespeichert wird (so spart man sich den manuellen OAuth Login). Leider weiss ich nicht wie man das in Perl macht. Aber das ja sicher demnächst jemand einbauen.

Danke für deine Antwort, leider bekomme ich es nicht zum laufen bekomme den Fehler: invalid_grant und jetzt invalid_request

Ich habe die Zeile 754 wie folgt ersetzt:
   
data => {grant_type => 'refresh_token', client_id => $hash->{helper}{client_id},  client_secret=> $hash->{helper}{client_secret}, refresh_token => '59039625e6da8b62a9|3c66eba37a313513d715b6967994', scope => 'read_station read_thermostat write_thermostat read_camera write_camera access_camera re
    ad_presence write_presence access_presence read_homecoach read_smokedetector'},

Was mache ich falsch? (Habe den refresh_token oben gekürzt) muss ich noch etwas anderes anpassen? (Ich habe fhem neugestartet, meine Credentials in der Device Definition aber enthalten lassen)

Vorab vielen Dank

Hello

Nach dem Komma ist ein Leerzeichen zu viel:
{client_id},  client_secret=>
Grüsse

Loller500

Tausend Dank an @Weisswurstverkäufer, funktioniert 1A. You made my day  8)  :).

Grüße
Gerd

Toto1973

Zitat von: topa_LE am 13 Juli 2023, 20:00:25So hier funktioniert es schonmal nicht...
define <name> netatmo ACCOUNT <refresh-token> <client_id> <client_secret>
Ja, das würde mich auch mal interessieren. Weil irgendwie bin ich zu doof, das hin zu bekommen :(
Raspberry PI2, Rademacher DuoFern Stick, CUL, 2 x SCC,  JeeLink 868 Mhz, JeeLink 433 Mhz, 3x Magic UFO LED WiFi Controller, 4x MAX BC-RT-TRX-CyG, 2x MAX Fensterkontakt, 5x Rademacher Gurtwickler, 6x TX29DTH-it, 2x TX25-it als Helligkeitssensor, 1X HM-ES-PM, 6x Sonoff, 7x G-Homa, PIR-1000

Det20

#1279
define Wetter netatmo ACCOUNT <Email> <Passwort> <Client_ID> <Client_Secret>

Das Modul kennt den Define Parameter doch überhaupt nicht, es müsste erst angepasst werden. Lade nachher mal ne provisorische Änderung hoch.

Rainer H.

Zitat von: topa_LE am 13 Juli 2023, 20:00:25Wie wäre denn dann die genaue DEF bei Änderung mit Hardcode in .pm mit Refresh-Token?
Weil hier wäre eine optimalere Änderung ohne user/password längerfristig sinnvoll.

So hier funktioniert es schonmal nicht...
define <name> netatmo ACCOUNT <refresh-token> <client_id> <client_secret>





Doch genau so!!! (nicht das "alte" ändern --  neu erstellen!!!)

Det20

#1281
Habe das mal auf die Schnelle, basierend auf @Weisswurstverkäufer geändert bis es vom Modul Ersteller gefixt wurde, Quick-and-dirty. Der Define Parameter hat hinter "<Client_Secret>" nun einen weiteren Parameter für "refresh-token", dann ist das nicht mehr hart verdrahtet. Ob man "client_id" und "client_secret" noch braucht weiß ich nicht. Soll aber auch egal sein, läuft so :)

define Wetter netatmo ACCOUNT <Email> <Passwort> <Client_ID> <Client_Secret> <Refresh Token>

Der Trick ist: refresh_token wird nur geholt, wenn er nicht definiert ist. Da er aber über Define definiert ist, wird er eben nicht geholt.
Wichtig: 38_netatmo für's erste für updates excluden, sonst sind die Änderungen Geschichte.

Den Refresh_Token gibt es über die beschriebene API Seite von Netatmo.

Weisswurstverkäufer

Zitat von: Det20 am 14 Juli 2023, 08:46:13Ob man "client_id" und "client_secret" noch braucht weiß ich nicht.

Man braucht <Client_ID> <Client_Secret> und <Refresh Token>. <Email> und <Passwort> entfallen dafür.

RappaSan

Ich habe zwar kein eigenes Netatmo-Gerät, aber bisher die Public-Geräte zur Regenmessung benutzt.
Wie komme ich nun an die neuen Token-Daten?
Das alte login funktioniert ja nun nicht mehr.
Zitat1. auf dev.netatmo.com bei der App einen Token generieren
Was ist damit gemeint? Ich finde so etwas nicht nach dem Login auf der dev.netatmo.com Seite.

Det20

1. Einlogen auf https://dev.netatmo.com/apps/
2. Deine App auswählen
3. Unter "Token generator" / "Choose scope" alles auswählen, danach auf "Generate Token" klicken

RappaSan

Danke, jetzt hab ich's gefunden.
Läuft. :)

Det20

Zitat von: Weisswurstverkäufer am 14 Juli 2023, 08:56:44
Zitat von: Det20 am 14 Juli 2023, 08:46:13Ob man "client_id" und "client_secret" noch braucht weiß ich nicht.

Man braucht <Client_ID> <Client_Secret> und <Refresh Token>. <Email> und <Passwort> entfallen dafür.

War mir nicht sicher, ob das an anderer Stelle noch gebraucht wird, ist ja auch nur Qick-and-dirty. Falls der Modul-Ersteller nicht aktiv wird, können wir uns das genauer anschauen, für den Moment läuft es ja.

Markus M.

Ich habe leider gerade keine Zeit mich darum zu kümmern.
Hat jemand eine funktionierende PM für mich, die ich schnell per Compare anpassen kann?
Aktuell weder Smarthome noch FHEM vorhanden

chrisx

Hi zusammen,

erstmal vielen Dank für dieses Modul und die letzten Beiträge zum beheben von dem OAuth2 Thema.

Zusätzlich zu der Code Änderung Zeile 754 von Weisswurstverkäufer musste ich noch weitere Zeilen ändern. Bei mir gab es noch die Fehlermeldung das kein Access Token definiert war.

Da ich mich mit Perl kaum auskenne, habe ich die Tokens direkt in das Modul geschrieben. Geht bestimmt auch eleganter über Variablen.

Die Sub netatmo_refreshToken um den generierten access_token erweitert, ein paar Zeilen auskommentiert und den refresh_token nach dem gleichen Schema bei data eingetragen:
    787 netatmo_refreshToken($;$)
    788 {
    789  my ($hash,$nonblocking) = @_;
    790  my $name = $hash->{NAME};
    791  my $access_token = 'aaaaaaaaaaaaaaaaaaaaaa|bbbbbbbbbbbbbbbbbbbbbb';
    792
    793 #  if( defined($hash->{access_token}) && defined($hash->{expires_at}) ) {
    794 #    my ($seconds) = gettimeofday();
    795 #    return undef if( $seconds < $hash->{expires_at} - 300 );
    796 #  }
    797
    798  Log3 $name, 3, "$name: refreshing token";
    799
    800 #  my $resolve = inet_aton($hash->{helper}{apiserver});
    801 #  if(!defined($resolve))
    802 #  {
    803 #    $hash->{STATE} = "DNS error";
    804 #    $hash->{network} = "dns" if($hash->{SUBTYPE} eq "ACCOUNT");
    805 #    delete($hash->{access_token});
    806 #    delete($hash->{access_token_app});
    807 #    InternalTimer( gettimeofday() + 1800, "netatmo_refreshTokenTimer", $hash);
    808 #    Log3 $name, 1, "$name: DNS error, cannot resolve ".$hash->{helper}{apiserver};
    809 #    return undef;
    810 #  } else {
    811 #    $hash->{network} = "ok";
    812 #  }
    813
    814 #  if( !$hash->{refresh_token} ) {
    815 #    netatmo_getToken($hash);
    816 #    return undef;
    817 #  }
    818
    819  if( $nonblocking ) {
    820    HttpUtils_NonblockingGet({
    821      url => "https://".$hash->{helper}{apiserver}."/oauth2/token",
    822      timeout => 30,
    823      noshutdown => 1,
    824      data => {grant_type => 'refresh_token', client_id => $hash->{helper}{client_id},  client_secret=> $hash->{helper}{client_secret}, refresh_token => 'xxxxxxxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'},
    825        hash => $hash,
    826        type => 'token',
    827        callback => \&netatmo_dispatch,
    828    });
    829  } else {
    830    my($err,$data) = HttpUtils_BlockingGet({
    831      url => "https://".$hash->{helper}{apiserver}."/oauth2/token",
    832      timeout => 5,
    833      noshutdown => 1,
    834      data => {grant_type => 'refresh_token', client_id => $hash->{helper}{client_id},  client_secret=> $hash->{helper}{client_secret}, refresh_token => 'xxxxxxxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'},
    835    });
    836
    837    netatmo_dispatch( {hash=>$hash,type=>'token'},$err,$data );
    838  }
    839 }

Die Sub netatmo_getDevices:
  1319 netatmo_getDevices($;$)
  1320 {
  1321  my ($hash,$blocking) = @_;
  1322  my $name = $hash->{NAME};
  1323
  1324 #  netatmo_refreshToken($hash, defined($hash->{access_token}));
  1325  Log3 $name, 3, "$name getDevices (devicelist)";
  1326
  1327  return Log3 $name, 1, "$name: No access token was found! (getDevices)" if(!defined($hash->{access_token}));
  1328
  1329  if( $blocking ) {
  1330    my($err,$data) = HttpUtils_BlockingGet({
  1331      url => "https://".$hash->{helper}{apiserver}."/api/getstationsdata",
  1332      timeout => 5,
  1333      noshutdown => 1,
  1334      data => { access_token => 'aaaaaaaaaaaaaaaaaaaaaa|bbbbbbbbbbbbbbbbbbbbbb', },
  1335    });
  1336    netatmo_dispatch( {hash=>$hash,type=>'devicelist'},$err,$data );
  1337
  1338
  1339    return $hash->{helper}{devices};
  1340  } else {
  1341    HttpUtils_NonblockingGet({
  1342      url => "https://".$hash->{helper}{apiserver}."/api/getstationsdata",
  1343      timeout => 30,
  1344      noshutdown => 1,
  1345      data => { access_token => $hash->{access_token}, },
  1346      hash => $hash,
  1347      type => 'devicelist',
  1348      callback => \&netatmo_dispatch,
  1349    });
  1350
  1351
  1352  }
  1353 }

Die Sub netatmo_getHomecoaches:
  1426 netatmo_getHomecoachs($;$)
  1427 {
  1428  my ($hash,$blocking) = @_;
  1429  my $name = $hash->{NAME};
  1430
  1431  netatmo_refreshToken($hash, defined($hash->{access_token}));
  1432  Log3 $name, 3, "$name getHomecoachs (homecoachlist)";
  1433
  1434  return Log3 $name, 1, "$name: No access token was found! (getHomecoachs)" if(!defined($hash->{access_token}));
  1435
  1436  if( $blocking ) {
  1437    my($err,$data) = HttpUtils_BlockingGet({
  1438      url => "https://".$hash->{helper}{apiserver}."/api/gethomecoachsdata",
  1439      timeout => 5,
  1440      noshutdown => 1,
  1441      data => { access_token => 'aaaaaaaaaaaaaaaaaaaaaa|bbbbbbbbbbbbbbbbbbbbbb', },
  1442    });
  1443    netatmo_dispatch( {hash=>$hash,type=>'homecoachlist'},$err,$data );
  1444
  1445
  1446    return $hash->{helper}{homecoachs};
  1447  } else {
  1448    HttpUtils_NonblockingGet({
  1449      url => "https://".$hash->{helper}{apiserver}."/api/gethomecoachsdata",
  1450      timeout => 30,
  1451      noshutdown => 1,
  1452      data => { access_token => 'aaaaaaaaaaaaaaaaaaaaaa|bbbbbbbbbbbbbbbbbbbbbb', },
  1453      hash => $hash,
  1454      type => 'homecoachlist',
  1455      callback => \&netatmo_dispatch,
  1456    });
  1457
  1458
  1459  }
  1460 }

Viele Grüße
Christian

Markus M.

Ok, bitte mal die Version im Anhang ausprobieren.
Neu dazu kommt in der Definition nur der Refresh Token.
Den könnt ihr für eure App generieren unter: https://dev.netatmo.com/apps/
Username und Passwort werden trotzdem noch gebraucht.

Bitte zeitnah Bescheid geben ob es klappt, wenn alles ok ist pack ich das ins Update.Du darfst diesen Dateianhang nicht ansehen.
Aktuell weder Smarthome noch FHEM vorhanden