Netatmo Wetterstation (incl. CO2 Messung) einbinden

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

Moderator: Co-Administratoren

wolfgangm
Beiträge: 22
Registriert: 04.11.2015, 17:01

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von wolfgangm » 09.12.2017, 19:35

Nach einem schönen Nachmittag lauft die Sache ganz wunderbar! Einen ganz herzlichen Dank an die Entwickler und Betreuer dieses großartigen Scripts!

Ich hatte auch Probleme mit der "verunreinigten" netatmo.tcl, aber auch nur, weil ich es nicht glauben wollte ;-)
Irgendwie Zeichensatz, Browserdownload oder dann der Upload, irgendwas auf dem Weg bis dorthin raubt tatsächlich ein paar Stunden zur Fehlersuche ;-)

Ein kleiner Verbesserungsvorschlag:
Könnte man dieses Thema hier für Probleme lassen und ein neues Thema nur mit der Anleitung ohne Diskussionen eröffnen?
Ich wäre die Sache schon viel früher angegangen, wenn es hier etwas übersichtlicher gewesen wäre...

Nochmals herzlichen Dank an die Entwickler

Wolfgang

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

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Indigo » 10.12.2017, 10:22

Schön , dass es bei dir läuft.
Den HowTo Thread gibt es schon:
viewtopic.php?p=250708#p250708

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

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Indigo » 10.12.2017, 15:38

timo-n hat geschrieben: Und wenn ich noch ein Zusatzmodul bekomme und aus einem 2ten Raum die Werte haben will was muss da noch in die tcl?
Die Infos findest du im HowTo. Aber hier nochmal. Gib bescheid wenn du nicht weiter kommst.
Indigo hat geschrieben:Da ich derzeit nicht dazu komme das HowTo zu erweitern hänge ich diesen Beitrag zumindest mal dahinter.

SO WERDEN ZUSATZMODULE EINGEBUNDEN

Die IDs weiterer Innenmodule beginnen mit 03:00:00.

Zusatzmodul liefern Temperatur, Feuchtigkeit und CO2 Werte. Es wird nur eine neue Systemvariable für den CO2 Wert benötigt. Ich nenn sie mal CO2_SZ (ggf. Im unteren Teil den Namen anpassen). Und ein weiteres CuXD Gerät.

Folgende Anpassungen im Skript müssen gemacht werden:
Im ersten Teil (rot im HowTo) eine weitere Zeile einfügen mit der ID.
z.B.: set szid "IDdesZusatzinnenmodules"

Unten muss folgender Block eingefügt werden (nach dem grünen Block im HowTo):

Code: Alles auswählen

    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"


Und im letzten Teil folgendes einfügen: (CuXD Gerätenummern anpassen!!)
Irgendwo zwischen diese Zeilen:
set rega_cmd ""
rega_script $rega_cmd

Code: Alles auswählen

append rega_cmd "var ZTemp = dom.GetObject('CUxD.CUX9002001:1.SET_TEMPERATURE');"
append rega_cmd "var ZHumi = dom.GetObject('CUxD.CUX9002001: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');"

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

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Indigo » 10.12.2017, 15:43

timo-n hat geschrieben:Es scheint zu gehen :-)
aber irgendwie aktualisiert sich der Status aber nicht automatisch.

Ich hab wie beschrieben nen Virtuellen Tasterkanal genommen und bei Key Short und Long dann

Code: Alles auswählen

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

Dann ein Programm mit 15minuten Zeitmodul mit diesem Script

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801001:2.CMD_QUERY_RET").State(2);
dom.GetObject("CUxD.CUX2801001:2.CMD_SETS").State("tclsh /usr/local/addons/netatmo/netatmo.tcl");
var v = dom.GetObject("CUxD.CUX2801001:2.CMD_RETS").State();
WriteLine(v);
Hi,

von was für einem Gerät hat du den virtuellen tasterkanal genommen?
Hast dieses Gerät die Seriennummer CUX2801001? Ansonsten bitte im Code die passende Seriennummer eintragen.

timo-n
Beiträge: 29
Registriert: 23.10.2015, 20:13
Wohnort: Stuttgart

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von timo-n » 11.12.2017, 17:46

Also am Tasterkanal kann es nicht liegen. Hatte das Script wie beschrieben ausführen lassen und dann kam nur in den Servicemeldungen das die Gerätekomuunikation gestört ist.

Hab das Programm mit dem Script dann gelöscht und lass momentan dann immer per zeitmodul den virtuellen taster drücken und das funktioniert auch. Keine Ahnung ob das Nachteile hat im vergleich zu dem script.

Wie binde ich denn noch ein Zusatzmodul nun ein?

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

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Indigo » 11.12.2017, 18:12

Hast du meinen Beitrag #503 gelesen? Da steht alles zu den Zusatzmodulen.


Gesendet von iPhone mit Tapatalk

timo-n
Beiträge: 29
Registriert: 23.10.2015, 20:13
Wohnort: Stuttgart

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von timo-n » 11.12.2017, 18:27

Ja hab ich und auch den Beitrag von Onkeltommy hatte ich gelesen bei dem es ja funktioniert hatte aber irgendwie kapier ich es nicht.

Ich hab nun noch eine SV angelegt (NetAtmo Innen 2 CO2) und das CUXD Gerät.

Aber ich versteh gerade nicht wo ich noch was alles einfügen muss und an welcher stelle :?:
Hab Das Modul auch noch nicht aber muss ja theoretisch dann nur noch die ID eingeben. Aber bevor ich nachts dran sitz und da keiner mitliest versuch ich es mal jetzt schon :-p

timo-n
Beiträge: 29
Registriert: 23.10.2015, 20:13
Wohnort: Stuttgart

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von timo-n » 11.12.2017, 18:34

Stimmt das so?

Kann ich denn die ID vom Hauptmodul zum testen anstatt dem Zusatzmodul nehmen und dann sehen ob die Ergebnisse in dem CUXD kommen oder kolidiert da irgendwas?

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 ID                     
  set clientSecret SECRET
  #  the following are your normal netatmo credentials (the ones you used to setup your netatmo weather station)
  set username EMAIL
  set password PASS
  #  the following are MAC addresses of your indoor station and the outside module and rain module
  set deviceid 70:ee:50:2a:e8:f2
  set moduleid 02:00:00:2c:ad:b4
  szid "03:XX:XX:XX:XX:XX
  set ::env(LD_LIBRARY_PATH) "/usr/local/addons/cuxd"
  set cfgfile "/tmp/netatmo.dat"
  set logtag "netatmo.tcl"
  set logfacility "local1"
  # 0=panic, 1=alert 2=crit 3=err 4=warn 5=notice 6=info 7=debug
  set loglevel 7
  #---------------------------------------------------------------------------------------------------------------#
  #---------------------------------------------------------------------------------------------------------------#
  #                                              GLOBAL VARIABLES                                                                #
  #---------------------------------------------------------------------------------------------------------------#
  set accesstoken ""
  set refreshtoken ""
  set tokenexpires 0
  #---------------------------------------------------------------------------------------------------------------#
  set loglevels {panic alert crit err warn notice info debug}
  proc log {lvl msg} {
      global logtag
      global logfacility
      global loglevel
      global loglevels
     
      set lvlnum [lsearch $loglevels $lvl]
     
      if {$lvlnum <= $loglevel} {
          if {$lvlnum <= 3} {
              catch {exec logger -s -t $logtag -p $logfacility.$lvl $msg}
          } else {
              puts "$lvl: $msg"
              catch {exec logger -t $logtag -p $logfacility.$lvl $msg}
          }
         
      }
     
  }
  proc refreshToken {rt ci cs} {
      log debug "refreshing token"
      set url "https://api.netatmo.net/oauth2/token"
      set header "Content-Type: application/x-www-form-urlencoded;charset=UTF-8"
      set parameter "grant_type=refresh_token&refresh_token=$rt&client_id=$ci&client_secret=$cs"
      catch {exec /usr/local/addons/cuxd/curl -k -i -H $header -X POST -d $parameter $url} response
      log debug "response was $response"
     
      return $response
  }
  proc requestToken {ci cs un pw} {
      log "debug" "requesting new token"
      set url "https://api.netatmo.net/oauth2/token"
      set header "Content-Type: application/x-www-form-urlencoded;charset=UTF-8"
      set parameter "grant_type=password&client_id=$ci&client_secret=$cs&username=$un&password=$pw"
      catch {exec /usr/local/addons/cuxd/curl -k -i -H $header -X POST -d $parameter $url} response
      log debug "response was $response"
     
      return $response
  }
  proc parseOAuthResponse {input} {
      log debug "parsing authentication result"
      global accesstoken
      global refreshtoken
     
      regexp {HTTP/1.1\s(\d*)} $input dummy returncode
      regexp {\"access_token\":\"(.*?)\"} $input dummy accesstoken
      regexp {\"refresh_token\":\"(.*?)\"} $input dummy refreshtoken
      regexp {\"expires_in\":(.*?)\,} $input dummy expiresin
      log debug "returncode is $returncode"
      log debug "access token is $accesstoken"
      log debug "refresh token is $refreshtoken"
      log debug "expires in $expiresin"
     
      if {[expr $returncode]!=200} {
              log error "Authentication failed with code $returncode and response $input"
              exit 1
          }
     
      return $expiresin
  }
  proc saveAccessToken {expin} {
      global accesstoken
      global refreshtoken
      global tokenexpires
      global cfgfile
         
      log debug "saving new access token to $cfgfile"
     
      set fileId [open $cfgfile "w"]
     
      set now [clock seconds]
      set tokenexpires [expr $now + $expin]
     
      puts $fileId $accesstoken
      puts $fileId $refreshtoken
      puts $fileId $tokenexpires
      close $fileId
  }
  proc loadAccessToken {} {
      global accesstoken
      global refreshtoken
      global tokenexpires
      global cfgfile
     
      log debug "loading stored credentials from $cfgfile"
     
      set fp [open $cfgfile r]
      set file_data [read $fp]
      close $fp
     
      log debug "file data is: $file_data"
     
      set data [split $file_data "\n"]   
     
      set accesstoken [lindex $data 0]
      set refreshtoken [lindex $data 1]
      set tokenexpires [lindex $data 2]
  }
  log debug "script has started"
  if { [file exists $cfgfile] == 1} {
      log info "found stored credentials"
          loadAccessToken
          set now [clock seconds]
          log debug "current time is [clock format $now -format "%Y-%m-%dT%H:%M:%S"], token is valid until [clock format $tokenexpires -format "%Y-%m-%dT%H:%M:%S"]"
          if {[expr $now >= $tokenexpires] == 1} {
              log notice "token has already expired"
              saveAccessToken [parseOAuthResponse [refreshToken $refreshtoken $clientId $clientSecret]]
              log notice "oauth token successfully refreshed"
          } else {
              log info "token is still valid"
          }
      } else {
          log warn "no stored credentials found"
          saveAccessToken [parseOAuthResponse [requestToken $clientId $clientSecret $username $password]]
          log notice "oauth token successfully initialized"
      }
  log debug "polling outdoor module..."
  set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&module_id=$moduleid&scale=max&type=Temperature,Humidity&date_end=last"
  log debug "querying $url"
  catch {exec /usr/local/addons/cuxd/curl -k -# $url} response
  log debug "response is: $response"
  regexp {\"value\":\[\[(.*?),(.*?)\]} $response dummy otemp ohum
  log info "Outside temperature is $otemp"
  log info "Outside humidity is $ohum"
  log debug "polling main module..."
  set url "https://api.netatmo.net/api/getmeasure?access_token=$accesstoken&device_id=$deviceid&scale=max&type=Temperature,Humidity,CO2,Pressure,Noise&date_end=last"
  log debug "querying $url"
  catch {exec /usr/local/addons/cuxd/curl -k -# $url} response
  log debug "response is: $response"
  regexp {\"value\":\[\[(.*?),(.*?),(.*?),(.*?),(.*?)\]} $response dummy itemp ihum ico2 ipressure inoise
  
  log info "LogI is $response"              
  log info "Inside temperature is $itemp"
  log info "Inside humidity is $ihum"
  log info "Inside CO2 level $ico2"
  log info "Inside pressure is $ipressure"
  log info "Inside noise level is $inoise"

  log debug "polling 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('NetAtmo Innen 1 Luftdruck');"
append rega_cmd "var ICO2 = dom.GetObject('NetAtmo Innen 1 CO2');"
append rega_cmd "var INoise = dom.GetObject('NetAtmo Innen 1 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('NetAtmo SyncTime');"
append rega_cmd "netatmosynctime.Variable(sdatetime.ToString());"
#Zusatzmodul
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('NetAtmo Innen 2 CO2');"
append rega_cmd "ZTemp.State('$ztemp');"
append rega_cmd "ZHumi.State('$zhum');"
append rega_cmd "ZCO2.State('$zco2');"
rega_script $rega_cmd

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

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von Indigo » 11.12.2017, 19:23

Sollte so passen.
Ob du es mit der ID des Innenmoduls testen kannst will ich nicht beschwören. Kommt auf einen Versuch an.

Wenn du mit Testen fertig bist solltest du aber noch alle Zeilen die zum Zusatzmodul gehören mit # auskommentieren. Natürlich nur bis du das Zusatzmodul hast. Sonst funktioniert dein Skript ggf nicht mehr richtig.

Wenn das Auslesen über Taster funktioniert ist doch gut. Das ist völlig egal wie man es macht. Ich mache es mittlerweile über einen CuXD Timer.

timo-n
Beiträge: 29
Registriert: 23.10.2015, 20:13
Wohnort: Stuttgart

Re: Netatmo Wetterstation (incl. CO2 Messung) einbinden

Beitrag von timo-n » 11.12.2017, 20:05

Also Testen ging irgendwie nicht. Hatte dann so wie du beschrieben hattest die Zusatzmodule vorrübergehend ausgeklammert und es lief ganz normal mit dem Hauptmodul.
Jetzt warte ich mal auf die DHL Lieferung vom Zusatzmodul...

Antworten

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