Съдържание:

Пауза на Chromcast с дистанционно управление: 5 стъпки
Пауза на Chromcast с дистанционно управление: 5 стъпки

Видео: Пауза на Chromcast с дистанционно управление: 5 стъпки

Видео: Пауза на Chromcast с дистанционно управление: 5 стъпки
Видео: Chromecast built-in: как транслировать контент с вашего устройства на телевизор Haier 2024, Ноември
Anonim
Image
Image
Оборудване
Оборудване

Имам Logitech хармонично дистанционно и изпълнявам Home Assistant на малиново пи.

Исках да мога да поставя пауза на chromecast от дистанционното си, но имам стар телевизор, който не поддържа това чрез hdmi. Идеята ми беше след това да използвам NodeMcu за улавяне на ir сигнала и за пауза.

Ако не можете да го накарате да работи или имате въпроси, моля, коментирайте по -долу

Стъпка 1: Оборудване

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

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

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

Ir reciver (като например това:

кабели dupont

Micro usb кабел (захранващ nodemcu)

Използвам Logitech Harmony -hub

За моя подход имате нужда от Raspberry pi с инсталиран и нодиран hass.io. Няма да влизам в настройка на неща за домашен помощник тук. Ако използвате нещо различно от домашен помощник, трябва сами да адаптирате нещата.

Трябва да можете да използвате Nodemcu в Arduino IDE, тъй като няма да влизам в това тук

Стъпка 2: Отдалечен сигнал

Дистанционен сигнал
Дистанционен сигнал
Дистанционен сигнал
Дистанционен сигнал
Дистанционен сигнал
Дистанционен сигнал
Дистанционен сигнал
Дистанционен сигнал

Начинът, по който го направих, беше да копирам сигнал от дистанционно, което не използвам в хармонично дистанционно.

Използвах дистанционно за телевизионен модел Panasonic TXL32C3E, тъй като това не пречи на моето оборудване на първия ми етаж. Това е телевизор, който имам горе.

Ако не използвате хармония, можете да пропуснете това.

Така че за намиране на сигнала използвах този сценарий:

/ * * IRremoteESP8266: IRrecvDumpV2 - демпфиране на данни за IR кодове с IRrecv * IR детектор/демодулатор трябва да бъде свързан към входа RECV_PIN. * * Авторско право 2009 Кен Шириф, https://arcfn.com * Авторско право 2017 Дейвид Конран * * Примерна електрическа схема: * 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

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

// IR детектор/демодулатор е свързан към GPIO извод 14 // напр. D5 на платка NodeMCU. #дефинирайте RECV_PIN 14

// Скоростта на предаване на серийна връзка.

// т.е. съобщението за състоянието ще бъде изпратено до компютъра с тази скорост на предаване. // Опитайте се да избягвате бавни скорости като 9600, тъй като ще пропуснете съобщения и // ще предизвикате други проблеми. 115200 (или по -бързо) се препоръчва. // ЗАБЕЛЕЖКА: Уверете се, че сте настроили серийния монитор на същата скорост. #дефинирайте BAUD_RATE 115200

// Тъй като тази програма е заснемане/декодиране със специално предназначение, нека използваме по -голям

// от нормалния буфер, за да можем да обработваме кодовете за дистанционно на климатика. #дефинирайте 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 // Някои климатични устройства имат пропуски в своите протоколи от ~ 40ms. // напр. Kelvinator // Стойност, която е толкова голяма, може да погълне повторения на някои протоколи #else // DECODE_AC #define TIMEOUT 15U // Подхожда на повечето съобщения, като същевременно не поглъща много повторения. #endif // DECODE_AC // Алтернативи: // #define TIMEOUT 90U // Подхожда на съобщения с големи пропуски като XMP-1 и някои климатични // единици, но може случайно да погълне повтарящи се съобщения // в изхода rawData . // #define TIMEOUT MAX_TIMEOUT_MS // Това ще го настрои на нашия максимално разрешен в момента //. Високите стойности са проблематични // защото това е приблизително типичната граница //, където повечето съобщения се повтарят. // напр. Той ще спре декодирането на съобщение и // ще започне да го изпраща към сериал точно // времето, когато е вероятно следващото съобщение // да бъде предадено, и може да го пропусне.

// Задайте най -малкия размер на "НЕИЗВЕСТНИ" пакети съобщения, които всъщност ни интересуват.

// Тази стойност помага за намаляване на фалшиво положителния процент на откриване на IR фона // шум като реални съобщения. Шансовете за откриване на фонов IR шум // като съобщение се увеличава с дължината на стойността TIMEOUT. (Вижте по -горе) // Недостатъкът на настройката на това съобщение е твърде голям е, че можете да пропуснете някои // валидни кратки съобщения за протоколи, които тази библиотека все още не декодира. // // Задайте по -високо, ако получавате много случайни кратки НЕИЗВЕСТНИ съобщения, когато нищо // не трябва да изпраща съобщение. // Задайте по -ниско, ако сте сигурни, че настройката ви работи, но не вижда съобщения // от вашето устройство. (напр. Други IR дистанционни работят.) // ЗАБЕЛЕЖКА: Задайте тази стойност много висока, за да изключите ефективно НЕИЗВЕСТНОТО откриване. #define MIN_UNKNOWN_SIZE 12 // ==================== край на НАСТРОЙКИТЕ ПАРАМЕТРИ ====================

// Използвайте включване на функцията за запазване на буфера за по -пълно покритие на заснемането.

IRrecv unrecv (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); // Изчакайте малко, за да се установи серийната връзка.

#ако DECODE_HASH

// Игнорирайте съобщения с по -малко от минимум импулси за включване или изключване. unrecv.setUnknownThreshold (MIN_UNKNOWN_SIZE); #endif // DECODE_HASH unrecv.enableIRIn (); // Стартирайте приемника}

// Повтарящата се част на кода

// void loop () {// Проверете дали е получен IR кодът. if (unrecv.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 (& резултати); // Показваме допълнителна климатична информация, ако я имаме. доходност (); // Подавайте WDT, тъй като извеждането на текст може да отнеме известно време за отпечатване.

// Показване на версията на библиотеката, с която е заснето съобщението.

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

// Извеждане на RAW информация за времето за резултата.

Serial.println (resultToTimingInfo (& резултати)); доходност (); // Захранване на WDT (отново)

// Извеждаме резултатите като изходен код

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

Когато този скеч е качен и работи с отворен сериен монитор, той ще изведе кода за натискане на бутон (вижте снимката)

Запишете кодовете, които искате да използвате за по -късна употреба. Използвах Excel, за да отбележа какво имам за бутоните, които исках да използвам (вижте снимката)

Редактирах бутоните в моята дейност в Netflix, за да изпратя сигнал за пауза от дистанционното управление на Panasonic.. (вижте снимката)

Стъпка 3: Писане на кода за изпращане до Nodered

Писане на кода за изпращане до Nodered
Писане на кода за изпращане до Nodered

#ifndef UNIT_TEST #включват #endif #include

#включва

#включва

#включва

#включва

#включва

const char* ssid = ""; // Въведете SSID тук concon char* password = ""; // Въведете парола тук const char *host = ""; // IP адрес #define USE_SERIAL Serial ESP8266WiFiMulti WiFiMulti; uint16_t RECV_PIN = 14; IRrecv unrecv (RECV_PIN); decode_results резултати; void setup () {unrecv.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 ("[SETUP] WAIT %d… / n", t); USE_SERIAL.flush (); забавяне (1000); } WiFi.mode (WIFI_STA); WiFiMulti.addAP (ssid, парола); } void loop () {if (unrecv.decode (& results)) {

// Променете тази стойност на сигнала за тази, която имате

if (results.value == 0x40040D00606D) {USE_SERIAL.println ("сигнал за пауза получен"); wifisend (пауза); забавяне (1000);

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

USE_SERIAL.println ("предишен");

wifisend ("предишен"); забавяне (1000); } if (results.value == 0x40040100F2F3) {USE_SERIAL.println ("следващ"); wifisend ("следващ"); забавяне (1000); }

unrecv.resume (); // Получаване на следващата стойност} забавяне (100); } void wifisend (String data) {if ((WiFiMulti.run () == WL_CONNECTED)) {HTTPClient http; USE_SERIAL.print ("[HTTP] начало … / n"); // конфигуриране на сървър на трагедия и URL адрес http.begin ("https:// [потребител]: [пас]@[ip]: [порт]/chromecastpause? data =" + данни); USE_SERIAL.print ("[HTTP] ВЗЕМЕТЕ … / n"); // стартиране на връзка и изпращане на HTTP заглавка int httpCode = http. GET (); // httpCode ще бъде отрицателен при грешка, ако (httpCode> 0) {// HTTP заглавието е изпратено и заглавката на отговора на сървъра е обработена USE_SERIAL.printf ("[HTTP] GET… code: %d / n", // файл, намерен на сървъра

if (httpCode == HTTP_CODE_OK) {String payload = http.getString (); USE_SERIAL.println (полезен товар); }} else {USE_SERIAL.printf ("[HTTP] GET… failed, error: %s / n", http.errorToString (httpCode).c_str ()); } http.end (); забавяне (100); }}

Това е кодът, който използвах на моя nodemcu. Ще трябва да имате инсталирани тези библиотеки.

Можете да тествате с помощта на сериен монитор и да натиснете дистанционните бутони, които сте добавили в кода, за да видите отговора.

В реда:

http.begin ("https:// [потребител]: [пас]@[ip]: [порт]/chromecastpause? data =" + данни);

Трябва да промените [потребител] на потребител и така нататък. БЕЗ скоби. скоби са там, за да покажат полета на вещици за промяна.

Този ред също няма да работи, докато не настроим потока си в nodered.

Стъпка 4: Създаване на поток в Nodered

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

Както бе споменато в началото, използвам hass.io с nodered. Ако стартирате различна настройка, ще трябва да направите тази различна! Можете да видите на изображението, че когато се натисне бутон, той се показва в прозореца за отстраняване на грешки …

Възлът на промяна на полезния товар вероятно би могъл да бъде пропуснат, ако бях избрал нещо различно от тези данни = в предишната стъпка. Превключвателният възел, който използвам, е много по -голям от паузата, но това е само за да мога да добавя още IR сигнали, за да използвам chromecast за радиостанции и др.

За просто пауза на възпроизвеждане можете да използвате потока в другата картина.

[{"id": "e6440c30.4a35a", "type": "http in", "z": "869ceb74.0275c8", "name": "", "url": "chromecastpause", "method": "get", "upload": false, "swaggerDoc": "", "x": 133, "y": 98, "проводници":

Премахнах името userpass и url от това, така че може да се наложи да го редактирате.

добавете превключващ възел, ако искате да реагирате на нещо повече от просто пауза (вижте снимката например)

В възела за домашен помощник за пауза при използване:

name: play pause chromecastdomain: media_playerService: media_play_pausedata: {"entity_id": "media_player. [вашият chromecast тук]"}

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

Стъпка 5: По избор Alexa Pause Chromecast

По избор команда за добавяне на alexa за пауза chromecast:

Тук има опции.. Можете да направите един алекса възел, наречен пауза chromecast, който поставя пауза chromecast, или можете да направите такъв, наречен pause tv, който проверява текущата хармонична дейност и прави пауза в зависимост от това.

Ще го добавя тук по -късно..

Препоръчано: