الطاقة والحرارة والمياه الجزء الثالث: اذهب إلى الراديو

دخول


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

المقالات السابقة:


الجزء الأول (1 درجة حرارة الأسلاك ، شكا ، عداد المياه ...)
الجزء الثاني (netping ، gidrolock ، مجسات الضغط ...)

المهام التي تم حلها في هذه المقالة


  • حماية تسرب المياه مرنة وقابلة للتطوير مع تنبيه zabbix
  • الأجهزة الأخرى في 433 ميجا هرتز: الجرس ، الباب مفتوح ، الخ
  • نحن ندفع 1 سلك في mqtt

نظام حماية التسرب


متطلبات النظام:


  • الكثير من أجهزة الاستشعار المنتشرة في جميع أنحاء المنزل (في حالتي - 6 قطع في مواقع مختلفة)
  • لا الأسلاك في أجهزة الاستشعار
  • اغلاق سريع عند الكشف عن تسرب
  • جميع معلومات الحالة الحالية في zabbix. هناك تنبيه

تكوين النظام


  • توت العليق بي
  • RTL2832U موالف USB
  • تسرب مجسات 433 ميجا هرتز
  • Netping + gidrolock crane (انظر المقال السابق) لإغلاق الجذع

عن الحديد


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

كيف يمكنني التقاط 433 ميجا هرتز؟ اتضح - موالف تلفزيون على شرائح محددة. وهو الآن يستحق فلساً واحداً (أخذت أفيتو مقابل 300 ر) مثل هذا:

صورة

أمرت هوائي منفصل لذلك على 12dbi ، لأن الحالي لا يغطي المنزل كله.

منذ أن حاولت تقليل مكونات التحكم في الدائرة ، كانت هناك رغبة في تشديد الموالف في جهاز التوجيه المنزلي الخاص بي باستخدام Openwrt ، والذي كان حتى ذلك الوقت هو جوهر حل المنزل الذكي لـ 1 أسلاك ، modbus ، مستشعرات wifi / بروتوكولات ، لكن لسوء الحظ ، استنفدت بعض مواردها ( تنتهي المساحة الموجودة على محرك الأقراص المحمول المدمج للبرامج الضرورية ، حيث يتم تحميل المعالج بشيء ما - ستكون هناك بالفعل مشكلات في الشبكة ، وما زال لدينا 4 كيلو بايت للبحث على الإنترنت :) ، + هناك بالفعل العديد من الأشياء المعلقة على USB ، والتي تؤثر على استقرار جمع البيانات). تقرر نقل وظيفة المنزل الذكي إلى جهاز خارجي تدريجيًا - rarpberry pi (كانت إحدى الإصدارات الأولى في متناول اليد).

حول البرنامج


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

صورة

وضع التوت


اخترت raspbian الأصلي. كتبت الصورة الأخيرة على محرك أقراص فلاش USB تحت نظام mac / linux:

sudo dd if=2019-07-10-raspbian-buster-lite.img of=/dev/disk2 bs=1048576 conv=sync 

التمهيد ، تكوين الشبكة و SSH.

التالي - وضعت على حزم التوت rtl-sdr ، rtl_433:

 sudo apt-get install cmake build-essential python-pip libusb-1.0-0-dev libusb-1.0 python-numpy git git clone https://github.com/merbanan/rtl_433.git cd rtl_433/ mkdir build cd build cmake .. make make install 

يحتوي rtl_433 على بروتوكولات مضمنة تقوم بفك تشفير البيانات من أجهزة مختلفة تعمل في نطاق 433 ميجا هرتز.

نبدأ rtl_433


 rtl_433 -f 433.9e6 

نخفض المستشعرات في الماء ونعتز بها:

 time : 2019-09-17 15:04:39 model : Smoke detector GS 558 id : 16919 unit : 1 learn : 0 Raw Code : c842e1 

كاشف الدخان؟ حسنًا ، دعنا نضع أغنية "Smoke on the water" في حالة تأهب من هذه المستشعرات ... :)
ولكن على محمل الجد - لدينا معرف كل مستشعر ، والذي في المستقبل سوف نفهم أين لدينا بالضبط تسرب (وسنغلق في أي حال).

حول أجهزة استشعار التسرب


صورةصورةصورة

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

بالمناسبة ، اكتب التعليقات ، ربما شخص عمل مع هذه المستشعرات ، هل يمكن بطريقة ما "تعليمها" لإرسال إشارة حول التسرب باستمرار؟

وضعت هذه المجسات جانبا ، في الترسانة كانت واحدة أخرى من rubetek (الصورة اليمنى) واشتريت في Leroy: GAL SHW-1005 (الصورة الوسطى).

بدا أن سلوك مستشعر rubetek لا يمكن التنبؤ به تمامًا (رد فعل لا يمكن التنبؤ به "يرى الماء / لا يرى").

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

MQTT


كيفية إرسال إخراج rtl_433 إلى zabbix؟ إطعام الوكيل؟ إرسال إلى zabbix_sender ، تحليل العملية؟ ربما من خلال سيسلوغ؟

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

والخبر السار هو أن rtl_433 يمكنه إرسال معلومات حول MQTT. خارج الصندوق. في الوقت نفسه ، يتم إرسال البيانات إلى الوسيط بتنسيق json.

لذلك تحتاج:

  • وضع وسيط البعوض المحلية (تفعل ذلك على التوت).
  • دمج المعلومات في الوسيط مع الموضوع المطلوب ، بحيث في وقت لاحق يمكن تحليلها.
  • اتصل بالوسيط محليًا على التوت وأرسل الأوامر إلى netping
  • اتصل بالوسيط من المكان الذي ستتم إعادة التوجيه فيه إلى zabbix (خادم zabbix في حالتي هو أيضًا عميل MQTT)

تركيب الإعداد البعوض MQTT:


 apt-get install mosquitto mosquitto-clients systemctl enable mosquitto systemctl start mosquitto 

نرسل المعلومات إلى الوسيط الذي يشير إلى معرف الجهاز:


 rtl_433 -f 433.88e6 -F mqtt://127.0.0.1,events=/433/[id] 

في عميل mqtt ، سنحصل على شيء مثل التالي:

 mosquitto_sub -h 127.0.0.1 -t '#' (   ) /433/16919 {"time":"2019-09-18 11:55:29","model":"Smoke detector GS 558","id":16919,"unit":1,"learn":0,"code":"c842e1"} 

البرنامج النصي للاتصال بالوسيط وإرسال الأمر إلى netping


قمت برسم عميل برنامج نصي MQTT بسيط يتيح لك تشغيل البرنامج النصي المرتبط بالموضوع عندما يظهر الموضوع المحدد في التكوين. وبالتالي ، عندما يتم تشغيل جهاز استشعار معين وتظهر معلومات حوله على الهواء (على سبيل المثال ، / 433/16919) ، يمكنك القيام ببعض الإجراءات (في حالة netping ، أرسل طلب حليقة لإغلاق الرافعة ، راجع المقال السابق). رابط للنص في نهاية المقال.

إعادة التوجيه في zabbix


لقد استخدمت حل mqtt-zabbix الجاهزة. على مستواه ، نحن نفهم في أي عنصر لإرسال القيمة (بالمعرف).

في keys.cfg ، حدد:

 /433/16919,mqtt.ventilation.waterleak::hostname 

حيث hostname هو اسم المضيف مع نوع tramp العنصر في Zabbix.

مهم !!! يجب أن يتطابق اسم المضيف في الإعدادات مع الاسم المراد إرساله في البرنامج النصي ، ويجب أن يكون نوع العنصر (عنصر البيانات) مناسبًا للبيانات المرسلة (على سبيل المثال ، json - text) ، وإلا فسوف تلتقط أخطاء النموذج:

 2019-09-18 14:29:48,749 Got response from Zabbix: {u'info': u'processed: 0; failed: 1; total: 1; seconds spent: 0.000055', u'response': u'success'} 

علاوة على ذلك ، من الصعب تحقيق مزيد من التصحيح (ولماذا فشل) من zabbix.

نحن نقوم بتهيئة /etc/mqtt-zabbix/mqtt-zabbix.cfg (حدد وسيط ip mqtt وعنوان خادم zabbix).

ماذا للاتصال 433؟


نعم اي شي :)

مجسات محطة الطقس


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

 time : 2019-09-19 10:48:54 Protocol : 56 model : TFA pool temperature sensor Id : 182 Channel : 3 Temperature: 19.3 C Modulation: ASK Freq : 433.9 MHz RSSI : -0.1 dB SNR : 35.0 dB Noise : -35.2 dB time : 2019-09-20 10:57:29 Protocol : 12 brand : OS model : THN132N House Code: 4 Channel : 3 Battery : OK Celsius : 20.00 C Modulation: ASK Freq : 432.9 MHz RSSI : -0.2 dB SNR : 31.5 dB Noise : -31.7 dB 

وبالتالي ، كانت المكافأة هي القدرة على مراقبة درجة حرارة النقاط على الهواء مع عرضها في zabbix. فقط في بعض الغرف لا أستطيع تمديد الكابل.

جرس الباب


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

لقد اشتريت مكالمة: Evology QA-688-E RU.

لكي يرى زر rtl_433 زر الاتصال ، تحتاج إلى تنشيط بروتوكولات "الاختبار" ، على سبيل المثال عن طريق التشغيل مع خيار "G" أو تحديد بروتوكول إضافي معين ، في نفس الوقت سنضيف مخرجات المعلومات حول البروتوكول والتردد:

 rtl_433 -f 433.9e6 -G -M protocol -M level -F mqtt://127.0.0.1,events=/433/[id] & 

الحصول على MQTT:

 {"time":"2019-09-30 10:57:00","protocol":72,"model":"RF-tech","id":0,"battery":"LOW","temperature_C":0,"button":0,"mod":"ASK","freq":433.84822,"rssi":-3.5981,"snr":33.77488,"noise":-37.373} 

هنا يمكنك أن ترى معرف = 0. في الوقت نفسه ، كان لدي العديد من الأجهزة التي تعرف باسم تقنية RF. كل منهم لديه معرف يساوي 0. ونتيجة لذلك ، يتم عرض جميع الأجهزة في zabbix كعنصر واحد. من الممكن التمييز بالضبط بين الجهاز الذي يعمل ، فقط حسب التردد.

نحن نسحب التردد إلى عنصر مستقل منفصل: mqtt.outside.doorbell.freq مع JSON preprocessing بسعر $ .freq (zabbix يمكن القيام بذلك من الإصدار الرابع).

في هذا العنصر ، قم بإنشاء مشغل مع التعبير:

 {HOME_PI:mqtt.outside.doorbell.freq.last()}>433.8 and {HOME_PI:mqtt.outside.doorbell.freq.last()}<433.81 and {HOME_PI:mqtt.outside.doorbell.freq.nodata(30)}=0 

أي إذا ظهرت فجأة قيمة في العنصر العام mqtt.outside.doorbell.freq (nodata) وكان التردد في النطاق المحدد بين 433.8 و 433.81 ، فيمكننا أن نستنتج أنهم يتصلون بنا (وعلى سبيل المثال ، تكرار مكالمة إلى SMS).

مجسات الباب / النافذة


لدي جهاز استشعار الاختراق من rubetek. يرسل ما يلي:

 {"time":"2019-09-30 14:11:28","protocol":86,"model":"Smoke detector GS 558","id":12262,"unit":16,"learn":0,"code":"e5fcd0","mod":"ASK","freq":433.85021,"rssi":-3.99241,"snr":33.38058,"noise":-37.373}  : {"time":"2019-09-30 14:11:28","protocol":68,"model":"Kerui Security","id":46074,"cmd":7,"state":"close","mod":"ASK","freq":433.85021,"rssi":-3.99241,"snr":33.38058,"noise":-37.373}  : {"time":"2019-09-30 14:11:21","protocol":68,"model":"Kerui Security","id":46074,"cmd":14,"state":"open","mod":"ASK","freq":433.85005,"rssi":-11.0148,"snr":25.1088,"noise":-36.1236} 

بمجرد إضافة جهاز استشعار الراديو الأخير إلى zabbix ، أردت إعادة كل شيء على MQTT. الفهرسة مريحة ، يمكنك تحديد الموضوع آه وموضع وأنواع الأجهزة. يمكنك الحصول على البث العام لجميع الأحداث.

1 سلك إلى MQTT


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

توجد حلول جاهزة لترحيل حالات الاستشعار من شبكة 1wire إلى MQTT ، لكنها لا تناسبني. حلول جاهزة الصنع على العقدة إما تحمل مجموعة من التبعيات وراءها ، أو أكلت معالج التوت بأكمله. يتم التخلي عن بعض الحلول من أفضل 10 حلول في بحث Google من قِبل المؤلفين ، وبعضها مدعوم فقط من خلال أجهزة استشعار درجة الحرارة. هناك أيضًا فئة من البوابات التي تجمع المعلومات من خلال واجهة gpio. كل هذا لم يناسبني.

لديّ نظام ملفات زائفة مثبت عليه أجهزة 1wire في / mnt / 1wire ، حيث أريد الحصول على جميع المعلومات اللازمة. للقيام بذلك ، يكفي إنشاء سطر واحد بسيط على bash ، وإرسال البيانات عبر mosquitto_pub لكل جهاز استشعار. ومع ذلك ، هناك أسئلة حول إطلاق هذه البرامج النصية (فوق التاج ، والقيادة إلى نوع من الخفي؟) ، والعرض العادي للبيانات (الحصول على نفس json) ، وإضافة مستشعر جديد ، وما إلى ذلك. وكلما تطورت الفكرة ، زاد عدد العكازات. اتضح أنه من الأسهل أن تكتب بوابة لأغرف أخرى لتتمكن من نقل هذه المهمة.

يوجد ملف تكوين نحتاج فيه إلى إدخال معرف المستشعرات وتلك الملفات من fuse.OWFS التي نريد نشرها على mqtt.

الإخراج في mqtt هو json التالية:

 /1wire/28.0425260a0000 {"type": "DS18B20", "temperature": "30"} /1wire/28.bf16270a0000 {"type": "DS18B20", "temperature": "7.9375"} /1wire/26.da2f71010000 {"temperature": "25.2812", "IAD": "1", "CA": "0", "VAD": "0.91", "VDD": "4.59", "type": "DS2438"} /1wire/28.48b3010b0000 {"type": "DS18B20", "temperature": "40.5625"} /1wire/1d.6a9306000000 {"type": "DS2423", "counter.B": "9", "counter.A": "9219"} /1wire/28.61cc260a0000 {"type": "DS18B20", "temperature": "12.5"} 

إضافة إلى التشغيل التلقائي ، قم بتعيين الفاصل الزمني للاستقصاء. تم حل المشكلة.

مراجع


github.com/merbanan/rtl_433 - أداة لفك تشفير بروتوكولات الراديو
github.com/kylegordon/mqtt-zabbix - MQTT on Zabbix
github.com/unlo/1wire2mqtt - 1wire في MQTT ، عميل MQTT الذي يسمح لك بتشغيل البرامج النصية عندما يظهر الموضوع

Source: https://habr.com/ru/post/ar467761/


All Articles