إدارة مستشعرات المنزل الذكي باستخدام مساعد Google

مرحبًا ، سيخبرك الزملاء في هذا الدليل بكيفية التحكم في مستشعرات المنزل الذكي باستخدام مساعد Google وبروتوكول mqtt ، باستخدام لوحة ESP8266 و LED كمثال. سنقوم أيضًا بإنشاء تطبيق المساعد الخاص بنا باستخدام مخطوطات البلاك جاك والـ php. أطلب من الجميع القط.

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

للتكامل مع مساعد Google ، سنستخدم خدمة إجراءات Google و Dialogflow. لذا ، لنبدأ.

صورة

إنشاء وإنشاء مشروع


وحدة تحكم العمل من Google


تحتاج أولاً إلى تسجيل الدخول إلى الخدمة وإنشاء مشروع وتحديد اللغة والمنطقة.

صورة

بعد أن تحتاج إلى اختيار النطاق. لقد اخترت Kids & Family. من تجربة شخص آخر ، سأقول أن الفئة المطلوبة منطقيًا Smart Home تعمل بشكل صحيح فقط مع الأجهزة من Google ، للمشاريع التي تحتوي على أجهزة استشعار خاصة بها ، من الأفضل اختيار فئة مختلفة للتشغيل الصحيح.

صورة

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

صورة

انتقل إلى علامة التبويب "الإجراءات" ، وأضف إجراء "غرض مخصص"

صورة

تدفق الحوار


بعد النقر على زر البناء ، تتم إعادة توجيهنا إلى مورد Dialogflow ، كما نقوم بتسجيل الدخول والمتابعة إلى إنشاء المشروع:

  1. اختر اللغة الافتراضية والمنطقة الزمنية.
  2. Fulfillment Webhook. ( , ) Dialogflow POST .

    صورة
  3. 3. .

    intets . . + Intents. .

صورة

يمكن تقسيم الصفحة نفسها إلى ثلاث فئات:

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

صورة

الإجراء - الإجراء نفسه ، أو الكلمة التي سيفهمها المستشعر ، هي كلمة واحدة وملموسة.

الردود هي إجابات المساعد بعد تنفيذ الأمر. هنا مجرد مجال للإبداع.

صورة

إعداد الاستضافة


كخادم ، اشتريت أقل قطب (5 دولارات) وقمت بتثبيت دبيان 10.2 عليه. الاستضافة التي تختارها لا يهم.

تكوين الوكيل العكسي و DNS


يمكنك تخطي هذا الجزء إذا كان لديك استضافة بشهادة صالحة.

تقدم خدمة Cloudflare نفسها الكثير من الأسماء ذات المستوى الأدنى ، لذلك إذا كنت تواجه مشاكل في الخطوة 4 ، فقد تحتاج إلى الإشارة إلى عنوان IP الخاص بك بدلاً من العنوان الافتراضي في عمود المحتوى بجوار www *** ، https // www *** (*** هو مجالك) .

للتفاعل مع Dialogflow ، تحتاج إلى شهادة SSL. لم أقم بتثبيته على الخادم ، وبدلاً من ذلك استخدمت وكيل DNS Cloudflare (مجاني - أساسي). للقيام بذلك ، عند تكوين Cloudflare ، أضفت اسم المجال الذي اشتريته سابقًا وأضفت عنوان IP لخادمي إليه (عمود المحتوى). تمت إضافة سجلي A أيضًا (في الصورة القيمة) في إعدادات موفر الاسم. وتجدر الإشارة إلى أن إضافة سجل ليست مسألة ثوان ويمكن أن تستغرق عدة أيام عمل.

صورة

تثبيت البرامج


1. أول شيء بعد بدء تشغيل الخادم لأول مرة ، لا تنس تحديث قاعدة بيانات الحزمة

apt update
، ثم قم بتحديث الحزم المثبتة
apt upgrade

2. بعد تثبيت LAMP

Apache

apt install apache2 

فب / الخلية

apt-get install php libapache2-mod-php php-mcrypt php-mysql

أضف عنوان الخادم في apache2.conf. يمكن القيام بذلك باستخدام الأمر nano /etc/apache2/apache2.conf من خلال التحديد في نهاية الملف ServerName *** في نهاية الملف ، حيث تحتاج بدلاً من العلامات النجمية إلى استبدال عنوان IP للخادم. تحقق من البنية وأعد تشغيل خدمة Apach تعرف على المزيد هنا .

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

صورة

إذا لم يحدث ذلك ، فتحقق مما إذا تم تنفيذ الأوامر بشكل صحيح ، وما إذا كانت الصفحة تعمل مع اتصال http غير آمن. إذا كان يعمل ، فمن المحتمل أن الخادم يستمع على المنفذ 80 ، وليس المنفذ 443. أو بعض الخدمات قيد التشغيل بالفعل. مزيد من التفاصيل هنا .

4. تركيب مكتبة البعوض لـ PHP

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

5. إذا لم يكن PECL مثبتًا لديك ، فقم بتثبيته

apt install pecl

بعد أن أصبحنا وسيط

pecl install Mosquitto-alpha

ثم أضف extension = mosquitto.so إلى php.ini الخاص بك. ولا تنس العميل

apt install mosquitto mosquitto-clients

مزيد من التفاصيل هنا .

إعداد سكربت php والاشتراك في الموضوع


في الواقع النصي نفسه. الغرض منه هو قبول طلب نشر من Dialogflow ، وعزل الإجراء عنه وإرساله كرسالة إلى الوسيط في الموضوع ، والذي يشار إلى اسمه في نهاية البرنامج النصي. ما تسمونه سيناريو لا يهم. بالمناسبة ، هذا هو النص الذي أشرنا إليه في علامة التبويب `` الوفاء ''. ضع النص في / var / www / html

المواضيع التي تم إنشاؤها من قبل المشتركين. لإنشاء موضوع ، استخدم الأمر:

mosquitto_sub -h localhost - t /test/light

بدلاً من localhost ، يمكنك تحديد أي عنوان أو مجال آخر ، حيث تريد إنشاء ناشر (حانة).

بدلاً من / test / light ، يمكنك تحديد أي موضوع. في حالتنا ، الشيء الرئيسي هو أن يشار إليه في البرنامج النصي.

يتم إنشاء الرسائل من قبل الناشرين. لإنشاء رسالة ، يمكنك استخدام الأمر.

mosquitto_pub -h localhost - t /test/light -m “light”

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

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

صورة

صورة

نص PHP
<?php


//Make sure that it is a POST request.
if(strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0){
    throw new Exception('Request method must be POST!');
}

//Make sure that the content type of the POST request has been set to application/json
$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"])                                                                                                              : '';
if(strcasecmp($contentType, 'application/json') != 0){
    throw new Exception('Content type must be: application/json');
}

//Receive the RAW post data.
$content = trim(file_get_contents("php://input"));

//Attempt to decode the incoming RAW post data from JSON.
$decoded = json_decode($content);

//file_put_contents($filename, $data);
var_dump($decoded);

echo $decoded->queryResult->action;

define('BROKER', 'localhost');
define('PORT', 1883);
define('CLIENT_ID',  getmypid());
  
$client = new Mosquitto\Client(CLIENT_ID);
$client->connect(BROKER, PORT, 60);

        $message = $decoded->queryResult->action;
        $client->publish('/test/light', $message, 0, false);
        $client->loop();
?>


البرامج الثابتة ESP8266


بالنسبة إلى البرامج الثابتة ، سنستخدم Arduino IDE. إذا قام شخص ما بتثبيت IDE للمرة الأولى ، فلا تنس برنامج التشغيل ch340. بشكل افتراضي ، لا يوجد مثل هذا الدفع في اردوينو. في ملف >> الإعدادات ، تحتاج إلى تحديد عنوان اللوحات الإضافية: arduino.esp8266.com/stable/package_esp8266com_index.json. في أدوات >> board >> board board تحتاج إلى تثبيت حزمة esp8266.

في الرسم التخطيطي بعد const char * ssid ، يجب أن تشير إلى اسم شبكة wi-fi الخاصة بك. بعد كلمة مرور const char * ، كلمة المرور الخاصة بها. بعد const char * mqtt_server حدد عنوان IP لخادمك.

رسم اردوينو IDE
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// Update these with values suitable for your network.

const char* ssid = "***";
const char* password = "********";
const char* mqtt_server = "**.**.*.*";

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

int led = D5;

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  randomSeed(micros());

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
  String msg="";
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
    msg+=(char)payload[i];
  }
  Serial.println();

  // Switch on the LED if an 1 was received as first character
//  if ((char)payload[0] == '1') {
  if (msg == "light") {
    digitalWrite(led, HIGH);   // Turn the LED on 
  } else {
    digitalWrite(led, LOW);  // Turn the LED off 
  }

}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      // ... and resubscribe
      client.subscribe("/test/light");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
  pinMode(led, OUTPUT);     // Initialize the led pin as an output
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}

void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();

}

نتيجة


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

صورة

صورة


All Articles