สารบัญ:

หยุด Chromcast ด้วยรีโมทคอนโทรล: 5 ขั้นตอน
หยุด Chromcast ด้วยรีโมทคอนโทรล: 5 ขั้นตอน

วีดีโอ: หยุด Chromcast ด้วยรีโมทคอนโทรล: 5 ขั้นตอน

วีดีโอ: หยุด Chromcast ด้วยรีโมทคอนโทรล: 5 ขั้นตอน
วีดีโอ: Chromecast with Google TV troubleshoot help guide 2024, กรกฎาคม
Anonim
Image
Image
อุปกรณ์
อุปกรณ์

ฉันมีรีโมทของ Logitech Harmony และเรียกใช้ Home Assistant บน Raspberry Pi

ฉันต้องการหยุด Chromecast ชั่วคราวจากรีโมตของฉัน แต่ฉันมีทีวีเครื่องเก่าที่ไม่รองรับสิ่งนี้ผ่าน hdmi ไอเดียของฉันคือใช้ NodeMcu เพื่อจับสัญญาณ ir และหยุดชั่วคราว

หากคุณใช้งานไม่ได้หรือมีคำถามโปรดแสดงความคิดเห็นด้านล่าง

ขั้นตอนที่ 1: อุปกรณ์

อุปกรณ์
อุปกรณ์
อุปกรณ์
อุปกรณ์

อุปกรณ์ที่จำเป็น:

โนเดมคู (https://www.ebay.com/sch/i.html?_from=R40&_trksid=…

Ir reciver (เช่นอดีตนี้:

สายดูปองท์

สายไมโครยูเอสบี (power nodemcu)

ฉันใช้ Logitech Harmony -hub

สำหรับแนวทางของฉัน คุณต้องการ Raspberry pi ที่ติดตั้ง hass.io และ Nodered ฉันจะไม่เข้าไปตั้งค่าผู้ช่วยที่บ้านที่นี่ หากคุณใช้อย่างอื่นที่ไม่ใช่ผู้ช่วยที่บ้าน คุณต้องปรับเปลี่ยนสิ่งต่างๆ ด้วยตัวเอง

คุณต้องสามารถใช้ Nodemcu บน Arduino IDE ได้ เพราะฉันจะไม่เข้าไปที่นี่

ขั้นตอนที่ 2: สัญญาณระยะไกล

สัญญาณรีโมท
สัญญาณรีโมท
สัญญาณรีโมท
สัญญาณรีโมท
สัญญาณรีโมท
สัญญาณรีโมท
สัญญาณรีโมท
สัญญาณรีโมท

วิธีที่ฉันทำคือคัดลอกสัญญาณจากรีโมตที่ฉันไม่ได้ใช้เป็นรีโมตฮาร์โมนี่

ฉันใช้รีโมตสำหรับทีวี panasonic รุ่น TXL32C3E เนื่องจากไม่รบกวนอุปกรณ์ของฉันที่ชั้น 1 นั่นคือทีวีที่ฉันอยู่ชั้นบน

หากคุณไม่ได้ใช้ความสามัคคีคุณสามารถข้ามไปได้

ดังนั้นในการค้นหาสัญญาณ ฉันจึงใช้ 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

// ==================== จุดเริ่มต้นของพารามิเตอร์ที่ปรับแต่งได้ =====================

// ตัวตรวจจับ/ตัวจำลอง IR เชื่อมต่อกับ GPIO pin 14 // เช่น D5 บนบอร์ด NodeMCU #define RECV_PIN 14

// อัตราบอดของการเชื่อมต่อแบบอนุกรม

// เช่น ข้อความสถานะจะถูกส่งไปยังพีซีในอัตราบอดนี้ // พยายามหลีกเลี่ยงความเร็วที่ช้า เช่น 9600 เนื่องจากคุณจะพลาดข้อความและ // ทำให้เกิดปัญหาอื่นๆ ขอแนะนำให้ใช้ 115200 (หรือเร็วกว่า) // หมายเหตุ: ตรวจสอบให้แน่ใจว่าคุณตั้งค่า Serial Monitor เป็นความเร็วเท่ากัน #define BAUD_RATE 115200

// เนื่องจากโปรแกรมนี้เป็นโปรแกรมดักจับ/ถอดรหัสวัตถุประสงค์พิเศษ ให้เราใช้โปรแกรมที่ใหญ่กว่า

// กว่าบัฟเฟอร์ปกติเพื่อให้เราสามารถจัดการกับรหัสรีโมทของเครื่องปรับอากาศได้ #define CAPTURE_BUFFER_SIZE 1024

// TIMEOUT คือ Nr ของมิลลิวินาทีที่ไม่มีข้อมูล ก่อนที่เราจะพิจารณา a

//ข้อความสิ้นสุด // พารามิเตอร์นี้เป็นการแลกเปลี่ยนที่น่าสนใจ ยิ่งหมดเวลานานเท่าไร // ก็ยิ่งทำให้ข้อความซับซ้อนมากขึ้นเท่านั้น เช่น. โปรโตคอลของอุปกรณ์บางอย่างจะส่ง // แพ็กเก็ตข้อความหลายชุดติดต่อกันอย่างรวดเร็ว เช่น รีโมทของเครื่องปรับอากาศ // โปรโตคอล Air Coniditioner มักจะมีช่องว่างมาก (20-40+ms) ระหว่าง // แพ็กเก็ต // ข้อเสียของค่าหมดเวลามากคือโปรโตคอลที่ซับซ้อนน้อยกว่ามาก // ส่งข้อความหลายข้อความเมื่อกดปุ่มของรีโมทค้างไว้ ช่องว่างระหว่าง // มักอยู่ที่ประมาณ 20+ms ซึ่งอาจส่งผลให้ข้อมูลดิบเป็น 2-3+ // มากกว่าที่จำเป็น เนื่องจากได้บันทึกข้อความ 2-3+ ในการจับภาพ // ครั้งเดียว การตั้งค่าระยะหมดเวลาต่ำสามารถแก้ไขปัญหานี้ได้ // ดังนั้น การเลือกค่า TIMEOUT ที่ดีที่สุดสำหรับกรณีการใช้งานของคุณโดยเฉพาะคือ // ค่อนข้างเหมาะสมยิ่ง ขอให้โชคดีและการล่าสัตว์อย่างมีความสุข // หมายเหตุ: ไม่เกิน MAX_TIMEOUT_MS โดยปกติ 130ms #if DECODE_AC #define TIMEOUT 50U // A/C บางยูนิตมีช่องว่างในโปรโตคอลประมาณ 40ms // เช่น. Kelvinator // ค่าขนาดใหญ่นี้อาจกลืนการทำซ้ำของโปรโตคอลบางตัว #else // DECODE_AC #define TIMEOUT 15U // เหมาะกับข้อความส่วนใหญ่ โดยไม่กลืนซ้ำหลายๆ ครั้ง #endif // DECODE_AC // ทางเลือก: // #define TIMEOUT 90U // เหมาะกับข้อความที่มีช่องว่างขนาดใหญ่ เช่น XMP-1 และเครื่องปรับอากาศบางส่วน // หน่วย แต่สามารถกลืนข้อความซ้ำโดยไม่ได้ตั้งใจ // ในเอาต์พุต rawData // #define TIMEOUT MAX_TIMEOUT_MS // สิ่งนี้จะตั้งค่าเป็นค่าสูงสุดที่เราอนุญาตในปัจจุบัน // สูงสุด ค่าที่สูงนี้เป็นปัญหา // เนื่องจากเป็นขอบเขตทั่วไป // ที่ข้อความส่วนใหญ่เกิดซ้ำ // เช่น. จะหยุดถอดรหัสข้อความและ // เริ่มส่งไปยังซีเรียลอย่างแม่นยำ // เวลาที่ข้อความถัดไปมีแนวโน้มว่าจะ // จะถูกส่งและอาจพลาด

// ตั้งค่าแพ็กเก็ตข้อความ "UNKNOWN" ที่มีขนาดเล็กที่สุดที่เราสนใจจริงๆ

// ค่านี้ช่วยลดอัตราการตรวจจับเท็จบวกของพื้นหลัง IR // สัญญาณรบกวนเป็นข้อความจริง โอกาสของการตรวจจับสัญญาณรบกวน IR พื้นหลัง // เมื่อข้อความเพิ่มขึ้นตามความยาวของค่า TIMEOUT (ดูด้านบน) // ข้อเสียของการตั้งค่าข้อความนี้ให้ใหญ่เกินไปคือ คุณอาจพลาดบางข้อความที่ถูกต้อง // ข้อความสั้นสำหรับโปรโตคอลที่ไลบรารีนี้ยังไม่ได้ถอดรหัส // // ตั้งค่าให้สูงขึ้นหากคุณได้รับข้อความ UNKNOWN สั้นๆ แบบสุ่มจำนวนมากโดยที่ไม่มีอะไร // ควรจะส่งข้อความ // ตั้งค่าให้ต่ำลงหากคุณแน่ใจว่าการตั้งค่าของคุณใช้งานได้ แต่ไม่เห็นข้อความ // จากอุปกรณ์ของคุณ (เช่น รีโมท IR อื่นๆ ใช้งานได้) // หมายเหตุ: ตั้งค่านี้ให้สูงมากเพื่อปิดการตรวจจับ UNKNOWN อย่างมีประสิทธิภาพ #define MIN_UNKNOWN_SIZE 12 // ==================== สิ้นสุดพารามิเตอร์ที่ปรับแต่งได้ =====================

// ใช้เปิดฟีเจอร์บันทึกบัฟเฟอร์เพื่อให้ครอบคลุมการดักจับที่สมบูรณ์ยิ่งขึ้น

IRrecv irrecv(RECV_PIN, CAPTURE_BUFFER_SIZE, TIMEOUT, จริง);

ผลลัพธ์ decode_results; // ที่ไหนสักแห่งที่จะเก็บผลลัพธ์

// แสดงสถานะที่มนุษย์สามารถอ่านได้ของข้อความ A/C หากเราทำได้

เป็นโมฆะ dumpACInfo (decode_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(results->state, results->bits / 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) { IRtohibaAC ac (0); ac.setRaw(ผลลัพธ์->สถานะ); คำอธิบาย = ac.toString(); } #endif // DECODE_TOSHIBA_AC #if DECODE_MIDEA ถ้า (ผลลัพธ์ -> decode_type == MIDEA) { IRMideaAC ac (0); ac.setRaw(ผลลัพธ์->ค่า); // Midea ใช้ค่าแทนสถานะ คำอธิบาย = ac.toString(); } #endif // DECODE_MIDEA // หากเราได้รับคำอธิบายข้อความที่มนุษย์สามารถอ่านได้ ให้แสดงข้อความนั้น if (description != "") Serial.println("Mesg Desc.: " + คำอธิบาย); }

// ส่วนของรหัสทำงานเพียงครั้งเดียวเมื่อเริ่มต้น

การตั้งค่าเป็นโมฆะ () { Serial.begin (BAUD_RATE, SERIAL_8N1, SERIAL_TX_ONLY); ล่าช้า (500); // รอสักครู่เพื่อให้การเชื่อมต่อแบบอนุกรมถูกสร้างขึ้น

#ถ้า DECODE_HASH

// ละเว้นข้อความที่มีพัลส์เปิดหรือปิดน้อยกว่าขั้นต่ำ irrecv.setUnknownThreshold(MIN_UNKNOWN_SIZE); #endif // DECODE_HASH irrecv.enableIRIn(); // เริ่มเครื่องรับ }

// ส่วนซ้ำของรหัส

// void loop() { // ตรวจสอบว่าได้รับรหัส IR หรือไม่ if (irrecv.decode (&results)) { // แสดงการประทับเวลาคร่าวๆ uint32_t ตอนนี้ = millis(); Serial.printf("Timestamp: %06u.%03u\n", ตอนนี้ / 1000, ตอนนี้ % 1000); if (results.overflow) Serial.printf("คำเตือน: รหัส IR ใหญ่เกินไปสำหรับบัฟเฟอร์ (>= %d) " "ไม่ควรเชื่อถือผลลัพธ์นี้จนกว่าจะได้รับการแก้ไข " "แก้ไขและเพิ่ม CAPTURE_BUFFER_SIZE.\n ", CAPTURE_BUFFER_SIZE); // แสดงผลลัพธ์พื้นฐานของสิ่งที่เราพบ Serial.print(resultToHumanReadableBasic(&ผล)); dumpACInfo(&ผลลัพธ์); // แสดงข้อมูล A/C เพิ่มเติมหากเรามี ผลผลิต(); // ป้อน WDT เนื่องจากข้อความที่ส่งออกอาจใช้เวลาสักครู่ในการพิมพ์

// แสดงเวอร์ชันไลบรารีที่ข้อความถูกจับด้วย

Serial.print("ห้องสมุด: v"); Serial.println(_IRREMOTEESP8266_VERSION_); Serial.println();

// ส่งออกข้อมูลเวลา RAW ของผลลัพธ์

Serial.println(resultToTimingInfo(&ผล)); ผลผลิต(); // ป้อน WDT (อีกครั้ง)

// ส่งออกผลลัพธ์เป็นซอร์สโค้ด

Serial.println(resultToSourceCode(&ผล)); Serial.println(""); // บรรทัดว่างระหว่างรายการให้ผลตอบแทน (); // ป้อน WDT (อีกครั้ง) } }

เมื่อ scetch นี้ถูกอัปโหลดและทำงานโดยเปิดมอนิเตอร์แบบอนุกรม มันจะส่งออกรหัสสำหรับการกดปุ่ม (ดูรูป)

จดรหัสที่คุณต้องการใช้ในภายหลัง ฉันใช้ excel เพื่อจดบันทึกสิ่งที่ฉันได้สำหรับปุ่มที่ฉันต้องการใช้ (ดูรูป)

ฉันแก้ไขปุ่มในกิจกรรม Netflix ของฉันเพื่อส่งสัญญาณหยุดชั่วคราวจากรีโมท panasonic.. (ดูรูป)

ขั้นตอนที่ 3: การเขียนโค้ดสำหรับส่งไปยัง Nodered

การเขียนโค้ดเพื่อส่งไปยัง Nodered
การเขียนโค้ดเพื่อส่งไปยัง Nodered

#ifndef UNIT_TEST#include #endif #include

#รวม

#รวม

#รวม

#รวม

#รวม

const ถ่าน* ssid = ""; // ป้อน SSID ที่นี่const char* password = ""; //ป้อนรหัสผ่านที่นี่ const char *host = ""; //ที่อยู่ IP #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 เสื้อ = 4; t > 0; t--) {

USE_SERIAL.printf("[SETUP] รอ %d…\n", t); USE_SERIAL.flush(); ล่าช้า (1000); } WiFi.mode (WIFI_STA); WiFiMulti.addAP(ssid, รหัสผ่าน); } วงเป็นโมฆะ () { ถ้า (irrecv.decode (&ผลลัพธ์)) {

// เปลี่ยนค่าสัญญาณนี้สำหรับค่าที่คุณได้รับ

ถ้า (results.value == 0x40040D00606D) { USE_SERIAL.println ("หยุดรับสัญญาณชั่วคราว"); wifisend(หยุดชั่วคราว); ล่าช้า (1000);

} if (results.value == 0x400401007273){

USE_SERIAL.println("ก่อนหน้า");

wifisend("ก่อนหน้า"); ล่าช้า (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://[user]:[pass]@[ip]:[port]/chromecastpause?data=" + data); USE_SERIAL.print("[HTTP] รับ…\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://[ผู้ใช้]:[pass]@[ip]:[port]/chromecastpause?data=" + data);

คุณต้องเปลี่ยน [ผู้ใช้] เป็นผู้ใช้ของคุณเป็นต้น ไม่มีวงเล็บ มีวงเล็บเพื่อแสดงทุ่งแม่มดที่จะเปลี่ยน

บรรทัดนั้นจะไม่ทำงานจนกว่าเราจะตั้งค่าโฟลว์ของเราเป็นโหนด

ขั้นตอนที่ 4: การสร้างโฟลว์ใน Nodered

การสร้างกระแสใน Nodered
การสร้างกระแสใน Nodered
การสร้างกระแสใน Nodered
การสร้างกระแสใน Nodered
การสร้างกระแสใน Nodered
การสร้างกระแสใน Nodered
การสร้างกระแสใน Nodered
การสร้างกระแสใน Nodered

ดังที่กล่าวไว้ในตอนต้นฉันใช้ hass.io กับ nodered หากคุณใช้การตั้งค่าอื่น คุณจะต้องทำให้การตั้งค่านี้แตกต่างออกไป! คุณสามารถเห็นในภาพว่าเมื่อกดปุ่มจะแสดงในหน้าต่างดีบั๊ก…

การเปลี่ยนแปลง payload node อาจจะถูกข้ามไป ถ้าฉันเลือกบางอย่างที่ต่างไปจาก data= ในขั้นตอนก่อนหน้า โหนดสวิตช์ที่ฉันใช้นั้นใหญ่กว่าเพียงแค่หยุดชั่วคราว แต่นั่นเป็นเพียงเพื่อให้ฉันสามารถเพิ่มสัญญาณ ir เพิ่มเติมเพื่อใช้ Chromecast สำหรับสถานีวิทยุ ฯลฯ

สำหรับการหยุดเล่นชั่วคราวคุณสามารถใช้โฟลว์ในรูปภาพอื่นได้

[{"id":"e6440c30.4a35a", "type":"http in", "z":"869ceb74.0275c8", "name":"", "url":"chromecastpause", "method": "get", "upload":false, "swaggerDoc":"", "x":133, "y":98, "wires":

ฉันลบชื่อผู้ใช้และ url ออกจากสิ่งนี้ ดังนั้นคุณอาจต้องแก้ไข

เพิ่มโหนดสวิตช์หากคุณต้องการตอบสนองมากกว่าแค่หยุดชั่วคราว (ดูรูปตัวอย่าง)

ในโหนดผู้ช่วยภายในบ้านสำหรับการหยุดชั่วคราว:

ชื่อ: play หยุดชั่วคราว chromecastdomain: media_playerService: media_play_pausedata: { "entity_id": "media_player.[your chromecast here]" }

สำหรับแทร็กถัดไปเพียงคัดลอกโหนดนั้นและแก้ไขบริการไปที่: media_next_track และตั้งชื่อไปที่: chromecast ถัดไป

ขั้นตอนที่ 5: ตัวเลือก Alexa หยุดชั่วคราว Chromecast

คำสั่งเพิ่ม alexa ทางเลือกสำหรับการหยุด Chromecast ชั่วคราว:

มีตัวเลือกอยู่ที่นี่.. คุณสามารถสร้าง alexa nnode หนึ่งตัวที่เรียกว่า chromecast ที่หยุดชั่วคราว chromecast

หรือคุณสามารถสร้างรายการที่เรียกว่าหยุดชั่วคราวทีวีซึ่งจะตรวจสอบกิจกรรมความสามัคคีในปัจจุบันและหยุดชั่วคราวขึ้นอยู่กับว่า

ฉันจะเพิ่มที่นี่ในภายหลัง..

แนะนำ: