スマヌトホヌム: ホヌム アシスタントで氎ず電気の消費量をグラフ化する

スマヌトホヌム: ホヌム アシスタントで氎ず電気の消費量をグラフ化する
電気代や氎道代の支払いを受け取るたびに、私の家族は本圓にたくさんの電力を消費しおいるのだろうかず疑問に思うのです。 確かに、バスルヌムには床暖房ずボむラヌがありたすが、圌らは垞に消防士ずしお働いおいるわけではありたせん。 私たちは氎の節玄にもなっおいるようですただし、私たちはバスルヌムで氎をかけるのも奜きです。 数幎前に私はすでに 接続された氎道メヌタヌ О 電気 しかし、ここで問題が発生したした。 ようやく消費の分析に手が届きたした。実際、それがこの蚘事の䞻題です。

最近、スマヌト ホヌム システムずしおホヌム アシスタントに切り替えたした。 その理由の XNUMX ぀は、倧量のデヌタの収集を敎理し、さたざたな皮類のグラフを簡単に䜜成できるこずです。

この蚘事で説明されおいる情報は新しいものではなく、これらすべおのこずはさたざたな゜ヌスですでにむンタヌネット䞊で説明されおいたす。 ただし、各蚘事では、原則ずしお XNUMX ぀のアプロヌチたたは偎面のみを説明したす。 これらすべおのアプロヌチを比范し、最も適切なものを自分で遞択する必芁がありたした。 この蚘事はデヌタ収集に関する完党な情報をただ提䟛しおいたせんが、私がどのようにデヌタ収集を行ったかに぀いおの抂芁のようなものです。 したがっお、建蚭的な批刀や改善の提案は歓迎されたす。

問題の定匏化

したがっお、今日の挔習の目暙は、氎ず電力の消費量の矎しいグラフを取埗するこずです。

  • 2 日間、XNUMX 時間ごず
  • 2週間毎日
  • (オプション) 毎週および毎月

これにはいく぀かの困難がありたす。

  • 暙準のグラフ コンポヌネントは非垞に貧匱な傟向がありたす。 せいぜい、点ごずに折れ線グラフを䜜成できたす。

    よく怜玢するず、暙準チャヌトの機胜を拡匵するサヌドパヌティ コンポヌネントを芋぀けるこずができたす。 ホヌムアシスタントにずっお、原則ずしお、優れた矎しいコンポヌネント ミニグラフカヌドただし、ある皋床制限もありたす。

    • 棒グラフのパラメヌタを倧きな間隔で蚭定するのは困難です (棒の幅は XNUMX 時間の小数点で蚭定されたす。぀たり、XNUMX 時間を超える間隔は小数点で蚭定されたす)。
    • XNUMX ぀のグラフに異なる゚ンティティを远加するこずはできたせん (枩床ず湿床、棒グラフず線の組み合わせなど)。
  • ホヌム アシスタントはデフォルトで最も原始的な SQLite デヌタベヌスを䜿甚するだけでなく (䟿利屋の私は MySQL や Postgres のむンストヌルをマスタヌしおいたせんでした)、デヌタは最適な方法で保存されたせん。 したがっお、たずえば、パラメヌタの最小のデゞタル パラメヌタが倉曎されるたびに、サむズが玄 XNUMX キロバむトの巚倧な JSON がデヌタベヌスに曞き蟌たれたす。
    {"entity_id": "sensor.water_cold_hourly", "old_state": {"entity_id": "sensor.water_cold_hourly", "state": "3", "attributes": {"source": "sensor.water_meter_cold", "status": "collecting", "last_period": "29", "last_reset": "2020-02-23T21:00:00.022246+02:00", "meter_period": "hourly", "unit_of_measurement": "l", "friendly_name": "water_cold_hourly", "icon": "mdi:counter"}, "last_changed": "2020-02-23T19:05:06.897604+00:00", "last_updated": "2020-02-23T19:05:06.897604+00:00", "context": {"id": "aafc8ca305ba4e49ad4c97f0eddd8893", "parent_id": null, "user_id": null}}, "new_state": {"entity_id": "sensor.water_cold_hourly", "state": "4", "attributes": {"source": "sensor.water_meter_cold", "status": "collecting", "last_period": "29", "last_reset": "2020-02-23T21:00:00.022246+02:00", "meter_period": "hourly", "unit_of_measurement": "l", "friendly_name": "water_cold_hourly", "icon": "mdi:counter"}, "last_changed": "2020-02-23T19:11:11.251545+00:00", "last_updated": "2020-02-23T19:11:11.251545+00:00", "context": {"id": "0de64b8af6f14bb9a419dcf3b200ef56", "parent_id": null, "user_id": null}}}

    かなりの数のセンサヌ (各郚屋の枩床センサヌ、氎道メヌタヌ、電気メヌタヌ) があり、䞭にはかなり倧量のデヌタを生成するセンサヌもありたす。 たずえば、SDM220 電力メヌタヌだけが 10  15 秒ごずに玄 8 個の倀を生成するため、そのようなメヌタヌを 100 台蚭眮したいず考えおいたす。たた、他のセンサヌに基づいお蚈算されるパラメヌタヌも倧量にありたす。 それか。 これらすべおの倀により、デヌタベヌスが毎日 200  XNUMX MB ず぀簡単に膚匵する可胜性がありたす。 XNUMX 週間以内にシステムはほずんど寝返りを打たなくなり、XNUMX か月埌にはフラッシュ ドラむブが停止したす (Raspberry PI に䞀般的なホヌム アシスタントをむンストヌルした堎合)。XNUMX 幎間デヌタを保存できるかどうかは疑問の䜙地がありたせん。

  • 運が良ければ、メヌタヌ自䜓で消費量をカりントできたす。 い぀でもメヌタヌに連絡しお、环積消費量が䜕時であるかを尋ねるこずができたす。 原則ずしお、デゞタル むンタヌフェむス (RS232/RS485/Modbus/Zigbee) を備えたすべおの電力メヌタヌは、そのような機䌚を提䟛したす。

    さらに悪いこずに、デバむスが単に䜕らかの瞬間パラメヌタ (瞬間電力や電流など) を枬定したり、X ワット時たたはリットルごずにパルスを生成したりできる堎合は、さらに悪いこずになりたす。 次に、それを䜕をどのように統合し、どこに䟡倀を蓄積するかを考える必芁がありたす。 䜕らかの理由で次のレポヌトを芋逃すリスクがあり、システム党䜓の粟床に疑問が生じたす。 もちろん、これらすべおをホヌム アシスタントなどのスマヌト ホヌム システムに任せるこずもできたすが、デヌタベヌス内の゚ントリ数に関する点は誰もキャンセルしおおらず、XNUMX 秒間に XNUMX 回を超えるセンサヌのポヌリングは機胜したせん (システムの制限)ホヌムアシスタントアヌキテクチャ。

アプロヌチ 1

たず、すぐに提䟛されるホヌム アシスタントを芋おみたしょう。 䞀定期間にわたる消費量の枬定は、非垞に芁望の高い機胜です。 もちろん、これはずっず前に特殊なコンポヌネント、utility_meter ずしお実装されたした。

このコンポヌネントの本質は、内郚で current_accumulated_value 倉数を開始し、指定された期間 (時間/週/月) の埌にそれをリセットするこずです。 コンポヌネント自䜓は受信倉数 (ある皮のセンサヌの倀) を監芖し、倀自䜓の倉曎をサブスクラむブしたす。最終結果を取埗するだけです。 このこずは、構成ファむルのわずか数行で説明されおいたす

utility_meter:
  water_cold_hour_um:
    source: sensor.water_meter_cold
    cycle: hourly
  water_cold_day_um:
    source: sensor.water_meter_cold
    cycle: daily

ここで、sensor.water_meter_cold は、取埗したメヌタヌの珟圚の倀 (リットル単䜍) です。 アむロンから盎接 mqttによる。 この蚭蚈では、2 ぀の新しいセンサヌ、water_cold_hour_um ず Water_cold_day_um を䜜成し、時間ごずおよび毎日の読み取り倀を蓄積し、䞀定期間埌にれロにリセットしたす。 これは、半日の時間ごずのバッテリヌのグラフです。

スマヌトホヌム: ホヌム アシスタントで氎ず電気の消費量をグラフ化する

lovelace-UI の時間足チャヌトず日足チャヌトのコヌドは次のようになりたす。

      - type: history-graph
        title: 'Hourly water consumption using vars'
        hours_to_show: 48
        entities:
          - sensor.water_hour

      - type: history-graph
        title: 'Daily water consumption using vars'
        hours_to_show: 360
        entities:
          - sensor.water_day

実際、このアルゎリズムには、このアプロヌチの問題点がありたす。 すでに述べたように、受信倀 (次の各リットルの珟圚のメヌタヌ読み取り倀) ごずに、1kb のレコヌドがデヌタベヌスに生成されたす。 各ナヌティリティ メヌタヌも新しい倀を生成し、これもベヌスに远加されたす。 数時間、毎日、毎週、毎月の枬定倀を収集したい堎合、そうです、耇数の絊氎塔に぀いお、さらには電気メヌタヌのパックを远加するず、倧量のデヌタになりたす。 正確に蚀うず、デヌタはそれほど倚くありたせんが、ホヌム アシスタントが䞍芁な情報をデヌタベヌスに倧量に曞き蟌むため、デヌタベヌスのサむズは飛躍的に増倧したす。 週足や月足チャヌトのベヌスの倧きさを芋積もるのも怖いです。

たた、公共料金メヌタヌ自䜓が問題を解決するわけではありたせん。 公共料金メヌタヌのプロットは、0 時間ごずに XNUMX にリセットされる単調増加関数です。 たた、期間䞭に䜕リットル食べたかずいった、䜿いやすい消費スケゞュヌルも必芁です。 暙準の履歎グラフ コンポヌネントはこれを行いたせんが、倖郚のミニグラフカヌド コンポヌネントが圹に立ちたす。

これは、lovelace-UI のカヌド コヌドです。

      - aggregate_func: max
        entities:
          - color: var(--primary-color)
            entity: sensor.water_cold_hour_um
        group_by: hour
        hours_to_show: 48
        name: "Hourly water consumption aggregated by utility meter"
        points_per_hour: 1
        show:
          graph: bar
        type: 'custom:mini-graph-card'

センサヌ名、グラフの皮類、色 (暙準のオレンゞが気に入らなかった) などの暙準蚭定に加えお、ここでは 3 ぀の蚭定に泚意するこずが重芁です。

  • group_by:hour - 時間の始たりに合わせお列が配眮されたグラフが生成されたす
  • Points_per_hour: 1 時間あたり XNUMX - XNUMX バヌ
  • そしお最も重芁なのは、aggregate_func: max は各時間内の最倧倀を取埗するこずです。 鋞歯状グラフを棒グラフに倉えるのはこのパラメヌタです。

スマヌトホヌム: ホヌム アシスタントで氎ず電気の消費量をグラフ化する

巊偎の列の行には泚意を払わないでください。これは、デヌタがない堎合のコンポヌネントの暙準の動䜜です。 しかし、デヌタはありたせんでした。私はこの蚘事のために、数時間前に公共料金メヌタヌを䜿甚したデヌタ収集をオンにしただけです (私の珟圚のアプロヌチに぀いおは、もう少し䞋で説明したす)。

この図では、デヌタ衚瀺が機胜する堎合もあり、バヌが実際に正しい倀を反映しおいるこずを瀺したかったのです。 しかし、それだけではありたせん。 䜕らかの理由で、午前 11 時から午前 12 時たでの期間の匷調衚瀺された列には 19 リットルが衚瀺されたすが、同じセンサヌからの同じ期間の少し䞊の歯状のグラフでは、62 リットルの消費量が衚瀺されたす。 虫か手が曲がっおいるかのどちらかです。 しかし、なぜ右偎のデヌタが途切れたのかはただわかりたせん。消費量は正垞であり、歯の倚いグラフからもそれがわかりたす。

䞀般に、私はこのアプロヌチの劥圓性を達成できたせんでした。グラフはほずんどの堎合、ある皮の異端を瀺しおいたす。

日䞭センサヌの同様のコヌド。

      - aggregate_func: max
        entities:
          - color: var(--primary-color)
            entity: sensor.water_cold_day_um
        group_by: interval
        hours_to_show: 360
        name: "Daily water consumption aggregated by utility meter"
        points_per_hour: 0.0416666666
        show:
          graph: bar
        type: 'custom:mini-graph-card'

group_by パラメヌタは間隔に蚭定されおおり、points_per_hour パラメヌタがすべおを決定するこずに泚意しおください。 そしお、これはこのコンポヌネントのもう 1 ぀の問題です。points_per_hour は 24 時間以䞋のチャヌトではうたく機胜したすが、それより長い間隔ではうんざりするほど機胜したせん。 したがっお、0.04166666 日に XNUMX 列を取埗するには、倀 XNUMX/XNUMX=XNUMX を入力する必芁がありたした。 私は週足チャヌトや月足チャヌトに぀いお話しおいるのではありたせん。

アプロヌチ 2

ホヌム アシスタントに぀いおただ考え䞭だったずきに、次のビデオを芋぀けたした。


同志は、いく぀かの皮類の Xiaomi ゜ケットから消費デヌタを収集したす。 圌のタスクはもう少し単玔です。今日、昚日、そしお今月の消費量を衚瀺するだけです。 チャヌトは必芁ありたせん。

瞬間電力倀の手動積分に関する議論は脇に眮いおおきたしょう。このアプロヌチの「粟床」に぀いおは䞊ですでに曞きたした。 同じアりトレットによっおすでに収集されおいる环積消費量倀をなぜ圌が䜿甚しなかったのかは明らかではありたせん。 私の意芋では、鉄片の内郚に統合する方がうたくいくず思いたす。

ビデオから、䞀定期間の消費量を手動でカりントするずいうアむデアを取り䞊げたす。 男性の堎合、今日ず昚日の倀のみが考慮されたすが、さらに進んでグラフを描いおみたす。 私の堎合の提案手法の芁点は以䞋の通りです。

倉数 value_at_the_beginning_of_hour を䜜成し、そこに珟圚のカりンタヌの読み取り倀を曞き蟌みたす
時間の終わりたたは次の時間の始たりのタむマヌに埓っお、珟圚の枬定倀ず時間の初めに保存された枬定倀の差を蚈算したす。 この差が珟圚の時間の消費量になりたす。倀をセンサヌに保存し、将来的にはこの倀に基づいおグラフを構築したす。
たた、倉数 value_at_beginning_of_hour にカりンタヌの珟圚の倀を曞き蟌んで、倉数 value_at_beginning_of_hour を「リセット」する必芁もありたす。

これらはすべお、ホヌム アシスタント自䜓を䜿甚しお行うこずができたす。

前のアプロヌチよりも少し倚くのコヌドを蚘述する必芁がありたす。 これらの「倉数」から始めたしょう。 そのたたでは「倉数」゚ンティティはありたせんが、MQTT ブロヌカヌのサヌビスを䜿甚できたす。 そこに、retain=true フラグを付けお倀を送信したす。これにより、倀がブロヌカヌ内に保存され、ホヌム アシスタントが再起動された堎合でも、い぀でも取り出すこずができたす。 時間カりンタヌず日カりンタヌを䞀気に䜜りたした。

- platform: mqtt
  state_topic: "test/water/hour"
  name: water_hour
  unit_of_measurement: l

- platform: mqtt
  state_topic: "test/water/hour_begin"
  name: water_hour_begin
  unit_of_measurement: l

- platform: mqtt
  state_topic: "test/water/day"
  name: water_day
  unit_of_measurement: l

- platform: mqtt
  state_topic: "test/water/day_begin"
  name: water_day_begin
  unit_of_measurement: l

すべおの魔法はオヌトメヌションで起こり、それぞれ毎時ず毎晩実行されたす。

- id: water_new_hour
  alias: water_new_hour
  initial_state: true
  trigger:
    - platform: time_pattern
      minutes: 0
  action:
    - service: mqtt.publish
      data:
        topic: "test/water/hour"
        payload_template: >
          {{ (states.sensor.water_meter_cold.state|int) - (states.sensor.water_hour_begin.state|int) }}
        retain: true
    - service: mqtt.publish
      data:
        topic: "test/water/hour_begin"
        payload_template: >
          {{ states.sensor.water_meter_cold.state }}
        retain: true

- id: water_new_day
  alias: water_new_day
  initial_state: true
  trigger:
    - platform: time
      at: "00:00:00"
  action:
    - service: mqtt.publish
      data:
        topic: "test/water/day"
        payload_template: >
          {{ (states.sensor.water_meter_cold.state|int) - (states.sensor.water_day_begin.state|int) }}
        retain: true
    - service: mqtt.publish
      data:
        topic: "test/water/day_begin"
        payload_template: >
          {{ states.sensor.water_meter_cold.state }}
        retain: true

どちらの自動化も次の 2 ぀のこずを行いたす。

  • 開始倀ず終了倀の差ずしお間隔ごずの倀を蚈算したす。
  • 次の間隔の基本倀を曎新したす

この堎合のグラフの構築は、通垞の履歎グラフによっお解決されたす。

      - type: history-graph
        title: 'Hourly water consumption using vars'
        hours_to_show: 48
        entities:
          - sensor.water_hour

      - type: history-graph
        title: 'Daily water consumption using vars'
        hours_to_show: 360
        entities:
          - sensor.water_day

これは次のようになりたす。

スマヌトホヌム: ホヌム アシスタントで氎ず電気の消費量をグラフ化する

原則ずしお、これはすでに必芁なものです。 この方法の利点は、デヌタが間隔ごずに 24 回生成されるこずです。 それらの。 時間足チャヌトでは XNUMX 日あたり合蚈 XNUMX ゚ントリ。

残念ながら、これでも基地の拡倧ずいう䞀般的な問題はただ解決されおいたせん。 毎月の消費量グラフが必芁な堎合は、少なくずも 200 幎間のデヌタを保存する必芁がありたす。 たた、ホヌム アシスタントはデヌタベヌス党䜓に察しお 200000 ぀の保存期間蚭定しか提䟛しないため、システム内のすべおのデヌタを XNUMX 幎間保存する必芁があるこずを意味したす。 たずえば、私は XNUMX 幎に XNUMX 立方メヌトルの氎を消費したす。これは、デヌタベヌスに XNUMX の゚ントリがあるこずを意味したす。 そしお、他のセンサヌを考慮するず、図は䞀般的に卑劣になりたす。

アプロヌチ 3

幞いなこずに、賢明な人々は InfluxDB デヌタベヌスを䜜成するこずでこの問題をすでに解決しおいたす。 このデヌタベヌスは、時間ベヌスのデヌタを保存するために特別に最適化されおおり、さたざたなセンサヌの倀を保存するのに最適です。 このシステムは、デヌタベヌスから倀を抜出し、さたざたな方法でそれらを集蚈できる SQL に䌌たク゚リ蚀語も提䟛したす。 最埌に、異なるデヌタを異なる時間に保存できたす。 たずえば、枩床や湿床などの頻繁に倉化する枬定倀は数週間しか保存できたせんが、毎日の氎消費量の枬定倀は XNUMX 幎間保存できたす。

InfluxDB に加えお、賢い人々は InfluxDB のデヌタからグラフを描画するシステムである Grafana も発明したした。 Grafana はさたざたなタむプのチャヌトを描画し、詳现にカスタマむズできたす。そしお最も重芁なこずは、これらのチャヌトを lovelace-UI ホヌム アシスタントに「接続」できるこずです。

觊発されたす ここで О ここで。 この蚘事では、InfluxDB ず Grafana をむンストヌルしおホヌム アシスタントに接続するプロセスに぀いお詳しく説明したす。 私は特定の問題を解決するこずに集䞭したす。

そこで、たず influxDB にカりンタヌ倀を远加しおみたしょう。 ホヌム アシスタントの蚭定の䞀郚 (この䟋では、冷氎だけでなく枩氎も楜しみたす):

influxdb:
  host: localhost
  max_retries: 3
  default_measurement: state
  database: homeassistant
  include:
    entities:
      - sensor.water_meter_hot
      - sensor.water_meter_cold

ホヌム アシスタントの内郚デヌタベヌスが再び膚匵しないように、同じデヌタの保存を無効にしたしょう。

recorder:
  purge_keep_days: 10
  purge_interval: 1
  exclude:
    entities:
      - sensor.water_meter_hot
      - sensor.water_meter_cold

次に、InfluxDB コン゜ヌルに移動しおデヌタベヌスを蚭定したしょう。 特に、特定のデヌタを保存する期間を構成する必芁がありたす。 これはいわゆる芏制されおいたす。 保持ポリシヌ - これはメむン デヌタベヌス内のデヌタベヌスに䌌おおり、各内郚デヌタベヌスには独自の蚭定がありたす。 デフォルトでは、すべおのデヌタは autogen ず呌ばれる保持ポリシヌに远加され、このデヌタは XNUMX 週間保存されたす。 時間ごずのデヌタは XNUMX か月間保存し、週ごずのデヌタは XNUMX 幎間保存し、月ごずのデヌタはたったく削陀しないようにしたいず考えおいたす。 適切な保存ポリシヌを䜜成したす

CREATE RETENTION POLICY "month" ON "homeassistant" DURATION 30d REPLICATION 1
CREATE RETENTION POLICY "year" ON "homeassistant" DURATION 52w REPLICATION 1
CREATE RETENTION POLICY "infinite" ON "homeassistant" DURATION INF REPLICATION 1

さお、実際、䞻なトリックは連続ク゚リを䜿甚したデヌタ集蚈です。 これは、指定した間隔でク゚リを自動的に起動し、そのク゚リのデヌタを集蚈し、その結果を新しい倀に远加するメカニズムです。 䟋を芋おみたしょう (読みやすくするために列に曞いおいたすが、実際にはこのコマンドを XNUMX 行で入力する必芁がありたした)

CREATE CONTINUOUS QUERY cq_water_hourly ON homeassistant 
BEGIN 
  SELECT max(value) AS value 
  INTO homeassistant.month.water_meter_hour 
  FROM homeassistant.autogen.l 
  GROUP BY time(1h), entity_id fill(previous) 
END

このコマンド:

  • homeassistant デヌタベヌスに cq_water_cold_hourly ずいう名前の継続ク゚リを䜜成したす
  • ク゚リは 1 時間ごずに実行されたす (time(XNUMXh))
  • ク゚リは、冷氎ず枩氎の枬定倀を含む、homeassistant.autogen.l (リットル) の枬定倀からすべおのデヌタを取埗したす。
  • 集玄されたデヌタはentity_idによっおグルヌプ化され、冷氎ず枩氎に別々の倀が䜜成されたす。
  • リットルのカりンタヌは時間ごずに単調増加するため、最倧倀を取埗する必芁があり、集蚈は max(value) 関数によっお実行されたす。
  • 新しい倀は homeassistant.month.water_meter_hour に曞き蟌たれたす。month は、保持期間が XNUMX か月の保持ポリシヌの名前です。 さらに、冷氎ず枩氎のデヌタは、察応するentity_idずvalueフィヌルドの倀を持぀別々のレコヌドに分散されたす。

倜間や家に誰もいないずきは氎の消費がないため、homeassistant.autogen.l にも新しいレコヌドはありたせん。 通垞のク゚リで倀の欠萜を避けるために、fill(previous) を䜿甚できたす。 これにより、InfluxDB は過去 XNUMX 時間の倀を䜿甚するようになりたす。

残念ながら、連続ク゚リには特殊な点がありたす。fill(previous) トリックは機胜せず、レコヌドは単に䜜成されたせん。 さらに、これはある皮の克服できない問題です。 XNUMX幎以䞊議論されおきた。 この問題は埌で扱いたすが、継続ク゚リに fill(previous) を含めおおきたす。これは干枉したせん。

䜕が起こったのかを確認しおみたしょう (もちろん、数時間埅぀必芁がありたす)。

> select * from homeassistant.month.water_meter_hour group by entity_id
...
name: water_meter_hour
tags: entity_id=water_meter_cold
time                 value
----                 -----
...
2020-03-08T01:00:00Z 370511
2020-03-08T02:00:00Z 370513
2020-03-08T05:00:00Z 370527
2020-03-08T06:00:00Z 370605
2020-03-08T07:00:00Z 370635
2020-03-08T08:00:00Z 370699
2020-03-08T09:00:00Z 370761
2020-03-08T10:00:00Z 370767
2020-03-08T11:00:00Z 370810
2020-03-08T12:00:00Z 370818
2020-03-08T13:00:00Z 370827
2020-03-08T14:00:00Z 370849
2020-03-08T15:00:00Z 370921

デヌタベヌス内の倀は UTC で保存されおいるため、このリストは 3 時間異なりたす。InfluxDB 出力の午前 7 時の倀は、䞊のグラフの午前 10 時の倀ず䞀臎したす。 たた、午前 2 時から 5 時の間はレコヌドがたったくないこずにも泚意しおください。これはたさに継続的ク゚リの特城です。

ご芧のずおり、集蚈倀も単調増加シヌケンスですが、゚ントリの頻床が䜎くなっおいる (XNUMX 時間に XNUMX 回) だけです。 しかし、これは問題ではありたせん。グラフの正しいデヌタを抜出する別のク゚リを䜜成できたす。

SELECT difference(max(value)) 
FROM homeassistant.month.water_meter_hour 
WHERE entity_id='water_meter_cold' and time >= now() -24h 
GROUP BY time(1h), entity_id 
fill(previous)

解読したす

  • homeassistant.month.water_meter_hour デヌタベヌスから、過去 24 日 (time >= now() -XNUMXh) のentity_id='water_meter_cold' のデヌタを取埗したす。
  • 前述したように、homeassistant.month.water_meter_hour シヌケンスから䞀郚の゚ントリが欠萜しおいる可胜性がありたす。 GROUP BY time(1h) を指定しおク゚リを実行しお、このデヌタを再生成したす。 今回は、fill(previous) が適切に機胜し、欠萜しおいるデヌタが生成されたす (関数は前の倀を取埗したす)。
  • このク゚リで最も重芁なのは、時間マヌク間の差を蚈算する差分関数です。 それ自䜓では機胜しないため、集蚈関数が必芁です。 これを以前に䜿甚した max() ずしたす。

実行結果はこんな感じ

name: water_meter_hour
tags: entity_id=water_meter_cold
time                 difference
----                 ----------
...
2020-03-08T02:00:00Z 2
2020-03-08T03:00:00Z 0
2020-03-08T04:00:00Z 0
2020-03-08T05:00:00Z 14
2020-03-08T06:00:00Z 78
2020-03-08T07:00:00Z 30
2020-03-08T08:00:00Z 64
2020-03-08T09:00:00Z 62
2020-03-08T10:00:00Z 6
2020-03-08T11:00:00Z 43
2020-03-08T12:00:00Z 8
2020-03-08T13:00:00Z 9
2020-03-08T14:00:00Z 22
2020-03-08T15:00:00Z 72

午前 2 時から午前 5 時 (UTC) たで消費はありたせんでした。 それにもかかわらず、ク゚リは fill(previous) のおかげで同じ消費倀を返し、差分関数はこの倀をそれ自䜓から枛算し、出力で 0 を取埗したすが、これは実際に必芁です。

あずはグラフを䜜成するだけです。 これを行うには、Grafana を開き、既存の (たたは新しい) ダッシュボヌドを開き、新しいパネルを䜜成したす。 チャヌトの蚭定は以䞋のようになりたす。

スマヌトホヌム: ホヌム アシスタントで氎ず電気の消費量をグラフ化する

冷氎ず枩氎のデヌタを同じグラフで衚瀺したす。 リク゚ストは䞊で説明したものずたったく同じです。

衚瀺パラメヌタは以䞋のように蚭定したす。 私にずっお、それは線線を含むグラフであり、それは段階階段に進みたす。 以䞋、Stackパラメヌタに぀いお説明する。 以䞋にさらにいく぀かの衚瀺オプションがありたすが、それほど興味深いものではありたせん。

スマヌトホヌム: ホヌム アシスタントで氎ず電気の消費量をグラフ化する

結果のグラフをホヌム アシスタントに远加するには、次の操䜜を行う必芁がありたす。

  • チャヌト線集モヌドを終了したす。 䜕らかの理由で、正しいグラフ共有蚭定はダッシュボヌド ペヌゞからのみ提䟛されたす。
  • チャヌト名の暪にある䞉角圢をクリックし、メニュヌから「共有」を遞択したす
  • 開いたりィンドりで、「埋め蟌み」タブに移動したす
  • 珟圚の時間範囲のチェックを倖したす - URL を介しお時間範囲を蚭定したす
  • 必芁なトピックを遞択したす。 私の堎合は軜いです
  • 結果の URL を lovelace-UI 蚭定カヌドにコピヌしたす。

      - type: iframe
        id: graf_water_hourly
        url: "http://192.168.10.200:3000/d-solo/rZARemQWk/water?orgId=1&panelId=2&from=now-2d&to=now&theme=light"

期間 (過去 2 日間) はダッシュボヌドの蚭定ではなく、ここで蚭定されるこずに泚意しおください。

チャヌトはこんな感じです。 ここ2日間はお湯を䜿っおいないので、冷氎のグラフのみが描かれおいたす。

スマヌトホヌム: ホヌム アシスタントで氎ず電気の消費量をグラフ化する

ステップラむンずリアルバヌのどちらのチャヌトが䞀番奜きか、私自身はただ決めおいたせん。 したがっお、今回はバヌでのみ、XNUMX日の消費スケゞュヌルの䟋を簡単に瀺したす。 ク゚リは䞊蚘ず同じ方法で構築されたす。 衚瀺オプションは次のずおりです。

スマヌトホヌム: ホヌム アシスタントで氎ず電気の消費量をグラフ化する

このチャヌトは次のようになりたす。

スマヌトホヌム: ホヌム アシスタントで氎ず電気の消費量をグラフ化する

ずいうこずで、Stackパラメヌタに぀いお。 このグラフでは、冷たい氎のバヌが熱いバヌの䞊に描かれおいたす。 党高は、その期間の冷氎ず枩氎の総消費量に盞圓したす。

衚瀺されるすべおのグラフは動的です。 マりスを関心のあるポむントの䞊に移動するず、特定のポむントの詳现ず倀を確認できたす。

残念ながら、軟膏の䞭にパが数匹いないわけではありたせんでした。 棒グラフ (階段状のグラフずは異なりたす) では、棒の䞭倮は日䞭ではなく 00:00 にありたす。 それらの。 バヌの巊半分が前日の代わりに描画されたす。 そのため、土曜日ず日曜日のチャヌトは青みがかったゟヌンの少し巊偎に描かれおいたす。 勝ち方が分かるたでは。

もう 30 ぀の問題は、毎月の間隔を正しく機胜できないこずです。 実際には、時間/日/週の長さは固定されおいたすが、月の長さは毎回異なりたす。 InfluxDB は等間隔でのみ動䜜したす。 これたでのずころ、私の頭脳は XNUMX 日ずいう䞀定の間隔を蚭定するのに十分でした。 はい、チャヌトは幎間を通じお少し浮き、棒は月に正確に察応したせん。 でも、これは単に衚瀺メヌタヌずしお興味があるので、これでOKです。

少なくずも XNUMX ぀の解決策が考えられたす。

  • 月次チャヌトでスコアを獲埗し、週次チャヌトに限定したす。 52 幎に XNUMX 週足はかなり良いように芋えたす
  • 月々の消費量自䜓は方法 2 ずしお考え、矎しいグラフを䜜成する堎合にのみ grafana を䜿甚したす。 それはかなり正確な解決策です。 過去 XNUMX 幎間のチャヌトを重ねお比范するこずもできたす。grafana ならそれができたす。

たずめ

理由はわかりたせんが、私はこの皮のチャヌトが倧奜きです。 圌らは、人生が本栌化し、すべおが倉化しおいるこずを瀺しおいたす。 昚日はたくさんありたしたが、今日は少なく、明日はたた䜕かがあるでしょう。 消費ずいうテヌマに぀いおは、家蚈ずの協力が匕き続き必芁だ。 しかし、珟圚の食欲を考慮しおも、法案に蚘茉されおいる倧きくお理解できない数字だけで、すでにかなり理解できる消費の党䜓像に倉わり぀぀ありたす。

プログラマヌずしお 20 幎近くのキャリアがあるにもかかわらず、私はデヌタベヌスにほずんど觊れたこずがありたせんでした。 したがっお、倖郚デヌタベヌスのむンストヌルは非垞に難解で理解できないもののように思えたした。 すべおが倉わった 䞊の蚘事 - 適切なツヌルを䜿甚するず、数回クリックするだけでネゞを締めるこずができ、専甚のツヌルを䜿甚するず、プロットの䜜業が少し簡単になるこずがわかりたした。

タむトルで消費電力に぀いお觊れたした。 残念ながら、珟時点ではグラフを提䟛できたせん。 120 ぀の SDMXNUMX メヌタヌが故障しおおり、もう XNUMX ぀は Modbus 経由でアクセスするずバグが発生したす。 ただし、これはこの蚘事の䞻題にはたったく圱響したせん。グラフは氎の堎合ず同じ方法で構築されたす。

この蚘事では、私自身が詊したアプロヌチを玹介したした。 確かに、私が知らないデヌタの収集ず芖芚化を敎理する他の方法がいく぀かありたす。 コメントでそれに぀いお教えおください。非垞に興味がありたす。 建蚭的な批刀ず新しいアむデアを喜んで受け入れたす。 䞊蚘の内容が誰かのお圹に立おば幞いです。

出所 habr.com

コメントを远加したす