Netatmo Modul - 38_netatmo.pm (Support)

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

Vorheriges Thema - Nächstes Thema

Loller500

Hallo zusammen,

ich betreibe seit 2017 eine fhem-Hausautomatisierung auf einem Raspberry PI 3. Nach der Anschaffung einer Netatmo Wetterstation konnte ich diese, dank des Netatmo Moduls, sehr schnell in meine fhem Installation integrieren. Bis vor einer Woche lief alles einwandfrei, als dann plötzlich mein Raspberry PI den Geist aufgab  :o . Da ich eh auf ein aktuelles Betriebssystem (debian bullseye) migrieren wollte, habe ich eine Neuinstallation auf einem Rock PI 4B (debian bullseye) durchgeführt. Bis auf ein paar Kleinigkeiten läuft auch alles wieder. Die Netatmo Integration zählt noch zu den Dingen, die nicht funken.
Wegen der seit Herbst letzten Jahres neu eingeführten oauth2 Authentifizierung erhalte ich in regelmäßigen Abständen die Meldung "No access token was found!" im fhem Logfile.

Auch wenn das Modul noch nicht an die neue Authentifizierung angepasst ist, kennt jemand einen Weg wie das Problem umschifft werden kann?

Herzlichen Dank im Voraus
Gerd

Loller500

Hallo nochmal,

das Problem hat sich erledigt (#1260). Auf der netatmo Seite kann man einen Token generieren, der dann auch nach dem Neustart von fhem im Netatmo Modul verwendet wird. Bei mir hatte sich, aus mir unerfindlichen Gründen, die  Client-ID und das Client-secret geändert. Ich habe keine Ahnung, ob das durch das Generieren des Token verursacht wurde oder ob es dafür einen anderen Grund gibt. Durch einem defmod mit den neuen Parametern auf das Netatmo device, ging dieses dann auch direkt auf CONNECTED und seither funktioniert wieder alles einwandfrei :-).

Grüße
Gerd

budy

Moin,

ich habe auch seit ca. 30.06.2023 das Problem, dass mein Netamo device nur noch ein unauthorized_client zurück bekommt. Ich habe die Keys neu erzeugt und sogar eine neue App auf der Dev Seite von Netatmo angelegt - alles ohne Erfolg.

Wenn ich eine neue App auf dev.netatmo.com/apps erzeuge, dann muss ich auch jetzt offenbar ein Access und ein Refreshtoken generieren, da ich sonst keinerlei Berechtigungen setzen kann...
Debian stretch, FHEM 5.9.
HM-CC-RT-DN, HM-ES-PMSw1-Pl, HM-LC-Dim1TPBU-FM, HMUARTLGW, HMLAN, HM-SEC-KEY, HM-SEC-RHS, HM-SEC-SC-2, HM-SEC-SCo, HM-SEC-SD-2, HM-OU-CFM-TW, div. HUEs, Wifilight, Ring Video Pro

Weisswurstverkäufer

Netatmo hat gestern den Passwort-Auth auch für eigene Stationen abgedreht (siehe auch https://github.com/philippelt/netatmo-api-python/issues/46). Da man bei dem Netatmo Modul in FHEM auch Username/Passwort eingeben muss düfte das ja zumindestens für Neuanlagen auch zu einem Problem führen, oder? Solange man noch einen Refresh Token hat scheint es aber jedenfalls noch zu gehen (meins läuft aktuell noch)

topa_LE

Mein Modul geht seit heute auch nicht mehr.

Status: unauthorized_client

Weisswurstverkäufer

Habe gerade mal FHEM aktualisiert und neu gestartet. Jetzt geht's bei mir auch nicht mehr: LOGIN FAILED; status: unauthorized_client


topa_LE

Zitat von: Weisswurstverkäufer am 13 Juli 2023, 08:46:56Habe gerade mal FHEM aktualisiert und neu gestartet. Jetzt geht's bei mir auch nicht mehr: LOGIN FAILED; status: unauthorized_client

Ich werde meine Devices nun erstmal deaktivieren um mein Log nicht vollzumüllen. Eventuell gibt es ja seitens des Modulentwickler kurzfristig ne Lösung.

Weisswurstverkäufer

#1267
Ich 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: (ohne Zeilenumbruch)

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 read_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.

juergen012

bei mir ebenfalls:
 unauthorized_client
Fhem unter Proxmox

TimoD

#1269
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

Det20

#1270
@TimoD: Hast du alle Scope's ausgewählt und den Refreshtoken in Hochkomma gesetzt?
@Weisswurstverkäufer: Klappt, danke!

jn75

Hallo,

ich habe mein eigenes Python Script am Laufen, welches Wetterdaten vom Natatmo Server holt, die Daten im RDD Tool ablegt, Grafiken generiert und die mir auf meinen Webserver hochlädt. Nun hatte ich seit gestern die gleichen Probleme mit "unauthorised_client"

Lösung mit Hilfe von Posts hier - und ja, ich bin ein Hobby-Programmierer ohne viel Ahnung :)

1: auf dev.netatmo.com bei der App Token generieren
2: den Code von Username / Passwort umstellen auf refresh Token

Alter Code (Emailadresse und die Springs sind nun Zufall, nicht die wahre Identität:
#payload = {'grant_type': 'password',
#          'username': "MEINE-EMAIL@BLABLA.DE",
#          'password': "dfkgjhdgkj",
#          'client_id':"34598kjs394857skjf84",
#          'client_secret': "345kj3434k5hkjh345uh34uh",
#          'scope': 'read_station'}

Neuer Code (der Refresh Token ist der im 1. Schritt generierte Token (nicht der Access Token):
payload = {'grant_type': 'refresh_token',
          'client_id':"34598kjs394857skjf84",
          'client_secret': "345kj3434k5hkjh345uh34uh",
          'refresh_token': "345kj354kj34klj35lk3j5lk3j54",
          'scope': 'read_station'}




Und dann gehts weiter mit anmelden und Auslesen der Werte:

try:
    response = requests.post("https://api.netatmo.com/oauth2/token", data=payload)
    response.raise_for_status()
    access_token=response.json()["access_token"]
    refresh_token=response.json()["refresh_token"]
    scope=response.json()["scope"]
    #print("Your access token is:", access_token)
    #print("Your refresh token is:", refresh_token)
    #print("Your scopes are:", scope)

    params = {
    'access_token': access_token
    }
    try:
        response = requests.post("https://api.netatmo.com/api/getstationsdata", params=params)
        response.raise_for_status()
        data = response.json()["body"]
        print json.dumps(data, indent=4, sort_keys=True)
        print '--------'
        print "Sensor: Kueche"
        my_luftdruck = data['devices']
  • ['dashboard_data']['Pressure']
        print "Pressure",
        print my_luftdruck

und so weiter für alle Sensoren dann...

Ich hoffe es hilft jemandem ... Ich war doch etwas länger ratlos bis ich Euch hier gefunden hatte




grappa24

@Weisswurstverkäufer: Klappt, auch bei mir, danke ;)
FHEM 6.1, 2 x RasPi 3B+, Debian Buster; KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200
Rollo-/Lichtsteuerung/-szenarien, T-Sensoren, Fensterkontakte, Heizungssteuerung, HEOS, Sprachsteuerung mit Alexa-FHEM, Netatmo, Nuki, ...

topa_LE

Wie 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>


Weisswurstverkäufer

Zitat von: TimoD am 13 Juli 2023, 16:29:42Ich 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

Hast Du hier Evtl einen Zeilenumbruch drin und deshalb ,,re ad" statt ,,read"?