Seite 74 von 92

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Verfasst: 10.06.2019, 02:17
von NeoLF
Hallo,
ich bin blutiger Neuling und will auch meine NetAtmo Daten (inkl. Windmodul) an die Homematic anbinden um meine Rolladen zu steuern.

Nun bekomme ich aber die Anbindung einfach nicht hin.
Es kommen scheinbar keine Daten an.

Benötigte ich zwangsläufig einen "CUL_Stick" ?
In allen Anleitungen die ich kenne, ist davon nie die Rede
und ich bin davon ausgegangen, dass die CCU2 sich die Daten über das Netzwerk holt.

Danke für euer Feedback.

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Verfasst: 10.06.2019, 08:54
von Indigo
Hallo,

Kennst du das HowTo?
Findest du hier: viewtopic.php?f=31&t=28188

Du benötigst nur die CCU und einen Internetzugang.

Damit wir dir helfen können musst du uns zeigen was du schon hast.
Poste bitte dein Script. Bitte ohne Zugangsdaten.
Screenshots deiner Angelegten Geräte und Variablen helfen auch.

Was kommt als Antwort wenn du dein Script im Terminalfenster testest?


Grüße

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Verfasst: 10.06.2019, 15:29
von NeoLF
Hallo,
vielen Dank für die extrem schnelle Antwort!

Ich kenne Dein HowTo:
viewtopic.php?f=31&t=28188
und ausserdem noch das hier:
https://appproject.de/Hausautomatisieru ... matic.html
Aus meiner Sicht wird aber die selbe Methode beschrieben

Im Terminalfenster des CUxD kann ich nichts eingeben.
Es kommt nur ein weißes Viereck ohne Eingabemöglichkeit

Bild


Hier mal was ich bisher alles habe:

Script
Bild

Geräte CUxD
Bild

Geräte CCU2:
Bild

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Verfasst: 10.06.2019, 15:31
von NeoLF
Geräte Einstellungen CCU2:
Bild

Variablen:
Bild

Programm:
Bild

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Verfasst: 11.06.2019, 08:57
von Indigo
Hi,

Bitte poste dein Script in Zukunft als Code (4. Button über dem Textfeld). Dann kann man ihn viel besser lesen.

Um das Script zu testen musst du dich per SSH auf die CCU begeben und dann das Script manuell starten. Ist im HowTo beschrieben. Als Ergebnis bekommst du die Werte der NetAtmo Geräte und/oder einen Fehler angezeigt. Diese Ausgabe wäre noch sehr hilfreich. Dann kann man sehen wo es hängt.

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Verfasst: 11.06.2019, 23:46
von NeoLF
Ok Danke!

anbei habe ich nochmal das Script hier rein kopiert
Das Problem war, dass ich die Datei mit FileZilla übertragen habe und dort kein Terminal finden konnte.
CTRL+T ist soweit ich weis ein Mac Befehl. Ich habe Windows.
Und Putty, dass ich noch drauf habe konnte sich nicht mit der CCU2 verbinden.

Also nun noch WinSCP installiert und das Terminal gefunden.

Allerdings gibt es den folgenden Fehler aus (siehe Bild)
190611_Terminal.JPG



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 "5xxxxxxxxxxxxx0"                     
    set clientSecret "qxxxxxxxxxxxxxxxxxxxU"
    #  the following are your normal netatmo credentials (the ones you used to setup your netatmo weather station)
    set username "lxxxxxxxxxxxxxxxxxxxxxe"
    set password "Txxxxxxxxxx1"
    #  the following are MAC addresses of your indoor station and the outside module and rain module
    set deviceid "7xxxxxxxxxxxxxx8"
    set moduleid "0xxxxxxxxxxxa"

    set windid "0xxxxxxxxxxxe"

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

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Verfasst: 12.06.2019, 19:48
von NeoLF
Ich bin etwas weiter gekommen...

Ich habe das Script in WinSCP Bearbeitet und dort viele merkwürdige Zeichen gefunden die ich alle gelöscht habe.
Ausserdem meckert er auch über so manches Leerzeichen.

Das alles habe ich gelöscht und bin so Stück für Stück weiter gekommen.
Hier ein Bild von den störenden Zeichen:
Unbenannt.JPG

Aber letztendlich kommt doch ein Fehler für den mir die Kenntnisse fehlen.
Was Bedeutet das?
Unbenannt2.JPG

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Verfasst: 12.06.2019, 21:54
von Indigo
Hallo,

du bist auf dem richtigen Weg. Da ist bestimmt noch irgendwo ein falsches Zeichen versteckt. Dirket gefunden habe ich aber auch nichts.
GGf. Ist es einfacher das Script in WinSCP direkt nochmal neu aufzubauen als das Vorhandene zu reparieren.
Habe gerade nicht viel Zeit. Ab übermorgen kann ich es mir nochmal genauer anschauen.

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Verfasst: 13.06.2019, 08:16
von Xel66
Solche merkwürdigen Zeichen verhindert man, wenn man Editierte Scripts per SSH und vi einfügt. Der Umweg über eine Windows-Editor und Kopieren per SFTP provoziert solche Steuerzeichen geradezu.

Gruß Xel66

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Verfasst: 13.06.2019, 23:06
von NeoLF
Danke für die Tipps,

ich bin ein ganzes Stück weiter.
habe das Script direkt in WinSCP direkt auf der CCU2 nochmal neu aufgebaut und editiert.
Nun spuckt die Terminaleingabe die Werte aus.
Unbenannt10.JPG

Allerdings kommen noch nicht alle Werte in dem Angelegten Gerät NetAtmoAussen an.
Die WindParameter kommen nicht an und Aussen Humidity wird gar nicht angezeigt.
Unbenannt11.JPG
Unbenannt12.JPG
Ich weiss...
Ich muss die Geräte mal nochmal neu anlegen und durchschauen.
Dafür hab ich heute allerdings nicht mehr den Kopf für.
Vielen Dank schonmal für Eure Hilfe bis hier hin.





EDIT:
Korrektur..........
Die Windwerte sind doch da. Der Fehler war natürlicher Art... Es war gestern abend zu dem Zeitpunkt einfach kein Wind da.
Heute Morgen war Wind und auch die Daten da.


Bleibt also noch die Luftfeuchtigkeit.
Darum kümmere ich mich am Wochenende...