Índice:

Pausar o Chromcast com um controle remoto: 5 etapas
Pausar o Chromcast com um controle remoto: 5 etapas
Anonim
Image
Image
Equipamento
Equipamento

Eu tenho um controle remoto Logitech Harmony e executo o Home Assistant em um framboesa pi.

Eu queria ser capaz de pausar o chromecast do meu controle remoto, mas tenho uma TV antiga que não suporta isso por meio de HDMI. Minha ideia era usar um NodeMcu para captar o sinal de IR e fazer uma pausa.

Se você não conseguir fazer funcionar ou tiver dúvidas, comente abaixo

Etapa 1: Equipamento

Equipamento
Equipamento
Equipamento
Equipamento

Equipamento necessário:

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

Ir receptor (como por exemplo:

fios dupont

Cabo micro usb (power nodemcu)

Eu uso Logitech Harmony -hub

Para minha abordagem, você precisa de um pi Raspberry com hass.io instalado e Nodered. Se você usar algo diferente de homeassistant, você precisará adaptar as coisas você mesmo.

Você precisa ser capaz de usar o Nodemcu no IDE do Arduino, pois não entrarei nisso aqui

Etapa 2: Sinal Remoto

Sinal Remoto
Sinal Remoto
Sinal Remoto
Sinal Remoto
Sinal Remoto
Sinal Remoto
Sinal Remoto
Sinal Remoto

Eu fiz isso copiando um sinal de um controle remoto que não uso para um controle remoto de harmonia.

Usei um controle remoto para a tv Panasonic modelo TXL32C3E, pois não interfere no meu equipamento no primeiro andar. Isso é uma tv que tenho lá em cima.

Se você não usa harmonia, pode pular isso.

Então, para encontrar o sinal, usei este scetch:

/ * * IRremoteESP8266: IRrecvDumpV2 - despeja detalhes de códigos IR com IRrecv * Um detector / demodulador IR deve ser conectado à entrada RECV_PIN. * * Copyright 2009 Ken Shirriff, https://arcfn.com * Copyright 2017 David Conran * * Diagrama de circuito de exemplo: * https://arcfn.com * * Mudanças: * Versão 0.3 de novembro de 2017 * - Suporte para A / C decodificação para alguns protocolos. * Versão 0.2 abril de 2017 * - Decodifique a partir de uma cópia dos dados para que possamos começar a capturar mais rapidamente, * reduzindo assim a probabilidade de erros de captura. * Baseado no IrsendDemo de Ken Shirriff versão 0.1 julho de 2009, * /

#ifndef UNIT_TEST

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

// ====================== início dos PARÂMETROS TUNEABLE ====================

// Um detector / desmodulador IR é conectado ao pino 14 GPIO // por exemplo, D5 em uma placa NodeMCU. # define RECV_PIN 14

// A taxa de transmissão da conexão serial.

// ou seja, a mensagem de status será enviada ao PC nesta taxa de transmissão. // Tente evitar velocidades lentas como 9600, pois você perderá mensagens e // causará outros problemas. 115200 (ou mais rápido) é recomendado. // NOTA: Certifique-se de configurar seu Monitor Serial para a mesma velocidade. # define BAUD_RATE 115200

// Como este programa é uma captura / decodificador de propósito especial, vamos usar um maior

// do que o buffer normal para que possamos lidar com os códigos remotos do ar condicionado. #define CAPTURE_BUFFER_SIZE 1024

// TIMEOUT é o Nr. de milissegundos de no-more-data antes de considerarmos um

// mensagem encerrada. // Este parâmetro é uma troca interessante. Quanto maior o tempo limite, mais // complexa é a mensagem que ele pode capturar. por exemplo. Alguns protocolos de dispositivo enviarão // vários pacotes de mensagens em rápida sucessão, como controles remotos de ar condicionado. // Os protocolos do Air Coniditioner geralmente têm uma lacuna considerável (20-40 + ms) entre // os pacotes. // A desvantagem de um grande valor de tempo limite são muitos protocolos menos complexos // enviam várias mensagens quando o botão do controle remoto é pressionado. A lacuna entre // eles geralmente é também em torno de 20 + ms. Isso pode fazer com que os dados brutos sejam 2-3+ // vezes maiores do que o necessário, pois capturaram 2-3+ mensagens em uma única // captura. Definir um valor de tempo limite baixo pode resolver isso. // Portanto, escolher o melhor valor de TIMEOUT para seu caso particular de uso é // bastante matizado. Boa sorte e boa caçada. // NOTA: Não exceda MAX_TIMEOUT_MS. Normalmente 130 ms. #if DECODE_AC #define TIMEOUT 50U // Algumas unidades A / C têm lacunas em seus protocolos de ~ 40ms. // por exemplo. Kelvinator // Um valor tão grande pode engolir repetições de alguns protocolos #else // DECODE_AC #define TIMEOUT 15U // Adequado para a maioria das mensagens, embora não engula muitas repetições. #endif // DECODE_AC // Alternatives: // #define TIMEOUT 90U // Adequa-se a mensagens com grandes lacunas como XMP-1 e algumas unidades // de ar condicionado, mas pode engolir acidentalmente mensagens repetidas // na saída rawData . // #define TIMEOUT MAX_TIMEOUT_MS // Isso irá configurá-lo para o nosso máximo permitido atualmente. Valores tão altos são problemáticos // porque é aproximadamente o limite // típico onde a maioria das mensagens se repete. // por exemplo. Ele irá parar de decodificar uma mensagem e // começará a enviá-la para serial precisamente // no momento em que a próxima mensagem for provavelmente // transmitida, e pode perdê-la.

// Defina os pacotes de mensagens "DESCONHECIDOS" de menor tamanho com os quais realmente nos importamos.

// Este valor ajuda a reduzir a taxa de detecção de falso positivo de ruído de // fundo IV como mensagens reais. As chances de ruído IV de fundo ser detectado // à medida que uma mensagem aumenta com a duração do valor TIMEOUT. (Veja acima) // A desvantagem de definir esta mensagem muito grande é que você pode perder algumas // mensagens curtas válidas para protocolos que esta biblioteca ainda não decodificou. // // Defina mais alto se você receber muitas mensagens curtas e aleatórias DESCONHECIDAS quando nada // deveria estar enviando uma mensagem. // Defina mais baixo se tiver certeza de que sua configuração está funcionando, mas não vê mensagens // de seu dispositivo. (por exemplo, outros controles remotos IR funcionam.) // NOTA: Defina este valor muito alto para desativar a detecção de DESCONHECIDO com eficácia. #define MIN_UNKNOWN_SIZE 12 // ==================== fim dos PARÂMETROS TUNEABLE ====================

// Use o recurso de salvar buffer para uma cobertura de captura mais completa.

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

resultados de decode_results; // Algum lugar para armazenar os resultados

// Exibe o estado legível de uma mensagem A / C, se possível.

void dumpACInfo (decode_results * results) {String description = ""; #if DECODE_DAIKIN if (results-> decode_type == DAIKIN) {IRDaikinESP ac (0); ac.setRaw (resultados-> estado); descrição = ac.toString (); } #endif // DECODE_DAIKIN #if DECODE_FUJITSU_AC if (resultados-> decode_type == FUJITSU_AC) {IRFujitsuAC ac (0); ac.setRaw (resultados-> estado, resultados-> bits / 8); descrição = ac.toString (); } #endif // DECODE_FUJITSU_AC #if DECODE_KELVINATOR if (resultados-> decode_type == KELVINATOR) {IRKelvinatorAC ac (0); ac.setRaw (resultados-> estado); descrição = ac.toString (); } #endif // DECODE_KELVINATOR #if DECODE_TOSHIBA_AC if (resultados-> decode_type == TOSHIBA_AC) {IRToshibaAC ac (0); ac.setRaw (resultados-> estado); descrição = ac.toString (); } #endif // DECODE_TOSHIBA_AC #if DECODE_MIDEA if (results-> decode_type == MIDEA) {IRMideaAC ac (0); ac.setRaw (resultados-> valor); // Midea usa valor em vez de estado. descrição = ac.toString (); } #endif // DECODE_MIDEA // Se obtivermos uma descrição legível da mensagem, exiba-a. if (descrição! = "") Serial.println ("Mesg Desc.:" + descrição); }

// A seção do código é executada apenas uma vez na inicialização.

void setup () {Serial.begin (BAUD_RATE, SERIAL_8N1, SERIAL_TX_ONLY); atraso (500); // Espere um pouco até que a conexão serial seja estabelecida.

#if DECODE_HASH

// Ignora mensagens com menos do que o mínimo de pulsos de ativação ou desativação. irrecv.setUnknownThreshold (MIN_UNKNOWN_SIZE); #endif // DECODE_HASH irrecv.enableIRIn (); // Inicie o receptor}

// A seção de repetição do código

// void loop () {// Verifique se o código IR foi recebido. if (irrecv.decode (& results)) {// Exibe um carimbo de data / hora bruto. uint32_t agora = millis (); Serial.printf ("Timestamp:% 06u.% 03u / n", agora / 1000, agora% 1000); if (results.overflow) Serial.printf ("AVISO: o código IR é muito grande para o buffer (> =% d)." "Este resultado não deve ser confiável até que seja resolvido." "Edite e aumente CAPTURE_BUFFER_SIZE. / n ", CAPTURE_BUFFER_SIZE); // Exibe a saída básica do que encontramos. Serial.print (resultToHumanReadableBasic (& results)); dumpACInfo (& resultados); // Exibe qualquer informação extra do A / C, se houver. produção(); // Alimente o WDT, pois a saída de texto pode demorar um pouco para ser impressa.

// Exibe a versão da biblioteca com a qual a mensagem foi capturada.

Serial.print ("Biblioteca: v"); Serial.println (_IRREMOTEESP8266_VERSION_); Serial.println ();

// Gera informações de tempo RAW do resultado.

Serial.println (resultToTimingInfo (& results)); produção(); // Alimente o WDT (novamente)

// Envie os resultados como código-fonte

Serial.println (resultToSourceCode (& results)); Serial.println (""); // Linha em branco entre as entradas yield (); // Alimente o WDT (novamente)}}

Quando este scetch é carregado e executado com o monitor serial aberto, ele gerará o código para pressionar o botão (veja a imagem)

Anote os códigos que deseja usar para uso posterior. Eu usei o Excel para anotar o que eu tenho para os botões que eu queria usar (veja a imagem)

Eu editei os botões em minha atividade Netflix para enviar sinal de pausa do controle remoto panasonic.. (veja a imagem)

Etapa 3: escrever o código para enviar para Nodered

Escrevendo o código para enviar para Nodered
Escrevendo o código para enviar para Nodered

#ifndef UNIT_TEST # include #endif #include

#incluir

#incluir

#incluir

#incluir

#incluir

const char * ssid = ""; // Insira o SSID hereconst char * password = ""; // Insira a senha aqui const char * host = ""; // endereço IP #define USE_SERIAL Serial ESP8266WiFiMulti WiFiMulti; uint16_t RECV_PIN = 14; IRrecv irrecv (RECV_PIN); resultados de decode_results; void setup () {irrecv.enableIRIn (); // Iniciar o receptor USE_SERIAL.begin (115200); // USE_SERIAL.setDebugOutput (true); USE_SERIAL.println (); USE_SERIAL.println (); USE_SERIAL.println ();

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

USE_SERIAL.printf ("[SETUP] ESPERE% d… / n", t); USE_SERIAL.flush (); atraso (1000); } WiFi.mode (WIFI_STA); WiFiMulti.addAP (ssid, senha); } void loop () {if (irrecv.decode (& results)) {

// Altere este valor de sinal para o que você obteve

if (results.value == 0x40040D00606D) {USE_SERIAL.println ("pausa Sinal recebido"); wifisend (pausa); atraso (1000);

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

USE_SERIAL.println ("anterior");

wifisend ("anterior"); atraso (1000); } if (results.value == 0x40040100F2F3) {USE_SERIAL.println ("próximo"); wifisend ("próximo"); atraso (1000); }

irrecv.resume (); // Recebe o próximo valor} delay (100); } void wifisend (dados String) {if ((WiFiMulti.run () == WL_CONNECTED)) {HTTPClient http; USE_SERIAL.print ("[HTTP] começar… / n"); // configurar servidor traged e url http.begin ("https:// [usuário]: [passar] @ [ip]: [porta] / chromecastpause? dados =" + dados); USE_SERIAL.print ("[HTTP] GET… / n"); // inicia a conexão e envia o cabeçalho HTTP int httpCode = http. GET (); // httpCode será negativo em caso de erro se (httpCode> 0) {// o cabeçalho HTTP foi enviado e o cabeçalho de resposta do servidor foi manipulado USE_SERIAL.printf ("[HTTP] GET… código:% d / n", // arquivo encontrado no servidor

if (httpCode == HTTP_CODE_OK) {Carga útil da string = http.getString (); USE_SERIAL.println (carga útil); }} else {USE_SERIAL.printf ("[HTTP] GET… falhou, erro:% s / n", http.errorToString (httpCode).c_str ()); } http.end (); atraso (100); }}

Este é o código que usei no meu nodemcu. Você precisará ter essas bibliotecas instaladas.

Você pode testar usando o monitor serial e pressionar os botões remotos que você adicionou no código para ver a resposta.

Na linha:

http.begin ("https:// [usuário]: [passagem] @ [ip]: [porta] / chromecastpause? dados =" + dados);

Você precisa alterar [usuário] para seu usuário e assim por diante. SEM colchetes. os colchetes estão lá para mostrar os campos de bruxa a serem alterados.

Essa linha também não funcionará até que configuremos nosso fluxo em nodered.

Etapa 4: Criando um fluxo em Nodered

Criando um fluxo em Nodered
Criando um fluxo em Nodered
Criando um fluxo em Nodered
Criando um fluxo em Nodered
Criando um fluxo em Nodered
Criando um fluxo em Nodered
Criando um fluxo em Nodered
Criando um fluxo em Nodered

Conforme mencionado no início, eu uso hass.io com nodered. Se você executar uma configuração diferente, precisará torná-la diferente! Você pode ver na imagem que quando um botão é pressionado, ele aparece na janela de depuração …

O nó de carga útil de mudança provavelmente poderia ter sido ignorado se eu tivesse escolhido algo diferente de data = na etapa anterior. O nó de switch que eu uso é muito maior do que apenas pausar, mas isso é apenas para que eu possa adicionar mais sinais de IR para usar o chromecast para estações de rádio, etc.

Para apenas reproduzir uma pausa, você pode usar o fluxo na outra imagem.

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

Removi o nome de usuário e o url deste, então talvez seja necessário editá-lo.

adicione um nó de troca se você quiser reagir a mais do que apenas uma pausa (veja a imagem, por exemplo)

No nó do assistente inicial para uso de pausa:

nome: reproduzir pausa chromecastdomain: media_playerService: media_play_pausedata: {"entity_id": "media_player. [your chromecast here]"}

para a próxima trilha, apenas copie esse nó e edite o serviço para: media_next_track e nome para: próximo chromecast

Etapa 5: Alexa Pause Chromecast opcional

Opcional adicionar comando alexa para pausar chromecast:

Há várias opções aqui.. Você pode fazer um nnode alexa chamado pausar chromecast que pausa o chromecast, ou você pode fazer um chamado pausar tv que verifica a atividade de harmonia atual e fazer uma pausa dependendo disso.

Vou adicionar isso aqui mais tarde..

Recomendado: