Netatmo Wetterstation (incl. CO2 Messung) einbinden

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

Moderator: Co-Administratoren

proph
Beiträge: 60
Registriert: 08.12.2009, 17:25

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von proph » 22.08.2017, 18:03

OK, hier mein Script..., Danke für's drüberschauen...

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 "client_id"                     
    set clientSecret "client_secret"
    #  the following are your normal netatmo credentials (the ones you used to setup your netatmo weather station)
    set username "user"
    set password "pw"
    #  the following are MAC addresses of your indoor station and the outside module and rain module
    set deviceid "70:ee:50:29:3f:12"
    set moduleid "02:00:00:29:4b:4f"
    set gzid "03:00:00:05:3f:89"
    # 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 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"

    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"
   
   log debug "polling zusatzmodule..."
    set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$gzid&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"


    #
    # 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 "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_GZ');"
    append rega_cmd "ZTemp.State('$ztemp');"
    append rega_cmd "ZHumi.State('$zhum');"
    append rega_cmd "ZCO2.State('$zco2');"
    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

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

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Indigo » 22.08.2017, 18:29

Hallo,

prinzipiell sieht das script erstmal gut aus.

Ich nehme mal an, dass in deiner aktiven Version clioentID, clientsecret, Username und Passwort richtig eingetragen sind.
Deinem oberen Skriptteil entnehme ich, dass du weder Wind noch Regenmodul in Betrieb hast.
Dann bitte noch diesen Teil

Code: Alles auswählen

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"
rauslöschen oder die Zeilen mit # versehen.

Wenn ich dein Log richtig verstehe scheitert es bereits beim Versuch einen Token zu bekommen. Eine Möglichkeit dafür ist die falsche Codierung der Datei. Was für ein Programm benutzt du um die TCL datei zu ertsellen?
Einfach mal ein anderes Programm ausprobieren.

Grüsse

proph
Beiträge: 60
Registriert: 08.12.2009, 17:25

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von proph » 22.08.2017, 19:27

...habe ich entsprechend geändert.

Als Programm benutze ich TCL-Runner vom Mac aus? Welches Programm sollte ich benutzen? Kann auch von Windows wenn es nützt.

LG

proph
Beiträge: 60
Registriert: 08.12.2009, 17:25

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von proph » 22.08.2017, 19:52

Es funzt :D :D :D

...Schuld war ein Sonderzeichen im Passwort! Es darf kein "+" verwendet werden....

LG

Leine0104
Beiträge: 2
Registriert: 24.08.2017, 21:51

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Leine0104 » 24.08.2017, 21:56

Hallo zusammen,
ich habe inzwischen so ziemlich alles versucht das Skript funktionsfähig auf die CCU zu übertragen.
Allerdings scheitere ich bereits an einem Grundsätzlichen Thema:

Entweder werden beim Kopieren irgendwelche Leerzeichen oder sonstige Sonderzeichen in das Skript eingefügt, so das tclsh das Teil überhaupt nicht ausführt...
Egal ob ASCII , ANSI oder UTF-8 völlig egal :(

Ich verwende WinSCP. Gibt es irgendwas besonderes zu beachten beim bearbeit und übertragen der Datei!?
Wie hier bereits beschrieben habe ich die Datei auch bereits direkt in WinSCP erzeugt und dann dort den Inhalt eingefügt...

Leider komme ich hier so gar nicht weiter :(

Leine0104
Beiträge: 2
Registriert: 24.08.2017, 21:51

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Leine0104 » 25.08.2017, 15:22

Hallo nochmal,
hier ein Nachtrag zu meiner Nachricht von gestern:

So bescheuert es auch klingt:
Beim kopieren des Skriptes (Copy -> Paste) aus Firefox heraus kam es zu genanntem Fehler mit merkwürdigen Sonmderzeichen, Fehlern wie "additonal character after closing-brace" und ähnlichem.

Der Verzweiflung nahe habe ich das ganze einfach mal aus Chrome heraus kopiert, in Notepad++ eingefügt und siehe da: #Läuft :D

Für die restlichen Anpassungen war mein Skripting-Know-How glücklicherweise ausreichend.

Sehr sehr coole Sache!
Vielen lieben Dank für das Skript ;)

Hary Danner
Beiträge: 23
Registriert: 08.09.2014, 16:16
System: CCU und Access Point

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Hary Danner » 28.09.2017, 16:54

Hallo,
ich komm irgend wie nicht weiter. Die module-id stimmen alle und trotzdem die Fehlermeldung - sh Bilder. https://www.dropbox.com/s/xbpk1xksykinc ... 9.pdf?dl=0

ich weis nicht weiter :roll:

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 » 29.09.2017, 15:56

Hallo
das bekommen wir schon hin. Am besten das Script von der CCU hier als Datei mal hoch halten. Userdaten Passwort mit XXX ersetzen nicht vergessen.

Vorher kannst du noch dos2unix machen wenn es dann schon funktioniert ist alles gut.

http://IP_DER_CCU/addons/cuxd/index.ccc?maintenance=
Punkt bei Shell command in den Kasten dos2unix /usr/local/addons/netatmo/netatmo.tcl
Button Ausführen drücken fertig.


Gruß
Bulli

Hary Danner
Beiträge: 23
Registriert: 08.09.2014, 16:16
System: CCU und Access Point

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Hary Danner » 29.09.2017, 16:14

Hallo Bulli,

script kommt

dos2unix im winscp terminal ausführen?
das zweite bitte auf „deutsch“

Danke, Hary

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 » 29.09.2017, 16:31

Hallo
zu 2 CUxD Maintenance Mode
siehe hier
viewtopic.php?f=26&t=32777&p=308342&hil ... ce#p308342

Gruß
Bulli

Antworten

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