विषयसूची:

रिमोट कंट्रोल से क्रोमकास्ट को रोकें: 5 कदम
रिमोट कंट्रोल से क्रोमकास्ट को रोकें: 5 कदम

वीडियो: रिमोट कंट्रोल से क्रोमकास्ट को रोकें: 5 कदम

वीडियो: रिमोट कंट्रोल से क्रोमकास्ट को रोकें: 5 कदम
वीडियो: How to Fix your Google Chromecast TV Remote in 3 simple steps 2024, जुलाई
Anonim
Image
Image
उपकरण
उपकरण

मेरे पास लॉजिटेक सद्भाव रिमोट है और रास्पबेरी पीआई पर होम सहायक चलाता है।

मैं अपने रिमोट से क्रोमकास्ट को रोकना चाहता था, लेकिन मेरे पास एक पुराना टीवी है जो एचडीएमआई के माध्यम से इसका समर्थन नहीं करता है। मेरा विचार तब ir सिग्नल को पकड़ने और रोकने के लिए NodeMcu का उपयोग करना था।

यदि आप इसे काम पर नहीं ला सकते हैं या आपके कोई प्रश्न हैं तो कृपया नीचे टिप्पणी करें

चरण 1: उपकरण

उपकरण
उपकरण
उपकरण
उपकरण

उपकरण की ज़रूरत:

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

इर रिसीवर (जैसे यह पूर्व:

डुपोंट तार

माइक्रो यूएसबी केबल (पावर नोडएमसीयू)

मैं लॉजिटेक हार्मनी -हब का उपयोग करता हूं

मेरे दृष्टिकोण के लिए आपको hass.io स्थापित और Nodered के साथ रास्पबेरी पाई की आवश्यकता है। मैं यहां होमएसिस्टेंट सामान स्थापित करने में नहीं जाऊंगा। यदि आप होमअसिस्टेंट के अलावा किसी अन्य चीज़ का उपयोग करते हैं तो आपको सामान को स्वयं अनुकूलित करने की आवश्यकता है।

आपको Arduino IDE पर Nodemcu का उपयोग करने में सक्षम होने की आवश्यकता है क्योंकि मैं यहां उस पर नहीं जाऊंगा

चरण 2: रिमोट सिग्नल

रिमोट सिग्नल
रिमोट सिग्नल
रिमोट सिग्नल
रिमोट सिग्नल
रिमोट सिग्नल
रिमोट सिग्नल
रिमोट सिग्नल
रिमोट सिग्नल

जिस तरह से मैंने इसे रिमोट से सिग्नल कॉपी करने के लिए किया था, मैं सद्भाव रिमोट में उपयोग नहीं करता था।

मैंने पैनासोनिक टीवी मॉडल TXL32C3E के लिए एक रिमोट का उपयोग किया क्योंकि यह मेरी पहली मंजिल पर मेरे उपकरण में हस्तक्षेप नहीं करता है। वह एक टीवी है मेरे पास ऊपर है।

यदि आप सद्भाव का उपयोग नहीं करते हैं तो आप इसे छोड़ सकते हैं।

तो सिग्नल खोजने के लिए मैंने इस स्केच का इस्तेमाल किया:

/* * IRremoteESP8266: IRrecvDumpV2 - IRrecv के साथ IR कोड का डंप विवरण * एक IR डिटेक्टर/डिमोडुलेटर इनपुट RECV_PIN से जुड़ा होना चाहिए। * * कॉपीराइट 2009 केन शिरिफ, https://arcfn.com * कॉपीराइट 2017 डेविड कॉनरन * * उदाहरण सर्किट आरेख: * https://arcfn.com * * परिवर्तन: * संस्करण 0.3 नवंबर, 2017 * - ए / सी के लिए समर्थन कुछ प्रोटोकॉल के लिए डिकोडिंग। * संस्करण ०.२ अप्रैल, २०१७ * - डेटा की एक प्रति से डिकोड करें ताकि हम तेजी से कैप्चर करना शुरू कर सकें इस प्रकार * मिसकैप्चर की संभावना को कम करें। * केन शिरिफ के इरसेंडडेमो संस्करण 0.1 जुलाई, 2009 पर आधारित, */

#ifndef UNIT_TEST

#शामिल करें #endif #शामिल करें #शामिल करें #शामिल करें #अगर DECODE_AC शामिल करें

// =================== ट्यून करने योग्य मापदंडों की शुरुआत ==================

// एक IR डिटेक्टर/डिमोडुलेटर GPIO पिन 14 // जैसे से जुड़ा है। एक NodeMCU बोर्ड पर D5। #RECV_पिन 14 परिभाषित करें

// सीरियल कनेक्शन बॉड दर।

// यानी इस बॉड रेट पर पीसी को स्टेटस मैसेज भेजा जाएगा। // 9600 जैसी धीमी गति से बचने की कोशिश करें, क्योंकि आप संदेशों को याद करेंगे और // अन्य समस्याओं का कारण बनेंगे। 115200 (या तेज) की सिफारिश की जाती है। // नोट: सुनिश्चित करें कि आपने अपने सीरियल मॉनिटर को उसी गति से सेट किया है। # परिभाषित करें BAUD_RATE 115200

// चूंकि यह कार्यक्रम एक विशेष उद्देश्य कैप्चर / डिकोडर है, आइए हम एक बड़े का उपयोग करें

// सामान्य बफर की तुलना में इसलिए हम एयर कंडीशनर रिमोट कोड को संभाल सकते हैं। # परिभाषित करें CAPTURE_BUFFER_SIZE 1024

// TIMEOUT Nr है। इससे पहले कि हम a. पर विचार करें, मिली-सेकंड का नो-मोर-डेटा

// संदेश समाप्त हो गया। // यह पैरामीटर एक दिलचस्प ट्रेड-ऑफ है। टाइमआउट जितना लंबा होगा, संदेश उतना ही अधिक जटिल होगा जो इसे कैप्चर कर सकता है। जैसे कुछ डिवाइस प्रोटोकॉल त्वरित उत्तराधिकार में // एकाधिक संदेश पैकेट भेजेंगे, जैसे एयर कंडीशनर रिमोट। // एयर कंडीशनर प्रोटोकॉल में अक्सर // पैकेट के बीच काफी अंतर (20-40+ms) होता है। // बड़े टाइमआउट मान का नकारात्मक पक्ष बहुत कम जटिल प्रोटोकॉल है // रिमोट के बटन को दबाए रखने पर कई संदेश भेजें। // उनके बीच का अंतर अक्सर लगभग 20+ms का भी होता है। इसके परिणामस्वरूप अपरिष्कृत डेटा आवश्यकता से 2-3+//गुना बड़ा हो सकता है क्योंकि इसने एक//कैप्चर में 2-3+ संदेशों को कैप्चर किया है। कम टाइमआउट मान सेट करने से इसका समाधान हो सकता है। // तो, आपके उपयोग विशेष मामले के लिए सबसे अच्छा TIMEOUT मान चुनना // काफी बारीक है। भाग्य अच्छा हो और हंटिंग के लिए बधाई। // नोट: MAX_TIMEOUT_MS से अधिक न हो। आमतौर पर 130 मि. #if DECODE_AC #define TIMEOUT 50U // कुछ A/C यूनिट्स के प्रोटोकॉल में ~40ms का गैप होता है। // जैसे केल्विनेटर // एक मान यह बड़ा कुछ प्रोटोकॉल के दोहराव को निगल सकता है #else // DECODE_AC #define TIMEOUT 15U // अधिकांश संदेशों को सूट करता है, जबकि कई दोहराव को निगलता नहीं है। #endif // DECODE_AC // विकल्प: // #define TIMEOUT 90U // बड़े अंतराल जैसे XMP-1 और कुछ aircon // इकाइयों के साथ संदेशों को सूट करता है, लेकिन गलती से दोहराए गए संदेशों // को rawData आउटपुट में निगल सकता है। // #define TIMEOUT MAX_TIMEOUT_MS // यह इसे हमारे वर्तमान में अनुमत // अधिकतम पर सेट कर देगा। यह उच्च मान समस्याग्रस्त हैं // क्योंकि यह मोटे तौर पर विशिष्ट सीमा है // जहां अधिकांश संदेश दोहराए जाते हैं। // जैसे यह एक संदेश को डिकोड करना बंद कर देगा और // इसे ठीक से सीरियल में भेजना शुरू कर देगा // उस समय जब अगला संदेश प्रसारित होने की संभावना है // और इसे याद कर सकता है।

// सबसे छोटे आकार के "अज्ञात" संदेश पैकेट सेट करें जिनकी हम वास्तव में परवाह करते हैं।

// यह मान IR पृष्ठभूमि की झूठी-सकारात्मक पहचान दर को कम करने में मदद करता है // वास्तविक संदेशों के रूप में शोर। TIMEOUT मान की लंबाई के साथ संदेश के रूप में पृष्ठभूमि IR शोर का पता लगने की संभावना // बढ़ जाती है। (ऊपर देखें) // इस संदेश को बहुत बड़ा सेट करने का नकारात्मक पक्ष यह है कि आप प्रोटोकॉल के लिए कुछ मान्य // लघु संदेशों को याद कर सकते हैं जिन्हें यह पुस्तकालय अभी तक डिकोड नहीं करता है। // // यदि आपको बहुत सारे यादृच्छिक छोटे UNKNOWN संदेश मिलते हैं तो उच्चतर सेट करें जब कुछ भी नहीं // एक संदेश भेजना चाहिए। // यदि आप सुनिश्चित हैं कि आपका सेटअप काम कर रहा है, तो कम सेट करें, लेकिन यह आपके डिवाइस से संदेश // नहीं देखता है। (उदाहरण के लिए अन्य IR रिमोट काम करते हैं।) // नोट: UNKNOWN डिटेक्शन को प्रभावी ढंग से बंद करने के लिए इस मान को बहुत अधिक सेट करें। #define MIN_UNKNOWN_SIZE 12 // ================== ट्यून करने योग्य मापदंडों का अंत ==================

// अधिक पूर्ण कैप्चर कवरेज के लिए सेव बफर सुविधा को चालू करें का उपयोग करें।

IRrecv irrecv (RECV_PIN, CAPTURE_BUFFER_SIZE, TIMEOUT, true);

decode_results परिणाम; // कहीं परिणाम संग्रहीत करने के लिए

// यदि हम कर सकते हैं तो ए / सी संदेश की मानव पठनीय स्थिति प्रदर्शित करें।

शून्य डंपएसीइन्फो (decode_results *results) {स्ट्रिंग विवरण = ""; #if DECODE_DAIKIN अगर (परिणाम-> decode_type == DAIKIN) {IRDaikinESP ac(0); ac.setRaw (परिणाम-> राज्य); विवरण = ac.toString (); } #endif // DECODE_DAIKIN #if DECODE_FUJITSU_AC अगर (परिणाम-> decode_type == FUJITSU_AC) { IRFujitsuAC ac(0); ac.setRaw (परिणाम-> राज्य, परिणाम-> बिट्स / 8); विवरण = ac.toString (); } #endif // DECODE_FUJITSU_AC #if DECODE_KELVINATOR अगर (परिणाम-> decode_type == KELVINATOR) { IRKelvinatorAC ac(0); ac.setRaw (परिणाम-> राज्य); विवरण = ac.toString (); } #endif // DECODE_KELVINATOR #if DECODE_TOSHIBA_AC अगर (परिणाम-> decode_type == TOSHIBA_AC) { IRToshibaAC ac(0); ac.setRaw (परिणाम-> राज्य); विवरण = ac.toString (); } #endif // DECODE_TOSHIBA_AC #if DECODE_MIDEA अगर (परिणाम-> decode_type == MIDEA) { IRMideaAC ac(0); ac.setRaw (परिणाम-> मूल्य); // मिडिया राज्य के बजाय मूल्य का उपयोग करता है। विवरण = ac.toString (); } #endif // DECODE_MIDEA // अगर हमें संदेश का मानव-पठनीय विवरण मिला है, तो उसे प्रदर्शित करें। अगर (विवरण != "") Serial.println ("Mesg Desc.:" + विवरण); }

// कोड का खंड स्टार्ट-अप पर केवल एक बार चलता है।

शून्य सेटअप () { Serial.begin (BAUD_RATE, SERIAL_8N1, SERIAL_TX_ONLY); देरी (500); // सीरियल कनेक्शन स्थापित होने के लिए थोड़ा इंतजार करें।

#अगर DECODE_HASH

// कम से कम दालों को चालू या बंद वाले संदेशों पर ध्यान न दें। ircv.setअज्ञात थ्रेशोल्ड (MIN_UNKNOWN_SIZE); #endif // DECODE_HASH irrecv.enableIRIn (); // रिसीवर शुरू करें}

// कोड का दोहराव अनुभाग

// शून्य लूप () {// जांचें कि क्या आईआर कोड प्राप्त हुआ है। अगर (irrecv.decode(&results)) {// एक क्रूड टाइमस्टैम्प प्रदर्शित करें। uint32_t अब = मिली (); Serial.printf ("टाइमस्टैम्प:% 06u.% 03u / n", अब / 1000, अब% 1000); if (results.overflow) Serial.printf("चेतावनी: IR कोड बफ़र (>= %d) के लिए बहुत बड़ा है। ", CAPTURE_BUFFER_SIZE); // हमने जो पाया उसका मूल आउटपुट प्रदर्शित करें। Serial.print(resultToHumanReadableBasic(&results)); डंपएसीइन्फो (और परिणाम); // यदि हमारे पास कोई अतिरिक्त ए / सी जानकारी है तो उसे प्रदर्शित करें। उपज(); // WDT को फीड करें क्योंकि टेक्स्ट आउटपुट को प्रिंट होने में कुछ समय लग सकता है।

// लाइब्रेरी संस्करण प्रदर्शित करें जिसके साथ संदेश कैप्चर किया गया था।

सीरियल.प्रिंट ("लाइब्रेरी: वी"); Serial.println (_IRREMOTEESP8266_VERSION_); सीरियल.प्रिंट्लन ();

// परिणाम के आउटपुट रॉ समय की जानकारी।

Serial.println(resultToTimingInfo(&results)); उपज(); // WDT फ़ीड (फिर से)

// परिणाम को स्रोत कोड के रूप में आउटपुट करें

Serial.println(resultToSourceCode(&results)); सीरियल.प्रिंट्लन (""); // प्रविष्टियों के बीच रिक्त रेखा उपज (); // WDT को फीड करें (फिर से) } }

जब यह स्केच अपलोड किया जाता है और सीरियल मॉनिटर के साथ चलता है तो यह बटन प्रेस के लिए कोड आउटपुट करेगा (चित्र देखें)

उन कोडों को लिख लें जिन्हें आप बाद में उपयोग के लिए उपयोग करना चाहते हैं। मैंने एक्सेल का उपयोग यह नोट करने के लिए किया कि मुझे उन बटनों के लिए क्या मिला है जिनका मैं उपयोग करना चाहता था (चित्र देखें)

मैंने पैनासोनिक रिमोट से पॉज़ सिग्नल भेजने के लिए अपनी नेटफ्लिक्स गतिविधि में बटन संपादित किए.. (चित्र देखें)

चरण 3: Nodered को भेजने के लिए कोड लिखना

Nodered को भेजने के लिए कोड लिखना
Nodered को भेजने के लिए कोड लिखना

#ifndef UNIT_TEST#शामिल करें #endif #शामिल करें

#शामिल

#शामिल

#शामिल

#शामिल

#शामिल

कास्ट चार * एसएसआईडी = ""; // यहां एसएसआईडी दर्ज करें कॉन्स्ट चार* पासवर्ड = ""; // यहां पासवर्ड दर्ज करें const char *host = ""; // आईपी एड्रेस # परिभाषित करें USE_SERIAL सीरियल ESP8266WiFiMulti WiFiMulti; uint16_t RECV_PIN = 14; IRrecv irrecv (RECV_PIN); decode_results परिणाम; शून्य सेटअप () {ircv.enableIRIn (); // रिसीवर USE_SERIAL.begin (115200) शुरू करें; // USE_SERIAL.setDebugOutput (सच); USE_SERIAL.println (); USE_SERIAL.println (); USE_SERIAL.println ();

for(uint8_t t = 4; t > 0; t--) {

USE_SERIAL.printf ("[सेटअप] WAIT%d…\n", t); USE_SERIAL.flush (); देरी (1000); } वाईफाई.मोड (WIFI_STA); WiFiMulti.addAP (एसएसआईडी, पासवर्ड); } शून्य लूप () { अगर (irrecv.decode(&results)) {

// आपको जो मिला है उसके लिए इस सिग्नल मान को बदलें

अगर (results.value == 0x40040D00606D){ USE_SERIAL.println ("सिग्नल प्राप्त रोकें"); वाईफाईसेंड (रोकें); देरी (1000);

} अगर (results.value == 0x400401007273){

USE_SERIAL.println ("पिछला");

वाईफाईसेंड ("पिछला"); देरी (1000); } अगर (results.value == 0x40040100F2F3){ USE_SERIAL.println ("अगला"); वाईफाईसेंड ("अगला"); देरी (1000); }

अपरिवर्तनीय। फिर से शुरू (); // अगला मान प्राप्त करें} देरी (100); } शून्य वाईफाईसेंड (स्ट्रिंग डेटा) { अगर ((वाईफाईमल्टी.रन () == WL_CONNECTED)) { HTTPClient http; USE_SERIAL.print("[HTTP] start…\n"); // ट्रैज्ड सर्वर को कॉन्फ़िगर करें और url http.begin("https://[user]:[pass]@[ip]:[port]/chromecastpause?data=" + data); USE_SERIAL.print("[HTTP] GET…\n"); // कनेक्शन शुरू करें और HTTP हेडर भेजें int httpCode = http. GET (); // httpCode त्रुटि पर नकारात्मक होगा यदि (httpCode> 0) {// HTTP हेडर भेज दिया गया है और सर्वर प्रतिक्रिया हेडर को USE_SERIAL.printf ("[HTTP] प्राप्त करें … कोड:% d / n", // फ़ाइल सर्वर पर मिली

अगर (httpCode == HTTP_CODE_OK) {स्ट्रिंग पेलोड = http.getString (); USE_SERIAL.println (पेलोड); } } और { USE_SERIAL.printf ("[HTTP] GET… विफल, त्रुटि: %s\n", http.errorToString(httpCode).c_str ()); } http.end (); देरी (100); } }

यह वह कोड है जिसका उपयोग मैंने अपने nodemcu पर किया था। आपको उन पुस्तकालयों को स्थापित करने की आवश्यकता होगी।

आप सीरियल मॉनिटर का उपयोग करके परीक्षण कर सकते हैं और प्रतिक्रिया देखने के लिए कोड में जोड़े गए रिमोट बटन दबा सकते हैं।

कतार में:

http.begin("https://[user]:[pass]@[ip]:[port]/chromecastpause?data=" + data);

आपको [उपयोगकर्ता] को अपने उपयोगकर्ता वगैरह में बदलना होगा। कोष्ठक के बिना। डायन फ़ील्ड को बदलने के लिए दिखाने के लिए कोष्ठक हैं।

वह लाइन भी तब तक काम नहीं करेगी जब तक हम अपने फ्लो को नोडर्ड में सेट नहीं करते।

चरण 4: Nodered में एक प्रवाह बनाना

Nodered में एक प्रवाह बनाना
Nodered में एक प्रवाह बनाना
Nodered में एक प्रवाह बनाना
Nodered में एक प्रवाह बनाना
Nodered में एक प्रवाह बनाना
Nodered में एक प्रवाह बनाना
Nodered में एक प्रवाह बनाना
Nodered में एक प्रवाह बनाना

जैसा कि शुरुआत में बताया गया है कि मैं नोडेड के साथ hass.io का उपयोग करता हूं। यदि आप एक अलग सेटअप चलाते हैं तो आपको इसे अलग बनाना होगा! आप छवि में देख सकते हैं कि जब एक बटन दबाया जाता है तो यह डिबग विंडो में दिखाई देता है…

परिवर्तन पेलोड नोड शायद छोड़ दिया जा सकता था अगर मैंने पिछले चरण में डेटा = कुछ अलग चुना था। मेरे द्वारा उपयोग किया जाने वाला स्विच नोड बहुत बड़ा है, बस रुकें, लेकिन बस इतना है कि मैं रेडियो स्टेशनों आदि के लिए क्रोमकास्ट का उपयोग करने के लिए और अधिक आईआर सिग्नल जोड़ सकता हूं।

केवल प्ले पॉज़ के लिए आप दूसरी तस्वीर में प्रवाह का उपयोग कर सकते हैं।

[{"id":"e6440c30.4a35a", "type":"http in", "z":"869ceb74.0275c8", "name":"", "url":"chromecastpause", "method": "प्राप्त करें", "अपलोड करें": झूठा, "स्वैगरडॉक":"", "एक्स":133, "वाई":98, "वायर्स":

मैंने इसमें से नाम यूजरपास और यूआरएल हटा दिया है ताकि आपको इसे संपादित करने की आवश्यकता हो।

एक स्विच नोड जोड़ें यदि आप केवल विराम से अधिक प्रतिक्रिया करना चाहते हैं (उदाहरण के लिए चित्र देखें)

विराम उपयोग के लिए गृह सहायक नोड में:

नाम: विराम दें

अगले ट्रैक के लिए बस उस नोड को कॉपी करें और सेवा को इसमें संपादित करें: media_next_track और नाम: अगला क्रोमकास्ट

चरण 5: वैकल्पिक एलेक्सा क्रोमकास्ट रोकें

क्रोमकास्ट को रोकने के लिए वैकल्पिक एलेक्सा कमांड जोड़ें:

यहां विकल्पों के लिए है.. आप एक एलेक्सा नोड बना सकते हैं जिसे पॉज़ क्रोमकास्ट कहा जाता है जो क्रोमकास्ट को रोकता है, या आप एक पॉज़ टीवी बना सकते हैं जो वर्तमान सद्भाव गतिविधि की जाँच करता है और उसके आधार पर पॉज़ करता है।

मैं इसे बाद में यहां जोड़ूंगा..

सिफारिश की: