Netatmo Wetterstation (incl. CO2 Messung) einbinden
Moderator: Co-Administratoren
Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden
Oh wie peinlich. Ich hatte mich echt vertippt. Danke nochmals. Eine Frage hätte ich aber noch. Wie kommt man darauf, dass man das so machen muss? Hat Netatmo Unterstützung geleistet oder kommt man von alleine auf sowas?;)
Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden
super Sache, kann mir jemand da den Regemesser mit reinmachen?Koggel hat geschrieben:HowTo: Einbindung der Wetterstation NetAtmo
Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden
Hallo Mobileme und AndyB,
Als erstes das Skript stammt nicht von mir, ich habe es nur etwas erweitert. Aber wie man darauf kommt? In der EDV sind offenliegende Schnittstellen (sogenannte APIs) nicht selten. Dann muss diese Schnittstelle nur angesprochen werden und schon nach etwas programmieren hat man die Daten
So nun zum Regensensor, ja der ist sicherlich auch integrierbar. Leider besitze ich noch keinen... Aber Spenden werde ich gerne annehmen Spaß beiseite
Hier der Codeschnipsel, der das Outdoormodul ausliest. Für den Regensensor muss auch dessen ID hinterlegen und diesen Bereich angepasst dem Skript zusätzlich hinzugefügen.
Dann ein weiteres virtuelles Gerät anlegen und dort die Werte speichern. Vielleicht kann sich jemand der einen Regensensor hat, darin mal versuchen. Nehme das auch gerne anschließend in das Howto auf.
Alternativ kann ich mich auch anbieten, bräuchte dann aber einen Zugang zu ner Netatmo mit Regenmesser
Gruß Koggel
Als erstes das Skript stammt nicht von mir, ich habe es nur etwas erweitert. Aber wie man darauf kommt? In der EDV sind offenliegende Schnittstellen (sogenannte APIs) nicht selten. Dann muss diese Schnittstelle nur angesprochen werden und schon nach etwas programmieren hat man die Daten
So nun zum Regensensor, ja der ist sicherlich auch integrierbar. Leider besitze ich noch keinen... Aber Spenden werde ich gerne annehmen Spaß beiseite
Hier der Codeschnipsel, der das Outdoormodul ausliest. Für den Regensensor muss auch dessen ID hinterlegen und diesen Bereich angepasst dem Skript zusätzlich hinzugefügen.
Code: Alles auswählen
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"
Alternativ kann ich mich auch anbieten, bräuchte dann aber einen Zugang zu ner Netatmo mit Regenmesser
Gruß Koggel
Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden
Was ich noch nicht so ganz nachvollziehen kann ist, dass ich die Werte des Sonometers, CO2 Sensors und Luftdrucks in der App Pocket Control angezeigt bekomme, aber die Werte für die Innen- und Außentemperatur irgendwie nicht finden kann. Gibt es hierfür eine Lösung?
Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden
Darauf komme ich gerne zurück sobald mein Regenmesser da ist und ich es selber nicht hinbekommeKoggel hat geschrieben: Alternativ kann ich mich auch anbieten, bräuchte dann aber einen Zugang zu ner Netatmo mit Regenmesser
Gruß Koggel
Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden
Hallo,
auch von mir tausend Dank für die tolle Anleitung. Echt super!!!
@Homemathias: Ich habe das TCL-Skript auf meinem Windows-Rechner mit Notepad++ erstellt. Dazu habe ich ein vorhandenes TCL-Skript einfach editiert. In diesem Tool kann man sich auch nicht sichtbare Zeichen anzeigen lassen. Ohne diese Vorgehensweise hatte ich am Zeilenende immer "CRLF" statt "LF". Damit liefen meine HUE-TCL-Skripte nie. Um das Skript auszuführen, habe ich mich mit putty auf die CCU per ssh aufgeschaltet und einfach diese Zeile in das Terminal-Fenster eingegeben: tclsh /usr/local/addons/netatmo/netatmo.tcl
Welches Tool du für den Mac nutzen kannst, weiß ich leider nicht.
Ich komme aber trotzdem auch nicht weiter. Ich habe alle Schritte aus der Anleitung durchgeführt. Anschließend starte ich via putty von meiner CCU2 das netatmo.tcl. Dann bekomme ich in putty folgende Fehlermeldung. Klingt ja so, als wenn die Anmeldung bei netatmo nicht klappt. Ich weiß leider nicht warum. Ich habe alle nötigen Änderungen im TCL-Skript durchgeführt.
Hat jemand eine Idee, was ich falsch gemacht haben könnte?
auch von mir tausend Dank für die tolle Anleitung. Echt super!!!
@Homemathias: Ich habe das TCL-Skript auf meinem Windows-Rechner mit Notepad++ erstellt. Dazu habe ich ein vorhandenes TCL-Skript einfach editiert. In diesem Tool kann man sich auch nicht sichtbare Zeichen anzeigen lassen. Ohne diese Vorgehensweise hatte ich am Zeilenende immer "CRLF" statt "LF". Damit liefen meine HUE-TCL-Skripte nie. Um das Skript auszuführen, habe ich mich mit putty auf die CCU per ssh aufgeschaltet und einfach diese Zeile in das Terminal-Fenster eingegeben: tclsh /usr/local/addons/netatmo/netatmo.tcl
Welches Tool du für den Mac nutzen kannst, weiß ich leider nicht.
Ich komme aber trotzdem auch nicht weiter. Ich habe alle Schritte aus der Anleitung durchgeführt. Anschließend starte ich via putty von meiner CCU2 das netatmo.tcl. Dann bekomme ich in putty folgende Fehlermeldung. Klingt ja so, als wenn die Anmeldung bei netatmo nicht klappt. Ich weiß leider nicht warum. Ich habe alle nötigen Änderungen im TCL-Skript durchgeführt.
Hat jemand eine Idee, was ich falsch gemacht haben könnte?
Code: Alles auswählen
# tclsh /usr/local/addons/netatmo/netatmo.tcl
debug: script has started
warn: no stored credentials found
debug: requesting new token
debug: response was curl: (6) Couldn't resolve host 'api.netatmo.net'
debug: parsing authentication result
can't read "returncode": no such variable
while executing
"log debug "returncode is $returncode""
(procedure "parseOAuthResponse" line 11)
invoked from within
"parseOAuthResponse [requestToken $clientId $clientSecret $username $password"
invoked from within
"if { [file exists $cfgfile] == 1} {
log info "found stored credentials"
loadAccessToken
set now [clock seconds]
log debug ..."
(file "/usr/local/addons/netatmo/netatmo.tcl" line 148)
-
- Beiträge: 11
- Registriert: 19.02.2014, 19:50
Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden
Hallo,
danke für deinen Hilfeversuch. Bei mir klappt es mittlerweile. Dein Ansatz war übrigens korrekt. In meinem .tcl File hatte ich durch die Erstellung am Mac einige Zeichen drin, die da nicht hingehören. Per Windows klappt es.
Bei deinem Fehler würde ich auch Tippfehler bei den Zugangsdaten/Url tippen, oder die api nicht aktiviert, die du bei Netatmo anlegen musstest um die client id und den client secret zu bekommen.
danke für deinen Hilfeversuch. Bei mir klappt es mittlerweile. Dein Ansatz war übrigens korrekt. In meinem .tcl File hatte ich durch die Erstellung am Mac einige Zeichen drin, die da nicht hingehören. Per Windows klappt es.
Bei deinem Fehler würde ich auch Tippfehler bei den Zugangsdaten/Url tippen, oder die api nicht aktiviert, die du bei Netatmo anlegen musstest um die client id und den client secret zu bekommen.
Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden
Hallo,
sowas hatte ich auch vermutet. Ich habe meine "App" bei netatmo aber aktiviert, habe die beiden IDs der Innen- und Außenmodule, meine Client-ID und mein Secret. Selbst die URLs habe ich kontrolliert, obwohl ich an den Zeilen nichts mehr verändert habe. Ist bestimmt nur ein kleiner, aber blöder Fehler, die ich einfach nicht finde. Mist...
sowas hatte ich auch vermutet. Ich habe meine "App" bei netatmo aber aktiviert, habe die beiden IDs der Innen- und Außenmodule, meine Client-ID und mein Secret. Selbst die URLs habe ich kontrolliert, obwohl ich an den Zeilen nichts mehr verändert habe. Ist bestimmt nur ein kleiner, aber blöder Fehler, die ich einfach nicht finde. Mist...
-
- 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 lemmy29
Die Fehlermeldung sag das er den Host nicht auflösen kann. Mach doch mal auf der ccu nslookup.
nslookup api.netatmo.net
sollte sowas raus kommen
Name: api.netatmo.net
Address 1: 195.154.191.74 f1.netatmo.net
Address 2: 195.154.189.95 f2.netatmo.net
Address 3: 62.210.178.168 f4.netatmo.net
Address 4: 62.210.178.169 f3.netatmo.net
Ich glaube aber es ist ein Fehler im Script beim curl Aufruf. Poste doch mal dein Script, aber bitte das von der CCU und nicht vergessen deine Login Daten unkenntlich zu machen. Du kannst auch im Script die Zeile (26) "set loglevel 6" auf "set loglevel 7" setzen und dann mal den Output posten
Gruß Bulli
Die Fehlermeldung sag das er den Host nicht auflösen kann. Mach doch mal auf der ccu nslookup.
nslookup api.netatmo.net
sollte sowas raus kommen
Name: api.netatmo.net
Address 1: 195.154.191.74 f1.netatmo.net
Address 2: 195.154.189.95 f2.netatmo.net
Address 3: 62.210.178.168 f4.netatmo.net
Address 4: 62.210.178.169 f3.netatmo.net
Ich glaube aber es ist ein Fehler im Script beim curl Aufruf. Poste doch mal dein Script, aber bitte das von der CCU und nicht vergessen deine Login Daten unkenntlich zu machen. Du kannst auch im Script die Zeile (26) "set loglevel 6" auf "set loglevel 7" setzen und dann mal den Output posten
Gruß Bulli
Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden
Hallo Bulli,
danke für deine Antwort. Nochmal kurz zur Klärung:
Ich habe mich via putty auf meine CCU2 aufgeschaltet und mit root angemeldet. Dann habe ich den Befehl "nslookup api.netatmo.net" eingegeben. Richtig so?
Wenn ich das richtig gemacht habe, hast du vollkommen Recht. Ich erhalte folgendes:
# nslookup api.netatmo.net
Server: 192.168.0.1
Address 1: 192.168.0.1
nslookup: can't resolve 'api.netatmo.net'
Die 192.168.0.1 ist natürlich die IP-Adresse meines Routers. Mache ich ein "ping api.netatmo.net" aus einer DOS-Box auf meinem Windows-Rechner, bekomme ich immerhin diese IP-Adresse ausgespuckt: 195.154.189.95
Hast du eine Idee, woran es liegen könnte?
Anbei meine netatmo.tcl. Meine 6 Daten habe ich mit jeweils --- gelöscht.
danke für deine Antwort. Nochmal kurz zur Klärung:
Ich habe mich via putty auf meine CCU2 aufgeschaltet und mit root angemeldet. Dann habe ich den Befehl "nslookup api.netatmo.net" eingegeben. Richtig so?
Wenn ich das richtig gemacht habe, hast du vollkommen Recht. Ich erhalte folgendes:
# nslookup api.netatmo.net
Server: 192.168.0.1
Address 1: 192.168.0.1
nslookup: can't resolve 'api.netatmo.net'
Die 192.168.0.1 ist natürlich die IP-Adresse meines Routers. Mache ich ein "ping api.netatmo.net" aus einer DOS-Box auf meinem Windows-Rechner, bekomme ich immerhin diese IP-Adresse ausgespuckt: 195.154.189.95
Hast du eine Idee, woran es liegen könnte?
Anbei meine netatmo.tcl. Meine 6 Daten habe ich mit jeweils --- gelöscht.
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
set deviceid "---"
set moduleid "---"
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 "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.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 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