أتمتة الشقق مع HomePod و Raspberry Pi و Node.js



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

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

توصي Skillbox بما يلي: دورة عملية لمدة عامين ، "أنا مطور ويب للمحترفين" .

نذكرك: لجميع قراء "Habr" - خصم بقيمة 10،000 روبل عند التسجيل في أي دورة تدريبية في Skillbox باستخدام الرمز الترويجي "Habr".

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

ثم أردت أن أبدأ في استخدام المساعد الصوتي للتحكم في الأنظمة الأخرى في المنزل ، على سبيل المثال ، تلفزيون أو وحدة تحكم. في حالة التلفزيون ، على سبيل المثال ، اكتشفت Simple IP Control - طريقة للتحكم في Sony Bravia عن طريق إرسال أوامر عبر TCP.

تخصيص سيري


في النصف الثاني من عام 2018 ، أطلقت Apple تطبيق Shortcuts لجميع مستخدمي iOS. يسمح لك بأتمتة العمل باستخدام الهاتف (أو المنزل الذكي) دون الحاجة إلى كتابة رمز.

يحتوي التطبيق على العديد من الأوامر المدمجة. ما ينقصه هو القدرة على استخدام أوامر TCP ، على الرغم من وجود آلية للعمل مع عناوين URL.

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

سوني برافيا تلفزيون التحكم


مسلحًا بدليل يحتوي على أوامر للتلفزيون ، كتبت تطبيقًا على Node.js Express (Github) ، والذي علمني كيفية الرد على بعض الأوامر الشائعة. لقد بدأت عن طريق تشغيل وحجم.

يعمل الأمر setPowerStatus على كل ما نحتاج إليه.



يتكون الرأس من الأحرف * و s ، والتي تكون ثابتة ويتم استخدامها لجميع الأوامر. ثم يتم استخدام البايت الثالث (ق) ل Command. هناك أربعة معاني قد تشغل هذا المنصب. C for Command (إرسال أمر على التلفزيون) ، E للاستعلام (التحقق من القيمة الحالية لمعلمة معينة ، على سبيل المثال ، مستوى الصوت) ، A - إجابة (تم إرسالها استجابة للأوامر والاستعلامات) و N للإعلام (إعلام الحدث ، مثل إيقاف تشغيل مستوى الصوت )

لتحقيق هدفي ، اضطررت إلى دراسة وثائق Sony JSON-RPC . كما اتضح فيما بعد ، أتاحت طبيعة JSON-RPC عبر HTTP إمكانية تبسيط المهمة وتقليل مقدار الشفرة.

كان العمل مع JSON-RPC API بسيطًا. خذ ، على سبيل المثال ، الخدمة (النظام) ، الأمر (getPowerStatus) بالإضافة إلى المعلمات (صواب أو خطأ) وقم بتكوين طلب HTTP ، والذي نرسله بعد ذلك إلى التلفزيون.

let body = JSON.stringify({ method: command, id: ++this.id, params: params, version: "1.0", }); return new Promise((resolve, reject) => { fetch('http://' + this.ip + ':' + this.port + '/sony/' + service, { method: 'post', headers: { 'X-Auth-PSK': this.psk }, body: body, }).then(response => { return response.json(); }).then(response => { if (response.error && (!response.result || response.result.length === 0)) { reject({ code: response.error[0] }); } else { resolve(response.result[0]); } }).catch(error => { reject(error); }); }); 

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

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

قم بتشغيل Xbox One


إكس بوكس ​​، بطبيعة الحال ، يتطلب إعدادا مختلفا. يبدو أن Microsoft قررت عدم استخدام واجهة برمجة تطبيقات REST ، لذلك تم إنجاز العمل باستخدام حزم UDP.

لحسن الحظ ، Node.js لديه وحدة نمطية dgram يعمل خارج الصندوق مع جميع ميزات USP. هذا ما حصلت عليه في النهاية.

 turnOn() { let socket = dgram.createSocket('udp4'); let powerPayload = new Buffer('\x00' + String.fromCharCode(this.liveId.length) + this.liveId.toUpperCase() + '\x00'); let powerHeader = Buffer.concat([new Buffer('dd0200', 'hex'), new Buffer(String.fromCharCode(powerPayload.length)), new Buffer('\x00\x00')]); let powerPacket = Buffer.concat([powerHeader, powerPayload]); return this._sendPacket(socket, powerPacket); } _sendPacket(socket, buffer) { return new Promise((resolve, reject) => { socket.send(buffer, 0, buffer.length, Constants.xboxPort, this.ip, function(err) { socket.close(); if (err) { return reject(err); } resolve(); }); }); } 

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

تكوين اختصارات لسيري


لكي تتمكن Siri من تنفيذ الأوامر التي أنشأتها للتو ، فهي بحاجة إلى مساعد. أنا خلقته من Raspberry Pi ، لأن "التوت" مناسب من جميع النواحي. لهذا ، اشتريت Pi 3 Model B + التي تدعم شبكة Wi-Fi.

Raspbian لديه واجهة المستخدم الرسومية لتكوين. قمت بالاتصال بشبكة Wi-Fi ، ثم قمت بإيقاف تشغيل الشاشة واستمرت في العمل على SSH. للتأكد من أن تطبيق الويب نشط باستمرار ، قمت بتكوين مقبس تنشيط الخدمة في systemd ، بحيث إذا تعطلت عملية Node.js ، يمكن للنظام إعادة تشغيله تلقائيًا.

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



وضع كل ذلك معا


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

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

فيما يلي مثال للوحدة النمطية التي تحتوي على Xbox وتليفزيون وتنشيط أول منفذ HDMI.

 router.post('/turnOnXboxAndTV', function(req, res, next) { Promise.all([ xbox.turnOn(), tv.turnOn() .then(() => new Promise(resolve => setTimeout(resolve, 2000))) .then(() => tv.setInput(config.scripts.xboxInput)), ]).then(() => { res.sendStatus(200); }).catch((error) => { res.status(500).send(error); }); }); 

وهنا كيف يعمل كل شيء في الممارسة العملية.


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

توصي Skillbox بما يلي:

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


All Articles