Netatmo Wetterstation (incl. CO2 Messung) einbinden

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

Moderator: Co-Administratoren

Indigo
Beiträge: 356
Registriert: 10.02.2015, 20:32
Danksagung erhalten: 1 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Indigo » 21.09.2018, 17:57

Es tut mir leid, aber ich probiere jetzt schon tatsächlich seit 4 Stunden meine Netatmo einzubinden. Ich habe jetzt tausendmal probiert, verglichen, quergelesen... aber leider klappt es bei mir nicht. Wenn ich ins Terminal gehe und die Datei laufen lasse, kommt bei mir Folgendes:

/usr/local/addons/netatmo$ tclsh /usr/local/addons/netatmo/netatmo.tcl
warn: no stored credentials found
can't read "expiresin": no such variable
while executing
"log debug "expires in $expiresin""
(procedure "parseOAuthResponse" line 14)
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]
..."
(file "/usr/local/addons/netatmo/netatmo.tcl" line 149)

Vielleicht kann ja von euch jemand was damit anfangen. Mir brummt jetzt nämlich der Schädel.
Hallo nochmal,

um dir kompetent helfen zu können müsstest du bitte mal dein Skript reinstellen. Und am besten auch ein paar Screenshots deiner angelegten HomeMatic Geräte und Variablen.
Bei könnte aber auch mal wieder das Problem sein, dass dein Skript faslch kodiert ist. Mit welchem Programm hast du es erstellt? Unter OSX bietet sich z.B. Sublime Text 2 an.

BFM
Beiträge: 26
Registriert: 21.09.2018, 17:40

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von BFM » 21.09.2018, 18:34

Hallo Indigo,

danke erstmal für die schnelle Antwort. Das Skript habe ich aus dem Thread kopiert und unter Win mit Notepad++ meine Daten eingetragen.
Here it Comes:

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 "XXXX"                     
    set clientSecret "XXXX"
    #  the following are your normal netatmo credentials (the ones you used to setup your netatmo weather station)
    set username "XXXX@my.mail.de"
    set password "XXXX"
    #  the following are MAC addresses of your indoor station and the outside module and rain module
    set deviceid "70:ee:50:2c:99:98"
    set moduleid "02:00:00:2c:7a:b4"
    set rainid "05:00:00:04:58:a2"

    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=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 rain rain1 rain1d
    
    log info "LogR is $response"                
    log info "Outside rain1 is $rain"
    log info "Outside Regensumme1 is $rain1"
    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"

    #
    # 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.CUX9002004:1.SET_TEMPERATURE');"
    append rega_cmd "var OHumi = dom.GetObject('CUxD.CUX9002004: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 "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 "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
    

Virtueller Taster.JPG
Übersicht.JPG
Innen.JPG
aussen.JPG
So, ich denke das ist alles. Falls du noch etwas brauchst, einfach sagen.
Sorry für die späte Antwort, aber meistens kommt ein Anruf dann wenn man es nicht braucht.

LG

BFM
Zuletzt geändert von alchy am 21.09.2018, 22:45, insgesamt 1-mal geändert.
Grund: Code in Codetags posten

BFM
Beiträge: 26
Registriert: 21.09.2018, 17:40

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von BFM » 21.09.2018, 18:41

Und so sieht es aus:
Überblick.JPG

vlcweb
Beiträge: 20
Registriert: 16.09.2018, 23:58
Hat sich bedankt: 1 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von vlcweb » 21.09.2018, 19:56

So heute hat es mal geregnet, es kommen aber dadür keine werte....
Hast du noch einen Tipp ?

Indigo
Beiträge: 356
Registriert: 10.02.2015, 20:32
Danksagung erhalten: 1 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Indigo » 21.09.2018, 20:11

Hi,

laut deiner Screenshots haben die Homematic Geräte andere Seriennummern als du im Skript verwendest.

Diese Zeilen:
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.CUX9002004:1.SET_TEMPERATURE');"
append rega_cmd "var OHumi = dom.GetObject('CUxD.CUX9002004:1.SET_HUMIDITY');"
Sollten besser so heissen:

Code: Alles auswählen

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');"

Indigo
Beiträge: 356
Registriert: 10.02.2015, 20:32
Danksagung erhalten: 1 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Indigo » 21.09.2018, 20:12

So heute hat es mal geregnet, es kommen aber dadür keine werte....
Hast du noch einen Tipp ?
Ohne dein Skript zu sehen schwer zu sagen. Kommt die SyncTime an?

vlcweb
Beiträge: 20
Registriert: 16.09.2018, 23:58
Hat sich bedankt: 1 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von vlcweb » 21.09.2018, 20:18

Hi

info: found stored credentials
info: token is still valid
info: Outside temperature is 12.3
info: Outside humidity is 88
info: LogI is {"body":[{"beg_time":1537553449,"value":[[24.5,50,719,1019.9,37]]}],"status":"ok","time_exec":0.018347978591919,"time_server":1537553848}#=#=#
##O#- #
##O=# #
info: Inside temperature is 24.5
info: Inside humidity is 50
info: Inside CO2 level 719
info: Inside pressure is 1019.9
info: Inside noise level is 37
info: LogR is {"body":[{"beg_time":1537524000,"value":[[6.3]]}],"status":"ok","time_exec":0.05019211769104,"time_server":1537553848}#=#=#
##O#- #
info: Outside Regen1d is 6.3
info: LogR is {"body":[{"beg_time":1537553700,"value":[[0,0]]}],"status":"ok","time_exec":0.044193029403687,"time_server":1537553848}#=#=#
info: Outside rain2 is 0
info: Outside Regen30min is 0

Das kommt......

BFM
Beiträge: 26
Registriert: 21.09.2018, 17:40

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von BFM » 21.09.2018, 20:46

Indigo hat geschrieben:
21.09.2018, 20:11
Hi,

laut deiner Screenshots haben die Homematic Geräte andere Seriennummern als du im Skript verwendest.

Diese Zeilen:
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.CUX9002004:1.SET_TEMPERATURE');"
append rega_cmd "var OHumi = dom.GetObject('CUxD.CUX9002004:1.SET_HUMIDITY');"
Sollten besser so heissen:

Code: Alles auswählen

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');"
Hmm das war schon mal ein Fehler. Danke dafür :-). Leider geht immer noch nichts. Mir wird Folgendes gezeigt:

/usr/local/addons/netatmo$ tclsh /usr/local/addons/netatmo/netatmo.tcl
warn: no stored credentials found
can't read "expiresin": no such variable
while executing
"log debug "expires in $expiresin""
(procedure "parseOAuthResponse" line 14)
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]
..."
(file "/usr/local/addons/netatmo/netatmo.tcl" line 149)

Aber mach doch lieber mal Feierabend.

Grüssle

BFM

Indigo
Beiträge: 356
Registriert: 10.02.2015, 20:32
Danksagung erhalten: 1 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Indigo » 21.09.2018, 21:15

Hi.

Probier dein Skript mal mit einem anderen Programm abzuspeichern. NotePad hat da schon öfter Probleme verursacht.
Probier es mal mit WinSCP.
Und achte darauf dass in der ersten Zeile kein Freizeichen am Anfang ist.

Wenn es immernoch nicht funzt geht es morgen weiter.

Indigo
Beiträge: 356
Registriert: 10.02.2015, 20:32
Danksagung erhalten: 1 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Indigo » 21.09.2018, 21:18

@vlcweb

in deiner Ausgabe sind die Regenwerte zumindest schomal drin.
Was ich meinte ist ob die SyncTime Variable in der Homematic befüllt wird. Wenn nicht ist das ein Indiz dafür dass dein Skript nicht durchläuft.

Antworten

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