Netatmo Wetterstation (incl. CO2 Messung) einbinden

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

mikethemagic
Beiträge: 14
Registriert: 25.04.2013, 12:23
Danksagung erhalten: 3 Mal

Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von mikethemagic » 02.05.2013, 11:53

Ich habe mir ein Skript für den CO2 Sensor der Netatmo Station (http://www.netatmo.com/de-DE/Startseite) und damit eine Lüftungssteuerung gebastelt.
Vielleicht kann es jemand brauchen:

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 "[your ID]"                                  
set clientSecret "[your app secret]"
#  the following are your normal netatmo credentials (the ones you used to setup your netatmo weather station)
set username "[your username]"
set password "[your password]"
#  the following are MAC addresses of your indoor station and the outside module
set deviceid "01:23:45:67:89:00"
set moduleid "01:23:45:67:89:00"
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 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 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 "http://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 curl -# $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 "http://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 curl -# $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 OTemp = dom.GetObject('NetAtmo_Aussentemperatur');"
append rega_cmd "var OHumi = dom.GetObject('NetAtmo_Aussenfeuchtigkeit');"
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 IPress = dom.GetObject('NetAtmo_InnenLuftdruck');"
append rega_cmd "var ICO2 = dom.GetObject('NetAtmo_InnenCO2');"
append rega_cmd "var INoise = dom.GetObject('NetAtmo_InnenLautstaerke');"
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');"
rega_script $rega_cmd
ein paar Anmerkungen:
  • Ein direktes polling der netatmo Station ist leider noch nicht möglich. Momentan muss man die Werte über die "Cloud" abfragen, d.h. Internet Verbindung wird benötigt.
  • Zusatzmodule sind angekündigt aber noch nicht zu kaufen. Das Skript ist daher momentan so festgelegt, dass immer Basisstation und Aussenmodul abgefragt werden.
  • Ich habe mir mit CUxD ein "Thermostat Wrapper Device" angelegt und schreibe die Werte für Temperatur und Luftfeuchtigkeit direkt in die jeweiligen Datenpunkte z.B.

    Code: Alles auswählen

    append rega_cmd "var ITemp = dom.GetObject('CUxD.CUX9002003:1.SET_TEMPERATURE');"
    Die anderen Werte gehen in Systemvariablen, die ich dann per Kanalzuordnung dem Wrapper-Device zuordne. Vorteil ist man hat alle Werte schön in einem Gerät vereint. Ausserdem erhält man eine Servicemeldung, wenn die Werte nicht regelmässig erneuert werden. Nachteil ist ein nerviger Bug in der CCU. Nach der Kanalzuordnung von Systemvariablen erscheint das Gerät nicht mehr korrekt in der Raum oder Gewerke Übersicht. Bei den meisten alternativen WebUIs oder mobilen Apps ist aber alles ok.
  • Da die Authentifizierung über https geht wird curl auf der CCU benötig
  • Wenn etwas nicht funktionieren sollte, den loglevl ggf. auf 7 (=Debug) erhöhen und das Skript mit telnet starten.
Viel Spass damit

andrehomematic
Beiträge: 26
Registriert: 15.10.2013, 06:42

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von andrehomematic » 09.11.2013, 13:31

Das klingt interessant. Funktioniert das Skript noch?

Danke Gruß
André

Gesendet von meinem Galaxy Nexus mit Tapatalk

andrehomematic
Beiträge: 26
Registriert: 15.10.2013, 06:42

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von andrehomematic » 15.11.2013, 20:05

Vielleicht will ja noch jemand zuschlagen. Heute nur 119,-€ bei amazon. http://www.amazon.de/dp/B0098MGWA8/ref= ... Hsb1BAEGJ6

Gesendet von meinem Galaxy Nexus mit Tapatalk

Benutzeravatar
Wheeler
Beiträge: 75
Registriert: 27.01.2011, 22:50
Wohnort: Feldkirchen-Westerham
Hat sich bedankt: 5 Mal
Danksagung erhalten: 1 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Wheeler » 16.11.2013, 17:43

andrehomematic hat geschrieben:Das klingt interessant. Funktioniert das Skript noch?
Ich hab mir jetzt eine Netatmo über das Amazon Angebot geholt :lol:
Jedoch bekomme ich das netatmo tcl Script auf meiner CCU2 (mit CUX 0.58f) nicht zum Laufen. :roll: Fehler:

Code: Alles auswählen

Nov 16 17:25:35 homematic-ccu2 local1.debug netatmo.tcl: response was couldn't execute "curl": no such file or directory
Es sieht so aus, dass das obere Script an den in CUxD enthaltenen curl angepasst werden muss.
Hat jemand eine Idee wie das aussehen muss bzw. das Script schon in angepasster Form? :idea:
Danke und Grüße,
-- Udo
RaspberryMatic Version 3.59.6.20211009, 148 Devices, CUxD 2.6, CCU-Historian V2.6.0 auf Debian Linux

Benutzeravatar
anli
Beiträge: 4326
Registriert: 10.06.2009, 14:01
Wohnort: 20 Min. nördlich von Hannover und bei Bremen
Hat sich bedankt: 1 Mal
Danksagung erhalten: 23 Mal
Kontaktdaten:

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von anli » 17.11.2013, 00:45

Beispielhaft ist der Curl Aufruf über CUxD in http://homematic-forum.de/forum/viewtop ... 37&t=13354 beschrieben.
Herzliche Grüße, anli

Alle Angaben ohne Gewähr und Haftung meinerseits. Verwendung der von mir zur Verfügung gestellten Downloads auf eigene Gefahr. Ich bitte um Verständnis, dass ich aus zeitlichen Gründen keine unaufgeforderte Hilfestellung per PN/Mail geben kann. Bitte allgemeine Fragen ins Forum stellen, hier können viele fähige User viel schneller helfen.

Homematic-Manager v2: einfaches Tool zum Erstellen von Direktverknüpfungen und Bearbeiten von Gerätenamen, -parametern etc. für Homematic und HomematicIP (Alternative diesbzgl. zur WebUI)

Einsteiger-Hilfeerweiterter Skript-Parser

Benutzeravatar
Wheeler
Beiträge: 75
Registriert: 27.01.2011, 22:50
Wohnort: Feldkirchen-Westerham
Hat sich bedankt: 5 Mal
Danksagung erhalten: 1 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Wheeler » 17.11.2013, 14:00

anli hat geschrieben:Beispielhaft ist der Curl Aufruf über CUxD in http://homematic-forum.de/forum/viewtop ... 37&t=13354 beschrieben.
Danke anli,
im Prinzip brauchte ich im Script nur den Pfad zum curl voranzustellen.
Allerdings läuft das Script in der Gesamtheit aber wohl nicht mehr :shock:. Dies bekomme ich in der Shell:

Code: Alles auswählen

# tclsh netatmo.tcl
debug: script has started
warn: no stored credentials found
debug: requesting new token
debug: response was Inconsistency detected by ld.so: dl-deps.c: 622: _dl_map_object_deps: Assertion `nlist > 1' failed!
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 "netatmo.tcl" line 146)
#
Mit meinen Linux-Kenntnissen werd ich da wohl nicht mehr weit kommen :roll:
Liest "mikethemagic" hier noch mit? F1, F1!
Grüße,
-- Udo
RaspberryMatic Version 3.59.6.20211009, 148 Devices, CUxD 2.6, CCU-Historian V2.6.0 auf Debian Linux

Benutzeravatar
anli
Beiträge: 4326
Registriert: 10.06.2009, 14:01
Wohnort: 20 Min. nördlich von Hannover und bei Bremen
Hat sich bedankt: 1 Mal
Danksagung erhalten: 23 Mal
Kontaktdaten:

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von anli » 17.11.2013, 14:38

Ich warte noch auf mein Netatmo (aus der Amazon-Bestellung :mrgreen:), daher kann ich zu dem Skript selbst noch nichts sagen...
Herzliche Grüße, anli

Alle Angaben ohne Gewähr und Haftung meinerseits. Verwendung der von mir zur Verfügung gestellten Downloads auf eigene Gefahr. Ich bitte um Verständnis, dass ich aus zeitlichen Gründen keine unaufgeforderte Hilfestellung per PN/Mail geben kann. Bitte allgemeine Fragen ins Forum stellen, hier können viele fähige User viel schneller helfen.

Homematic-Manager v2: einfaches Tool zum Erstellen von Direktverknüpfungen und Bearbeiten von Gerätenamen, -parametern etc. für Homematic und HomematicIP (Alternative diesbzgl. zur WebUI)

Einsteiger-Hilfeerweiterter Skript-Parser

mikethemagic
Beiträge: 14
Registriert: 25.04.2013, 12:23
Danksagung erhalten: 3 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von mikethemagic » 29.11.2013, 17:58

Sorry, war durch andere Projekte ein wenig abgelenkt :roll:

Ich werde mir das Skript am WE mal ansehen, wahrscheinlich hat sich etwas an der API geändert .

Mike

joe13
Beiträge: 67
Registriert: 10.11.2013, 22:16

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von joe13 » 29.11.2013, 22:38

Super,

hoffe die Daten (z.B Aussentemperatur) mit Homematic zu nutzen

gruss joe

mikethemagic
Beiträge: 14
Registriert: 25.04.2013, 12:23
Danksagung erhalten: 3 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von mikethemagic » 07.12.2013, 13:03

ich hatte leider noch nicht genug Zeit mir alles in Ruhe anzuschauen. Als kleiner Zwischenstand:

- das Skript an sich funktioniert scheinbar noch, wenn ich es auf meinem Mac starte klappt alles wunderbar wie gehabt.
- einfach den Pfad zum curl von cuxd im Skript voranzustellen funktioniert bei mir nicht, ich bekomme die Meldung "can't load library 'libcurl.so.4"
- mit "LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl" funktioniert es leider auch nicht, das funktioniert nur in einer shell aber nicht mit dem tcl exec command. Der nächste Versuch wäre dann offensichtlich das Skript so zu modifizieren, dass exec nicht mehr curl direkt aufruft, sondern ein shell command mit "LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl" vielleicht klappt es ja dann mit dem cixd curl. Hab leider jetzt keine Zeit mehr das zu testen.

momentan sieht es so aus alsob die Probleme eher mit der (richtigen) version von curl zusammenhängen. Ich versuche mal nachzuvollziehen woher mein ursprünglich verwendetes curl kam.

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“