Nein, sehe ich nicht. An welcher Stelle in meinem Satz von oben...
... habe ich mich missverständlich ausgedrückt?
Gruß Xel66
Moderator: Co-Administratoren
Nein, sehe ich nicht. An welcher Stelle in meinem Satz von oben...
... habe ich mich missverständlich ausgedrückt?
Das hat weniger etwas mit einem Skript auf der CCU direkt zu tun, sondern mit der Art und Weise wie OAuth2 funktioniert. Dazu muss eine feste Redirect URL für OAuth2 vorhanden sein, an die der Token vom Hersteller übergeben wird. Eine CCU ist per se ohne das nutzten über einen Dienst eines Drittanbieters aber nicht aus dem Internet für einen anderen Anbieter (Hersteller) per fester URL erreichbar. Eine CCU3 funktioniert zunächst mal nur ausschließlich lokal, ohne das diese aus dem Internet direkt für andere Hersteller erreichbar wäre. Wenn Du eine CCU3 über einen vom Hersteller eQ-3 vorinstallierten Dienst auf der CCU3 auch sicher aus dem Internet erreichbar machst bzw. für andere Hersteller erreichbar machst, dann ist es aber auch unnötig etwas mit einem Skript zu versuchen zu lösen, wenn durch die Anbindung durch den Drittanbieter einer CCU3 in das Internet bzw. an Cloud APIs von anderen Herstellern so oder so auch gleichzeitig eine Anbindung und Authentifizierung über OAuth2 beim Hersteller wie Legrand für Netatmo erfolgt, wie z.B. mediola Cloud Services und einem aktivierten NEO Server auf der CCU3.
Das hatte Bernd112 ja bereits gelesen und zur Kenntnis genommen und mitHEINEN_Eric hat geschrieben: ↑20.03.2023, 13:43Hier die dazu passende Quelle: viewtopic.php?f=31&t=28188&p=746203#p742908
kommentiert.
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 "******************"
set clientSecret "**********************"
# the following are your normal netatmo credentials (the ones you used to setup your netatmo weather station)
set username "****************"
set password "****************"
# the following are MAC addresses of your indoor station and the outside module and rain module
set deviceid "70:ee:50:22:**:**"
set moduleid "02:00:00:22:**:**"
set szid "03:00:00:04:**:**"
set buid "03:00:00:04:**:**"
set gaid "03:00:00:07:**:**"
set rainid "05:00:00:03:**:**"
set windid "06:00:00:01:**:**"
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 6
#---------------------------------------------------------------------------------------------------------------#
#---------------------------------------------------------------------------------------------------------------#
# 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 "polling outdoor module..."
set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$moduleid&scale=max&type=Temperature,Humidity&date_end=last"
log debug "querying $url"
catch {exec /usr/local/addons/cuxd/curl -k -# $url} response
log debug "response is: $response"
regexp {\"value\":\[\[(.*?),(.*?)\]} $response dummy otemp ohum
log info "Outside temperature is $otemp"
log info "Outside humidity is $ohum"
log debug "polling main module..."
set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&scale=max&type=Temperature,Humidity,CO2,Pressure,Noise&date_end=last"
log debug "querying $url"
catch {exec /usr/local/addons/cuxd/curl -k -# $url} response
log debug "response is: $response"
regexp {\"value\":\[\[(.*?),(.*?),(.*?),(.*?),(.*?)\]} $response dummy itemp ihum ico2 ipressure inoise
log info "LogI is $response"
log info "Inside temperature is $itemp"
log info "Inside humidity is $ihum"
log info "Inside CO2 level $ico2"
log info "Inside pressure is $ipressure"
log info "Inside noise level is $inoise"
log debug "polling zusatzmodule..."
set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$szid&scale=max&type=Temperature,Humidity,CO2&date_end=last"
log debug "querying $url"
catch {exec /usr/local/addons/cuxd/curl -k -# $url} response
log debug "response is: $response"
regexp {\"value\":\[\[(.*?),(.*?),(.*?)\]} $response dummy ztemp zhum zco2
log info "LogI is $response"
log info "Inside temperature is $ztemp"
log info "Inside humidity is $zhum"
log info "Inside CO2 level $zco2"
log debug "polling zusatzmodule1..."
set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$buid&scale=max&type=Temperature,Humidity,CO2&date_end=last"
log debug "querying $url"
catch {exec /usr/local/addons/cuxd/curl -k -# $url} response
log debug "response is: $response"
regexp {\"value\":\[\[(.*?),(.*?),(.*?)\]} $response dummy btemp bhum bco2
log info "LogI is $response"
log info "Inside temperature is $btemp"
log info "Inside humidity is $bhum"
log info "Inside CO2 level $bco2"
log debug "polling zusatzmodule2..."
set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$gaid&scale=max&type=Temperature,Humidity,CO2&date_end=last"
log debug "querying $url"
catch {exec /usr/local/addons/cuxd/curl -k -# $url} response
log debug "response is: $response"
regexp {\"value\":\[\[(.*?),(.*?),(.*?)\]} $response dummy gtemp ghum gco2
log info "LogI is $response"
log info "Inside temperature is $gtemp"
log info "Inside humidity is $ghum"
log info "Inside CO2 level $gco2"
log debug "polling regensensor module...1d"
set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$rainid&scale=1day&type=sum_rain&date_end=last"
log debug "querying $url"
catch {exec /usr/local/addons/cuxd/curl -k -# $url} response
log debug "response is: $response"
regexp {\"value\":\[\[(.*?)\]} $response dummy rain1d
log info "LogR is $response"
log info "Outside Regen1d is $rain1d"
log debug "polling regensensor module...30min"
set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$rainid&scale=30min&type=Rain,sum_rain&date_end=last"
log debug "querying $url"
catch {exec /usr/local/addons/cuxd/curl -k -# $url} response
log debug "response is: $response"
regexp {\"value\":\[\[(.*?),(.*?)\]} $response dummy rain2 rain30min
log info "LogR is $response"
log info "Outside rain2 is $rain2"
log info "Outside Regen30min is $rain30min"
#log debug "polling wind module..."
#set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$windid&scale=max&type=WindStrength,GustAngle,GustStrength&date_end=last"
#log debug "quering $url"
#catch {exec /usr/local/addons/cuxd/curl -k -# $url} response
#log debug "respnose is $response"
#regexp {\"value\":\[\[(.*?),(.*?),(.*?),(.*?)\]} $response dummy windstrength gustangle guststrength
#log info "WindAngle is $windangle"
#log info "Windstrength is $windstrength"
#log info "GustAngle is $gustangle"
#log info "Guststrength is $guststrength"
#
# set ReGaHss variables
#
set rega_cmd ""
append rega_cmd "var ITemp = dom.GetObject('CUxD.CUX9002001:1.SET_TEMPERATURE');"
append rega_cmd "var IHumi = dom.GetObject('CUxD.CUX9002001:1.SET_HUMIDITY');"
append rega_cmd "var OTemp = dom.GetObject('CUxD.CUX9002002:1.SET_TEMPERATURE');"
append rega_cmd "var OHumi = dom.GetObject('CUxD.CUX9002002:1.SET_HUMIDITY');"
append rega_cmd "var OTemp = dom.GetObject('Temp_aussen');"
append rega_cmd "var OHumi = dom.GetObject('Luftfeuchtigkeit _aussen');"
append rega_cmd "var IPress = dom.GetObject('Luftdruck');"
append rega_cmd "var ICO2 = dom.GetObject('CO2');"
append rega_cmd "var INoise = dom.GetObject('Sonometer');"
append rega_cmd "var Rain1 = dom.GetObject('Regenmenge_30min');"
append rega_cmd "var Rain2 = dom.GetObject('Regenmenge_1d');"
append rega_cmd "var Rain3 = dom.GetObject('Regen_aktuell');"
#append rega_cmd "var windA = dom.GetObject('Windrichtung');"
#append rega_cmd "var windS = dom.GetObject('Windstaerke');"
#append rega_cmd "var gustA = dom.GetObject('Gustangle');"
#append rega_cmd "var gustS = dom.GetObject('Guststaerke');"
append rega_cmd "OTemp.State('$otemp');"
append rega_cmd "OHumi.State('$ohum');"
append rega_cmd "ITemp.State('$itemp');"
append rega_cmd "IHumi.State('$ihum');"
append rega_cmd "IPress.State('$ipressure');"
append rega_cmd "ICO2.State('$ico2');"
append rega_cmd "INoise.State('$inoise');"
append rega_cmd "Rain1.State('$rain30min');"
append rega_cmd "Rain2.State('$rain1d');"
append rega_cmd "Rain3.State('$rain2');"
#append rega_cmd "windA.State('$windangle');"
#append rega_cmd "windS.State('$windstrength');"
#append rega_cmd "gustA.State('$gustangle');"
#append rega_cmd "gustS.State('$guststrength');"
append rega_cmd "var sdatetime = system.Date('%d.%m.%Y %H:%M:%S');"
append rega_cmd "var netatmosynctime = dom.GetObject('SyncTime');"
append rega_cmd "netatmosynctime.Variable(sdatetime.ToString());"
append rega_cmd "var ZTemp = dom.GetObject('CUxD.CUX9002003:1.SET_TEMPERATURE');"
append rega_cmd "var ZHumi = dom.GetObject('CUxD.CUX9002003:1.SET_HUMIDITY');"
append rega_cmd "var ZCO2 = dom.GetObject('CO2_SZ');"
append rega_cmd "ZTemp.State('$ztemp');"
append rega_cmd "ZHumi.State('$zhum');"
append rega_cmd "ZCO2.State('$zco2');"
append rega_cmd "var BTemp = dom.GetObject('CUxD.CUX9002004:1.SET_TEMPERATURE');"
append rega_cmd "var BHumi = dom.GetObject('CUxD.CUX9002004:1.SET_HUMIDITY');"
append rega_cmd "var BCO2 = dom.GetObject('CO2_BU');"
append rega_cmd "BTemp.State('$btemp');"
append rega_cmd "BHumi.State('$bhum');"
append rega_cmd "BCO2.State('$bco2');"
append rega_cmd "var GTemp = dom.GetObject('CUxD.CUX9002005:1.SET_TEMPERATURE');"
append rega_cmd "var GHumi = dom.GetObject('CUxD.CUX9002005:1.SET_HUMIDITY');"
append rega_cmd "var GCO2 = dom.GetObject('CO2_GA');"
append rega_cmd "GTemp.State('$gtemp');"
append rega_cmd "GHumi.State('$ghum');"
append rega_cmd "GCO2.State('$gco2');"
rega_script $rega_cmd
blueb6 hat geschrieben: ↑22.07.2023, 09:41Guten Morgen
Ich bin verzweifelt, ich habe die Einbindung jetzt schon seit jahren laufen, vor ein paar jahren hat dann die Einbindung mit dem Wind nicht mehr funktioniert,... OK ich war auch nicht sonderlich dahinter das zu beheben.
Aber seit 2 Tage geht garnichts mehr. ich habe das letzte update von der Homematic gemacht und auf einmal geht garnichts mehr, es werden keine daten mehr in die Variablen oder Geräte geschrieben.
Auch die CuxD Geräte sagen dass sie nicht verbunden sind, diese hab ich dann neu angelegt, hat aber auch nichts gebracht
nächster versuch, Zentrale auf die Vorhergehende FW Version zurückzusetzen und ein altes Backup einspielen, Fehlanzeige, geht trotzdem nicht.
hat da jemand eine Idee?
Danke lg Tom
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 "******************" set clientSecret "**********************" # the following are your normal netatmo credentials (the ones you used to setup your netatmo weather station) set username "****************" set password "****************" # the following are MAC addresses of your indoor station and the outside module and rain module set deviceid "70:ee:50:22:**:**" set moduleid "02:00:00:22:**:**" set szid "03:00:00:04:**:**" set buid "03:00:00:04:**:**" set gaid "03:00:00:07:**:**" set rainid "05:00:00:03:**:**" set windid "06:00:00:01:**:**" 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 6 #---------------------------------------------------------------------------------------------------------------# #---------------------------------------------------------------------------------------------------------------# # 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 "polling outdoor module..." set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$moduleid&scale=max&type=Temperature,Humidity&date_end=last" log debug "querying $url" catch {exec /usr/local/addons/cuxd/curl -k -# $url} response log debug "response is: $response" regexp {\"value\":\[\[(.*?),(.*?)\]} $response dummy otemp ohum log info "Outside temperature is $otemp" log info "Outside humidity is $ohum" log debug "polling main module..." set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&scale=max&type=Temperature,Humidity,CO2,Pressure,Noise&date_end=last" log debug "querying $url" catch {exec /usr/local/addons/cuxd/curl -k -# $url} response log debug "response is: $response" regexp {\"value\":\[\[(.*?),(.*?),(.*?),(.*?),(.*?)\]} $response dummy itemp ihum ico2 ipressure inoise log info "LogI is $response" log info "Inside temperature is $itemp" log info "Inside humidity is $ihum" log info "Inside CO2 level $ico2" log info "Inside pressure is $ipressure" log info "Inside noise level is $inoise" log debug "polling zusatzmodule..." set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$szid&scale=max&type=Temperature,Humidity,CO2&date_end=last" log debug "querying $url" catch {exec /usr/local/addons/cuxd/curl -k -# $url} response log debug "response is: $response" regexp {\"value\":\[\[(.*?),(.*?),(.*?)\]} $response dummy ztemp zhum zco2 log info "LogI is $response" log info "Inside temperature is $ztemp" log info "Inside humidity is $zhum" log info "Inside CO2 level $zco2" log debug "polling zusatzmodule1..." set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$buid&scale=max&type=Temperature,Humidity,CO2&date_end=last" log debug "querying $url" catch {exec /usr/local/addons/cuxd/curl -k -# $url} response log debug "response is: $response" regexp {\"value\":\[\[(.*?),(.*?),(.*?)\]} $response dummy btemp bhum bco2 log info "LogI is $response" log info "Inside temperature is $btemp" log info "Inside humidity is $bhum" log info "Inside CO2 level $bco2" log debug "polling zusatzmodule2..." set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$gaid&scale=max&type=Temperature,Humidity,CO2&date_end=last" log debug "querying $url" catch {exec /usr/local/addons/cuxd/curl -k -# $url} response log debug "response is: $response" regexp {\"value\":\[\[(.*?),(.*?),(.*?)\]} $response dummy gtemp ghum gco2 log info "LogI is $response" log info "Inside temperature is $gtemp" log info "Inside humidity is $ghum" log info "Inside CO2 level $gco2" log debug "polling regensensor module...1d" set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$rainid&scale=1day&type=sum_rain&date_end=last" log debug "querying $url" catch {exec /usr/local/addons/cuxd/curl -k -# $url} response log debug "response is: $response" regexp {\"value\":\[\[(.*?)\]} $response dummy rain1d log info "LogR is $response" log info "Outside Regen1d is $rain1d" log debug "polling regensensor module...30min" set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$rainid&scale=30min&type=Rain,sum_rain&date_end=last" log debug "querying $url" catch {exec /usr/local/addons/cuxd/curl -k -# $url} response log debug "response is: $response" regexp {\"value\":\[\[(.*?),(.*?)\]} $response dummy rain2 rain30min log info "LogR is $response" log info "Outside rain2 is $rain2" log info "Outside Regen30min is $rain30min" #log debug "polling wind module..." #set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$windid&scale=max&type=WindStrength,GustAngle,GustStrength&date_end=last" #log debug "quering $url" #catch {exec /usr/local/addons/cuxd/curl -k -# $url} response #log debug "respnose is $response" #regexp {\"value\":\[\[(.*?),(.*?),(.*?),(.*?)\]} $response dummy windstrength gustangle guststrength #log info "WindAngle is $windangle" #log info "Windstrength is $windstrength" #log info "GustAngle is $gustangle" #log info "Guststrength is $guststrength" # # set ReGaHss variables # set rega_cmd "" append rega_cmd "var ITemp = dom.GetObject('CUxD.CUX9002001:1.SET_TEMPERATURE');" append rega_cmd "var IHumi = dom.GetObject('CUxD.CUX9002001:1.SET_HUMIDITY');" append rega_cmd "var OTemp = dom.GetObject('CUxD.CUX9002002:1.SET_TEMPERATURE');" append rega_cmd "var OHumi = dom.GetObject('CUxD.CUX9002002:1.SET_HUMIDITY');" append rega_cmd "var OTemp = dom.GetObject('Temp_aussen');" append rega_cmd "var OHumi = dom.GetObject('Luftfeuchtigkeit _aussen');" append rega_cmd "var IPress = dom.GetObject('Luftdruck');" append rega_cmd "var ICO2 = dom.GetObject('CO2');" append rega_cmd "var INoise = dom.GetObject('Sonometer');" append rega_cmd "var Rain1 = dom.GetObject('Regenmenge_30min');" append rega_cmd "var Rain2 = dom.GetObject('Regenmenge_1d');" append rega_cmd "var Rain3 = dom.GetObject('Regen_aktuell');" #append rega_cmd "var windA = dom.GetObject('Windrichtung');" #append rega_cmd "var windS = dom.GetObject('Windstaerke');" #append rega_cmd "var gustA = dom.GetObject('Gustangle');" #append rega_cmd "var gustS = dom.GetObject('Guststaerke');" append rega_cmd "OTemp.State('$otemp');" append rega_cmd "OHumi.State('$ohum');" append rega_cmd "ITemp.State('$itemp');" append rega_cmd "IHumi.State('$ihum');" append rega_cmd "IPress.State('$ipressure');" append rega_cmd "ICO2.State('$ico2');" append rega_cmd "INoise.State('$inoise');" append rega_cmd "Rain1.State('$rain30min');" append rega_cmd "Rain2.State('$rain1d');" append rega_cmd "Rain3.State('$rain2');" #append rega_cmd "windA.State('$windangle');" #append rega_cmd "windS.State('$windstrength');" #append rega_cmd "gustA.State('$gustangle');" #append rega_cmd "gustS.State('$guststrength');" append rega_cmd "var sdatetime = system.Date('%d.%m.%Y %H:%M:%S');" append rega_cmd "var netatmosynctime = dom.GetObject('SyncTime');" append rega_cmd "netatmosynctime.Variable(sdatetime.ToString());" append rega_cmd "var ZTemp = dom.GetObject('CUxD.CUX9002003:1.SET_TEMPERATURE');" append rega_cmd "var ZHumi = dom.GetObject('CUxD.CUX9002003:1.SET_HUMIDITY');" append rega_cmd "var ZCO2 = dom.GetObject('CO2_SZ');" append rega_cmd "ZTemp.State('$ztemp');" append rega_cmd "ZHumi.State('$zhum');" append rega_cmd "ZCO2.State('$zco2');" append rega_cmd "var BTemp = dom.GetObject('CUxD.CUX9002004:1.SET_TEMPERATURE');" append rega_cmd "var BHumi = dom.GetObject('CUxD.CUX9002004:1.SET_HUMIDITY');" append rega_cmd "var BCO2 = dom.GetObject('CO2_BU');" append rega_cmd "BTemp.State('$btemp');" append rega_cmd "BHumi.State('$bhum');" append rega_cmd "BCO2.State('$bco2');" append rega_cmd "var GTemp = dom.GetObject('CUxD.CUX9002005:1.SET_TEMPERATURE');" append rega_cmd "var GHumi = dom.GetObject('CUxD.CUX9002005:1.SET_HUMIDITY');" append rega_cmd "var GCO2 = dom.GetObject('CO2_GA');" append rega_cmd "GTemp.State('$gtemp');" append rega_cmd "GHumi.State('$ghum');" append rega_cmd "GCO2.State('$gco2');" rega_script $rega_cmd
HAJHomematic hat geschrieben: ↑24.07.2023, 16:29hi, hast du das problem schon behoben.
Es scheint als hätte Netatmo die URLs oder auch die auth geändert... hatte da wohl mal eine mail aber finde es nicht mehr
Lösung ?
blueb6 hat geschrieben: ↑22.07.2023, 09:41Guten Morgen
Ich bin verzweifelt, ich habe die Einbindung jetzt schon seit jahren laufen, vor ein paar jahren hat dann die Einbindung mit dem Wind nicht mehr funktioniert,... OK ich war auch nicht sonderlich dahinter das zu beheben.
Aber seit 2 Tage geht garnichts mehr. ich habe das letzte update von der Homematic gemacht und auf einmal geht garnichts mehr, es werden keine daten mehr in die Variablen oder Geräte geschrieben.
Auch die CuxD Geräte sagen dass sie nicht verbunden sind, diese hab ich dann neu angelegt, hat aber auch nichts gebracht
nächster versuch, Zentrale auf die Vorhergehende FW Version zurückzusetzen und ein altes Backup einspielen, Fehlanzeige, geht trotzdem nicht.
hat da jemand eine Idee?
Danke lg Tom
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 "******************" set clientSecret "**********************" # the following are your normal netatmo credentials (the ones you used to setup your netatmo weather station) set username "****************" set password "****************" # the following are MAC addresses of your indoor station and the outside module and rain module set deviceid "70:ee:50:22:**:**" set moduleid "02:00:00:22:**:**" set szid "03:00:00:04:**:**" set buid "03:00:00:04:**:**" set gaid "03:00:00:07:**:**" set rainid "05:00:00:03:**:**" set windid "06:00:00:01:**:**" 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 6 #---------------------------------------------------------------------------------------------------------------# #---------------------------------------------------------------------------------------------------------------# # 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 "polling outdoor module..." set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$moduleid&scale=max&type=Temperature,Humidity&date_end=last" log debug "querying $url" catch {exec /usr/local/addons/cuxd/curl -k -# $url} response log debug "response is: $response" regexp {\"value\":\[\[(.*?),(.*?)\]} $response dummy otemp ohum log info "Outside temperature is $otemp" log info "Outside humidity is $ohum" log debug "polling main module..." set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&scale=max&type=Temperature,Humidity,CO2,Pressure,Noise&date_end=last" log debug "querying $url" catch {exec /usr/local/addons/cuxd/curl -k -# $url} response log debug "response is: $response" regexp {\"value\":\[\[(.*?),(.*?),(.*?),(.*?),(.*?)\]} $response dummy itemp ihum ico2 ipressure inoise log info "LogI is $response" log info "Inside temperature is $itemp" log info "Inside humidity is $ihum" log info "Inside CO2 level $ico2" log info "Inside pressure is $ipressure" log info "Inside noise level is $inoise" log debug "polling zusatzmodule..." set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$szid&scale=max&type=Temperature,Humidity,CO2&date_end=last" log debug "querying $url" catch {exec /usr/local/addons/cuxd/curl -k -# $url} response log debug "response is: $response" regexp {\"value\":\[\[(.*?),(.*?),(.*?)\]} $response dummy ztemp zhum zco2 log info "LogI is $response" log info "Inside temperature is $ztemp" log info "Inside humidity is $zhum" log info "Inside CO2 level $zco2" log debug "polling zusatzmodule1..." set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$buid&scale=max&type=Temperature,Humidity,CO2&date_end=last" log debug "querying $url" catch {exec /usr/local/addons/cuxd/curl -k -# $url} response log debug "response is: $response" regexp {\"value\":\[\[(.*?),(.*?),(.*?)\]} $response dummy btemp bhum bco2 log info "LogI is $response" log info "Inside temperature is $btemp" log info "Inside humidity is $bhum" log info "Inside CO2 level $bco2" log debug "polling zusatzmodule2..." set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$gaid&scale=max&type=Temperature,Humidity,CO2&date_end=last" log debug "querying $url" catch {exec /usr/local/addons/cuxd/curl -k -# $url} response log debug "response is: $response" regexp {\"value\":\[\[(.*?),(.*?),(.*?)\]} $response dummy gtemp ghum gco2 log info "LogI is $response" log info "Inside temperature is $gtemp" log info "Inside humidity is $ghum" log info "Inside CO2 level $gco2" log debug "polling regensensor module...1d" set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$rainid&scale=1day&type=sum_rain&date_end=last" log debug "querying $url" catch {exec /usr/local/addons/cuxd/curl -k -# $url} response log debug "response is: $response" regexp {\"value\":\[\[(.*?)\]} $response dummy rain1d log info "LogR is $response" log info "Outside Regen1d is $rain1d" log debug "polling regensensor module...30min" set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$rainid&scale=30min&type=Rain,sum_rain&date_end=last" log debug "querying $url" catch {exec /usr/local/addons/cuxd/curl -k -# $url} response log debug "response is: $response" regexp {\"value\":\[\[(.*?),(.*?)\]} $response dummy rain2 rain30min log info "LogR is $response" log info "Outside rain2 is $rain2" log info "Outside Regen30min is $rain30min" #log debug "polling wind module..." #set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$windid&scale=max&type=WindStrength,GustAngle,GustStrength&date_end=last" #log debug "quering $url" #catch {exec /usr/local/addons/cuxd/curl -k -# $url} response #log debug "respnose is $response" #regexp {\"value\":\[\[(.*?),(.*?),(.*?),(.*?)\]} $response dummy windstrength gustangle guststrength #log info "WindAngle is $windangle" #log info "Windstrength is $windstrength" #log info "GustAngle is $gustangle" #log info "Guststrength is $guststrength" # # set ReGaHss variables # set rega_cmd "" append rega_cmd "var ITemp = dom.GetObject('CUxD.CUX9002001:1.SET_TEMPERATURE');" append rega_cmd "var IHumi = dom.GetObject('CUxD.CUX9002001:1.SET_HUMIDITY');" append rega_cmd "var OTemp = dom.GetObject('CUxD.CUX9002002:1.SET_TEMPERATURE');" append rega_cmd "var OHumi = dom.GetObject('CUxD.CUX9002002:1.SET_HUMIDITY');" append rega_cmd "var OTemp = dom.GetObject('Temp_aussen');" append rega_cmd "var OHumi = dom.GetObject('Luftfeuchtigkeit _aussen');" append rega_cmd "var IPress = dom.GetObject('Luftdruck');" append rega_cmd "var ICO2 = dom.GetObject('CO2');" append rega_cmd "var INoise = dom.GetObject('Sonometer');" append rega_cmd "var Rain1 = dom.GetObject('Regenmenge_30min');" append rega_cmd "var Rain2 = dom.GetObject('Regenmenge_1d');" append rega_cmd "var Rain3 = dom.GetObject('Regen_aktuell');" #append rega_cmd "var windA = dom.GetObject('Windrichtung');" #append rega_cmd "var windS = dom.GetObject('Windstaerke');" #append rega_cmd "var gustA = dom.GetObject('Gustangle');" #append rega_cmd "var gustS = dom.GetObject('Guststaerke');" append rega_cmd "OTemp.State('$otemp');" append rega_cmd "OHumi.State('$ohum');" append rega_cmd "ITemp.State('$itemp');" append rega_cmd "IHumi.State('$ihum');" append rega_cmd "IPress.State('$ipressure');" append rega_cmd "ICO2.State('$ico2');" append rega_cmd "INoise.State('$inoise');" append rega_cmd "Rain1.State('$rain30min');" append rega_cmd "Rain2.State('$rain1d');" append rega_cmd "Rain3.State('$rain2');" #append rega_cmd "windA.State('$windangle');" #append rega_cmd "windS.State('$windstrength');" #append rega_cmd "gustA.State('$gustangle');" #append rega_cmd "gustS.State('$guststrength');" append rega_cmd "var sdatetime = system.Date('%d.%m.%Y %H:%M:%S');" append rega_cmd "var netatmosynctime = dom.GetObject('SyncTime');" append rega_cmd "netatmosynctime.Variable(sdatetime.ToString());" append rega_cmd "var ZTemp = dom.GetObject('CUxD.CUX9002003:1.SET_TEMPERATURE');" append rega_cmd "var ZHumi = dom.GetObject('CUxD.CUX9002003:1.SET_HUMIDITY');" append rega_cmd "var ZCO2 = dom.GetObject('CO2_SZ');" append rega_cmd "ZTemp.State('$ztemp');" append rega_cmd "ZHumi.State('$zhum');" append rega_cmd "ZCO2.State('$zco2');" append rega_cmd "var BTemp = dom.GetObject('CUxD.CUX9002004:1.SET_TEMPERATURE');" append rega_cmd "var BHumi = dom.GetObject('CUxD.CUX9002004:1.SET_HUMIDITY');" append rega_cmd "var BCO2 = dom.GetObject('CO2_BU');" append rega_cmd "BTemp.State('$btemp');" append rega_cmd "BHumi.State('$bhum');" append rega_cmd "BCO2.State('$bco2');" append rega_cmd "var GTemp = dom.GetObject('CUxD.CUX9002005:1.SET_TEMPERATURE');" append rega_cmd "var GHumi = dom.GetObject('CUxD.CUX9002005:1.SET_HUMIDITY');" append rega_cmd "var GCO2 = dom.GetObject('CO2_GA');" append rega_cmd "GTemp.State('$gtemp');" append rega_cmd "GHumi.State('$ghum');" append rega_cmd "GCO2.State('$gco2');" rega_script $rega_cmd