发送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第三方库


热门话题
在Windows 7 64位上运行Jive Dev Enrivoment的java   Java/C/C++/C#/PHP到Pascal的转换器?   java将字符串列表转换为单个对象   java SimpleAdapter,spinner中的文本和图像   java当客户端返回时,有状态会话bean如何恢复状态?   JavaWebLogic。jdbc。包装纸。无法将数组\u oracle\u sql\u数组强制转换为oracle。sql。大堆   java MySQL/Hibernate检索列映射为LocalTime的错误数据   java如何检测页面中是否包含句子(模糊)?   java如何在springboot框架中验证wsdl   JTextPane中的java双列表项插入   java根据窗口大小调整JScrollPane的大小   sql如何在java中映射VARCHAR2(5)的类型表?   用于生成Cron表达式的java类型转换   如何将基于spring注释的Hibernate代码迁移到JavaEE   java对象作为参数?   JavaSeleniumWebDriver:在许多输入中设置值的更快方法