Taula de continguts:

Pausa Chromcast amb un control remot: 5 passos
Pausa Chromcast amb un control remot: 5 passos

Vídeo: Pausa Chromcast amb un control remot: 5 passos

Vídeo: Pausa Chromcast amb un control remot: 5 passos
Vídeo: Si tienes CHROMECAST, DEBES activar estas opciones! 2024, Juliol
Anonim
Image
Image
Equipament
Equipament

Tinc un control remot d’harmonia Logitech i executo Home Assistant amb un raspberry pi.

Volia poder posar en pausa el chromecast des del meu comandament a distància, però tinc un televisor antic que no admet això mitjançant HDMI. La meva idea era llavors utilitzar un NodeMcu per captar el senyal ir i fer una pausa.

Si no podeu aconseguir que funcioni o tingueu preguntes, si us plau, comenteu-ho a continuació

Pas 1: equipament

Equipament
Equipament
Equipament
Equipament

Equip necessari:

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

Receptor (com ara:

cables de dupont

Cable micro USB (nodemcu d'alimentació)

Utilitzo Logitech Harmony -hub

Per al meu enfocament, necessiteu un Raspberry pi amb hass.io Instal·lat i nodrit. No entraré a configurar coses homosexuals aquí. Si utilitzeu alguna cosa que no sigui homeasistant, heu d’adaptar-vos les coses vosaltres mateixos.

Heu de poder utilitzar Nodemcu a Arduino IDE, ja que aquí no hi entraré

Pas 2: senyal remot

Senyal remot
Senyal remot
Senyal remot
Senyal remot
Senyal remot
Senyal remot
Senyal remot
Senyal remot

La forma en què ho vaig fer va ser copiar un senyal d'un comandament a distància que no faig servir en un comandament a distància d'harmonia.

He utilitzat un comandament a distància per al model de televisió panasonic TXL32C3E, ja que no interfereix amb el meu equip al primer pis. Això és un televisor que tinc al pis de dalt.

Si no utilitzeu l'harmonia, podeu ometre-ho.

Així que per trobar el senyal he utilitzat aquest scetch:

/ * * IRremoteESP8266: IRrecvDumpV2: bolqueu els detalls dels codis IR amb IRrecv * S'ha de connectar un detector / demodulador IR a l'entrada RECV_PIN. * * Copyright 2009 Ken Shirriff, https://arcfn.com * Copyright 2017 David Conran * * Exemple de diagrama de circuits: * https://arcfn.com * * Canvis: * Versió 0.3 de novembre de 2017 * - Suport per a A / C descodificació d'alguns protocols. * Versió 0.2 d'abril de 2017 *: descodifiqueu a partir d'una còpia de les dades perquè puguem començar a capturar més ràpidament, de manera que * reduïu la probabilitat de captures errònies. * Basat en la versió IrsendDemo de Ken Shirriff, 0,1 de juliol de 2009, * /

#ifndef UNIT_TEST

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

// ==================== inici de PARÀMETRES TUNEABLE ====================

// Un detector / demodulador d’IR està connectat al pin 14 GPIO // per ex. D5 en una placa NodeMCU. #define RECV_PIN 14

// La velocitat en bauds de la connexió sèrie.

// És a dir, el missatge d'estat s'enviarà a l'ordinador amb aquesta velocitat de transmissió. // Intenteu evitar velocitats lentes com el 9600, ja que trobareu a faltar missatges i // causareu altres problemes. Es recomana 115200 (o més ràpid). // NOTA: assegureu-vos que configureu el monitor de sèrie a la mateixa velocitat. #define BAUD_RATE 115200

// Com que aquest programa és un programa de captura / descodificació amb finalitats especials, en fem servir un de més gran

// que la memòria intermèdia normal perquè puguem gestionar codis remots de l'aire condicionat. #define CAPTURE_BUFFER_SIZE 1024

// TIMEOUT és el núm. de milli-segons de no-more-data abans de considerar a

// missatge finalitzat. // Aquest paràmetre és un compromís interessant. Com més llarg sigui el temps d'espera, més // complex pot captar un missatge. per exemple. Alguns protocols del dispositiu enviaran // paquets de missatges múltiples successivament, com ara comandaments a distància de l'aire condicionat. // Els protocols Air Coniditioner solen tenir un buit considerable (20-40 + ms) entre // paquets. // L’inconvenient d’un gran temps d’espera és un munt de protocols menys complexos // enviar diversos missatges quan es manté premut el botó del comandament. La bretxa entre // sovint també és al voltant dels 20 ms. Això pot provocar que les dades brutes siguin 2-3 + // vegades més grans del necessari, ja que ha capturat 2-3 + missatges en una sola // captura. Establir un valor d’espera baix pot resoldre-ho. // Per tant, triar el millor valor de TIMEOUT per al vostre cas particular és // bastant matisat. Bona sort i feliç caça. // NOTA: no superi MAX_TIMEOUT_MS. Normalment de 130 ms. #if DECODE_AC #define TIMEOUT 50U // Algunes unitats A / C tenen buits en els seus protocols de ~ 40ms. // per exemple. Kelvinator // Un valor tan gran pot empassar repeticions d'alguns protocols #else // DECODE_AC #define TIMEOUT 15U // S'adapta a la majoria de missatges, tot i que no empassa moltes repeticions. #endif // DECODE_AC // Alternatives: // #define TIMEOUT 90U // S'adapta a missatges amb grans buits com XMP-1 i algunes unitats d'aire condicionat, però pot empassar accidentalment missatges repetits // a la sortida rawData . // #define TIMEOUT MAX_TIMEOUT_MS // Això configurarà el nostre // màxim permès actualment. Els valors tan elevats són problemàtics // perquè és aproximadament el límit típic // on es repeteixen la majoria de missatges. // per exemple. Deixarà de descodificar un missatge i // començarà a enviar-lo a la sèrie exactament // en el moment en què és probable que // es transmeti el següent missatge, i és possible que el perdi.

// Estableix els paquets de missatges "DESCONEGUTS" de mida més petita que realment ens interessen.

// Aquest valor ajuda a reduir la taxa de detecció de falsos positius del soroll IR de fons // com a missatges reals. Les probabilitats que es detecti un soroll IR de fons // a mesura que el missatge augmenta amb la longitud del valor TIMEOUT. (Vegeu més amunt) // L’inconvenient de configurar aquest missatge massa gran és que podeu perdre alguns // missatges curts vàlids per a protocols que aquesta biblioteca encara no descodifica. // // Estableix més amunt si rep molts missatges desconeguts aleatoris curts quan res // hauria d’enviar un missatge. // Estableix més baix si esteu segur que la vostra configuració funciona, però no veu els missatges // del vostre dispositiu. (per exemple, altres comandaments a distància IR funcionen.) // NOTA: Establiu aquest valor molt alt per desactivar efectivament la detecció DESCONEGUT. #define MIN_UNKNOWN_SIZE 12 // ==================== final de PARÀMETRES TUNEABLE ====================

// Utilitzeu activar la funció de memòria intermèdia per a una cobertura de captura més completa.

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

resultats decode_results; // En algun lloc on emmagatzemar els resultats

// Mostra l'estat llegible per humans d'un missatge de A / C si podem.

void dumpACInfo (decode_results * results) {String description = ""; #if DECODE_DAIKIN if (results-> decode_type == DAIKIN) {IRDaikinESP ac (0); ac.setRaw (resultats-> estat); descripció = ac.toString (); } #endif // DECODE_DAIKIN #if DECODE_FUJITSU_AC if (resultats-> decode_type == FUJITSU_AC) {IRFujitsuAC ac (0); ac.setRaw (resultats-> estat, resultats-> bits / 8); descripció = ac.toString (); } #endif // DECODE_FUJITSU_AC #if DECODE_KELVINATOR if (resultats-> decode_type == KELVINATOR) {IRKelvinatorAC ac (0); ac.setRaw (resultats-> estat); descripció = ac.toString (); } #endif // DECODE_KELVINATOR #if DECODE_TOSHIBA_AC if (resultats-> decode_type == TOSHIBA_AC) {IRToshibaAC ac (0); ac.setRaw (resultats-> estat); descripció = ac.toString (); } #endif // DECODE_TOSHIBA_AC #if DECODE_MIDEA if (resultats-> decode_type == MIDEA) {IRMideaAC ac (0); ac.setRaw (resultats-> valor); // Midea utilitza el valor en lloc de l'estat. descripció = ac.toString (); } #endif // DECODE_MIDEA // Si obtenim una descripció del missatge llegible per humans, mostreu-lo. if (description! = "") Serial.println ("Desc. mes.:" + descripció); }

// La secció de codi només s'executa una vegada a l'inici.

configuració nul·la () {Serial.begin (BAUD_RATE, SERIAL_8N1, SERIAL_TX_ONLY); retard (500); // Espereu una mica a establir la connexió sèrie.

#if DECODE_HASH

// Ignoreu els missatges amb menys o menys d'impulsos d'activació o apagat. irrecv.setUnknownThreshold (MIN_UNKNOWN_SIZE); #endif // DECODE_HASH irrecv.enableIRIn (); // Arrenca el receptor}

// La secció que repeteix el codi

// void loop () {// Comproveu si s'ha rebut el codi IR. if (irrecv.decode (& resultats)) {// Mostra una marca de temps bruta. uint32_t ara = millis (); Serial.printf ("Marca de temps:% 06u.% 03u / n", ara / 1000, ara% 1000); if (results.overflow) Serial.printf ("ADVERTÈNCIA: el codi IR és massa gran per al buffer (> =% d)." "No s'ha de confiar en aquest resultat fins que no es resolgui." "Edita i augmenta CAPTURE_BUFFER_SIZE. / n ", CAPTURE_BUFFER_SIZE); // Mostra la sortida bàsica del que hem trobat. Serial.print (resultToHumanReadableBasic (& results)); dumpACInfo (& resultats); // Mostra qualsevol informació de A / C addicional si la tenim. rendiment (); // Alimenteu el WDT ja que la sortida de text pot trigar una estona a imprimir-se.

// Mostra la versió de la biblioteca amb la qual s'ha capturat el missatge.

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

// Sortiu informació del temps RAW del resultat.

Serial.println (resultToTimingInfo (& results)); rendiment (); // Alimentar el WDT (de nou)

// Sortiu els resultats com a codi font

Serial.println (resultToSourceCode (& results)); Serial.println (""); // Línia en blanc entre les entrades yield (); // Alimentar el WDT (de nou)}}

Quan aquest scetch es carrega i s’executa amb el monitor sèrie obert, sortirà el codi per prémer el botó (veure imatge)

Escriviu els codis que voleu utilitzar per utilitzar-los posteriorment. Vaig utilitzar Excel per anotar què tenia per als botons que volia utilitzar (veure imatge)

He editat els botons de la meva activitat de Netflix per enviar senyal de pausa des del comandament de Panasonic.. (veure imatge)

Pas 3: escriure el codi per enviar a Nodered

Redacció del codi per a l’enviament a Nodered
Redacció del codi per a l’enviament a Nodered

#ifndef UNIT_TEST # include #endif #include

#incloure

#incloure

#incloure

#incloure

#incloure

const char * ssid = ""; // Introduïu SSID hereconst char * password = ""; // Introduïu aquí la contrasenya const char * host = ""; // IP addresse #define USE_SERIAL Serial ESP8266WiFiMulti WiFiMulti; uint16_t RECV_PIN = 14; IRrecv irrecv (RECV_PIN); resultats decode_results; void setup () {irrecv.enableIRIn (); // Inicieu el receptor USE_SERIAL.begin (115200); // USE_SERIAL.setDebugOutput (true); USE_SERIAL.println (); USE_SERIAL.println (); USE_SERIAL.println ();

per a (uint8_t t = 4; t> 0; t--) {

USE_SERIAL.printf ("[CONFIGURACIÓ] ESPERA% d … / n", t); USE_SERIAL.flush (); retard (1000); } WiFi.mode (WIFI_STA); WiFiMulti.addAP (ssid, contrasenya); } bucle buit () {if (irrecv.decode (& resultats)) {

// Canvieu aquest valor de senyal pel que heu obtingut

if (results.value == 0x40040D00606D) {USE_SERIAL.println ("Pausa del senyal rebut"); wifisend (pausa); retard (1000);

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

USE_SERIAL.println ("anterior");

wifisend ("prev"); retard (1000); } if (results.value == 0x40040100F2F3) {USE_SERIAL.println ("següent"); wifisend ("següent"); retard (1000); }

irrecv.resume (); // Rebre el següent valor} delay (100); } void wifisend (dades de cadenes) {if ((WiFiMulti.run () == WL_CONNECTED)) {HTTPClient http; USE_SERIAL.print ("[HTTP] comença … / n"); // configurar el servidor i l'URL http.begin ("https:// [usuari]: [passar] @ [ip]: [port] / chromecastpause? dades =" + dades); USE_SERIAL.print ("[HTTP] GET … / n"); // iniciar la connexió i enviar la capçalera HTTP int httpCode = http. GET (); // httpCode serà negatiu per error si (httpCode> 0) {// s'ha enviat la capçalera HTTP i s'ha gestionat la capçalera de resposta del servidor USE_SERIAL.printf ("[HTTP] GET … codi:% d / n", // fitxer trobat al servidor

if (httpCode == HTTP_CODE_OK) {String payload = http.getString (); USE_SERIAL.println (càrrega útil); }} else {USE_SERIAL.printf ("[HTTP] GET … ha fallat, error:% s / n", http.errorToString (httpCode).c_str ()); } http.end (); retard (100); }}

Aquest és el codi que he fet servir al meu nodemcu. Haureu de tenir instal·lades aquestes biblioteques.

Podeu fer proves mitjançant el monitor sèrie i prémer els botons remots que heu afegit al codi per veure la resposta.

A la línia:

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

Heu de canviar [usuari] al vostre usuari, etc. SENSE claudàtors. hi ha claudàtors per mostrar els camps de bruixa a canviar.

Aquesta línia tampoc funcionarà fins que no configurem el nostre flux.

Pas 4: crear un flux a Nodered

Creació d'un flux a Nodered
Creació d'un flux a Nodered
Creació d'un flux a Nodered
Creació d'un flux a Nodered
Creació d'un flux a Nodered
Creació d'un flux a Nodered
Creació d'un flux a Nodered
Creació d'un flux a Nodered

Com es va esmentar al principi, faig servir hass.io amb nodered. Si feu una configuració diferent, haureu de fer-ho diferent. Podeu veure a la imatge que quan es prem un botó es mostra a la finestra de depuració …

El node de canvi de càrrega útil probablement s’hauria pogut ometre si hagués triat alguna cosa diferent que data = en el pas anterior. El node de commutació que faig servir és molt més gran, només fa una pausa, però és així perquè pugui afegir més senyals de IR per utilitzar chromecast per a estacions de ràdio, etc.

Si només teniu una pausa de reproducció, podeu utilitzar el flux de l’altra imatge.

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

He eliminat el nom userpass i l'URL, de manera que és possible que hàgiu d'editar-lo.

afegiu un node de commutador si voleu reaccionar a més d'una pausa (vegeu la imatge per exemple)

Al node de l'assistent domèstic per fer servir una pausa:

name: play pause chromecastdomain: media_playerService: media_play_pausedata: {"entity_id": "media_player. [el vostre chromecast aquí]"}

per a la següent pista, només cal que copieu aquest node i editeu el servei a: media_next_track i el nom a: next chromecast

Pas 5: Alexa Chromecast en pausa opcional

Ordre opcional d'afegir Alexa per pause chromecast:

Hi ha opcions aquí. Podeu fer un nnode Alexa anomenat pausa chromecast que faci pausa chromecast, o podeu fer una pausa TV anomenada que comprovi l'activitat de l'harmonia actual i feu una pausa en funció d'això.

Afegiré això aquí més endavant..

Recomanat: