Netatmo Script geht nicht mehr

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

Antworten
Accuracy
Beiträge: 749
Registriert: 22.05.2013, 16:37
Hat sich bedankt: 1 Mal

Netatmo Script geht nicht mehr

Beitrag von Accuracy » 08.10.2021, 08:07

Hallo Gemeinde,

ich habe ein riesen Problem mit meiner Netatmo Wetterstation. Vielmehr dem Script das die Wetterdaten abfragt und in die CCU importiert. Die (Wetterdaten sind zentraler Bestandteil meiner Anlage und steuern viele andere Programme.)
Das Skript lief über Jahre fehlerfrei und perfekt. Seit letzter Woche ist mir aber aufgefallen, dass die Daten nicht mehr refreshed werden. Warum auch immer - ich habe nichts geändert. (ich habe das Script und das Setup damals hier aus dem Forum nachgebaut).

Hier einmal die Details:
Ich habe ein Programm welches via Zeitsteuerung alle 15min das TLC Netatmo Skript aufruft.
Bildschirmfoto 2021-10-08 um 07.56.21.png
CCU Skriptaufruf
im CuxD Log sehe ich auch dass das Skript ausgeführt wird:
Bildschirmfoto 2021-10-08 um 07.58.33.png
CuxD Log
Trotzdem werden die entsprechenden Variablen für Innen und Außen nicht mehr befüllt und die Spalte Refreshzeitstempel zeigt nichts mehr an bzw. für innen den letzten Refresh gestern.
Bildschirmfoto 2021-10-08 um 07.55.37.png
variablen innen
Bildschirmfoto 2021-10-08 um 07.55.45.png
variablen aussen
In meinem Netatmokonto kann ich mich ganz normal einloggen und alles scheint dort ok zu sein.
Ein Restart der CCU hat auch nichts gebracht.

Hat jemand eine Idee woran es liegen könnte, dass die Variablen plötzlich nicht mehr befüllt werden?

MichaelN
Beiträge: 9684
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1627 Mal

Re: Netatmo Script geht nicht mehr

Beitrag von MichaelN » 08.10.2021, 08:18

Das was Du uns zeigst befüllt die SV auf jeden Fall nciht.
Also muss es ja wohl am tcl Skript liegen.
Wenn Du das postet, aber bitte nicht als Screenshot, sondern in Code Tags.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Accuracy
Beiträge: 749
Registriert: 22.05.2013, 16:37
Hat sich bedankt: 1 Mal

Re: Netatmo Script geht nicht mehr

Beitrag von Accuracy » 08.10.2021, 08:28

das zugehörige Skipt schaut so aus (Credentials und MACs geändert):

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 "234jk234"                     
    set clientSecret "234"
    #  the following are your normal netatmo credentials (the ones you used to setup your netatmo weather station)
    set username "meine email"
    set password "mein PW"
    #  the following are MAC addresses of your indoor station and the outside module
    set deviceid "44:ee:40:04:A3:5e"
    set moduleid "01:02:11:04:e8:48"
    set rainid "05:00:22:44:sd:3c"

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

    #
    # set ReGaHss variables
    #
    set rega_cmd ""
    append rega_cmd "var ITemp = dom.GetObject('CUxD.CUX9002016:1.SET_TEMPERATURE');"
    append rega_cmd "var IHumi = dom.GetObject('CUxD.CUX9002016:1.SET_HUMIDITY');"
    append rega_cmd "var OTemp = dom.GetObject('CUxD.CUX9002017:1.SET_TEMPERATURE');"
    append rega_cmd "var OHumi = dom.GetObject('CUxD.CUX9002017: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 "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 IPress = dom.GetObject('Luftdruck');"
    append rega_cmd "var ICO2 = dom.GetObject('CO2');"
    append rega_cmd "var INoise = dom.GetObject('Sonometer');"
    append rega_cmd "OTemp.State('$otemp');"
    append rega_cmd "OHumi.State('$ohum');"
    append rega_cmd "ITemp.State('$itemp');"
    append rega_cmd "IHumi.State('$ihum');"
    append rega_cmd "IPress.State('$ipressure');"
    append rega_cmd "ICO2.State('$ico2');"
    append rega_cmd "INoise.State('$inoise');"
    append rega_cmd "Rain1.State('$rain30min');"
    append rega_cmd "Rain2.State('$rain1d');"
    append rega_cmd "Rain3.State('$rain2');"
    append rega_cmd "var sdatetime = system.Date('%d.%m.%Y %H:%M:%S');"
    append rega_cmd "var netatmosynctime = dom.GetObject('SyncTime');"
    append rega_cmd "netatmosynctime.Variable(sdatetime.ToString());"
    rega_script $rega_cmd


Accuracy
Beiträge: 749
Registriert: 22.05.2013, 16:37
Hat sich bedankt: 1 Mal

Re: Netatmo Script geht nicht mehr

Beitrag von Accuracy » 08.10.2021, 11:23

Hat sich erledigt. Die CCU war nicht im Internet.

Antworten

Zurück zu „HomeMatic allgemein“