Netatmo Wetterstation (incl. CO2 Messung) einbinden

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

Moderator: Co-Administratoren

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 » 28.01.2020, 07:45

Crady hat geschrieben:
27.01.2020, 14:34


Habe aber nun die neuste FW der CCU2 drauf und die neuste Version vom CUXd... muss hier das Skript angepasst werden? Habe jetzt nichts gefuden...
Hallo Guido

eigentlich sollte es mit neuer Version von CUxD ohne Änderung wieder laufen. Schaut aber nicht so aus.
Ich würde mal folgende Zeile
>> set ::env(LD_LIBRARY_PATH) "/usr/local/addons/cuxd"
auskommentieren einfach ein # davor machen.

Wenn das nicht geht schauen wir weiter. Am besten dann mal dein Script posten, Zugangsdaten durch XXX ersetzen nicht vergessen.

Gruß
Bulli

Crady
Beiträge: 272
Registriert: 09.08.2016, 12:16
Hat sich bedankt: 4 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Crady » 28.01.2020, 07:59

Moin Bulli,

das Auskommentieren hat leider nicht funktioniert. Hier mein Skript:

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 "xxx"                     
        set clientSecret "xxx"
        #  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 "xxx"
        set moduleid "xxx"
        set rainid "xxx"
        #set windid "XX:XX:XX:XX:XX:XX"
        set szid "xxx"
        set keid "xxx"
        set deviceid2 "xxx"
        set thid "xxx"

        #set ::env(LD_LIBRARY_PATH) "/usr/local/addons/cuxd"
        set cfgfile "/tmp/netatmo.dat"
        set logtag "netatmo_station.tcl"
        set logfacility "local1"
        # 0=panic, 1=alert 2=crit 3=err 4=warn 5=notice 6=info 7=debug
        set loglevel 0
        #---------------------------------------------------------------------------------------------------------------#

        #---------------------------------------------------------------------------------------------------------------#
        #                                              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&scope=read_station read_thermostat write_thermostat"

            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,GustS#trength&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 Zusatzmodul Schlafzimmer..."
        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 sztemp szhum szco2

        log info "LogI is $response"             
        log info "Inside temperature is $sztemp"
        log info "Inside humidity is $szhum"
        log info "Inside CO2 level $szco2"

        log debug "polling Zusatzmodul Keller..."
        set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$keid&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 ketemp kehum keco2

        log info "LogI is $response"             
        log info "Inside temperature is $ketemp"
        log info "Inside humidity is $kehum"
        log info "Inside CO2 level $keco2"

 #       log debug "polling Thermostat..."
 #       set url https://api.netatmo.com/api/getthermostatsdata?access_token=$accesstoken&device_id=$deviceid2&module_id=$thid"
 #       log debug "querying $url"
 #       catch {exec /usr/local/addons/cuxd/curl -k -# $url} response
 #       log debug "response is: $response"
 #       log info "LogI is $response" 
        
 #       regexp {\"temperature\":([-+]?[0-9]*[.]?[0-9]+)} $response dummy ztemp
 #       log info "Thermostat temperature is $ztemp"

 #       regexp {\"setpoint_mode\":\"(.*?)\"} $response dummy smode
 #       log info "Mode is $smode"

 #       regexp {\"setpoint_temp\":([-+]?[0-9]*[.]?[0-9]+)} $response dummy sptmp
 #       log info "Setpoint is $sptmp"
        
        

        #
        # 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 "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());"
        append rega_cmd "var SZTemp = dom.GetObject('CUxD.CUX9002003:1.SET_TEMPERATURE');"
        append rega_cmd "var SZHum = dom.GetObject('CUxD.CUX9002003:1.SET_HUMIDITY');"
        append rega_cmd "var SZCO2 = dom.GetObject('CO2_sz');"
        append rega_cmd "SZTemp.State('$sztemp');"
        append rega_cmd "SZHum.State('$szhum');"
        append rega_cmd "SZCO2.State('$szco2');"
        append rega_cmd "var KETemp = dom.GetObject('CUxD.CUX9002004:1.SET_TEMPERATURE');"
        append rega_cmd "var KEHum = dom.GetObject('CUxD.CUX9002004:1.SET_HUMIDITY');"
        append rega_cmd "var KECO2 = dom.GetObject('CO2_ke');"
        append rega_cmd "KETemp.State('$ketemp');"
        append rega_cmd "KEHum.State('$kehum');"
        append rega_cmd "KECO2.State('$keco2');"
  #      append rega_cmd "var ZTemp = dom.GetObject('CUxD.CUX9002006:1.SET_TEMPERATURE');"
  #      append rega_cmd "var SMode = dom.GetObject('Th_schedule');"
  #      append rega_cmd "var SPtmp = dom.GetObject('Set_temp');"
  #      append rega_cmd "ZTemp.State('$ztemp');"
  #      append rega_cmd "SMode.State('$smode');"
  #      append rega_cmd "SPtmp.State('$sptmp');"


        rega_script $rega_cmd

Gruß

Guido

Xel66
Beiträge: 14085
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 580 Mal
Danksagung erhalten: 1492 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Xel66 » 28.01.2020, 09:23

Das Auskommentieren des Pfades bringt nichts. Im Script wird in der catch-Teile curl immer noch mit dem falschen Pfad aufgerufen. Das muss angepasst werden (Pfad vor curl löschen).

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

Crady
Beiträge: 272
Registriert: 09.08.2016, 12:16
Hat sich bedankt: 4 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Crady » 28.01.2020, 09:47

Danke, das war´s.

Geht jetzt wieder.
Gruß

Guido

Samsing
Beiträge: 54
Registriert: 21.01.2016, 09:43
Hat sich bedankt: 18 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Samsing » 30.01.2020, 18:10

Hallo zusammen,

leider habe ich auch ein Problem mit dem Script, welches seit Einspielen der neuen Firmware Mitte Dezember nicht mehr funktioniert.
Ich hatte das seit 2016 laufen und nicht mehr angefasst. Leider bin ich mit Scripting und Linux nicht so bewandert und jetzt echt Probleme, dies trotz der hier bereits mitgeteilten Infos wieder hin zu kriegen. Ich habe bereits versucht, den Pfad zu ändern (im Script). Hierzu hatte ich den alten mit dem neuen Pfad ersetzt (suchen und ersetzen im Notepad++) dann die neue Version der netatmo.tcl wieder hochgeladen. Leider ohne Erfolg.
Muss ich denn das Script nun auch woanders hin kopieren? Hatte das geänderte Script wieder in den alten Ordner hinein kopiert.
Hier liegt das Script drin:
/usr/local/addons/netatmo

Ich würde mich freuen, wenn mir jemand helfen könnte.

Wie kann man denn das Script testen? Ich habe gelesen, man soll es mit putty testen. Mir fehlt hierzu aber der Befehl, wie ich das zum laufen kriegen soll. Und vorallem, wo legt man das hin und wie führt man dann den Pfad aus? Sorry, mit Windows kenne ich mich aus, aber das ist für mich sehr schwierig. Aus den Antworten hier wird man zwar schlauer, aber es fehlt mir leider der Gesamtzusammenhang. Und eine vollständige Lösung.

DANKE!!!

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 and rain module
    set deviceid 
    set moduleid 
    set szid 
    # 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 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 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"

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

Benutzeravatar
Westfale
Beiträge: 46
Registriert: 19.02.2016, 21:42
Wohnort: Münsterland
Hat sich bedankt: 2 Mal
Danksagung erhalten: 2 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Westfale » 30.01.2020, 20:28

Hallo Samsing,

bei mir hat es nach dem FW-Update auch erst nach ein paar Anläufen geklappt.
Mach Dir keine Sorgen, das wird schon :D

In Deinem Skript
set ::env(LD_LIBRARY_PATH) "/usr/local/addons/cuxd"
ersetzen mit
set ::env(LD_LIBRARY_PATH) "/usr/lib"

dann noch den Pfad in allen vorkommenden
catch {exec /usr/local/addons/cuxd/curl ...
ersetzen mit
catch {exec /usr/bin/curl ...

Sollte dann wieder funktionieren.

Gruß vom Westfalen

Samsing
Beiträge: 54
Registriert: 21.01.2016, 09:43
Hat sich bedankt: 18 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Samsing » 03.02.2020, 20:25

Vielen Dank für Deine Hilfe,

ich komme erst gerade wieder dazu, Deine Lösung umzusetzen.
Ich habe all Deine Punkte mit Suchen und Ersetzen im Originalscript geändert.
Danach das Script wieder auf den bisherigen! Pfad (siehe meine erste Anfrage) gesichert und damit die "alte" Datei überschrieben.

Leider werden die Daten der netatmo Geräte weiterhin nicht aktualisiert.
Hat also leider nichts geholfen.
Unter CUXD kommt bei INFO folgende Zeile:
Feb 3 20:15:01 ccu2 daemon.info cuxd[1667]: pclose(tclsh /usr/local/addons/netatmo/netatmo.tcl) exit(1) 0s

Ist das so richtig?
Was ist da los?

Bitte weiterhin um Hilfe.
Danke!

Gruß
Samsing

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 » 04.02.2020, 08:04

Samsing hat geschrieben:
03.02.2020, 20:25
Vielen Dank für Deine Hilfe,
..........

Bitte weiterhin um Hilfe.
Danke!

Gruß
Samsing
Hallo Samsing
ohne das Script auch der CCU mal direkt aus zuführen kommen wir hier nicht zum Ziel.
Das howto von Inidgo bekannt? Da steht eine Möglichkeit mit Winscp drin.
>>>>>>>>>>
Nun kopiert die Datei (z.B. mit Hilfe des Tools WinSCP http://winscp.net) auf eure CCU. Als Protokoll nehmt ihr SCP und zur Verbindung braucht ihr die IP, den Benutzer: root und eurer Passwort vom SSH Zugang, als Ziel erstellt das Verzeichnis /usr/local/addons/netatmo/ und speichert dort die Datei.

Anschließend könnt ihr das Skript testen: Hierzu öffnet ein Terminal (CTRL + T) und geht folgenden Befehl ein:

tclsh /usr/local/addons/netatmo/netatmo.tcl

Wenn alles richtig gemacht wurde, seht ihr in der Ausgabe die aktuellen Werte eurer Netatmo.
>>>>>>>>>>
2 Möglichkeit mit Putty
User root passwort was du in der Webui vergeben hast und dein einfach
>>> tclsh /usr/local/addons/netatmo/netatmo.tcl ausführen (mit rechter Maustaste kannst du es einfügen)
3 Möglichkeit über CUxD
Haupseite Button Service drücken.
Auf der neuen Seite unten Shell command Punkt setzen und tclsh /usr/local/addons/netatmo/netatmo.tcl einfügen.
Button Ausführen drücken.

Am besten dein Script auf Debug umstellen. 2 Zeile auf 7 ändern.
>>> # 0=panic, 1=alert 2=crit 3=err 4=warn 5=notice 6=info 7=debug
set loglevel 6

Bitte mal die Ausgabe posten und am besten auch noch dein aktuell verwendetes Scirpt. Zugangsdaten aus XXX nicht vergessen.

Gruß
Bulli

Samsing
Beiträge: 54
Registriert: 21.01.2016, 09:43
Hat sich bedankt: 18 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Samsing » 04.02.2020, 16:02

Bulli, vielen Dank!
Das hilft sehr. Mir war leider nicht bekannt, wie ich das Script außerhalb der CCU über CUXD ausführen kann.

Nun habe ich das eben so gemacht und den Fehler gefunden und konnte nun an der passenden Stelle entsprechend korrigieren!
Geht wieder!

Recht herzlichen Dank für die Unterstützung!

Gruß
Samsing

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 » 05.02.2020, 07:33

rost2802 hat geschrieben:
15.01.2020, 16:16

Perfekt... das Funktioniert... also einen Schritt weiter. Nun verzweifle ich an regexp.
In der Antwort sind ja mehrere battery_percent die ich den Variablen zuordnen muss. Könntest du mir dabei helfen? Vielen Dank!
Hallo
2 Möglichkeiten beide sind aber nicht wirklich schön.
Alle auf einmal, hier sind es 5 als Beispiel.

Code: Alles auswählen

regexp {\"battery_percent\":(\d+).*\"battery_percent\":(\d+).*\"battery_percent\":(\d+).*\"battery_percent\":(\d+).*\"battery_percent\":(\d+)} $response dummy b1 b2 b3 b4 b5
Oder einzeln. Geht mit Namen des Moduls oder auch mit der Modulid. Mußt halt dann x Zeilen draus machen.

Code: Alles auswählen

regexp {\"Temp_Ess_Bulli\".*?\"battery_percent\":(\d+),} $response dummy x1
Unten im Script halt pro Modul 2 Zeilen noch das wars dann.

Reicht das für dich? Wenn nicht einfach wieder melden. Schön wär es wenn du es fertig hast mal eine kleine Zusammenfassung zu posten.
Ich glaube das wollen andere User auch noch umsetzen/haben.

Gruß
Bulli

Antworten

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