المنزل الذكي: بناء مخططات المياه والكهرباء في مساعد المنزل


في كل مرة أتلقى فيها فاتورة للكهرباء والمياه ، أتساءل - هل تستهلك عائلتي حقًا الكثير؟ حسنًا ، نعم ، يحتوي الحمام على أرضية مدفأة وغلاية ، لكنهما لا يثران باستمرار. يبدو أيضًا أننا نوفر المياه (على الرغم من أننا نحب أيضًا الرش في الحمام). وقبل بضع سنوات، وأنا بالفعل مرتبطة المياه و الكهرباء متر إلى المنزل الذكي، ولكن هذا كان عالقا في هذا الشأن. وصلت الأيدي إلى تحليل الاستهلاك الآن فقط ، والذي تدور حوله هذه المقالة.

لقد تحولت مؤخرًا إلى Home Assistant كنظام منزلي ذكي. كان أحد الأسباب مجرد فرصة لتنظيم جمع كمية كبيرة من البيانات مع إمكانية إنشاء أنواع مختلفة من الرسوم البيانية بشكل ملائم.

المعلومات الموصوفة في هذه المقالة ليست جديدة ، كل هذه الأشياء مع صلصات مختلفة سبق وصفها على الإنترنت. لكن كل مقال ، كقاعدة عامة ، يصف نهجًا أو جانبًا واحدًا فقط. كان علي مقارنة كل هذه الأساليب واختيار أنسبها بنفسي. لا تزال المقالة لا توفر معلومات شاملة عن جمع البيانات ، ولكنها نوع من ملخص كيف فعلت. لذا نرحب بالنقد البناء والاقتراحات للتحسين.

صياغة المشكلة


لذا ، فإن الهدف من التمرين اليوم هو الحصول على رسوم بيانية جميلة لاستهلاك المياه والكهرباء:

  • كل ساعة لمدة يومين
  • يومياً لمدة أسبوعين
  • (اختياري) أسبوعي وشهري

هنا تنتظرنا بعض الصعوبات:

  • , , . .

    , , . home assistant, , mini-graph-card, :

    • ( , )
    • ( , )
  • , home assistant SQLite ( , , MySQL Postgres), . , , 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 . , ( home assistant raspberry PI), .
  • , . . (RS232/RS485/Modbus/Zigbee) .

    ( ), X - . . , . , , home assistant, , ( home assistant).

1


أولاً ، دعنا نرى ما يتم توفيره مساعد المنزل من خارج منطقة الجزاء. يعد قياس الاستهلاك على مدى فترة من الوظائف المطلوبة بشدة. بالطبع ، تم إدراكه منذ فترة طويلة في شكل مكون متخصص - فائدة_مقياس.

جوهر المكون هو أنه بداخله يبدأ المتغير الحالي_ المتراكم_القيمة ، ويعيد تعيينه بعد فترة محددة (ساعة / أسبوع / شهر). يراقب المكون نفسه المتغير الوارد (قيمة نوع من أجهزة الاستشعار) ، ويشترك في التغييرات في القيمة نفسها - تحصل فقط على النتيجة النهائية. يتم وصف هذا الشيء في أسطر قليلة فقط في ملف التكوين.

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. يخلق التصميم مستشعرين جديدين 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

في الواقع ، تكمن مشكلة هذا النهج في هذه الخوارزمية. كما ذكرت ، لكل قيمة إدخال (قراءة العداد الحالية لكل لتر لاحق) ، يتم إنشاء 1 كيلو بايت من السجل في قاعدة البيانات. كما يولد كل عداد فائدة قيمة جديدة ، والتي تضيف أيضًا إلى قاعدة البيانات. إذا كنت أرغب في جمع قراءات كل ساعة / يومية / أسبوعية / شهرية ، ولعدة زيادات للمياه ، وحتى إضافة مجموعة من العدادات الكهربائية - سيكون هذا كثيرًا من البيانات. حسنًا ، على نحو أدق ، ليس هناك الكثير من البيانات ، ولكن بما أن المساعد المنزلي يكتب إلى قاعدة البيانات مجموعة من المعلومات غير الضرورية ، فإن حجم قاعدة البيانات سينمو بسرعة فائقة. أخشى حتى أن أقدر حجم القاعدة للرسم البياني الأسبوعي والشهري.

بالإضافة إلى ذلك ، لا يحل عداد المرافق وحده المهمة. إن الرسم البياني للقيم التي يعطيها مقياس المنفعة هو دالة متزايدة بشكل رتيب تتم إعادة تعيينها إلى 0 كل ساعة. نحتاج إلى مخطط استهلاك سهل الاستخدام ، كم لترًا تم تناوله خلال هذه الفترة. لا يعرف المكون القياسي للرسم البياني التاريخي كيفية القيام بذلك ، ولكن المكون الخارجي لبطاقة الرسم البياني المصغر يمكن أن يساعدنا.

هذا هو رمز البطاقة لـ 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 - بار واحد لكل ساعة
  • , 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 تحكم كل شيء. وهذه مشكلة أخرى لهذا المكون - يعمل point_per_hour بشكل جيد على الرسوم البيانية في ساعة أو أقل ، ولكنه مثير للاشمئزاز على فترات كبيرة. لذلك للحصول على عمود واحد في يوم واحد ، كان علي إدخال القيمة 1/24 = 0.04166666. أنا لا أتحدث عن الرسوم البيانية الأسبوعية والشهرية.

النهج 2


لقد اكتشفت للتو مساعد المنزل ، لقد صادفت هذا الفيديو هنا:


يجمع صديق بيانات الاستهلاك من عدة أنواع من منافذ Xiaomi. مهمته أسهل قليلاً - ما عليك سوى عرض قيمة الاستهلاك لليوم والأمس والشهر. لا جداول مطلوبة.

دعونا نترك جانبا المناقشة حول التكامل اليدوي لقيم الطاقة الآنية - لقد كتبت بالفعل عن "دقة" هذا النهج. ليس من الواضح لماذا لم يستخدم قيم الاستهلاك المتراكمة ، والتي تم جمعها بالفعل من نفس المنفذ. في رأيي ، الاندماج داخل قطعة الحديد سيعمل بشكل أفضل.

من الفيديو ، نأخذ فكرة حساب الاستهلاك يدويًا للفترة. يحسب الفلاح فقط قيم اليوم والأمس ، لكننا سنذهب أبعد من ذلك ونحاول رسم رسم بياني. جوهر الطريقة المقترحة في حالتي هو على النحو التالي.

  • ___,
  • ( ) . — , .
  • “” ___ .

كل هذا يمكن القيام به من خلال وسائل مساعدة المنزل نفسه.

سيكون عليك كتابة بعض التعليمات البرمجية أكثر من النهج السابق. للبدء ، دعنا نحصل على هذه "المتغيرات". خارج الصندوق ، ليس لدينا كيان "متغير" ، ولكن يمكنك استخدام خدمات وسيط mqtt. سنرسل القيم مع الاحتفاظ بالعلم الحقيقي هناك - سيوفر هذا القيمة داخل وسيط ، ويمكنك سحبها في أي وقت ، حتى عند إعادة تشغيل مساعد المنزل. أنا جعلت عدادات ساعة ونهار على الفور.

- 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

يقوم كلا الأتمتة بإجراءين:

  • يتم حساب قيمة الفاصل الزمني على أنه الفرق بين قيمة البداية والنهاية
  • تحديث القيمة الأساسية للفاصل الزمني التالي

يتم حل الرسوم البيانية في هذه الحالة من خلال الرسم البياني المعتاد للتاريخ:

      - 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 إدخالًا يوميًا للرسم البياني لكل ساعة.

لسوء الحظ ، لا يزال هذا لا يحل المشكلة العامة لقاعدة متنامية. إذا كنت أرغب في جدول استهلاك شهري ، فسيتعين علي تخزين البيانات لمدة عام على الأقل. ونظرًا لأن المساعد المنزلي يوفر إعدادًا واحدًا فقط لمدة التخزين لقاعدة البيانات بأكملها ، فإن هذا يعني أنه يجب تخزين جميع البيانات في النظام لمدة عام كامل. على سبيل المثال ، لمدة عام أستهلك 200 متر مكعب من الماء ، مما يعني أنه يحتوي على 200000 سجل في قاعدة البيانات. وإذا أخذت في الاعتبار أجهزة استشعار أخرى ، يصبح الرقم غير لائق على الإطلاق.

النهج 3


لحسن الحظ ، قام الأشخاص الأذكياء بالفعل بحل هذه المشكلة عن طريق كتابة قاعدة بيانات InfluxDB. تم تحسين قاعدة البيانات هذه خصيصًا لتخزين البيانات القائمة على الوقت وهي مثالية لتخزين قيم أجهزة الاستشعار المختلفة. يوفر النظام أيضًا لغة استعلام شبيهة بـ SQL تسمح لك باختيار القيم من قاعدة البيانات ، ثم تجميعها بطرق مختلفة. أخيرًا ، يمكن تخزين بيانات مختلفة في أوقات مختلفة. على سبيل المثال ، يمكن تخزين القراءات المتغيرة باستمرار مثل درجة الحرارة أو الرطوبة لبضعة أسابيع فقط ، بينما يمكن تخزين القراءات اليومية لاستهلاك المياه لمدة عام كامل.

بالإضافة إلى InfluxDB ، اخترع الأشخاص الأذكياء أيضًا Grafana ، وهو نظام رسم بياني يعتمد على بيانات من InfluxDB. يمكن لـ Grafana رسم أنواع مختلفة من الرسوم البيانية ، وتخصيصها بالتفصيل ، والأهم من ذلك ، يمكن أن تكون هذه الرسوم البيانية "عالقة" على مساعد المنزل lovelace-UI.

الحصول على مستوحاة هنا و هنا . تصف المقالات بالتفصيل عملية تثبيت وتوصيل InfluxDB و Grafana بمساعد المنزل. سأركز على حل مشكلتي المحددة.

لذا ، بادئ ذي بدء ، دعونا نبدأ في إضافة قيمة العداد في تدفق. جزء من تكوين المساعد المنزلي (في هذا المثال ، سأستمتع ليس فقط بالبرد ، ولكن أيضًا بالماء الساخن):

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 ، سيتم تخزين هذه البيانات لمدة أسبوع. أرغب في تخزين بيانات الساعة لمدة شهر ، والأسبوعي لمدة عام ، ويجب عدم حذف البيانات الشهرية على الإطلاق. إنشاء سياسة احتفاظ مناسبة

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

الآن ، في الحقيقة ، الخدعة الرئيسية هي تجميع البيانات باستخدام الاستعلام المستمر. هذه آلية تبدأ استعلامًا تلقائيًا في فواصل زمنية محددة ، وتجميع البيانات لهذا الاستعلام ، وتضيف النتيجة إلى قيمة جديدة. دعونا نلقي نظرة على مثال (أكتب في عمود من أجل سهولة القراءة ، ولكن في الواقع كان علي إدخال هذا الأمر في سطر واحد)

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

هذا الأمر:

  • إنشاء استعلام مستمر باسم cq_water_cold_hourly في قاعدة بيانات المساعدة المنزلية
  • سيتم تنفيذ الطلب كل ساعة (الوقت (1 ساعة))
  • سوف يقوم الطلب باسترجاع جميع البيانات من Meas'a homeassistant.autogen.l (لتر) ، بما في ذلك قراءات الماء البارد والساخن
  • سيتم تجميع البيانات المجمعة حسب كيان_ايد ، مما سيؤدي إلى إنشاء قيم منفصلة للمياه الباردة والساخنة.
  • , max(value)
  • homeassistant.month.water_meter_hour, month retention policy . entity_id value

في الليل أو عندما لا يكون هناك أحد في المنزل ، لا يوجد استهلاك للمياه ، وبالتالي لا توجد إدخالات جديدة في homeassistant.autogen.l أيضًا. لتجنب القيم المفقودة في الاستعلامات العادية ، يمكنك استخدام التعبئة (السابقة). سيؤدي ذلك إلى إجبار InfluxDB على استخدام قيمة الساعة الماضية.

لسوء الحظ ، فإن الاستعلام المستمر له خصوصية: لا تعمل خدعة التعبئة (السابقة) ولا يتم إنشاء السجلات ببساطة. علاوة على ذلك ، هذه مشكلة لا يمكن التغلب عليها والتي نوقشت منذ أكثر من عام . سنتعامل مع هذه المشكلة لاحقًا ، ونترك ملء (السابق) في طلب بحث مستمر - فهو لا يتداخل.

دعونا نتحقق مما حدث (بالطبع ، تحتاج إلى الانتظار بضع ساعات):

> 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 ساعات - تتوافق قيم 7 صباحًا في إخراج InfluxDB مع القيم الخاصة بـ 10 صباحًا في الرسوم البيانية أعلاه. لاحظ أيضًا أنه في الفترة ما بين 2 و 5 صباحًا لا توجد سجلات ببساطة - هذه هي نفس ميزة الاستعلام المستمر.

كما ترى ، فإن القيمة المجمعة هي أيضًا تسلسل متزايد بشكل روتيني ، فقط السجلات أقل تكرارًا - مرة واحدة في الساعة. لكن هذه ليست مشكلة - يمكننا كتابة استعلام آخر ينتج البيانات الصحيحة للمخطط.

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 ، نقوم باستخراج البيانات الخاصة بالكيان_id = 'water_meter_cold' لليوم الأخير (time> = now () -24h).
  • كما ذكرت في التسلسل homeassistant.month.water_meter_hour قد تكون بعض الإدخالات مفقودة. سنقوم بإعادة إنشاء هذه البيانات عن طريق تشغيل استعلام باستخدام GROUP BY time (1h). ستعمل تعبئة الوقت هذه (السابقة) حسب الحاجة ، مما يؤدي إلى إنشاء البيانات المفقودة (ستأخذ الوظيفة القيمة السابقة)
  • أهم شيء في هذا الطلب هو دالة الفرق ، والتي ستحسب الفرق بين علامات الساعة. في حد ذاته ، لا يعمل ويتطلب وظيفة مجمعة. فليكن الحد الأقصى () المستخدم من قبل.

نتيجة الإعدام تبدو هكذا

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) لم يكن هناك استهلاك. ومع ذلك ، سيقوم الاستعلام بإرجاع نفس قيمة الاستهلاك بسبب التعبئة (السابق) ، وستقوم دالة الفرق بطرح هذه القيمة من نفسها والحصول على 0 عند الإخراج ، وهو أمر مطلوب بالفعل.

الشيء الوحيد المتبقي هو بناء جدول زمني. للقيام بذلك ، افتح Grafana ، افتح بعض لوحة المعلومات الموجودة (أو أنشئ لوحة تحكم جديدة) ، أنشئ لوحة جديدة. ستكون إعدادات الرسم البياني مثل هذا.



سأعرض بيانات عن الماء البارد والساخن على مخطط واحد. الطلب مطابق تمامًا كما وصفته أعلاه.

يتم تعيين معلمات العرض على النحو التالي. سيكون لدي رسم بياني بخطوط ، يمر عبر الدرج. سأشرح معلمة المكدس أدناه. هناك خياران آخران للعرض أدناه ، لكنهما ليسا مثيرين للاهتمام.



لإضافة الجدول الزمني المستلم إلى مساعد المنزل ، تحتاج إلى:

  • . -
  • , share
  • embed
  • current time range — URL
  • . light
  • 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"

يرجى ملاحظة أنه تم تعيين النطاق الزمني (آخر يومين) هنا ، وليس في إعدادات لوحة التحكم.

الرسم البياني يبدو هكذا. لم أستخدم الماء الساخن في اليومين الماضيين ، لذلك يتم رسم رسم بياني للمياه الباردة فقط.



لم أقرر بنفسي أي جدول أحبه أفضل ، أو خط خطوة ، أو أشرطة حقيقية. لذلك ، سأعطي ببساطة مثالًا على مخطط الاستهلاك اليومي ، فقط هذه المرة في الأعمدة. يتم إنشاء الطلبات بنفس الطريقة الموضحة أعلاه. معلمات العرض هي كما يلي:



يبدو هذا الرسم البياني كما يلي:



إذن حول معلمة المكدس. في هذا الرسم البياني ، يتم رسم عمود من الماء البارد فوق عمود من الماء الساخن. يتوافق الارتفاع الكلي مع إجمالي استهلاك المياه الباردة والساخنة خلال هذه الفترة.

جميع الرسوم البيانية المعروضة ديناميكية. يمكنك تحريك مؤشر الماوس فوق نقطة اهتمام والاطلاع على التفاصيل والقيمة عند نقطة معينة.

لسوء الحظ ، لم تتمكن ملاعق من القطران من القيام بذلك. على الرسم البياني الشريطي (على النقيض من الرسم البياني بخطوط الخطوة) ، لا يكون منتصف الشريط في منتصف اليوم ، ولكن في 00:00. أولئك. يتم رسم النصف الأيسر من العمود بدلاً من اليوم السابق. لذا فإن الرسوم البيانية ليومي السبت والأحد مرسومة قليلاً إلى اليسار من المنطقة الزرقاء. حتى عرفت كيف أفوز بها.

مشكلة أخرى هي عدم القدرة على العمل بشكل صحيح على فترات شهرية. والحقيقة هي أن طول الساعة / اليوم / الأسبوع ثابت ، ولكن طول الشهر يختلف في كل مرة. يمكن أن يعمل InfluxDB فقط على فترات منتظمة. حتى الآن ، كان دماغي كافياً لتحديد فترة زمنية ثابتة تبلغ 30 يومًا. نعم ، سوف يطفو الرسم البياني قليلاً خلال العام ولن تتوافق الأعمدة تمامًا مع الأشهر. ولكن بما أن هذا الشيء مثير للاهتمام بالنسبة لي ببساطة كجهاز عرض ، فأنا موافق على ذلك.

أرى حلين على الأقل:

  • يسجل في الجداول الشهرية ويقتصر على الأسبوعية. 52 بار أسبوعيًا لهذا العام تبدو جيدة
  • №2, . . — .



لا أدري لماذا ، لكنني أتلاعب بمثل هذا النوع من الرسوم البيانية. يظهرون أن الحياة على قدم وساق وكل شيء يتغير. أمس كان كثيرًا ، اليوم ليس كافيًا ، وغدًا سيكون شيء آخر. يبقى العمل مع الأسر حول موضوع الاستهلاك. ولكن حتى مع الشهية الحالية ، فإن مجرد رقم كبير وغير مفهوم في الدفع يتحول بالفعل إلى صورة واضحة إلى حد ما للاستهلاك.

على الرغم من مهنة الـ 20 عامًا تقريبًا كمبرمج ، إلا أنني لم أتقاطع عمليًا مع قواعد البيانات. لذلك ، بدا تثبيت قاعدة بيانات خارجية شيئًا غريبًا وغير مفهوم. تم تغيير كل شيء بالمقالة المذكورة أعلاه - اتضح أن شد أداة مناسبة يتم في بضع نقرات ، ومع أداة متخصصة تصبح مهمة الرسم البياني أسهل قليلاً.

في العنوان ، ذكرت استهلاك الكهرباء. لسوء الحظ ، لا يمكنني في الوقت الحالي تقديم مخطط واحد. أحد عدادات SDM120 ميت ، والآخر هو عربات التي تجرها الدواب عند الوصول عبر Modbus. ومع ذلك ، لا يؤثر هذا على موضوع هذه المقالة - سيتم إنشاء الرسومات بنفس الطريقة التي يتم بها الماء.

في هذه المقالة ، استشهدت بالنهج التي جربتها بنفسي. بالتأكيد هناك بعض الطرق الأخرى لتنظيم جمع وتصور البيانات التي لا أعرف عنها. أخبرني عن ذلك في التعليقات ، سيكون الأمر مثيرًا للاهتمام بالنسبة لي. سأكون سعيدًا بالنقد البناء والأفكار الجديدة. آمل أن تساعد المواد المقدمة أيضًا شخصًا ما.

All Articles