Hallo,
ich habe heute mal verschiedenes ausprobiert.
Vielleicht hilft dir schon was ich bisher herausgefunden habe.
Zunächst habe ich mir eine neue .tcl Datei gebastelt die einen getuser request abschickt. Laut Doku sollten in der response alle IDs der Module enthalten sein die der betreffende User besitzt. Bei mir wird bislang aber nur die ID des Innenmoduls ausgeschmissen. Und diese ID bekommt man leichter über die my.netatmo.com Seite.
Also bisher eine Sackgasse. Warum auch immer.
Nächster Versuch mit einem devicelist request. Nun bekomme ich alle deviceIDs.
ABER vielleicht geht es viel einfacher:
Wenn ich mir die Seriennummern des Aussenmoduls und meines Regensensors anschaue Stelle ich fest dass die Seriennummer aus den letzten 6 Ziffern der ID besteht plus Buchstabe davor.
Bei mir wird z.B. aus
h123456 (Seriennummer) ->
02:00:00:12:34:56 (ID)
Oder aus
f123456 ->
05:00:00:12:34:56
(fette Zahlen und Buchstaben unverändert)
Es könnte also sein, dass beim Aussenmodul immer ein "h" vor der Seriennummer steht und die ID mit 02:00:00 beginnt.
Oder der Regensensor mit "f" beginnt und die ID mit 05:00:00 beginnt.
Alles bisher nur Theorie. Bitte einmal bei dir überprüfen.
Ansonsten diesen Code in eine .tcl Datei speichern, Kopf anpassen (clientID, clientSecret, Username, password) auf die CCu kopieren und unter Windoes im winSCP Terminalfenster ausführen wie die netatmo.tcl Datei
Code: Alles auswählen
#!/bin/tclsh
load tclrega.so
#---------------------------------------------------------------------------------------------------------------#
# CONFIG #
#---------------------------------------------------------------------------------------------------------------#
# to obtain your own client ID and API key please register a new app here: http://dev.netatmo.com/dev/listapps
set clientId "XXXXXXXXXXX"
set clientSecret "XXXXXXXXX"
# the following are your normal netatmo credentials (the ones you used to setup your netatmo weather station)
set username "XXXeMailXXX"
set password "XXXXX"
set ::env(LD_LIBRARY_PATH) "/usr/local/addons/cuxd"
set cfgfile "/tmp/netatmo.dat"
set logtag "netatmo.tcl"
set logfacility "local1"
# 0=panic, 1=alert 2=crit 3=err 4=warn 5=notice 6=info 7=debug
set loglevel 7
#---------------------------------------------------------------------------------------------------------------#
#---------------------------------------------------------------------------------------------------------------#
# GLOBAL VARIABLES #
#---------------------------------------------------------------------------------------------------------------#
set accesstoken ""
set refreshtoken ""
set tokenexpires 0
#---------------------------------------------------------------------------------------------------------------#
set loglevels {panic alert crit err warn notice info debug}
proc log {lvl msg} {
global logtag
global logfacility
global loglevel
global loglevels
set lvlnum [lsearch $loglevels $lvl]
if {$lvlnum <= $loglevel} {
if {$lvlnum <= 3} {
catch {exec logger -s -t $logtag -p $logfacility.$lvl $msg}
} else {
puts "$lvl: $msg"
catch {exec logger -t $logtag -p $logfacility.$lvl $msg}
}
}
}
proc refreshToken {rt ci cs} {
log debug "refreshing token"
set url "https://api.netatmo.net/oauth2/token"
set header "Content-Type: application/x-www-form-urlencoded;charset=UTF-8"
set parameter "grant_type=refresh_token&refresh_token=$rt&client_id=$ci&client_secret=$cs"
catch {exec /usr/local/addons/cuxd/curl -k -i -H $header -X POST -d $parameter $url} response
log debug "response was $response"
return $response
}
proc requestToken {ci cs un pw} {
log "debug" "requesting new token"
set url "https://api.netatmo.net/oauth2/token"
set header "Content-Type: application/x-www-form-urlencoded;charset=UTF-8"
set parameter "grant_type=password&client_id=$ci&client_secret=$cs&username=$un&password=$pw"
catch {exec /usr/local/addons/cuxd/curl -k -i -H $header -X POST -d $parameter $url} response
log debug "response was $response"
return $response
}
proc parseOAuthResponse {input} {
log debug "parsing authentication result"
global accesstoken
global refreshtoken
regexp {HTTP/1.1\s(\d*)} $input dummy returncode
regexp {\"access_token\":\"(.*?)\"} $input dummy accesstoken
regexp {\"refresh_token\":\"(.*?)\"} $input dummy refreshtoken
regexp {\"expires_in\":(.*?)\,} $input dummy expiresin
log debug "returncode is $returncode"
log debug "access token is $accesstoken"
log debug "refresh token is $refreshtoken"
log debug "expires in $expiresin"
if {[expr $returncode]!=200} {
log error "Authentication failed with code $returncode and response $input"
exit 1
}
return $expiresin
}
proc saveAccessToken {expin} {
global accesstoken
global refreshtoken
global tokenexpires
global cfgfile
log debug "saving new access token to $cfgfile"
set fileId [open $cfgfile "w"]
set now [clock seconds]
set tokenexpires [expr $now + $expin]
puts $fileId $accesstoken
puts $fileId $refreshtoken
puts $fileId $tokenexpires
close $fileId
}
proc loadAccessToken {} {
global accesstoken
global refreshtoken
global tokenexpires
global cfgfile
log debug "loading stored credentials from $cfgfile"
set fp [open $cfgfile r]
set file_data [read $fp]
close $fp
log debug "file data is: $file_data"
set data [split $file_data "\n"]
set accesstoken [lindex $data 0]
set refreshtoken [lindex $data 1]
set tokenexpires [lindex $data 2]
}
log debug "script has started"
if { [file exists $cfgfile] == 1} {
log info "found stored credentials"
loadAccessToken
set now [clock seconds]
log debug "current time is [clock format $now -format "%Y-%m-%dT%H:%M:%S"], token is valid until [clock format $tokenexpires -format "%Y-%m-%dT%H:%M:%S"]"
if {[expr $now >= $tokenexpires] == 1} {
log notice "token has already expired"
saveAccessToken [parseOAuthResponse [refreshToken $refreshtoken $clientId $clientSecret]]
log notice "oauth token successfully refreshed"
} else {
log info "token is still valid"
}
} else {
log warn "no stored credentials found"
saveAccessToken [parseOAuthResponse [requestToken $clientId $clientSecret $username $password]]
log notice "oauth token successfully initialized"
}
log debug "getting deviceIDs mit getuser"
set url "https://api.netatmo.net/api/getuser?access_token=$accesstoken"
catch {exec /usr/local/addons/cuxd/curl -k -# $url} response
log debug "response is: $response"
log debug "getting DeviceIDs mit devicelist"
set url "https://api.netatmo.net/api/devicelist?access_token=$accesstoken"
catch {exec /usr/local/addons/cuxd/curl -k -# $url} response
log debug "response is: $response"
Ich habe nur die original netatmo.tcl Datei umgebaut. Es mag also noch allerlei nicht notwendiges enthalten sein. Aber so tut sie zumindest was sie soll.
In der langen Antwort verstecken sich die DeviceIDs aller Module.
Ich hoffe es klappt.
Tobi