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 » 23.03.2020, 13:13

Mibra hat geschrieben:
22.03.2020, 23:08
Danke für den Tip, leider keine Änderung.

Wo genau kann ich denn die Fehler auslesen. Im Systemprotokoll kommt nichts an.

Sorry ist mein erstes größeres Skript und habe leider damit kaum Erfahrungen.
Hallo
bekommen wir schon hin :-)
Welche Geräte hast du genau? Dein Script ist wie Kraut und Rüppen sag ich mal(nicht böse gemeint)

Als Beispiel ganz oben ist der Windmesser heraus. Im Script in der Mitte und Unten aber noch drin. Wenn du keinen hast raus damit.
folgende Zeilen alle raus
>>>>
log debug "polling wind module..."
set url "https://api.netatmo.net/api/getmeasure? ... e_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"

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 "windA.State('$windangle');"
append rega_cmd "windS.State('$windstrength');"
append rega_cmd "gustA.State('$gustangle');"
append rega_cmd "gustS.State('$guststrength');"
>>>>>

Bei den Zusatzmodulen hast du unten nur eins, in der mitte aber 2. Oben im Script fehlen aber die ID.
>>>>
# the following are MAC addresses of your indoor station and the outside module and rain module
set deviceid "7XXXXXXXXXX:"
set moduleid "0XXXXXXXX:"
set moduleid "0XXXXXXXXXX:"
set rainid "XXXXXXXXXXX"
# set windid "XX:XX:XX:XX:XX:XX"
>>>>>>
Das darf nur einmal moduleid sein, jedes Modul einen eindeutigen Namen. Braucht man dann weiter unten im Script für die Abfragen.
Etwa so
set deviceid "7XXXXXXXXXX:"
set moduleid "0XXXXXXXX:"
set zusatzmodulinnen1 "0XXXXXXXXXX:"
set zusatzmodulinnen1 "0XXXXXXXXXX:"
set rainid "XXXXXXXXXXX"
so würde es ausschauen wenn man die Station mit einen Regensensor und 2 zusätzlichen Innenmodulen betreibt.

Gruß
Bulli

Mibra
Beiträge: 27
Registriert: 24.02.2020, 19:31
Hat sich bedankt: 7 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Mibra » 23.03.2020, 20:59

Hallo Bulli,

vielen Dank.

Ich hab da irgendwie den Durchblick verloren und beim kopieren scheint hier einiges falsch gelaufen zu sein.

Nun habe ich mal ausgemistet und ich hoffe es sieht besser aus. Werte habe ich aber noch keine auf der CCU bekommen.

Ich habe die Netatmo Stadion mit einem außen und einem innenmodul und dem Regenmesser.

Hier mal das verbesserte 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 5e425e6f21XXXXXXXXXX                   
    set clientSecret n238kXf2WxXXXXXXXXXXX
    #  the following are your normal netatmo credentials (the ones you used to setup your netatmo weather station)
    set username mbrXXXXXX
    set password CXXXXXXXX
    #  the following are MAC addresses of your indoor station and the outside module and rain module
    set deviceid 70:ee:XXXXXXX
    set moduleid 02:00:XXXXXXX
    set zusatzmodulinnen1 03:00XXXXXXX
    set rainid 05:00:XXXXXXX

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? ... e_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? ... e_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? ... e_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? ... e_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 zusatzmodule..." 
set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$gartenhausid&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 gustA = dom.GetObject('Gustangle');"
append rega_cmd "var gustS = dom.GetObject('Guststaerke');"
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 "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());"
    

append rega_cmd "var Z2Temp = dom.GetObject('CUxD.CUX9002003:1.SET_TEMPERATURE');"
append rega_cmd "var Z2Humi = dom.GetObject('CUxD.CUX9002003:1.SET_HUMIDITY');" 
append rega_cmd "var Z2CO2 = dom.GetObject('CO2_Geraeteraum');" 
append rega_cmd "Z2Temp.State('$z2temp');" 
append rega_cmd "Z2Humi.State('$z2hum');" 
append rega_cmd "Z2CO2.State('$z2co2');"



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 » 24.03.2020, 18:34

Hallo
schaut schon besser aus. Aber die Punkte in den Abfragen( Zeile 158,166,180,190)Plus Zeile 201(das ist es fast richtig) passen noch nicht.

Zu den Punkten in den Zeilen 158,166usw., das kommt wenn man es im Forum ohne Codetags postet, machst du ja nicht. Also bitte mal schauen ob es bei dir im Script auch Punkte sind. Dann mußt du die richtige Zeile reinkopieren.

Zeile 157,158
du

Code: Alles auswählen

log debug "polling outdoor module..."
set url "https://api.netatmo.net/api/getmeasure? ... e_end=last"
so sollte es im Script sein

Code: Alles auswählen

    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"

Bei den Zeilen 166 180 190 dann auch machen. Wenn du die Zeilen brauchst, stehen im Howto von Indigo.
viewtopic.php?f=31&t=28188&hilit=netatmo+howto#p250708

Zeile 201
Oben im Script hast du für dein Zusatzmodul den Namen zusatzmodulinnen1 geben.
>>>> set zusatzmodulinnen1 03:00XXXXXXX Zeile 17
in zeile 201 steht aber module_id=$gartenhausid hier muß zusatzmodulinnen1 stehen
falsch

Code: Alles auswählen

set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$gartenhausid&scale=max&type=Temperature,Humidity,CO2&date_end=last" 
richtig

Code: Alles auswählen

set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$zusatzmodulinnen1&scale=max&type=Temperature,Humidity,CO2&date_end=last" 
Dann sollte es gehen, wenn nicht bekommen wir es noch hin :-)

Gruß
Bulli

Mibra
Beiträge: 27
Registriert: 24.02.2020, 19:31
Hat sich bedankt: 7 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Mibra » 24.03.2020, 21:55

Hi Bulli, vielen Dank für deine mühen und vor allem das Du mich nicht aufgibst 8)

Ich hoffe ich habe nun alles soweit geändert aber leider bekomme ich noch immer keine Daten.

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 5e425e6f2161XXXXXXXX                     
    set clientSecret n238kXf2WxEXXXXXXXXXX
    #  the following are your normal netatmo credentials (the ones you used to setup your netatmo weather station)
    set username mXXXXXXXXX
    set password CXXXXXXX
    #  the following are MAC addresses of your indoor station and the outside module and rain module
    set deviceid 70:ee:50:XXXXXXX
    set moduleid 02:00XXXXXXX
    set zusatzmodulinnen1 03:0XXXXXXX
    set rainid 05:00:XXXXXXXXXX

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&70:ee:50:XXXXXXXX=$02:00:XXXXXXXXX=$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?70:ee:5XXXXXXXX e_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? ... e_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?05:00:00:XXXXXXX e_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 zusatzmodule..." 
set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$70:ee:50:01:db:6a&03:00:0XXXXXXX=$zusatzmodulinnen1&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 gustA = dom.GetObject('Gustangle');"
append rega_cmd "var gustS = dom.GetObject('Guststaerke');"
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 "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());"
    

append rega_cmd "var Z2Temp = dom.GetObject('CUxD.CUX9002003:1.SET_TEMPERATURE');"
append rega_cmd "var Z2Humi = dom.GetObject('CUxD.CUX9002003:1.SET_HUMIDITY');" 
append rega_cmd "var Z2CO2 = dom.GetObject('CO2_Geraeteraum');" 
append rega_cmd "Z2Temp.State('$z2temp');" 
append rega_cmd "Z2Humi.State('$z2hum');" 
append rega_cmd "Z2CO2.State('$z2co2');"



rega_script $rega_cmd

Tobias78
Beiträge: 1464
Registriert: 27.06.2010, 01:01
Wohnort: Braunschweig
Hat sich bedankt: 4 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Tobias78 » 08.04.2020, 10:08

Meine Lösung für die CCU2 mit aktueller CUxD:

Hatte auch auf einer aktuellen CCU2 das gleiche Problem nach einem der letzten Updates und bekam die Fehlermeldung:

Code: Alles auswählen

debug: script has started
warn: no stored credentials found
debug: requesting new token
debug: response was couldn't execute "/usr/lib/curl": no such file or directory
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]
      ..."
    (file "/usr/local/addons/netatmo/netatmo.tcl" line 151)

Bei mir hat folgendes geholfen.
1. Auskommentieren:

Code: Alles auswählen

 # set ::env(LD_LIBRARY_PATH) "/usr/lib"
2. Suchen ersetzen von

Code: Alles auswählen

/usr/local/addons/cuxd/curl 
nach:

Code: Alles auswählen

/usr/bin/curl
in der netatmo.tcl Datei.

Gruß, Tobias.
--------------------------------------------
Im Einsatz und empfehlenswert:
RaspberryMatic,IO.Broker, Homeputer Studio; CuXD; PocketControl, HomeStatus, Robonect, Alexa, io.Broker
------------------------------------------

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 » 06.05.2020, 14:17

Hallo zusammen!

Bei mir schreibt er seit kurzem die ausgelesenen Werte nicht mehr in die Variablen. Die Ausgabe per debug zeigt mir keinen Fehler:

Code: Alles auswählen

debug: script has started
info: found stored credentials
debug: loading stored credentials from /tmp/netatmo.dat
debug: file data is: 55a8d86d485a88c29603cf48|a1f22321d757eb96de59d0e517f4050b
55a8d86d485a88c29603cf48|567b611e6c81955be21c732c37c6a7f7
1588768200

debug: current time is 2020-05-06T14:10:38, token is valid until 2020-05-06T14:30:00
info: token is still valid
debug: polling outdoor module...
debug: querying https://api.netatmo.net/api/getmeasure?access_token=55a8d86d485a88c29603cf48|a1f22321d757eb96de59d0e517f4050b&device_id=xxx:c8&module_id=xxx:d6&scale=max&type=Temperature,Humidity&date_end=last
debug: response is: {"body":[{"beg_time":1588766501,"value":[[17.2,39]]}],"status":"ok","time_exec":0.04106903076171875,"time_server":1588767038}#=#=#                                                                         
info: Outside temperature is 17.2
info: Outside humidity is 39
debug: polling main module...
debug: querying https://api.netatmo.net/api/getmeasure?access_token=55a8d86d485a88c29603cf48|a1f22321d757eb96de59d0e517f4050b&device_id=70:ee:50:12:eb:c8&scale=max&type=Temperature,Humidity,CO2,Pressure,Noise&date_end=last
debug: response is: {"body":[{"beg_time":1588766501,"value":[[21.4,37,442,1025.6,45]]}],"status":"ok","time_exec":0.05035400390625,"time_server":1588767038}#=#=#                                                                         
info: LogI is {"body":[{"beg_time":1588766501,"value":[[21.4,37,442,1025.6,45]]}],"status":"ok","time_exec":0.05035400390625,"time_server":1588767038}#=#=#                                                                         
info: Inside temperature is 21.4
info: Inside humidity is 37
info: Inside CO2 level 442
info: Inside pressure is 1025.6
info: Inside noise level is 45
debug: polling regensensor module...1d
debug: querying https://api.netatmo.net/api/getmeasure?access_token=55a8d86d485a88c29603cf48|a1f22321d757eb96de59d0e517f4050b&device_id=xxx&module_id=xxxc&scale=1day&type=sum_rain&date_end=last
debug: response is: {"body":[{"beg_time":1588759200,"value":[[0]]}],"status":"ok","time_exec":0.08369278907775879,"time_server":1588767039}#=#=#                                                                         
info: LogR is {"body":[{"beg_time":1588759200,"value":[[0]]}],"status":"ok","time_exec":0.08369278907775879,"time_server":1588767039}#=#=#                                                                         
info: Outside Regen1d is 0
debug: polling regensensor module...30min
debug: querying https://api.netatmo.net/api/getmeasure?access_token=55a8d86d485a88c29603cf48|a1f22321d757eb96de59d0e517f4050b&device_id=70:ee:50:12:eb:c8&module_id=05:00:00:01:74:4c&scale=30min&type=Rain,sum_rain&date_end=last
debug: response is: {"body":[{"beg_time":1588767300,"value":[[0,0]]}],"status":"ok","time_exec":0.05063295364379883,"time_server":1588767039}#=#=#                                                                         
info: LogR is {"body":[{"beg_time":1588767300,"value":[[0,0]]}],"status":"ok","time_exec":0.05063295364379883,"time_server":1588767039}#=#=#                                                                         
info: Outside rain2 is 0

Das Cux-Device habe ich schon mal komplett neu angelegt (Universal Wrapper), alle Einstellungen vorgenommen und die Kanäle zugerordnet, im Skript auf das neue Cux umgestellt. Dennoch werden die Var nicht befüllt...

Jemand eine Idee?

rost2802
Beiträge: 4
Registriert: 12.01.2020, 14:41
Hat sich bedankt: 1 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von rost2802 » 15.05.2020, 22:17

Bulli hat geschrieben:
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
Nabend... Vielen Dank für die Zeilen! Jetzt läuft es und schreibt mir die Levels in die Systemvariablen. Hier noch meine netatmo.tcl zum nachbauen.

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 wzid "xxx"
  set aid "xxx"
  set szid "xxx"
  set tid "xxx"
  set eid "xxx"
  #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 aussen..."
  set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$wzid&module_id=$aid&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 atemp ahum
  log info "a temperature is $atemp"
  log info "a humidity is $ahum"
  
  log debug "polling battery..."
  set url "https://api.netatmo.net/api/getstationsdata?access_token=$accesstoken&device_id=$wzid"
  log debug "querying $url"
  catch {exec /usr/local/addons/cuxd/curl -k -# $url} response
  log debug "response is: $response"
  regexp {\"battery_percent\":(\d+).*\"battery_percent\":(\d+).*\"battery_percent\":(\d+).*\"battery_percent\":(\d+)} $response dummy bs bt be ba
  log info " SZ battery is $bs"
  log info " T battery is $bt"
  log info " E battery is $be"
  log info " A battery is $ba"
  
  
  log debug "polling wz..."
  set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$wzid&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 wztemp wzhum wzco2 wzpressure wznoise
  log info "LogI is $response"              
  log info "wz temperature is $wztemp"
  log info "wz humidity is $wzhum"
  log info "wz CO2 level $wzco2"
  log info "wz pressure is $wzpressure"
  log info "wz noise level is $wznoise"
  
  log debug "polling sz..."
  set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$wzid&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 "SZ temperature is $sztemp"
  log info "SZ humidity is $szhum"
  log info "SZ CO2 level $szco2"
  
  log debug "polling tom..."
  set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$wzid&module_id=$tid&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 ttemp thum tco2
  log info "LogI is $response"             
  log info "T temperature is $ttemp"
  log info "T humidity is $thum"
  log info "T CO2 level $tco2"
  
  log debug "polling emma..."
  set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$wzid&module_id=$eid&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 etemp ehum eco2
  log info "LogI is $response"             
  log info "E temperature is $etemp"
  log info "E humidity is $ehum"
  log info "E CO2 level $eco2"
  
  #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"
  #
  # set ReGaHss variables
  #
  set rega_cmd ""
  append rega_cmd "var WZTemp = dom.GetObject('CUxD.CUX9002001:1.SET_TEMPERATURE');"
  append rega_cmd "var WZHumi = dom.GetObject('CUxD.CUX9002001:1.SET_HUMIDITY');"
  append rega_cmd "var WZPress = dom.GetObject('Luftdruck');"
  append rega_cmd "var WZCO2 = dom.GetObject('WZCO2');"
  append rega_cmd "var WZNoise = dom.GetObject('Sonometer');"
  append rega_cmd "WZTemp.State('$wztemp');"
  append rega_cmd "WZHumi.State('$wzhum');"
  append rega_cmd "WZPress.State('$wzpressure');"
  append rega_cmd "WZCO2.State('$wzco2');"
  append rega_cmd "WZNoise.State('$wznoise');"
  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 AuTemp = dom.GetObject('CUxD.CUX9002002:1.SET_TEMPERATURE');"
  append rega_cmd "var AuHumi = dom.GetObject('CUxD.CUX9002002:1.SET_HUMIDITY');"
  append rega_cmd "AuTemp.State('$atemp');"
  append rega_cmd "AuHumi.State('$ahum');"
  
  append rega_cmd "var SZTemp = dom.GetObject('CUxD.CUX9002003:1.SET_TEMPERATURE');"
  append rega_cmd "var SZHumi = dom.GetObject('CUxD.CUX9002003:1.SET_HUMIDITY');"
  append rega_cmd "var SZCO2 = dom.GetObject('SZCO2');"
  append rega_cmd "SZTemp.State('$sztemp');"
  append rega_cmd "SZHumi.State('$szhum');"
  append rega_cmd "SZCO2.State('$szco2');"
  
  append rega_cmd "var TomTemp = dom.GetObject('CUxD.CUX9002004:1.SET_TEMPERATURE');"
  append rega_cmd "var TomHumi = dom.GetObject('CUxD.CUX9002004:1.SET_HUMIDITY');"
  append rega_cmd "var TomCO2 = dom.GetObject('TomCO2');"
  append rega_cmd "TomTemp.State('$ttemp');"
  append rega_cmd "TomHumi.State('$thum');"
  append rega_cmd "TomCO2.State('$tco2');"
  
  append rega_cmd "var EmmaTemp = dom.GetObject('CUxD.CUX9002005:1.SET_TEMPERATURE');"
  append rega_cmd "var EmmaHumi = dom.GetObject('CUxD.CUX9002005:1.SET_HUMIDITY');"
  append rega_cmd "var EmmaCO2 = dom.GetObject('EmmaCO2');"
  append rega_cmd "EmmaTemp.State('$etemp');"
  append rega_cmd "EmmaHumi.State('$ehum');"
  append rega_cmd "EmmaCO2.State('$eco2');"
  
  append rega_cmd "var SBat = dom.GetObject('SBat');"
  append rega_cmd "SBat.State('$bs');"
  append rega_cmd "var TBat = dom.GetObject('TBat');"
  append rega_cmd "TBat.State('$bt');"
  append rega_cmd "var EBat = dom.GetObject('EBat');"
  append rega_cmd "EBat.State('$be');"
  append rega_cmd "var ABat = dom.GetObject('ABat');"
  append rega_cmd "ABat.State('$ba');"

  #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 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 "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');"
  rega_script $rega_cmd[code]

Gruß Ronny

DanielK
Beiträge: 28
Registriert: 21.03.2015, 09:07
Wohnort: Bremen
Hat sich bedankt: 1 Mal

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von DanielK » 25.05.2020, 09:05

redy09 hat geschrieben:
06.05.2020, 14:17
Hallo zusammen!

Bei mir schreibt er seit kurzem die ausgelesenen Werte nicht mehr in die Variablen.
....
Das Cux-Device habe ich schon mal komplett neu angelegt (Universal Wrapper), alle Einstellungen vorgenommen und die Kanäle zugerordnet, im Skript auf das neue Cux umgestellt. Dennoch werden die Var nicht befüllt...

Jemand eine Idee?
Hi, das ist bei mir auch so. Vor 3.51.6.20200420 funktionierte es noch, ich weiß aber nicht, ob es damit zusammenhängt. Das Skript läuft erfolgreich und liest die Werte bei netatmo. In dem "tcl" steht bei mir beispielhaft:

Sorry, bei mir lag es ganz banal daran, dass meine Station abgeraucht war und praktisch immer die alten Werte noch in die Variablen gesetzt worden.
Programme: 154 - Variablen: 169 - Aktoren: 127 - Kanäle: 632

finn_lu
Beiträge: 14
Registriert: 23.02.2019, 09:47

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von finn_lu » 10.06.2020, 17:30

Guden,

ich habe jetzt versucht einige Fehlermöglichkeiten auszuprobieren. Bekomme aber immer die Fehlermeldung

Code: Alles auswählen

/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 150)


Meine Datei ist folgende:

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 "5edbb31c17xxxxxxxxxxxxxx"                     
    set clientSecret "nALzukVecxxxxx"
    #  the following are your normal netatmo credentials (the ones you used to setup your netatmo weather station)
    set username "xxx.de"
    set password "HierwäredasPW"
    #  the following are MAC addresses of your indoor station and the outside module and rain module
    set deviceid "70:ee:50:xx:xx:xx"
    set moduleid "02:00:00:xx:xx:xx"
    set rainid "05:00:00:xx:xx:xx"
    set windid "06:00:00: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 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"


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

Vielleicht könnt ihr mir helfen.

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 » 11.06.2020, 09:13

finn_lu hat geschrieben:
10.06.2020, 17:30
Guden,
ich habe jetzt versucht einige Fehlermöglichkeiten auszuprobieren. Bekomme aber immer die Fehlermeldung

Vielleicht könnt ihr mir helfen.
Morgen
das Script schaut auf den ersten Blick erst mal gut aus. Dein Problem könnten die Zugangsdaten bzw. das Passwort sein. Wenn im Passwort ein x oder - Zeichen enthalten ist läuft es auf keinen Fall.
Bitte mal das Script auf Debug umstellen auf der CCU ausführen und Ausgabe hier posten.

Code: Alles auswählen

    # 0=panic, 1=alert 2=crit 3=err 4=warn 5=notice 6=info 7=debug
    set loglevel 6
Ändern auf >> set loglevel 7

Gruß
Bulli

Antworten

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