发送netatmo恒温器数据到infloxdb。

netatmo2influxdb的Python项目详细描述


NetatMo2influxDB

Netatmo2InfluxDB支持跨多个房屋将多个netatmo恒温器导入infloxdb。

工作原理

通过使用Netatmo Developer API,我们可以使用它们的api/homesdataapi/getroommeasure端点来获取数据(请参见:^{})。api/getroommeasure端点允许30分钟的粒度,这对我们的应用程序很好。

为了能够实际检索数据,我们首先必须收集访问和刷新令牌。我们使用给定用户名的oauth2/token端点(请参见:^{})获取这些值。这需要一次性使用用户密码。随后的令牌存储在一个小型的sqlite数据库(netatmo.db)中。

在正常的用例中,我们想要检索所有的数据。为此,我们使用命令行参数--all。这将检索所有家庭ID和相关的房间ID(请参见:^{}^{}),并收集数据。因为我们不想每次都获取新数据,所以所有的导入记录(usernamehome_idroom_idstart_tsend_tscount)都被存储。

要将数据存储在infloxdb中,必须对数据进行一些小的更改。我们将epoch时间戳解析为dt.isoformat并解压温度。通过使用提供的infloxdb serieshelper,我们确保一次只发送512条记录的包。默认情况下包括以下标记:userhome_namehome_idroom_nameroom_id

因为我们中的一些人喜欢在infloxdb数据库度量中添加额外的标记,所以这个功能是用--custom-tags参数添加的。只需添加空格分隔的tag:value(请参见^{})。

如果你想玩,添加了--interactive参数。这可以确保所有cli参数都被解析,但实际上没有运行任何参数。像这样使用:pipenv run python -it app {username} {args} --interactive。你也可以用--dry进行一次试运行。这确保不会在本地或infloxdb实例中存储任何内容。

安装

使用pipenv安装,运行pipenv install

确保复制.env.tpl->;.env,并添加适当的值。

cli

使用pipenv run app {netatmo username} {--all or --home ...} {optional arguments}

运行应用程序

要了解可用的房屋和恒温器,请运行pipenv run app {netatmo username} --get-home

usage: app [-h] [--home [home_id [['room_id'] ...]]]
           [--custom-tags [tag:value [tag:value ...]]] [--get-home] [--all]
           [--dry] [--clear-db] [--interactive]
           user

Gather thermostat data from Netatmo

positional arguments:
  user                  User to parse

optional arguments:
  -h, --help            show this help message and exit
  --home [home_id [['room_id'] ...]]
                        Homes and rooms to parse. Use format --home {home_id_1} {room_id_1} {room_id2} ... --home {home_id_2} ...
  --custom-tags [tag:value [tag:value ...]]
                        Provide custom tags for InfluxDB. Format: --custom-tags tag:value tag:value
  --get-home            Get home and room information
  --all                 Parse all homes and rooms
  --dry                 Do a dry-run (don't store in InfluxDB)
  --clear-db            Wipes database from users and import history
  --interactive         Allows interactive use (ignores all other args)

与Docker一起使用

因为我在Docker中运行所有的内部工具,这里有一个关于如何启动和运行的简要描述。

打造Docker形象

docker build -t netatmo2influxdb .

与docker crontab一起使用

使用Docker Crontab我们可以每30分钟启动一次容器,并在获取完数据后关闭它。

使用并调整crontab的以下config.json文件:

[{"schedule":"@every 30m","image":"netatmo2influxdb","dockerargs":"-d \    --env-file /location/of/.env \    -v /location/of/netatmo.db:/netatmo2influxdb/netatmo.db","command":"python app [USERNAME] --all & shutdown -h now"}]

如果尚未运行crontab,请使用以下命令运行容器:

docker run -d \
    -v /var/run/docker.sock:/var/run/docker.sock:ro \
    -v ./env:/opt/env:ro \
    -v /path/to/config/dir:/opt/crontab:rw \
    -v /path/to/logs:/var/log/crontab:rw \
    willfarrell/crontab:latest

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
JPA中的java按对象属性查找   java SetOnKeyListener不使用gridview   java“无法构建实体管理器工厂”在运行用Maven编译的jar文件时出现Hibernate异常   java缓存webclient创建是个好主意吗   java如何显示回文?   使用Java写入txt文件时是否有行限制?   Java的重写无法正确重写函数   使用Java用uu RequestVerificationToken填写HTML表单   java Bukkit插件:如何使用命令停止计时器   processbuilder正在尝试运行。使用java在另一个目录中创建bat文件   java Android编程发送数据   java从文本文件中读取每行不同数据类型   函数java中是否有“dofor”循环?   在选择框中列出所有可用系统字体的java   JMS侦听器中异常时java JMS消息的重新传递   Java通用比较器   java简单DAO使用Hibernate和Spring框架,不起作用:无法找到XML架构命名空间的Spring NamespaceHandler   在Java中向抽象基类添加成员对部署的影响   gwt如何在Java中比较两个相同对象的数据