العمل مع المراقبة الشعبية لـ Python مع Raspberry Pi

أثناء محاولتي توصيل مستشعر درجة الحرارة DS18B20 بجهاز الاحتباس الحراري الذكي الخاص بي ، وجدت أن الإنترنت لا يحتوي على تعليمات كاملة لتوصيل هذا المستشعر عبر لغة برمجة Python. أستخدمه لأنني أعمل مع منصة Raspberry Pi. قررت إصلاح هذه المشكلة. اتضح أن العمل مع TCP ليس بهذه الصعوبة ، ولكن عليك أن تفهم ما نقوم به ولماذا. من الواضح أن الرقص لمدة ساعتين مع الدف أغضبني. لذا هنا ، بالإضافة إلى جزء البرنامج نفسه ، أريد أن أخبر الخوارزمية بأكملها من البداية إلى النهاية. أعتقد أن أجهزة الاستشعار الأخرى تعمل بشكل مشابه ، لذلك ستكون مقالة كبيرة هي نفسها للجميع. آمل أنه إذا كنت تريد توصيل المستشعر ، فلن تحتاج إلى الدف :) وهكذا ، دعنا نبدأ ، أطلب منك Habrokat.

الشامانية بجهاز استشعار


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

import os
tfile=open("/sys/bus/w1/devices/28-000000d7970b/w1_slave")
ttext=tfile.read()
tfile.close()
temp=ttext.split("\n")[1].split(" ")[9]
temperature=float(temp[2:])/1000
print temperature

لا تنس استبدال البيانات بجهاز الاستشعار الخاص بك.

كما نرى ، تأخذ درجة الحرارة متغير درجة الحرارة (من كان يظن) ، والذي سنحتاجه أكثر.

تمشى مع المراقبة


حسنًا ، أولاً تحتاج إلى تسجيل narodmon.ru ، أولئك الذين لم يفعلوا ذلك بعد. تقدم لنا واجهة برمجة التطبيقات للخدمة إمكانية نقل البيانات عبر TCP. لذلك دعونا نفعل ذلك. نحن مطالبون بنقل النص بالتنسيق التالي:

#MAC[#NAME][#LAT][#LNG][#ELE]\n
#mac1#value1[#time1][#name1]\n
...
#macN#valueN[#timeN][#nameN]\n
##

ولكن في الواقع ، نحتاج إلى تمرير ثلاث معلمات فقط: MAC للجهاز ، واسم المستشعر وقيمته. البقية ليست ضرورية ، ونحن لسنا بحاجة إليها حقا.

في السطر الأول ، نحتاج إلى تمرير شعرية و MAC وحرف تغذية السطر \ n.
في السطور الثاني واللاحق ، نقوم مرة أخرى بنقل الشبكة واسم المستشعر ومرة ​​أخرى الشبكة وقراءات المستشعر. ننهي هذا بحرف تغذية \ n.
في السطر الأخير ، تحتاج إلى تمرير شبكتين لإكمال الحزمة.

ونتيجة لذلك ، يظل التنسيق كما يلي:

#MAC\n
#mac1#value1\n
#macN#valueN\n
##

كتابة برنامج بايثون


سنكتب البرنامج في Python 2. ستكون الخوارزمية هكذا. نتلقى بيانات من المستشعر ونكتبها على متغير درجة الحرارة. ثم نقوم بتشكيل الحزمة وإرسالها إلى خادم مراقبة الأشخاص. سنقوم بتشغيل البرنامج النصي كل 10 دقائق (الحد الأدنى المسموح به لإرسال القراءات هو 5 دقائق) عبر cron.

يحدث الإرسال على النحو التالي (مثال على موقع المراقبة):

إرسال رمز البرنامج النصي
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# by Roman Vishnevsky aka.x0x01 @ gmail.com

import socket

# MAC  .   !
DEVICE_MAC = '0123456789012'

#  ,    01 (02)  mac 
SENSOR_ID_1 = DEVICE_MAC + '01'
SENSOR_ID_2 = DEVICE_MAC + '02'

#  ,  float/integer
sensor_value_1 = 20
sensor_value_2 = -20.25

#  
sock = socket.socket()

#  
try:
    #   
    sock.connect(('narodmon.ru', 8283))

    #      
    sock.send("#{}\n#{}#{}\n##".format(DEVICE_MAC, SENSOR_ID_1, sensor_value_1))

    #      
    # sock.send("#{}\n#{}#{}\n#{}#{}\n##".format(DEVICE_MAC, SENSOR_ID_1, sensor_value_1, SENSOR_ID_2, sensor_value_2))

    #  
    data = sock.recv(1024)
    sock.close()
    print data
except socket.error, e:
    print('ERROR! Exception {}'.format(e))


نقوم بالاتصال بالخادم narodmon.ru:8283

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

رمز النص النهائي
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import socket
import os
import fnmatch

# MAC  .   !
DEVICE_MAC = 'FF:FF:FF:FF:FF:FF'

# 
SENSOR_ID_1 = 'T1'
SENSOR_ID_2 = 'T2'

#  
temperature = []
IDs = []
for filename in os.listdir("/sys/bus/w1/devices"):
  if fnmatch.fnmatch(filename, '28-031652ddbdff'):
    with open("/sys/bus/w1/devices/" + filename + "/w1_slave") as fileobj:
        lines = fileobj.readlines()
    if lines[0].find("YES"):
        pok = lines[1].find('=')
        temperature.append(float(lines[1][pok+1:pok+7])/1000)
        IDs.append(filename)
    else:
          logger.error("Error reading sensor with ID: %s" % (filename))

temperature2 = []
for filename in os.listdir("/sys/bus/w1/devices"):
  if fnmatch.fnmatch(filename, '28-011563e8d2ff'):
    with open("/sys/bus/w1/devices/" + filename + "/w1_slave") as fileobj:
        lines = fileobj.readlines()
    if lines[0].find("YES"):
        pok = lines[1].find('=')
        temperature2.append(float(lines[1][pok+1:pok+7])/1000)
        IDs.append(filename)
    else:
          logger.error("Error reading sensor with ID: %s" % (filename))

sock = socket.socket()

#
try:
    sock.connect(('narodmon.ru', 8283))
# ,       
    sock.send("#{}\n#{}#{}\n#{}#{}\n##".format(DEVICE_MAC, SENSOR_ID_1, str(temperature)[1:-1], SENSOR_ID_2, str(temperature2)[1:-1]))

# 
    data=sock.recv(1024)
    sock.close()
    print data
except socket.error, e:
    print('ERROR! Exception {}'.format(e))

print str(temperature)[1:-1]
print str(temperature2)[1:-1]


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

الآن نحن بحاجة إلى إضافة المستشعر إلى كرون. نكتب: crontab -eونضيف السطر التالي هناك:

*/10 * * * * sudo python /home/pi/narod.py

نحن في انتظار تشغيل البرنامج النصي.

الآن نذهب هنا narodmon.ru/ip ومعرفة ما إذا تم نقل البيانات. إذا كان كل شيء على ما يرام ، فانقر على زر "إضافة جهاز" في الصفحة الرئيسية في القائمة وحدد MAC. الآن يمكننا تخصيص كل شيء حسب الذوق (الاسم ، النوع ، الموقع ، إلخ.). يمكنك جعل المستشعر عامًا بعد يوم واحد من بدء إرسال الشهادة.

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

نراكم مرة أخرى :)

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


All Articles