Оглавление:

Приостановить Chromcast с помощью пульта дистанционного управления: 5 шагов
Приостановить Chromcast с помощью пульта дистанционного управления: 5 шагов

Видео: Приостановить Chromcast с помощью пульта дистанционного управления: 5 шагов

Видео: Приостановить Chromcast с помощью пульта дистанционного управления: 5 шагов
Видео: Обзор Chromecast 2020, настройка и мой опыт использования! 2024, Июль
Anonim
Image
Image
Оборудование
Оборудование

У меня есть пульт Logitech Harmony, и я запускаю Home Assistant на Raspberry Pi.

Я хотел иметь возможность приостановить Chromecast с моего пульта дистанционного управления, но у меня есть старый телевизор, который не поддерживает это через hdmi. Моя идея заключалась в том, чтобы использовать NodeMcu, чтобы поймать ИК-сигнал и сделать паузу.

Если вы не можете заставить его работать или у вас есть вопросы, прокомментируйте ниже

Шаг 1: оборудование

Оборудование
Оборудование
Оборудование
Оборудование

Необходимое оборудование:

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

ИК-приемник (например:

dupont провода

Кабель micro usb (power nodemcu)

Я использую Logitech Harmony -hub

Для моего подхода вам понадобится Raspberry pi с установленным и Nodered hass.io. Я не буду вдаваться в настройку домашнего помощника здесь. Если вы используете что-то другое, кроме домашнего помощника, вам нужно адаптировать его самостоятельно.

Вы должны иметь возможность использовать Nodemcu в Arduino IDE, так как я не буду здесь вдаваться в подробности.

Шаг 2: удаленный сигнал

Удаленный сигнал
Удаленный сигнал
Удаленный сигнал
Удаленный сигнал
Удаленный сигнал
Удаленный сигнал
Удаленный сигнал
Удаленный сигнал

Я сделал это так, чтобы скопировать сигнал с пульта дистанционного управления, который я не использую, в пульт Harmony.

Я использовал пульт для модели телевизора Panasonic TXL32C3E, так как он не мешает работе моего оборудования на первом этаже. Это телевизор, который у меня наверху.

Если вы не используете гармонию, вы можете пропустить это.

Итак, для поиска сигнала я использовал этот рисунок:

/ * * IRremoteESP8266: IRrecvDumpV2 - сбросить детали IR кодов с IRrecv * ИК-детектор / демодулятор должен быть подключен к входу RECV_PIN. * * Copyright 2009 Ken Shirriff, https://arcfn.com * Copyright 2017 David Conran * * Пример принципиальной схемы: * https://arcfn.com * * Изменения: * Версия 0.3, ноябрь 2017 г. * - Поддержка A / C расшифровка некоторых протоколов. * Версия 0.2, апрель, 2017 г. * - Декодирование из копии данных, чтобы мы могли начать захват быстрее, что * снижает вероятность ошибочного захвата. * На основе IrsendDemo версии 0.1 Кена Ширрифа, июль 2009 г. * /

#ifndef UNIT_TEST

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

// ==================== начало НАСТРОЙКИ ПАРАМЕТРОВ ====================

// ИК-детектор / демодулятор подключен к контакту 14 GPIO // например. D5 на плате NodeMCU. #define RECV_PIN 14

// Скорость передачи последовательного соединения.

// т.е. сообщение о состоянии будет отправлено на ПК с этой скоростью передачи. // Старайтесь избегать низких скоростей, таких как 9600, так как вы пропустите сообщения и // вызовете другие проблемы. Рекомендуется 115200 (или быстрее). // ПРИМЕЧАНИЕ. Убедитесь, что вы установили для монитора последовательного порта одинаковую скорость. #define BAUD_RATE 115200

// Поскольку эта программа предназначена для захвата / декодирования специального назначения, давайте воспользуемся большим

// чем обычный буфер, чтобы мы могли обрабатывать удаленные коды кондиционера. #define CAPTURE_BUFFER_SIZE 1024

// TIMEOUT - номер. миллисекунд отсутствия данных, прежде чем мы рассмотрим

// сообщение закончилось. // Этот параметр представляет собой интересный компромисс. Чем больше время ожидания, тем // сложнее сообщение, которое он может захватить. например Некоторые протоколы устройств будут отправлять // несколько пакетов сообщений в быстрой последовательности, например, пульты дистанционного управления кондиционера. // Протоколы Air Coniditioner часто имеют значительный промежуток (20-40 + мс) между // пакетами. // Обратной стороной большого значения тайм-аута является множество менее сложных протоколов, // отправляющих несколько сообщений, когда кнопка пульта дистанционного управления удерживается нажатой. Промежуток между ними // часто также составляет около 20 + мс. Это может привести к тому, что необработанные данные будут в 2-3 + // раза больше, чем необходимо, поскольку они захватили 2-3 + сообщения за один // захват. Эту проблему может решить установка низкого значения тайм-аута. // Итак, выбор наилучшего значения TIMEOUT для вашего конкретного случая // довольно тонок. Удачи и счастливой охоты. // ПРИМЕЧАНИЕ: не превышайте MAX_TIMEOUT_MS. Обычно 130 мс. #if DECODE_AC #define TIMEOUT 50U // У некоторых кондиционеров есть пробелы в протоколах ~ 40 мс. // например Kelvinator // Такое большое значение может поглощать повторы некоторых протоколов #else // DECODE_AC #define TIMEOUT 15U // Подходит для большинства сообщений, но не поглощает много повторов. #endif // DECODE_AC // Альтернативы: // #define TIMEOUT 90U // Подходит для сообщений с большими промежутками, таких как XMP-1 и некоторые // устройства кондиционирования воздуха, но может случайно проглотить повторяющиеся сообщения // в выводе rawData . // #define TIMEOUT MAX_TIMEOUT_MS // Это установит его на наш текущий разрешенный // максимум. Такие высокие значения проблематичны, // потому что это примерно типичная граница, // где повторяется большинство сообщений. // например Он прекратит декодирование сообщения и // начнет посылать его по последовательному каналу точно // в то время, когда, вероятно, // будет передано следующее сообщение, и может его пропустить.

// Устанавливаем пакеты сообщений «UNKNOWN» наименьшего размера, которые нам действительно нужны.

// Это значение помогает снизить частоту ложных срабатываний // ИК-фонового шума как реальных сообщений. Вероятность обнаружения фонового ИК-шума // при сообщении увеличивается с увеличением длины значения TIMEOUT. (См. Выше) // Обратной стороной установки слишком большого размера сообщения является то, что вы можете пропустить некоторые допустимые // короткие сообщения для протоколов, которые эта библиотека еще не декодирует. // // Установите выше, если вы получаете много случайных коротких сообщений UNKNOWN, когда ничто // не должно отправлять сообщения. // Установите более низкое значение, если вы уверены, что ваша установка работает, но не видит сообщений // с вашего устройства. (например, работают другие ИК-пульты.) // ПРИМЕЧАНИЕ: Установите это значение очень высоким, чтобы эффективно отключить обнаружение НЕИЗВЕСТНО. #define MIN_UNKNOWN_SIZE 12 // ==================== конец НАСТРОЙКИ ПАРАМЕТРОВ ====================

// Используйте функцию включения буфера сохранения для более полного охвата захвата.

IRrecv irrecv (RECV_PIN, CAPTURE_BUFFER_SIZE, TIMEOUT, истина);

decode_results результаты; // Где-нибудь для хранения результатов

// Отображаем удобочитаемое состояние сообщения A / C, если можем.

void dumpACInfo (decode_results * results) {String description = ""; #if DECODE_DAIKIN if (results-> decode_type == DAIKIN) {IRDaikinESP ac (0); ac.setRaw (результаты-> состояние); description = ac.toString (); } #endif // DECODE_DAIKIN #if DECODE_FUJITSU_AC if (results-> decode_type == FUJITSU_AC) {IRFujitsuAC ac (0); ac.setRaw (результаты-> состояние, результаты-> бит / 8); description = ac.toString (); } #endif // DECODE_FUJITSU_AC #if DECODE_KELVINATOR if (results-> decode_type == KELVINATOR) {IRKelvinatorAC ac (0); ac.setRaw (результаты-> состояние); description = ac.toString (); } #endif // DECODE_KELVINATOR #if DECODE_TOSHIBA_AC if (results-> decode_type == TOSHIBA_AC) {IRToshibaAC ac (0); ac.setRaw (результаты-> состояние); description = ac.toString (); } #endif // DECODE_TOSHIBA_AC #if DECODE_MIDEA if (results-> decode_type == MIDEA) {IRMideaAC ac (0); ac.setRaw (результаты-> значение); // Midea использует значение вместо состояния. description = ac.toString (); } #endif // DECODE_MIDEA // Если у нас есть удобочитаемое описание сообщения, отобразите его. if (description! = "") Serial.println ("Описание сообщения:" + описание); }

// Раздел кода запускается только один раз при запуске.

void setup () {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 () {// Проверяем, получен ли ИК-код. if (irrecv.decode (& results)) {// Отображаем приблизительную временную метку. uint32_t now = millis (); Serial.printf ("Отметка времени:% 06u.% 03u / n", сейчас / 1000, сейчас% 1000); if (results.overflow) Serial.printf («ПРЕДУПРЕЖДЕНИЕ: ИК-код слишком велик для буфера (> =% d).» «Этому результату нельзя доверять, пока проблема не будет решена». «Отредактируйте и увеличьте CAPTURE_BUFFER_SIZE. / n ", CAPTURE_BUFFER_SIZE); // Отображаем основной вывод того, что мы нашли. Serial.print (resultToHumanReadableBasic (& results)); dumpACInfo (& результаты); // Отображаем любую дополнительную информацию об A / C, если она у нас есть. урожай(); // Подача WDT, так как вывод текста на печать может занять некоторое время.

// Отображаем версию библиотеки, в которой было записано сообщение.

Serial.print ("Библиотека: v"); Serial.println (_IRREMOTEESP8266_VERSION_); Serial.println ();

// Выводим информацию о времени в формате RAW для результата.

Serial.println (resultToTimingInfo (& results)); урожай(); // Подача WDT (снова)

// Вывод результатов в виде исходного кода

Serial.println (resultToSourceCode (& результаты)); Serial.println (""); // Пустая строка между записями yield (); // Подача WDT (снова)}}

Когда этот сценарий загружен и запущен с открытым последовательным монитором, он будет выводить код для нажатия кнопки (см. Рисунок).

Запишите коды, которые вы хотите использовать для дальнейшего использования. Я использовал Excel, чтобы записать, что у меня есть для кнопок, которые я хотел использовать (см. Рисунок)

Я отредактировал кнопки в своей деятельности Netflix, чтобы отправить сигнал паузы с пульта panasonic.. (см. Рисунок)

Шаг 3: Написание кода для отправки в Nodered

Написание кода для отправки в Nodered
Написание кода для отправки в Nodered

#ifndef UNIT_TEST # include #endif #include

#включают

#включают

#включают

#включают

#включают

const char * ssid = ""; // Здесь введите SSIDconst char * password = ""; // Введите пароль здесь const char * host = ""; // IP-адрес #define USE_SERIAL Serial ESP8266WiFiMulti WiFiMulti; uint16_t RECV_PIN = 14; IRrecv irrecv (RECV_PIN); decode_results результаты; void setup () {irrecv.enableIRIn (); // Запускаем приемник USE_SERIAL.begin (115200); // USE_SERIAL.setDebugOutput (true); USE_SERIAL.println (); USE_SERIAL.println (); USE_SERIAL.println ();

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

USE_SERIAL.printf ("[НАСТРОЙКА] ПОДОЖДИТЕ% d… / n", t); USE_SERIAL.flush (); задержка (1000); } WiFi.mode (WIFI_STA); WiFiMulti.addAP (ssid, пароль); } void loop () {if (irrecv.decode (& results)) {

// Меняем значение этого сигнала на то, что у вас есть

if (results.value == 0x40040D00606D) {USE_SERIAL.println ("Получен сигнал паузы"); wifisend (пауза); задержка (1000);

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

USE_SERIAL.println ("предыдущий");

wifisend ("пред"); задержка (1000); } если (results.value == 0x40040100F2F3) {USE_SERIAL.println ("следующий"); wifisend ("следующий"); задержка (1000); }

irrecv.resume (); // Получение следующего значения} delay (100); } void wifisend (строковые данные) {if ((WiFiMulti.run () == WL_CONNECTED)) {HTTPClient http; USE_SERIAL.print ("[HTTP] начало… / 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] GET… code:% d / n", // файл найден на сервере

если (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);

Вам нужно изменить [user] на вашего пользователя и так далее. БЕЗ скобок. скобки нужны, чтобы показать поля, которые нужно изменить.

Эта строка также не будет работать, пока мы не настроим наш поток в узлах.

Шаг 4: Создание потока в Nodered

Создание потока в Nodered
Создание потока в Nodered
Создание потока в Nodered
Создание потока в Nodered
Создание потока в Nodered
Создание потока в Nodered
Создание потока в Nodered
Создание потока в Nodered

Как упоминалось в начале, я использую hass.io с nodered. Если вы запустите другую настройку, вам нужно будет изменить ее! Вы можете видеть на изображении, что когда кнопка нажата, она отображается в окне отладки…

Узел изменения полезной нагрузки, вероятно, мог бы быть пропущен, если бы я выбрал что-то другое, чем data = на предыдущем шаге. Узел переключения, который я использую, намного больше, чем просто пауза, но это просто для того, чтобы я мог добавить больше ИК-сигналов, чтобы использовать Chromecast для радиостанций и т. Д.

Для простой паузы воспроизведения вы можете использовать поток на другом изображении.

[{"id": "e6440c30.4a35a", "type": "http in", "z": "869ceb74.0275c8", "name": "", "url": "chromecastpause", "method": «получить», «загрузить»: false, «swaggerDoc»: «», «x»: 133, «y»: 98, «провода»:

Я удалил имя пользователя и URL из этого файла, поэтому вам может потребоваться его отредактировать.

добавьте узел переключения, если вы хотите реагировать не только на паузу (например, см. рисунок)

В узле домашнего помощника для использования паузы:

name: play pause chromecastdomain: media_playerService: media_play_pausedata: {"entity_id": "media_player. [здесь ваш chromecast]"}

для следующего трека просто скопируйте этот узел и отредактируйте сервис в: media_next_track и назовите: next chromecast

Шаг 5. Дополнительный Chromecast с функцией Alexa Pause

Необязательно добавить команду alexa для приостановки Chromecast:

Здесь есть параметры.. Вы можете сделать один узел alexa nnode, называемый pause chromecast, который приостанавливает chromecast, или вы можете сделать так, чтобы оно было названо pause tv, которое проверяет текущую активность гармонии и приостанавливает в зависимости от этого.

Я добавлю это сюда позже..

Рекомендуемые: