Netatmo Wetterstation (incl. CO2 Messung) einbinden

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

Moderator: Co-Administratoren

redy09
Beiträge: 40
Registriert: 18.11.2018, 12:31
Hat sich bedankt: 1 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von redy09 » 09.12.2018, 10:31

Hab die Datei mal ganz neu angelegt, dann kommt:

tclsh /usr/local/addons/netatmo/netatmo.tcl
warn: no stored credentials found
notice: oauth token successfully initialized
info: Outside temperature is 9.6
info: Outside humidity is 79
info: LogI is {"body":[{"beg_time":1544347596,"value":[[21.9,58,1456,1003.8,53]]}],"status":"ok","time_exec":0.016852855682373,"time_server":1544347870}#=O#- #
##O=# #
info: Inside temperature is 21.9
info: Inside humidity is 58
info: Inside CO2 level 1456
info: Inside pressure is 1003.8
info: Inside noise level is 53

redy09
Beiträge: 40
Registriert: 18.11.2018, 12:31
Hat sich bedankt: 1 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von redy09 » 09.12.2018, 10:34

Dannke, perfekt, bekomme Daten!

Hat dies noch eine Bedeutung:

warn: no stored credentials found

Bulli
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

Beitrag von Bulli » 09.12.2018, 10:38

redy09 hat geschrieben:
09.12.2018, 10:34
Dannke, perfekt, bekomme Daten!

Hat dies noch eine Bedeutung:

warn: no stored credentials found
nein ist normal.

Gruß
Bulli

Dinosky
Beiträge: 13
Registriert: 12.01.2016, 00:14

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Dinosky » 09.12.2018, 10:48

Bulli hat geschrieben:
09.12.2018, 09:01
Dinosky hat geschrieben:
09.12.2018, 03:31
Bildschirmfoto 2018-12-09 um 03.30.22.png

Ich bekomme halt alte Werte angezeigt.???

Gruß Dinosky
Hallo
Scripte bitte beim nächsten mal in

Code: Alles auswählen

hier rein
packen. So Sind teile in deinen Script abgeschnitten.

Stell bitte mal auf debug um und poste die Ausgabe. Zeile set loglevel 6 auf set loglevel 7 ändern.

Gruß
Bulli
Hallo Bulli,

dann spuckt das Terminal folgendes aus:

Code: Alles auswählen

# tclsh /usr/local/addons/netatmo/netatmo.tcl
debug: script has started
info: found stored credentials
debug: loading stored credentials from /tmp/netatmo.dat
debug: file data is: 546c90231c7759997929bdfe|94223ea27b5381ef488d9e239498c89e
546c90231c7759997929bdfe|e5f4ca1e15c4168149e705fe2e04a38d
1544352300

debug: current time is 2018-12-09T10:47:04, token is valid until 2018-12-09T11:45:00
info: token is still valid
debug: polling outdoor module...
debug: querying https://api.netatmo.net/api/getmeasure?access_token=546c90231c7759997929bdfe|94223ea27b5381ef488d9e239498c89e&device_id=70:ee:50:04:d7:84&module_id=02:00:00:2c:b6:e6&scale=max&type=Temperature,Humidity&date_end=last
debug: response is: {"error":{"code":9,"message":"Device not found"}}#=#=- #                                                                                               
##O=#  #                                                                                              
can't read "otemp": no such variable
    while executing
"log info "Outside temperature is $otemp""
    (file "/usr/local/addons/netatmo/netatmo.tcl" line 173)
# 


Bulli
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

Beitrag von Bulli » 09.12.2018, 13:13

Dinosky hat geschrieben:
09.12.2018, 10:48
Hallo Bulli,

dann spuckt das Terminal folgendes aus:
# tclsh /usr/local/addons/netatmo/netatmo.tcl
debug: script has started
info: found stored credentials
debug: loading stored credentials from /tmp/netatmo.dat
debug: file data is: 546c90231c7759997929bdfe|94223ea27b5381ef488d9e239498c89e
546c90231c7759997929bdfe|e5f4ca1e15c4168149e705fe2e04a38d
1544352300

debug: current time is 2018-12-09T10:47:04, token is valid until 2018-12-09T11:45:00
info: token is still valid
debug: polling outdoor module...
debug: querying https://api.netatmo.net/api/getmeasure? ... e_end=last
debug: response is: {"error":{"code":9,"message":"Device not found"}}#=#=- #
##O=# #
can't read "otemp": no such variable
while executing
"log info "Outside temperature is $otemp""
(file "/usr/local/addons/netatmo/netatmo.tcl" line 173)
#
Wir kommen der Sache näher er findet das Device nicht. Deswegen ist otemp leer und das Script bricht ab.
Entweder passt die deviceid oder moduleid nicht. Bitte noch mal prüfen. Wobei beide gut ausschauen.
>>>> device_id=70:ee:50:04:d7:84&module_id=02:00:00:2c:b6:e6
Der Fehler sagt aber er findet es nicht.
>>>> debug: response is: {"error":{"code":9,"message":"Device not found"}}#=#=- #

Wenn es dann immer noch nicht geht. Bitte noch mal dein ganzes Script posten, nicht vergessen User Passwort durch xxx ersetzen.

Gruß
Bulli

satpower
Beiträge: 11
Registriert: 06.12.2018, 17:01

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von satpower » 09.12.2018, 13:51

Bulli hat geschrieben:
09.12.2018, 08:30
satpower hat geschrieben:
08.12.2018, 17:24
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.
Hallo
du mußt für jedes Innenmodul die drei Sachen machen. Natürlich immer mit neuen Namen.Sprich
oben im Script
set szid "IDdesZusatzinnenmodules"
set szid2 "IDdesZusatzinnenmodules"
set szid3 "IDdesZusatzinnenmodules"

in der mitte

Code: Alles auswählen

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 zusatzmodule..."
    set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$szid2&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 ztemp2 zhum2 zco22

    log info "LogI is $response"             
    log info "Inside temperature is $ztemp2"
    log info "Inside humidity is $zhum2"
    log info "Inside CO2 level $zco22"
    
    log debug "polling zusatzmodule..."
    set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$szid3&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 ztemp3 zhum3 zco23

    log info "LogI is $response"             
    log info "Inside temperature is $ztemp3"
    log info "Inside humidity is $zhum3"
    log info "Inside CO2 level $zco23"

unten

Code: Alles auswählen

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 ZTemp2 = dom.GetObject('CUxD.CUX9002004:1.SET_TEMPERATURE');"
append rega_cmd "var ZHumi2 = dom.GetObject('CUxD.CUX9002004:1.SET_HUMIDITY');"
append rega_cmd "var ZCO22 = dom.GetObject('CO2_SZ');"
append rega_cmd "ZTemp2.State('$ztemp2');"
append rega_cmd "ZHumi2.State('$zhum2');"
append rega_cmd "ZCO22.State('$zco22');"

append rega_cmd "var ZTemp3 = dom.GetObject('CUxD.CUX9002005:1.SET_TEMPERATURE');"
append rega_cmd "var ZHumi3 = dom.GetObject('CUxD.CUX9002005:1.SET_HUMIDITY');"
append rega_cmd "var ZCO23 = dom.GetObject('CO2_SZ');"
append rega_cmd "ZTemp3.State('$ztemp3');"
append rega_cmd "ZHumi3.State('$zhum3');"
append rega_cmd "ZCO23.State('$zco23');"
3 neu CUXd Geräte nicht vergessen. Sollten wahrscheinlich die IDs 3 4 5 (CUX9002005:1) haben da du schon ein Innen und Aussenmodul Gerät angelegt hast.

Gruß
Bulli
Vielen Dank für die promte Hilfe > funktioniert einwandfrei so.
MfG

Dinosky
Beiträge: 13
Registriert: 12.01.2016, 00:14

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Dinosky » 09.12.2018, 15:09

Bulli hat geschrieben:
09.12.2018, 13:13
Dinosky hat geschrieben:
09.12.2018, 10:48
Hallo Bulli,

dann spuckt das Terminal folgendes aus:
# tclsh /usr/local/addons/netatmo/netatmo.tcl
debug: script has started
info: found stored credentials
debug: loading stored credentials from /tmp/netatmo.dat
debug: file data is: 546c90231c7759997929bdfe|94223ea27b5381ef488d9e239498c89e
546c90231c7759997929bdfe|e5f4ca1e15c4168149e705fe2e04a38d
1544352300

debug: current time is 2018-12-09T10:47:04, token is valid until 2018-12-09T11:45:00
info: token is still valid
debug: polling outdoor module...
debug: querying https://api.netatmo.net/api/getmeasure? ... e_end=last
debug: response is: {"error":{"code":9,"message":"Device not found"}}#=#=- #
##O=# #
can't read "otemp": no such variable
while executing
"log info "Outside temperature is $otemp""
(file "/usr/local/addons/netatmo/netatmo.tcl" line 173)
#
Wir kommen der Sache näher er findet das Device nicht. Deswegen ist otemp leer und das Script bricht ab.
Entweder passt die deviceid oder moduleid nicht. Bitte noch mal prüfen. Wobei beide gut ausschauen.
>>>> device_id=70:ee:50:04:d7:84&module_id=02:00:00:2c:b6:e6
Der Fehler sagt aber er findet es nicht.
>>>> debug: response is: {"error":{"code":9,"message":"Device not found"}}#=#=- #

Wenn es dann immer noch nicht geht. Bitte noch mal dein ganzes Script posten, nicht vergessen User Passwort durch xxx ersetzen.

Gruß
Bulli
Ja ich habe im Herbst den Außensensor ersetzt und gestern auch die mac 02:00:00:2c:b6:e6 Adresse (aus der App abgelesen) ersetzt. Ist ja nur 1 mal im sickt drin oder ?

Dino

Dinosky
Beiträge: 13
Registriert: 12.01.2016, 00:14

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Dinosky » 09.12.2018, 15:12

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 "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 "70:ee:50:04:d7:84"
    set moduleid "02:00:00:2c:b6:e6"
    
    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 7
    #---------------------------------------------------------------------------------------------------------------#

    #---------------------------------------------------------------------------------------------------------------#
    #                                              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"

    #
    # 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

Bulli
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

Beitrag von Bulli » 09.12.2018, 15:28

Hallo Dinosky
da mach mal bitte folgende 2 Zeile genau nach dieser Zeile rein. Dann sollte es erst mal durch laufen.

Code: Alles auswählen

    regexp {\"value\":\[\[(.*?),(.*?)\]} $response dummy otemp ohum

    set otemp "99"
    set ohum "99"
Dann Wissen wir das die moduleid richtig ist. Dann schauen wir weiter.

Dinosky
Beiträge: 13
Registriert: 12.01.2016, 00:14

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Dinosky » 09.12.2018, 16:19

Es läuft durch , die Innenmodul Werte stimmen auch die Aussen Werte sind alle bei 99 grad oder %
IMG_3110.png
Dinosky

Antworten

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