ホームアシスタントによる植物の健康状態の監視

この章では、植物の健康を簡単かつ安価に制御する方法を学びます. 湿度などのパラメータを知ることができる場所, 温度, 光の量, またはとりわけ肥料.

悪くありません, ほとんどの人がこれらのセンサーをどこかで聞いたことがあると思います, 多くのブランドがあり、それらは通常、最終的には同じものだと思います, 私はそれをXiaomiMiプラントとして知っています, フラワーケアなど、どんな名前でも見つけることができますが… で バングッド 彼らは通常割引を行い、約10ユーロでそれを手に入れることができます.

通常の使用は、携帯電話で表示されるたびにBluetoothでデータを収集する勤務中のメーカーのアプリを使用することです. この場合、Bluetoothを持っていないホームアシスタントを持つことによって, 私の場合、センサーと通信するのが難しいため、仮想マシンのように動作します. だから、家の周りにいくつかのラズベリーパイスを散らばらせておくことによって, 問題の植物に最も近い各Raspberry Piで, それがセンサーに接続するものになります, Bluetooth経由でデータを収集する, そして、MySQL / MariaDBから転がっているデータベースにそれらを保存します; また、データベースをスキップしたい場合は、MQTTでデータを送信できるのも事実です, しかし、私は遺産です, 従来の🙂 BDに物を保存するのそれはあなたが持っているアイデアに少し依存します、私はこの投稿があなたを助けると確信しています.

sudoは無駄なツールlescan LEスキャンをやった ...
0宛先:4D:49:文学士:19:XXさん (不明)
0宛先:4D:49:文学士:19:XXさん (不明)
54:5F:A0:C4の:A5:XXさん (不明)
0宛先:4D:49:文学士:19:XXさん (不明)
C4の:7C:8D:6B:25:XXさん (不明)
C4の:7C:8D:6B:25:XX フラワーケア 0A:4D:49:文学士:19:XXさん (不明)
54:5F:A0:C4の:A5:XXさん (不明)
...

次に、そのRaspberry Piにインストールします 書店 XiaomiのPython用Miプラントセンサー, そして、あなたがそれにいる間、私たちが必要とするMySQLクライアント:

sudo piP3 miflora sudo PiP3をインストールする MySQLクライアントをインストールする

そして今、それはそれです, あとは、このスクリプトをダウンロードするだけです, 彼に永遠に感謝するためにどこからそれを手に入れたのか覚えていません. 線路をよく見ると 47 収集するデータがそのMySQLサーバーに保存されるように、数行を追加しました, 詳細を入力してください, 植物の名前だけでなく.

#!/usr/bin/env python3
"""mifloraライブラリの使用方法を示すデモファイル。"""

import argparse import re logging import sys import MySQLdb from btlewrap import the available_backends, Bluepyバックエンド, Gatttoolバックエンド, PygattBackend から miflora.miflora_poller import MiFloraPoller, \
    MI_CONDUCTIVITY, MI_MOISTURE, MI_LIGHT, MI_TEMPERATURE, MI_BATTERY から miflora import miflora_scanner def valid_miflora_mac(マック, pat=re.compile(r"80:EAの:交流:[0-9A-F(エー・エフ)]{2}:[0-9A-F(エー・エフ)]{2}:[0-9A-F(エー・エフ)]{2}")):
    """有効なMACアドレスを確認します。"""
    pat.matchでない場合(マックアッパー()):
        argparse を raise します。ArgumentTypeError (引数タイプエラー)('The MAC address "{}" seems to be in the wrong format'.format(マック))
    Mac Def Poll を返す(引数):
    """センサーからデータをポーリングします。"""
    バックエンド = _get_backend(引数)
    poller = MiFloraPoller(args.macの, バックエンド)
    #プリント("Mi Floraからデータを取得する")
    #プリント("FWの: {}".形式(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)))
    nombre = (poller.name())
    temperatura = (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 = "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.コミット()

DEFスキャン(引数):
    """センサーをスキャンします。"""
    バックエンド = _get_backend(引数)
    プリント('Scanning for 10 seconds...')
    デバイス = miflora_scanner.scan(バックエンド, 10)
    プリント('Found {} デバイス:'.format(レン(デバイス)))
    デバイス内のデバイス用:
        プリント('  {}'.format(デバイス))

防御力 _get_backend(引数):
    """コマンドライン引数からバックエンドクラスを抽出します。"""
    if args.backend == 'gatttool':
        backend = GatttoolBackend
    elif args.backend == 'bluepy':
        backend = BluepyBackend
    elif args.backend == 'pygatt':
        バックエンド = PygattBackend else:
        例外を発生させる('unknown backend: {}'.format(args.バックエンド))
    リターンバックエンドの防御list_backends(_):
    """利用可能なすべてのバックエンドを一覧表示します。"""
    バックエンド = [available_backends年のBのb.__name__()]
    プリント('\n'.join(バックエンド))


DEFの歴史(引数):
    """センサーから履歴を読み取ります。"""
    バックエンド = _get_backend(引数)
    プリント('Getting history from sensor...')
    poller = MiFloraPoller(args.macの, バックエンド)
    history_list = poller.fetch_history()
    プリント('History returned {} entries.'.format(レン(history_list)))
    history_listへのエントリー:
        プリント('History from {}'.format(entry.wall_time))
        プリント("    温度: {}".形式(entry.temperature(温度)))
        プリント("    湿気: {}".形式(エントリー.モイスチャー))
        プリント("    光: {}".形式(エントリ.ライト))
        プリント("    伝導性: {}".形式(entry.conductivity))


防御力 clear_history(引数):
    """センサーの履歴をクリアします。"""
    バックエンド = _get_backend(引数)
    プリント('Deleting sensor history data...')
    poller = MiFloraPoller(args.macの, バックエンド)
    poller.clear_history()


防御メイン():
    """主な機能.

    主にコマンドライン引数を解析します.
    """
    parser = argparse です。引数パーサー()
    parser.add_argument('--backend', choices=['gatttool', 'bluepy', 'pygatt'], default='gatttool')
    parser.add_argument('-v', '--verbose', action='store_const', const=True です)
    サブパーサー = 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)

    引数 = parser.parse_args()

    args.verbose の場合:
        logging.basicConfigの(level=loggingです。デバッグ)

    hasattrでない場合(引数, "funcの"):
        parser.print_help()
        sys.exit(0)

    args.func(引数)

if __name__ == '__main__':
    メイン()

あなたが望むなら, このテーブルを作成するためにMySQLで必要なコードを残します, 結局のところ、これは非常に簡単です, は 7 田畑, プラント名が格納されている場所, 温度, 湿度, 贅沢な軽さ, 伝導性, バッテリーの残骸と確認した日付.

テーブル 'plants' を作成する (
    'name' CHAR (名前)(20) NULL COLLATE 'utf8mb4_general_ci',
    'temperature' FLOAT NULL,
    'moisture' フロート NULL,
    'light' FLOAT NULL,
    'conductivity' FLOAT NULL,
    'battery' フロート NULL,
    'fecha' タイムスタンプが NULL でない 更新時のデフォルトのCURRENT_TIMESTAMP CURRENT_TIMESTAMP
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
ROW_FORMAT=COMPACT
;

トータル, 私たちが行うことは、Raspberry Piでプログラムして、スケジュールされたタスクでこのスクリプトを実行することです, たとえば、データを収集するたびに 1 今では私には関係ありません, 'crontab -e' を使用して cron を追加します, 最後にセンサーのBluetoothMACアドレス:

0 * * * * python3 /home/pi/miflora_jardin.py -v ポーリング C4:7C:8D:6B:1そして:XXさん
0 * * * * python3 /home/pi/miflora_portulaca.py -v poll 80:EAの:交流:88:E4:XXさん

次に、ホームアシスタントでこのデータを収集する必要があります, どう? とてもシンプル, 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: '%'
...

そして今、私たちが収集しているこれらの値を統合するために、プラントコンポーネントを追加する時が来ました, そして、それらが何に対応するかを示します, したがって、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で少し検索して示すことができます.

いつも通り, 設定ファイルをタップした後, ホームアシスタントを再起動し、LovelaceUIから植物や花のカードを追加できます, または庭や木、または私たちが制御したいものは何でも. 「プラントステータス」カードを選択します’ そして、植物の実体を示し、! 完了した作業. これで、プラントの状況をいつでも知ることができます.

そして今、ケーキの上のアイシングがあります, 私たちに警告する何かが起こったとき, 例えば, 湿度が低い場合, まあ、それは植物が枯渇しているからです, テレグラムやアラートをホームスピーカーで送って教えてくれるのが一番です.

いつも通り, あなたが最後までそれを作り、助けることができたことを願っています, そして何よりも、ソーシャルネットワークやそれらのいいねで共有してくれてありがとう!

おすすめの投稿

著者

nheobug@bujarra.com
Autor del blog Bujarra.com Cualquier necesidad que tengas, 私に連絡することを躊躇しないでください, できる限りお手伝いします, シェアリングは生きていること ;) . ドキュメントを楽しむ!!!