جدول المحتويات:

إيقاف Chromcast بجهاز تحكم عن بعد: 5 خطوات
إيقاف Chromcast بجهاز تحكم عن بعد: 5 خطوات

فيديو: إيقاف Chromcast بجهاز تحكم عن بعد: 5 خطوات

فيديو: إيقاف Chromcast بجهاز تحكم عن بعد: 5 خطوات
فيديو: حل لمشكلات ريموت الكروم كاست من جوجل 2024, يوليو
Anonim
Image
Image
المعدات
المعدات

لدي جهاز تحكم عن بعد من Logitech وأقوم بتشغيل Home Assistant على raspberry pi.

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

إذا لم تتمكن من تشغيله أو لديك أسئلة ، فيرجى التعليق أدناه

الخطوة 1: المعدات

المعدات
المعدات
المعدات
المعدات

المعدات اللازمة:

Nodemcu (https://www.ebay.com/sch/i.html؟_from=R40&_trksid=…

جهاز استقبال الأشعة تحت الحمراء (مثل هذا:

أسلاك دوبونت

كبل USB مصغر (طاقة nodemcu)

يمكنني استخدام Logitech Harmony -hub

بالنسبة لأسلوبي ، فأنت بحاجة إلى Raspberry Pi مع hass.io مثبتًا وإيماءًا لن أخوض في إعداد الأشياء المنزلية هنا. إذا كنت تستخدم شيئًا آخر غير المساعدة المنزلية ، فأنت بحاجة إلى تكييف الأشياء بنفسك.

يجب أن تكون قادرًا على استخدام Nodemcu على Arduino IDE لأنني لن أخوض في ذلك هنا

الخطوة 2: الإشارة عن بعد

إشارة عن بعد
إشارة عن بعد
إشارة عن بعد
إشارة عن بعد
إشارة عن بعد
إشارة عن بعد
إشارة عن بعد
إشارة عن بعد

كانت الطريقة التي قمت بها هي نسخ إشارة من جهاز تحكم عن بعد لا أستخدمها في جهاز التحكم عن بعد.

لقد استخدمت جهاز تحكم عن بعد لطراز تلفزيون باناسونيك TXL32C3E لأن ذلك لا يتداخل مع أجهزتي في الطابق الأول. هذا تلفزيون لدي في الطابق العلوي.

إذا كنت لا تستخدم الانسجام يمكنك تخطي هذا.

لذلك من أجل العثور على الإشارة ، استخدمت هذا scetch:

/ * * IRremoteESP8266: IRrecvDumpV2 - تفاصيل تفريغ أكواد IR باستخدام IRrecv * يجب توصيل كاشف / مزيل تشكيل IR بمدخل RECV_PIN. * * حقوق الطبع والنشر 2009 Ken Shirriff ، https://arcfn.com * حقوق الطبع والنشر 2017 David Conran * * مثال على مخطط الدائرة: * https://arcfn.com * * التغييرات: * الإصدار 0.3 نوفمبر 2017 * - دعم A / C فك لبعض البروتولات. * الإصدار 0.2 أبريل ، 2017 * - فك التشفير من نسخة من البيانات حتى نتمكن من البدء في الالتقاط بشكل أسرع وبالتالي * تقليل احتمالية حدوث أخطاء في الالتقاط. * استنادًا إلى إصدار IrsendDemo الخاص بـ Ken Shirriff 0.1 يوليو ، 2009 ، * /

#ifndef UNIT_TEST

#include #endif #include # include #include #if DECODE_AC #include # include # include # include # include #endif // DECODE_AC

// ===================== بداية المعلمات القابلة للضبط ====================

// يتم توصيل كاشف / مزيل تشكيل بالأشعة تحت الحمراء بـ GPIO pin 14 // على سبيل المثال D5 على لوحة NodeMCU. #define RECV_PIN 14

// معدل البث بالباود للاتصال التسلسلي.

// أي سيتم إرسال رسالة الحالة إلى الكمبيوتر بمعدل الباود هذا. // حاول تجنب السرعات البطيئة مثل 9600 ، حيث ستفقد الرسائل و // تسبب مشاكل أخرى. يوصى باستخدام 115200 (أو أسرع). // ملاحظة: تأكد من ضبط Serial Monitor الخاص بك على نفس السرعة. #define BAUD_RATE 115200

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

// من المخزن المؤقت العادي حتى نتمكن من التعامل مع رموز التحكم عن بعد لمكيف الهواء. #define CAPTURE_BUFFER_SIZE 1024

// TIMEOUT هو رقم Nr. من ملي ثانية من البيانات التي لا تحتاج إلى مزيد من البيانات قبل أن نأخذ في الاعتبار ملف

// انتهت الرسالة. // هذه المعلمة هي مقايضة مثيرة للاهتمام. كلما طالت المهلة ، زادت // تعقيدًا الرسالة التي يمكن التقاطها. على سبيل المثال سترسل بعض بروتوكولات الجهاز // حزم رسائل متعددة في تتابع سريع ، مثل أجهزة التحكم عن بعد لمكيف الهواء. // غالبًا ما تحتوي بروتوكولات Air Coniditioner على فجوة كبيرة (20-40 + مللي ثانية) بين // الحزم. // الجانب السلبي لقيمة المهلة الكبيرة هو الكثير من البروتوكولات الأقل تعقيدًا // إرسال رسائل متعددة عند الضغط على زر جهاز التحكم عن بُعد. غالبًا ما تكون الفجوة بينهما حوالي 20 + مللي ثانية. يمكن أن ينتج عن ذلك أن تكون البيانات الأولية أكبر من 2-3 + // مرات مما هو مطلوب لأنها قد التقطت 2-3 + رسائل في // التقاط واحد. يمكن أن يؤدي تعيين قيمة مهلة منخفضة إلى حل هذه المشكلة. // لذا ، فإن اختيار أفضل قيمة لـ TIMEOUT لحالة معينة لاستخدامك هو // دقيق تمامًا. حظا سعيدا وصيد سعيد. // ملاحظة: لا تتجاوز MAX_TIMEOUT_MS. عادةً 130 مللي ثانية. #if DECODE_AC #define TIMEOUT 50U // بعض وحدات التكييف بها فجوات في بروتوكولاتها تبلغ 40 مللي ثانية تقريبًا. // على سبيل المثال Kelvinator // قيمة بهذا الحجم قد تبتلع تكرار بعض البروتوكولات # آخر // DECODE_AC #define TIMEOUT 15U // يناسب معظم الرسائل ، بينما لا يبتلع الكثير من التكرارات. #endif // DECODE_AC // Alternatives: // #define TIMEOUT 90U // يناسب الرسائل ذات الفجوات الكبيرة مثل XMP-1 وبعض وحدات aircon // ، ولكن يمكنه ابتلاع الرسائل المتكررة عن طريق الخطأ // في إخراج rawData . // #define TIMEOUT MAX_TIMEOUT_MS // سيؤدي ذلك إلى ضبطه على // الحد الأقصى المسموح به حاليًا. القيم بهذا الارتفاع إشكالية // لأنها تقريبًا الحدود النموذجية // حيث تتكرر معظم الرسائل. // على سبيل المثال سيتوقف عن فك تشفير رسالة و // يبدأ إرسالها إلى المسلسل بدقة // في الوقت الذي يحتمل فيه إرسال الرسالة التالية // ، وقد تفوتها.

// قم بتعيين حزم الرسائل "غير المعروفة" الأصغر حجمًا التي نهتم بها بالفعل.

// تساعد هذه القيمة في تقليل معدل الكشف الإيجابي الكاذب لخلفية الأشعة تحت الحمراء // ضوضاء كرسائل حقيقية. فرص اكتشاف ضوضاء الأشعة تحت الحمراء في الخلفية // كرسالة تزداد مع طول قيمة TIMEOUT. (انظر أعلاه) // الجانب السلبي لتعيين هذه الرسالة كبيرة جدًا هو أنه يمكنك تفويت بعض // الرسائل القصيرة الصالحة للبروتوكولات التي لم تقم هذه المكتبة بفك تشفيرها بعد. // // تعيين أعلى إذا تلقيت الكثير من الرسائل غير المعروفة القصيرة العشوائية عندما لا يكون هناك شيء // يجب أن يرسل رسالة. // تعيين أقل إذا كنت متأكدًا من أن الإعداد يعمل ، لكنه لا يرى الرسائل // من جهازك. (على سبيل المثال ، تعمل أجهزة التحكم عن بعد الأخرى بالأشعة تحت الحمراء.) // ملاحظة: عيّن هذه القيمة عالية جدًا لإيقاف اكتشاف UNKNOWN بشكل فعال. #define MIN_UNKNOWN_SIZE 12 // ===================== نهاية معلمات TUNEABLE ====================

// استخدم تشغيل ميزة حفظ المخزن المؤقت للحصول على تغطية التقاط أكثر اكتمالاً.

IRrecv irrecv (RECV_PIN ، CAPTURE_BUFFER_SIZE ، TIMEOUT ، صحيح) ؛

نتائج decode_results ؛ // في مكان ما لتخزين النتائج

// اعرض الحالة التي يمكن قراءتها من قبل الإنسان لرسالة A / C إذا استطعنا.

void dumpACInfo (decode_results * results) {String description = ""؛ #if DECODE_DAIKIN إذا (النتائج-> decode_type == DAIKIN) {IRDaikinESP ac (0) ؛ ac.setRaw (النتائج-> الحالة) ؛ الوصف = ac.toString () ؛ } #endif // DECODE_DAIKIN #if DECODE_FUJITSU_AC if (results-> decode_type == FUJITSU_AC) {IRFujitsuAC ac (0) ؛ ac.setRaw (النتائج-> الحالة ، النتائج-> بت / 8) ؛ الوصف = ac.toString () ؛ } #endif // DECODE_FUJITSU_AC #if DECODE_KELVINATOR if (results-> decode_type == KELVINATOR) {IRKelvinatorAC ac (0) ؛ ac.setRaw (النتائج-> الحالة) ؛ الوصف = ac.toString () ؛ } #endif // DECODE_KELVINATOR #if DECODE_TOSHIBA_AC if (results-> decode_type == TOSHIBA_AC) {IRToshibaAC ac (0) ؛ ac.setRaw (النتائج-> الحالة) ؛ الوصف = ac.toString () ؛ } #endif // DECODE_TOSHIBA_AC #if DECODE_MIDEA if (results-> decode_type == MIDEA) {IRMideaAC ac (0) ؛ ac.setRaw (النتائج-> القيمة) ؛ // يستخدم ميديا القيمة بدلاً من الحالة. الوصف = ac.toString () ؛ } #endif // DECODE_MIDEA // إذا حصلنا على وصف للرسالة يمكن قراءته ، اعرضه. إذا (الوصف! = "") Serial.println ("Mesg Desc.:" + description)؛ }

// يتم تشغيل قسم الكود مرة واحدة فقط عند بدء التشغيل.

إعداد باطل () {Serial.begin (BAUD_RATE، SERIAL_8N1، SERIAL_TX_ONLY) ؛ تأخير (500) ؛ // انتظر قليلاً حتى يتم تأسيس الاتصال التسلسلي.

#if DECODE_HASH

// تجاهل الرسائل التي تحتوي على نبضات تشغيل أو إيقاف تشغيل أقل من الحد الأدنى. irrecv.setUnknownThreshold (MIN_UNKNOWN_SIZE) ، #endif // DECODE_HASH irrecv.enableIRIn () ، // بدء المتلقي}

// قسم التكرار من الكود

// void loop () {// تحقق من استلام كود IR. if (irrecv.decode (& results)) {// عرض طابع زمني خام. uint32_t الآن = ميلي () ؛ Serial.printf ("الطابع الزمني:٪ 06u.٪ 03u / n" ، الآن / 1000 ، الآن٪ 1000) ؛ إذا كانت (results.overflow) Serial.printf ("تحذير: رمز IR كبير جدًا بالنسبة للمخزن المؤقت (> =٪ d)." "لا يجب الوثوق بهذه النتيجة حتى يتم حل ذلك." "تحرير وزيادة CAPTURE_BUFFER_SIZE. / n "، CAPTURE_BUFFER_SIZE) ، // عرض المخرجات الأساسية لما وجدناه. Serial.print (resultToHumanReadableBasic (& results)) ؛ تفريغACInfo (والنتائج) ؛ // اعرض أي معلومات إضافية عن التكييف إذا كانت متوفرة لدينا. أثمر()؛ // قم بتغذية WDT حيث يمكن أن يستغرق إخراج النص بعض الوقت للطباعة.

// عرض إصدار المكتبة الذي تم التقاط الرسالة به.

Serial.print ("Library: v") ؛ Serial.println (_IRREMOTEESP8266_VERSION_) ، Serial.println () ،

// إخراج معلومات توقيت RAW للنتيجة.

Serial.println (resultToTimingInfo (& results)) ؛ أثمر()؛ // تغذية WDT (مرة أخرى)

// إخراج النتائج ككود مصدر

Serial.println (resultToSourceCode (& results)) ؛ Serial.println ("") ؛ // سطر فارغ بين إدخالات العائد () ؛ // تغذية WDT (مرة أخرى)}}

عندما يتم تحميل هذا scetch وتشغيله مع فتح جهاز العرض التسلسلي ، فإنه سيخرج رمز الضغط على الزر (انظر الصورة)

اكتب الرموز التي تريد استخدامها لاستخدامها لاحقًا. لقد استخدمت برنامج Excel لتدوين ما حصلت عليه من الأزرار التي أردت استخدامها (انظر الصورة)

لقد قمت بتحرير الأزرار الموجودة في نشاط Netflix الخاص بي لإرسال إشارة إيقاف مؤقت من جهاز التحكم عن بُعد من باناسونيك.. (انظر الصورة)

الخطوة 3: كتابة الكود للإرسال إلى Nodered

كتابة التعليمات البرمجية للإرسال إلى Nodered
كتابة التعليمات البرمجية للإرسال إلى Nodered

#ifndef UNIT_TEST # include #endif #include

#يشمل

#يشمل

#يشمل

#يشمل

#يشمل

const char * ssid = ""؛ // أدخل SSID hereconst char * password = "" ؛ // أدخل كلمة المرور هنا const char * host = "" ؛ // Ip addresse #define USE_SERIAL Serial ESP8266WiFiMulti WiFiMulti؛ uint16_t RECV_PIN = 14 ؛ IRrecv irrecv (RECV_PIN) ؛ نتائج decode_results ؛ إعداد باطل () {irrecv.enableIRIn () ؛ // بدء المتلقي USE_SERIAL.begin (115200) ؛ // USE_SERIAL.setDebugOutput (صواب) ، USE_SERIAL.println () ، USE_SERIAL.println () ، USE_SERIAL.println () ،

لـ (uint8_t t = 4؛ t> 0؛ t--) {

USE_SERIAL.printf ("[الإعداد] انتظر٪ d… / n"، t)؛ USE_SERIAL.flush () ، تأخير (1000) ؛ } WiFi.mode (WIFI_STA) ، WiFiMulti.addAP (SSID ، كلمة المرور) ؛ } حلقة فارغة () {if (irrecv.decode (& results)) {

// غيّر قيمة الإشارة هذه للذي حصلت عليه

if (results.value == 0x40040D00606D) {USE_SERIAL.println ("pause Signal recieved") ؛ wifisend (وقفة) ؛ تأخير (1000) ؛

} إذا (results.value == 0x400401007273) {

USE_SERIAL.println ("السابقة") ؛

wifisend ("prev") ؛ تأخير (1000) ؛ } if (results.value == 0x40040100F2F3) {USE_SERIAL.println ("next") ؛ wifisend ("التالي") ؛ تأخير (1000) ؛ }

irrecv.resume () ؛ // تلقي القيمة التالية} تأخير (100) ؛ } wifisend باطلة (بيانات سلسلة) {if ((WiFiMulti.run () == WL_CONNECTED)) {HTTPClient http ؛ USE_SERIAL.print ("[HTTP] تبدأ … / n") ؛ // تكوين خادم traged و url http.begin ("https:// [مستخدم]: [تمرير] @ [ip]: [منفذ] / chromecastpause؟ data =" + data)؛ USE_SERIAL.print ("[HTTP] GET… / n") ؛ // بدء الاتصال وإرسال رأس HTTP int httpCode = http. GET () ؛ // سيكون كود http سلبيًا عند الخطأ إذا (httpCode> 0) {// تم إرسال رأس HTTP وتم التعامل مع رأس استجابة الخادم USE_SERIAL.printf ("[HTTP] GET… code:٪ d / n"، httpCode) ؛

// تم العثور على ملف في الخادم

إذا (httpCode == HTTP_CODE_OK) {String payload = http.getString () ؛ USE_SERIAL.println (حمولة) ؛ }} else {USE_SERIAL.printf ("[HTTP] GET… فشل ، خطأ:٪ s / n"، http.errorToString (httpCode).c_str ())؛ } http.end () ؛ تأخير (100) ؛ }}

هذا هو الكود الذي استخدمته في nodemcu الخاص بي. ستحتاج إلى تثبيت هذه المكتبات.

يمكنك الاختبار باستخدام جهاز العرض التسلسلي والضغط على الأزرار البعيدة التي أضفتها في الكود لمعرفة الاستجابة..

على الخط:

http.begin ("https:// [مستخدم]: [تمرير] @ [ip]: [منفذ] / chromecastpause؟ data =" + data)؛

تحتاج إلى تغيير [المستخدم] إلى المستخدم الخاص بك وما إلى ذلك. بدون أقواس. الأقواس هناك لإظهار الساحرة للتغيير.

لن يعمل هذا الخط أيضًا حتى نقوم بإعداد تدفقنا بإيماءة.

الخطوة 4: إنشاء تدفق في Nodered

إنشاء تدفق في Nodered
إنشاء تدفق في Nodered
إنشاء تدفق في Nodered
إنشاء تدفق في Nodered
إنشاء تدفق في Nodered
إنشاء تدفق في Nodered
إنشاء تدفق في Nodered
إنشاء تدفق في Nodered

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

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

لمجرد تشغيل وقفة ، يمكنك استخدام التدفق في الصورة الأخرى.

[{"id": "e6440c30.4a35a"، "type": "http in"، "z": "869ceb74.0275c8"، "name": ""، "url": "chromecastpause"، "الطريقة": "get"، "upload": false، "swaggerDoc": ""، "x": 133، "y": 98، "wires":

لقد قمت بإزالة اسم المستخدم وعنوان url من هذا لذا قد تحتاج إلى تعديل ذلك.

أضف عقدة تبديل إذا كنت تريد الرد على أكثر من مجرد إيقاف مؤقت (انظر الصورة على سبيل المثال)

في عقدة المساعد المنزلي لاستخدام الإيقاف المؤقت:

name: play pause chromecastdomain: media_playerService: media_play_pausedata: {"object_id": "media_player. [جهاز chromecast هنا]"}

للمسار التالي ، ما عليك سوى نسخ هذه العقدة وتعديل الخدمة إلى: media_next_track والاسم إلى: chromecast التالي

الخطوة 5: إيقاف تشغيل Chromecast الاختياري Alexa

اختياري إضافة أمر alexa لإيقاف Chromecast:

هناك خيارات هنا.. يمكنك إنشاء عقدة alexa واحدة تسمى pause chromecast الذي يوقف Chromecast مؤقتًا ،

أو يمكنك عمل جهاز يسمى pause tv الذي يتحقق من نشاط التناغم الحالي ويتوقف مؤقتًا بناءً على ذلك.

سأضيف هذا هنا لاحقًا..

موصى به: