Netatmo Wetterstation (incl. CO2 Messung) einbinden
Moderator: Co-Administratoren
Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden
Danke, jetzt passts! API hab ich auch.
Blöde Frage: Gibt es auch eine Möglichkeit die öffentlichen Daten von einer Netatmos Wetterstation aus meiner Nachbarschaft in HM abzugreifen? Lt. https://weathermap.netatmo.com wären da ein paar in meiner Gegend.
Im WWW hab ich das dazu gefunden: https://dev.netatmo.com/en-US/resources ... publicdata.
Also die Daten kann man abgreifen, aber ohne ModulID krieg ich sie nicht in die Homematic oder?
Blöde Frage: Gibt es auch eine Möglichkeit die öffentlichen Daten von einer Netatmos Wetterstation aus meiner Nachbarschaft in HM abzugreifen? Lt. https://weathermap.netatmo.com wären da ein paar in meiner Gegend.
Im WWW hab ich das dazu gefunden: https://dev.netatmo.com/en-US/resources ... publicdata.
Also die Daten kann man abgreifen, aber ohne ModulID krieg ich sie nicht in die Homematic oder?
Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden - zu dumm dazu
Komme erst jetzt dazu, mich ganz dolle zu bedanken. Das Löschen der überflüssigen Kommandozeilen war der Fehler. Das Auskommentieren nützt nichts.Bulli hat geschrieben: ↑19.09.2018, 19:26Hallo herkherk hat geschrieben: ↑17.09.2018, 17:57Hallo zusammen,
komme einfach nicht mehr weiter
Ich dachte eigentlich, copy&paste wäre kein Problem und die Anleitung ist ja auch super geschrieben. Habe problemlos alle Variablen herausbekommen....aber: Nix passiert in der CCU3 und im Terminal bekomme ich folgendes Ergebnis vom script:
17:16:10 [ttyACM0] --> ? (api.netatmo.net is unknown) Use one of B b C F i A Z E G M K U Y R T V W X e f m l t u x
Was bedeutet das und wie behebe ich das???? Fragen über Fragen.
Kann jemand helfen?
Danke
die Fehlermeldung sagt mir erst mal gar nichts. Was komisch ist >>>17:16:10 [ttyACM0] <<< wo kommt das denn her?
Am besten auch mal das Script posten und was bis jetzt geht oder eben nicht. Zugangsdaten aus XXX nicht vergessen.
Gruß
Bulli
Danke Bulli
Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden
Ich bin heute von meiner CCU2 auf eine CCU3 umgezogen, entsprechend dem dafür hier im Forum empfohlenen Ablauf.
Leider werden die Temperatur und Luftfeuchtigkeit nicht in die CCU-Netatmo-Geräte übertragen. Andere Werte, wie der CO2-Gehalt hingegen schon. Beim Netatmo-Aufruf sehe ich in der Ausgabe des tcl-Skripts, dass die Temperatur und die Luftfeuchtigkeit korrekt abgerufen werden. Das funktioniert also auch nach dem Transfer von der CCU2 auf die CCU3 noch.
Meine Vermutung ist, dass eine Einstellung an den CCU-Netatmo-Geräten noch nicht passt. Denn alle die Eigenschaften, die ich über eine separate Systemvariable fülle, werden ja korrekt übertragen. Nur die eigentlichen Werte Temperatur und Luftfeuchtigkeit des Geräts jeweils nicht.
Ich habe deshalb die entsprechenden Screenshots der Einstellungen angehängt. Falls noch Infos fehlen, reiche ich die natürlich zeitnah nach.
Leider werden die Temperatur und Luftfeuchtigkeit nicht in die CCU-Netatmo-Geräte übertragen. Andere Werte, wie der CO2-Gehalt hingegen schon. Beim Netatmo-Aufruf sehe ich in der Ausgabe des tcl-Skripts, dass die Temperatur und die Luftfeuchtigkeit korrekt abgerufen werden. Das funktioniert also auch nach dem Transfer von der CCU2 auf die CCU3 noch.
Meine Vermutung ist, dass eine Einstellung an den CCU-Netatmo-Geräten noch nicht passt. Denn alle die Eigenschaften, die ich über eine separate Systemvariable fülle, werden ja korrekt übertragen. Nur die eigentlichen Werte Temperatur und Luftfeuchtigkeit des Geräts jeweils nicht.
Ich habe deshalb die entsprechenden Screenshots der Einstellungen angehängt. Falls noch Infos fehlen, reiche ich die natürlich zeitnah nach.
Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden
Ist gelöst. Wer lesen kann ist doch im Vorteil ...
Im How-to war nachzulesen, welche Einstellungen bei den CUxD-Geräten nicht passten.
Im How-to war nachzulesen, welche Einstellungen bei den CUxD-Geräten nicht passten.
Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden
Hallo,
das ganze funktioniert sehr gut.
Vielen Dank dafür!
Ich würde gerne mehrere Zusatz-Innenmodule einbinden.
Was muss ich genau ergänzen bzw. abändern?
das ganze funktioniert sehr gut.
Vielen Dank dafür!
Ich würde gerne mehrere Zusatz-Innenmodule einbinden.
Was muss ich genau ergänzen bzw. abändern?
-
- Beiträge: 494
- Registriert: 29.04.2014, 18:38
- Hat sich bedankt: 2 Mal
- Danksagung erhalten: 9 Mal
Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden
Hallo
Howto bekannt? Das steht es drin, wenn dann noch Fragen offen sind einfach wieder hier Fragen.
viewtopic.php?f=31&t=28188&hilit=netatmo+howto#p277517
Gruß
Bulli
Howto bekannt? Das steht es drin, wenn dann noch Fragen offen sind einfach wieder hier Fragen.
viewtopic.php?f=31&t=28188&hilit=netatmo+howto#p277517
Gruß
Bulli
Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden
Hallo,
Howto ist mir bekannt, aber ich will mehr als ein Zusatz-Innenmodul in die Raspberrymatic einbinden, deshalb auch die Frage.
Beschrieben wird dort nur 1x Hauptmodulinnen, Außenmodul und ein weiteres Zusatz-Innenmessmodul, das funktioniert auch, aber will noch weiter 3stk. einbinden.
Howto ist mir bekannt, aber ich will mehr als ein Zusatz-Innenmodul in die Raspberrymatic einbinden, deshalb auch die Frage.
Beschrieben wird dort nur 1x Hauptmodulinnen, Außenmodul und ein weiteres Zusatz-Innenmessmodul, das funktioniert auch, aber will noch weiter 3stk. einbinden.
Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden
Erst mal vielen Dank für das tolle Skript! Es ließ sich alles auf der CCU3 gut einrichten - aber es funktioniert nicht...
Zwei Fragen daher:
weiter vorne steht, dass die Anführungszeichen bei den ID's
Zeile 9 set clientid "123456789"
Zeile 10 set clientid "123456789"
Zeile 12 set username "username"
Zeile 13 set username "passwort"
Zeile 15 set deviceid "ID vom Innenmodul"
Zeile 16 set deviceid "ID vom Aussenmodul"
Zeile 17 set deviceid "ID vom Regenmodul"
Zeile 18 set deviceid "ID vom Windmodul"
wegfallen müssen. Stimmt das?
Und ich bekomme im Terminal folgende Fehlermeldung:
# tclsh /usr/local/addons/netatmo/netatmo.tcl
invalid command name ""
while executing
" !/bin/tclsh"
(file "/usr/local/addons/netatmo/netatmo.tcl" line 1)
Was mache ich falsch?
Zwei Fragen daher:
weiter vorne steht, dass die Anführungszeichen bei den ID's
Zeile 9 set clientid "123456789"
Zeile 10 set clientid "123456789"
Zeile 12 set username "username"
Zeile 13 set username "passwort"
Zeile 15 set deviceid "ID vom Innenmodul"
Zeile 16 set deviceid "ID vom Aussenmodul"
Zeile 17 set deviceid "ID vom Regenmodul"
Zeile 18 set deviceid "ID vom Windmodul"
wegfallen müssen. Stimmt das?
Und ich bekomme im Terminal folgende Fehlermeldung:
# tclsh /usr/local/addons/netatmo/netatmo.tcl
invalid command name ""
while executing
" !/bin/tclsh"
(file "/usr/local/addons/netatmo/netatmo.tcl" line 1)
Was mache ich falsch?
Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden
Hier noch mein Skript:
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 5c0bf2698c04c4b3cb8xxxxx
set clientSecret mVDw8mCNiLdS3a4rF9i8uId875xxxxx
# the following are your normal netatmo credentials (the ones you used to setup your netatmo weather station)
set username xx@xx
set password xxxxx
# the following are MAC addresses of your indoor station and the outside module and rain module
set deviceid 70:ee:50:xx:xx:xx
set moduleid 02:00:00:xx:xx:xx
#set rainid "XX:XX:XX:XX:XX:XX"
#set windid "XX:XX:XX:XX:XX:XX"
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 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=WindAngle,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 windangle 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 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 IPress = dom.GetObject('Luftdruck');"
append rega_cmd "var ICO2 = dom.GetObject('CO2');"
append rega_cmd "var INoise = dom.GetObject('Sonometer');"
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());"
rega_script $rega_cmd
Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden
Hallo, habe seit einiger Zeit mit dem Script Probleme :
Mein CUx (2.2.0) spuckt das aus:
Dec 9 03:10:00 HomeMatic daemon.info cuxd[1929]: pclose(tclsh /usr/local/addons/netatmo/netatmo.tcl) exit(1) 0s
Dec 9 03:14:20 HomeMatic daemon.info cuxd[2128]: pclose(tclsh /usr/local/addons/netatmo/netatmo.tcl) exit(1) 3s
Dec 9 03:15:00 HomeMatic daemon.info cuxd[2180]: pclose(tclsh /usr/local/addons/netatmo/netatmo.tcl) exit(1) 0s
Dec 9 03:18:09 HomeMatic daemon.info cuxd[2323]: pclose(tclsh /usr/local/addons/netatmo/netatmo.tcl) exit(1) 0s
Der Terminal Test dieses:
# tclsh /usr/local/addons/netatmo/netatmo.tcl
info: found stored credentials
info: token is still valid
can't read "otemp": no such variable
while executing
"log info "Outside temperature is $otemp""
(file "/usr/local/addons/netatmo/netatmo.tcl" line 173)
Und mein Script sieht so aus:
Pass und Mac Adressen sollten stimmen.
#!/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 "587ea03fe6da23a96e8b77ff"
set clientSecret "cIWdKYmqbQIGXReQ3RmjCSX6MUmSWTDQDNpMDbiLA"
# the following are your normal netatmo credentials (the ones you used to setup your netatmo weather station)
set username "XXX"
set password "XXX"
# the following are MAC addresses of your indoor station and the outside module and rain module
set deviceid "XXX"
set moduleid "XXX"
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? ... e_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? ... e_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"
#
# set ReGaHss variables
#
set rega_cmd ""
append rega_cmd "var ITemp = dom.GetObject('CUxD.CUX9002003:1.SET_TEMPERATURE');"
append rega_cmd "var IHumi = dom.GetObject('CUxD.CUX9002003: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 IPress = dom.GetObject('Luftdruck');"
append rega_cmd "var ICO2 = dom.GetObject('CO2');"
append rega_cmd "var INoise = dom.GetObject('Sonometer');"
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 "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());"
rega_script $rega_cmd
Mein CUx (2.2.0) spuckt das aus:
Dec 9 03:10:00 HomeMatic daemon.info cuxd[1929]: pclose(tclsh /usr/local/addons/netatmo/netatmo.tcl) exit(1) 0s
Dec 9 03:14:20 HomeMatic daemon.info cuxd[2128]: pclose(tclsh /usr/local/addons/netatmo/netatmo.tcl) exit(1) 3s
Dec 9 03:15:00 HomeMatic daemon.info cuxd[2180]: pclose(tclsh /usr/local/addons/netatmo/netatmo.tcl) exit(1) 0s
Dec 9 03:18:09 HomeMatic daemon.info cuxd[2323]: pclose(tclsh /usr/local/addons/netatmo/netatmo.tcl) exit(1) 0s
Der Terminal Test dieses:
# tclsh /usr/local/addons/netatmo/netatmo.tcl
info: found stored credentials
info: token is still valid
can't read "otemp": no such variable
while executing
"log info "Outside temperature is $otemp""
(file "/usr/local/addons/netatmo/netatmo.tcl" line 173)
Und mein Script sieht so aus:
Pass und Mac Adressen sollten stimmen.
#!/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 "587ea03fe6da23a96e8b77ff"
set clientSecret "cIWdKYmqbQIGXReQ3RmjCSX6MUmSWTDQDNpMDbiLA"
# the following are your normal netatmo credentials (the ones you used to setup your netatmo weather station)
set username "XXX"
set password "XXX"
# the following are MAC addresses of your indoor station and the outside module and rain module
set deviceid "XXX"
set moduleid "XXX"
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? ... e_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? ... e_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"
#
# set ReGaHss variables
#
set rega_cmd ""
append rega_cmd "var ITemp = dom.GetObject('CUxD.CUX9002003:1.SET_TEMPERATURE');"
append rega_cmd "var IHumi = dom.GetObject('CUxD.CUX9002003: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 IPress = dom.GetObject('Luftdruck');"
append rega_cmd "var ICO2 = dom.GetObject('CO2');"
append rega_cmd "var INoise = dom.GetObject('Sonometer');"
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 "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());"
rega_script $rega_cmd