
使用 Home Assistant 监控植物的健康状况
在本章中,我们将学习如何以简单而廉价的方式控制植物的健康状况. 我们在哪里可以知道它的湿度等参数, 温度, 光量, 或肥料等.
不错, 我想你们几乎所有人都曾在某个时候听说过这些传感器, 我认为有很多品牌,它们通常最终是一回事, 我知道它是小米 Mi Plant, 尽管您可以使用任何名称找到它,例如 Flower Care… 在 邦古德 他们通常会打折,大约 10 欧元即可获得.
通常的用途是使用值班制造商的应用程序,该应用程序每次用您的手机看到数据时都会通过蓝牙收集数据. 在这种情况下,通过拥有没有蓝牙的 Home Assistant, 因为在我的情况下,它像虚拟机一样运行,因为很难与传感器通信. 因此,通过在房子周围散布几个 Raspberry Pi, 在最靠近相关植物的每个 Raspberry Pi 上, 这将是与传感器连接的那个, 通过蓝牙收集数据, 并将它们存储在我从 MySQL/MariaDB 中收集的数据库中; 如果您想跳过数据库,也可以通过 MQTT 发送数据, 但我是遗产, 在传统 🙂 BD 中存储东西这有点取决于你的想法,我相信这篇文章会帮助你.
sudo did 无用工具 lescan LE 扫描 ... 0自:4D:49:八:19:二十 (未知) 0自:4D:49:八:19:二十 (未知) 54:5F:答 0:C4 系列:答 5:二十 (未知) 0自:4D:49:八:19:二十 (未知) C4 系列:7C:8D:6B:25:二十 (未知) C4 系列:7C:8D:6B:25:XX 花卉护理 0A:4D:49:八:19:二十 (未知) 54:5F:答 0:C4 系列:答 5:二十 (未知) ...
现在,我们将在 Raspberry Pi 上安装 书店 小米的 Python 小米植物传感器, 当您使用它时,我们需要的 MySQL 客户端:
sudo PiP3 安装 Miflora sudo PiP3 安装 MySQLCLIENT
现在就是这样, 剩下的就是下载此脚本, 我不记得我从哪里得到永远感谢他的. 如果你仔细观察这条线 47 我添加了几行代码,以便它收集的数据存储在该 MySQL 服务器上, 输入您的详细信息, 以及工厂的名称.
#!/usr/bin/env python3 """演示如何使用 miflora 库的演示文件。""" import argparse import re import logging import sys import MySQLdb from btlewrap import available_backends, Bluepy后端, Gatttool后端, PygattBackend 从 miflora.miflora_poller 导入 MiFloraPoller, \ MI_CONDUCTIVITY, MI_MOISTURE, MI_LIGHT, MI_TEMPERATURE, 来自 Miflora Import miflora_scanner Def valid_miflora_mac 的 MI_BATTERY(苹果电脑, pat=re.compile(r"80:EA (英语):交流:[0-9F]{2}:[0-9F]{2}:[0-9F]{2}")): """检查有效的 mac 地址。""" 如果不是 pat.match(mac.upper 的()): raise argparse 的 Override 调用。ArgumentTypeError('The MAC address "{}" seems to be in the wrong format'.format(苹果电脑)) 返回 mac def poll(参数): """轮询来自传感器的数据。""" 后端 = _get_backend(参数) 轮询器 = MiFloraPoller(args.mac, 后端) #打印("从 Mi Flora 获取数据") #打印("固件: {}".格式(poller.firmware_version())) 打印("名字: {}".格式(poller.name())) 打印("温度: {}".格式(poller.parameter_value(MI_TEMPERATURE))) 打印("湿气: {}".格式(poller.parameter_value(MI_MOISTURE))) 打印("光: {}".格式(poller.parameter_value(MI_LIGHT))) 打印("传导率: {}".格式(poller.parameter_value(MI_CONDUCTIVITY))) 打印("电池: {}".格式(poller.parameter_value(MI_BATTERY))) 诺姆布雷 = (poller.name()) 温度 = (poller.parameter_value(MI_TEMPERATURE)) 胡梅达 = (poller.parameter_value(MI_MOISTURE)) 卢兹 = (poller.parameter_value(MI_LIGHT)) conductividad = (poller.parameter_value(MI_CONDUCTIVITY)) 巴特里亚 = (poller.parameter_value(MI_BATTERY)) 打印 (名字) 打印 (温度) 打印 (湿度) 打印 (光) 打印 (康健达) 打印 (电池) 诺姆布雷 = "NOMBRE_DE_LA_PLANTA" db = MySQLdb.connect("DIRECCION_IP_SERVIDOR_MYSQL","USUARIO_BD","CONTRASEÑA_BD","NOMBRE_BD") 游标 = db.cursor() cursor.execute 命令("""插入植物 (名字,温度,湿度,光,康健达,电池) 值 (%s,%s,%s,%s,%s,%s) """,(名字,温度,湿度,光,康健达,电池)) db.commit 文件() def scan(参数): """扫描传感器。""" 后端 = _get_backend(参数) 打印('Scanning for 10 seconds...') 设备 = miflora_scanner.scan(后端, 10) 打印('Found {} 设备:'.format(莱恩(设备))) 对于设备中的设备: 打印(' {}'.format(装置)) 防守_get_backend(参数): """从命令行参数中提取 backend 类。""" if args.backend == 'gatttool': backend = GatttoolBackend elif args.backend == 'bluepy': backend = BluepyBackend elif args.backend == 'pygatt': backend = PygattBackend 否则: raise 异常('unknown backend: {}'.format(args.backend)) 返回后端防御list_backends(_): """列出所有可用的后端。""" 后端 = [available_backends 中 b 的 b.__name__()] 打印('\n'.join(后端)) 防守历史(参数): """从传感器读取历史记录。""" 后端 = _get_backend(参数) 打印('Getting history from sensor...') 轮询器 = MiFloraPoller(args.mac, 后端) history_list = poller.fetch_history() 打印('History returned {} entries.'.format(莱恩(history_list))) 用于 history_list: 打印('History from {}'.format(entry.wall_time)) 打印(" 温度: {}".格式(entry.temperature (入口温度))) 打印(" 湿气: {}".格式(入口.moisture)) 打印(" 光: {}".格式(entry.light (入口.轻型))) 打印(" 传导率: {}".格式(入口.conductivity)) 防守clear_history(参数): """清除传感器历史记录。""" 后端 = _get_backend(参数) 打印('Deleting sensor history data...') 轮询器 = MiFloraPoller(args.mac, 后端) poller.clear_history() 防守主(): """主要功能. 主要解析命令行参数. """ parser = argparse 的 Parse 中。ArgumentParser 解析器() parser.add_argument('--backend', 选择=['gatttool', 'bluepy', 'pygatt'], default='gatttool') parser.add_argument('-v', '--verbose', action='store_const', const=真) 子解析器 = parser.add_subparsers(help='sub-command help', ) parser_poll = subparsers.add_parser('poll', help='poll data from a sensor') parser_poll.add_argument('mac', 类型 = valid_miflora_mac) parser_poll.set_defaults(func=轮询) parser_scan = subparsers.add_parser('scan', help='scan for devices') parser_scan.set_defaults(func=扫描) parser_scan = subparsers.add_parser('backends', help='list the available backends') parser_scan.set_defaults(func=list_backends) parser_history = subparsers.add_parser('history', help='get device history') parser_history.add_argument('mac', 类型 = valid_miflora_mac) parser_history.set_defaults(func=历史) parser_history = subparsers.add_parser('clear-history', help='clear device history') parser_history.add_argument('mac', 类型 = valid_miflora_mac) parser_history.set_defaults(func=clear_history) args = parser.parse_args() 如果 args.verbose: logging.basicConfig(level=logging 的调试) 如果不是 hasattr(参数, "函数"): parser.print_help() sys.exit 的(0) args.func(参数) if __name__ == '__main__': 主要()
Si queréis, os dejo el código que necesitaréis en MySQL para crear esta tabla, 你终于结束了,地震使者, 具有 7 领域, Donde se almacena el nombre de la planta, 温度, 拉胡梅达, La luz en luxes, La conductividad, Lo que le queda de batería y la fecha de cuando hizo el chequeo.
创建表 'plantas' ( 'name' 字符(20) NULL COLLATE 'utf8mb4_general_ci', 'temperature' 浮点型 NULL, 'moisture' FLOAT 空, 'light' 浮点型 NULL, 'conductivity' FLOAT NULL, 'battery' 浮点型 NULL, 'date' 时间戳 NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) COLLATE='utf8mb4_general_ci' ENGINE=InnoDB ROW_FORMAT=COMPACT ;
总, 我们要做的是在 Raspberry Pi 上编程,以使用计划任务运行此脚本, 例如,它每 1 现在对我来说已经不重要了, 我们使用 'crontab -e' 添加 cron, 最后是传感器的蓝牙 MAC 地址:
0 * * * * python3 /home/pi/miflora_jardin.py -v 轮询 C4:7C:8D:6B:1和:二十 0 * * * * python3 /home/pi/miflora_portulaca.py -v 轮询 80:EA (英语):交流:88:E4 系列:二十
现在我们需要使用 Home Assistant 收集这些数据, 如何? 很简单, 使用 MySQL 查询! 因此,在我们的 configuration.yaml 中,我们可以为每个楼层添加以下查询:
传感器: ... - 平台: SQL db_url: MySQL 的://USUARIO_BD:CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD 查询: - 名字: "西克拉门 - 温度" 查询: "SELECT temperatura FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;" 列: 'temperatura' unit_of_measurement: 'ºC' - 平台: SQL db_url: MySQL 的://USUARIO_BD:CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD 查询: - 名字: "西克拉门 - 胡梅达" 查询: "SELECT humedad FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;" 列: 'humedad' unit_of_measurement: '%' - 平台: SQL db_url: MySQL 的://USUARIO_BD:CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD 查询: - 名字: "西克拉门 - 卢斯" 查询: "SELECT luz FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;" 列: 'luz' unit_of_measurement: 'lux' - 平台: SQL db_url: MySQL 的://USUARIO_BD:CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD 查询: - 名字: "西克拉门 - 康健达" 查询: "SELECT conductividad FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;" 列: 'conductividad' unit_of_measurement: 'Ω' - 平台: SQL db_url: MySQL 的://USUARIO_BD:CONTRASEÑA_BD@DIRECCION_IP_SERVIDOR_MYSQL/NOMBRE_DE_BD 查询: - 名字: "西克拉门 - 电池" 查询: "SELECT bateria FROM plantas WHERE nombre = 'Ciclamen' ORDER BY fecha DESC LIMIT 1;" 列: 'bateria' unit_of_measurement: '%' ...
现在是时候添加 Plant 组件来集成我们正在收集的这些值了, 并指示它们对应的内容, 因此,我们将在 configuration.yaml 中添加类似以下内容的内容:
植物: # 仙客来仙客来: 传感器: 湿气: sensor.ciclamen_humedad 电池: sensor.ciclamen_bateria温度: sensor.ciclamen_temperatura 电导率: sensor.ciclamen_conductividad亮度: sensor.ciclamen_luz min_moisture: 15 max_moisture: 75 min_battery: 10 min_conductivity: 250 max_conductivity: 2000 min_temperature: 1 max_temperature: 35 min_brightness: 2000 max_brightness: 40000 check_days: 3
不错, 哪些值与我们工厂的值相对应?? 我在这里离开你 Google 电子表格 您可以在此处获取有关植物的信息, 如果不是,您可以通过在 San Google 上搜索一下来指示它们.
照常, 点按配置文件后, 我们重新启动 Home Assistant,从 Lovelace UI 中,我们可以添加带有植物或花朵的卡片, 或花园或树木或任何我们想要控制的事物. 我们选择一张“工厂状态”卡’ ,我们表示植物的实体,并且! 已完成的工作. 我们现在将能够随时了解我们工厂的状态.
现在我们锦上添花, 当发生提醒我们的事情时, 例如, 如果湿度较低, 嗯,那是因为植物正在干涸, 有什么比通过我们的家用扬声器发送 Telegram 或警报更好的呢.
照常, 感谢你,如果你坚持到最后,希望能够提供帮助, 最重要的是感谢您在社交网络上的分享和那些点赞!