Innholdsfortegnelse:

Pause Chromcast med en fjernkontroll: 5 trinn
Pause Chromcast med en fjernkontroll: 5 trinn

Video: Pause Chromcast med en fjernkontroll: 5 trinn

Video: Pause Chromcast med en fjernkontroll: 5 trinn
Video: How to install and set up Chromecast with Google TV 2024, Juli
Anonim
Image
Image
Utstyr
Utstyr

Jeg har en Logitech Harmony -fjernkontroll og kjører hjemmeassistent på en bringebærpi.

Jeg ønsket å kunne sette Chromecast på pause fra fjernkontrollen, men jeg har en gammel tv som ikke støtter dette via hdmi. Min idé var da å bruke en NodeMcu for å fange IR -signalet og sette en pause.

Hvis du ikke får det til å fungere eller har spørsmål, vennligst kommenter nedenfor

Trinn 1: Utstyr

Utstyr
Utstyr
Utstyr
Utstyr

Utstyr som trengs:

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

Ir mottaker (som for eksempel dette:

dupont -ledninger

Micro USB -kabel (strømnodemcu)

Jeg bruker Logitech Harmony -hub

For min tilnærming Du trenger en Raspberry pi med hass.io installert og Nodered. Jeg vil ikke gå inn på å sette opp hjemmeassistent ting her. Hvis du bruker noe annet enn hjemmeassistent, må du tilpasse ting selv.

Du må kunne bruke Nodemcu på Arduino IDE, da jeg ikke går inn på det her

Trinn 2: Remote Signal

Ekstern signal
Ekstern signal
Ekstern signal
Ekstern signal
Ekstern signal
Ekstern signal
Ekstern signal
Ekstern signal

Måten jeg gjorde det på var å kopiere et signal fra en fjernkontroll jeg ikke bruker til harmoni -fjernkontroll.

Jeg brukte en fjernkontroll for panasonic tv modell TXL32C3E, da det ikke forstyrrer utstyret mitt i første etasje. Det er en tv jeg har ovenpå.

Hvis du ikke bruker harmoni, kan du hoppe over dette.

Så for å finne signalet brukte jeg denne skissen:

/ * * IRremoteESP8266: IRrecvDumpV2 - dump detaljer om IR -koder med IRrecv * En IR -detektor/demodulator må være koblet til inngangen RECV_PIN. * * Copyright 2009 Ken Shirriff, https://arcfn.com * Copyright 2017 David Conran * * Eksempel på kretsdiagram: * https://arcfn.com * * Endringer: * Versjon 0.3 november, 2017 * - Støtte for A/C dekoding for noen protokoller. * Versjon 0.2 april, 2017 * - Dekod fra en kopi av dataene, slik at vi kan begynne å fange raskere og dermed * redusere sannsynligheten for feiloppføringer. * Basert på Ken Shirriffs IrsendDemo versjon 0.1 juli 2009, */

#ifndef UNIT_TEST

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

// ===================== start av TUNEABLE PARAMETERS ======================

// En IR -detektor/demodulator er koblet til GPIO -pinne 14 // f.eks. D5 på et NodeMCU -kort. #define RECV_PIN 14

// Seriell tilkoblingsoverføringshastighet.

// dvs. statusmelding vil bli sendt til PC -en med denne overføringshastigheten. // Prøv å unngå lave hastigheter som 9600, da du kommer til å savne meldinger og // forårsake andre problemer. 115200 (eller raskere) anbefales. // MERK: Sørg for at du har satt den serielle skjermen til samme hastighet. #define BAUD_RATE 115200

// Ettersom dette programmet er et spesialopptak/dekoder, la oss bruke en større

// enn vanlig buffer, slik at vi kan håndtere fjernkoder for klimaanlegg. #define CAPTURE_BUFFER_SIZE 1024

// TIMEOUT er Nr. av milli-sekunder med ikke-mer-data før vi vurderer a

// meldingen er avsluttet. // Denne parameteren er en interessant avveining. Jo lengre tidsavbrudd, jo mer // kompleks melding kan den fange. f.eks. Noen enhetsprotokoller sender // flere meldingspakker raskt etter hverandre, for eksempel klimaanleggskontroller. // Air Coniditioner-protokoller har ofte et betydelig gap (20-40+ms) mellom // pakker. // Ulempen med en stor timeout -verdi er mange mindre komplekse protokoller // sende flere meldinger når fjernkontrollens knapp holdes nede. Gapet mellom // dem er ofte også rundt 20+ms. Dette kan resultere i at rådata er 2-3+ // ganger større enn nødvendig ettersom det har fanget opp 2-3+ meldinger i en enkelt // fangst. Å sette en lav timeout -verdi kan løse dette. // Så å velge den beste TIMEOUT -verdien for ditt spesielle tilfelle er // ganske nyansert. Lykke til og god jakt. // MERK: Ikke overstig MAX_TIMEOUT_MS. Vanligvis 130 ms. #if DECODE_AC #define TIMEOUT 50U // Noen A/C -enheter har hull i protokollene på ~ 40 ms. // f.eks. Kelvinator // En så stor verdi kan svelge gjentakelser av noen protokoller #else // DECODE_AC #define TIMEOUT 15U // Passer til de fleste meldinger, men ikke svelge mange repetisjoner. #endif // DECODE_AC // Alternativer: // #define TIMEOUT 90U // Passer meldinger med store hull som XMP-1 og noen aircon // enheter, men kan ved et uhell svelge gjentatte meldinger // i rawData -utgangen. // #define TIMEOUT MAX_TIMEOUT_MS // Dette vil sette det til vårt nåværende tillatte // maksimum. Verdier som er så høye er problematiske // fordi det er omtrent den typiske grensen // der de fleste meldingene gjentas. // f.eks. Den vil slutte å dekode en melding og // begynne å sende den til serie på nøyaktig // tidspunktet da den neste meldingen sannsynligvis // skal overføres, og kan gå glipp av den.

// Angi de minste "UKJENTE" meldingspakkene vi faktisk bryr oss om.

// Denne verdien bidrar til å redusere den falsk-positive deteksjonshastigheten for IR-bakgrunn // støy som ekte meldinger. Sjansen for at bakgrunns -IR -støy blir oppdaget // ettersom en melding øker med lengden på TIMEOUT -verdien. (Se ovenfor) // Ulempen med å sette denne meldingen for stor er at du kan gå glipp av noen gyldige // korte meldinger for protokoller som dette biblioteket ennå ikke har avkodet. // // Angi høyere hvis du får mange tilfeldige korte UKJENTE meldinger når ingenting // skal sende en melding. // Sett lavere hvis du er sikker på at oppsettet fungerer, men det ser ikke meldinger // fra enheten. (f.eks. andre IR -fjernkontroller fungerer.) // MERK: Sett denne verdien veldig høyt for effektivt å slå av UKJENT registrering. #define MIN_UNKNOWN_SIZE 12 // ===================== slutten av TUNEABLE PARAMETERS ======================

// Bruk slå på lagringsbufferfunksjonen for mer fullstendig fangstdekning.

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

resultater for dekoderesultater; // Et sted å lagre resultatene

// Vis den menneskelige lesbare tilstanden til en A/C -melding hvis vi kan.

void dumpACInfo (decode_results *results) {String description = ""; #if DECODE_DAIKIN if (results-> decode_type == DAIKIN) {IRDaikinESP ac (0); ac.setRaw (resultater-> tilstand); description = ac.toString (); } #endif // DECODE_DAIKIN #if DECODE_FUJITSU_AC if (results-> decode_type == FUJITSU_AC) {IRFujitsuAC ac (0); ac.setRaw (resultater-> tilstand, resultater-> bits / 8); description = ac.toString (); } #endif // DECODE_FUJITSU_AC #if DECODE_KELVINATOR if (results-> decode_type == KELVINATOR) {IRKelvinatorAC ac (0); ac.setRaw (resultater-> tilstand); description = ac.toString (); } #endif // DECODE_KELVINATOR #if DECODE_TOSHIBA_AC if (results-> decode_type == TOSHIBA_AC) {IRToshibaAC ac (0); ac.setRaw (resultater-> tilstand); description = ac.toString (); } #endif // DECODE_TOSHIBA_AC #if DECODE_MIDEA if (results-> decode_type == MIDEA) {IRMideaAC ac (0); ac.setRaw (resultater-> verdi); // Midea bruker verdi i stedet for stat. description = ac.toString (); } #endif // DECODE_MIDEA // Hvis vi har en lesbar beskrivelse av meldingen, kan du vise den. if (description! = "") Serial.println ("Mesg Desc.:" + description); }

// Kodeseksjonen kjøres bare én gang ved oppstart.

ugyldig oppsett () {Serial.begin (BAUD_RATE, SERIAL_8N1, SERIAL_TX_ONLY); forsinkelse (500); // Vent litt på den serielle tilkoblingen.

#if DECODE_HASH

// Ignorer meldinger med mindre enn minimum på eller av pulser. irrecv.setUnknownThreshold (MIN_UNKNOWN_SIZE); #endif // DECODE_HASH irrecv.enableIRIn (); // Start mottakeren}

// Den gjentatte delen av koden

// void loop () {// Sjekk om IR -koden er mottatt. if (irrecv.decode (& results)) {// Vis et grovt tidsstempel. uint32_t nå = millis (); Serial.printf ("Tidstempel: %06u. %03u / n", nå / 1000, nå %1000); if (results.overflow) Serial.printf ("ADVARSEL: IR -koden er for stor for buffer (> = %d)." "Dette resultatet skal ikke stole på før dette er løst." "Rediger og øk CAPTURE_BUFFER_SIZE. / n ", CAPTURE_BUFFER_SIZE); // Vis den grunnleggende produksjonen av det vi fant. Serial.print (resultToHumanReadableBasic (& resultater)); dumpACInfo (& resultater); // Vis eventuell ekstra luftkondisjonering hvis vi har den. utbytte(); // Mat WDT -en, ettersom teksten kan ta litt tid å skrive ut.

// Vis bibliotekversjonen meldingen ble fanget opp med.

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

// Utdata RAW timing informasjon om resultatet.

Serial.println (resultToTimingInfo (& resultater)); utbytte(); // Feed WDT (igjen)

// Skriv ut resultatene som kildekode

Serial.println (resultToSourceCode (& resultater)); Serial.println (""); // Tom linje mellom oppføringer (); // Feed WDT (igjen)}}

Når denne oversikten er lastet opp og kjører med seriell skjerm åpen, vil den sende ut koden for knappetrykk (se bilde)

Skriv ned kodene du vil bruke til senere bruk. Jeg brukte excel til å notere hva jeg fikk for knapper jeg ønsket å bruke (se bilde)

Jeg redigerte knappene i Netflix -aktiviteten min for å sende pausesignal fra panasonic -fjernkontrollen. (Se bilde)

Trinn 3: Skrive koden for sending til Nodered

Skriver koden for sending til Nodered
Skriver koden for sending til Nodered

#ifndef UNIT_TEST #inkluderer #endif #include

#inkludere

#inkludere

#inkludere

#inkludere

#inkludere

const char* ssid = ""; // Skriv inn SSID hereconst char* password = ""; // Skriv inn passord her const char *host = ""; // Ip addresse #define USE_SERIAL Serial ESP8266WiFiMulti WiFiMulti; uint16_t RECV_PIN = 14; IRrecv irrecv (RECV_PIN); resultater for dekoderesultater; ugyldig oppsett () {irrecv.enableIRIn (); // Start mottakeren 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 ("[SETUP] WAIT %d… / n", t); USE_SERIAL.flush (); forsinkelse (1000); } WiFi.mode (WIFI_STA); WiFiMulti.addAP (ssid, passord); } void loop () {if (irrecv.decode (& results)) {

// Endre denne signalverdien for den du har

if (results.value == 0x40040D00606D) {USE_SERIAL.println ("pause Signal mottatt"); wifisend (pause); forsinkelse (1000);

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

USE_SERIAL.println ("forrige");

wifisend ("prev"); forsinkelse (1000); } if (results.value == 0x40040100F2F3) {USE_SERIAL.println ("neste"); wifisend ("neste"); forsinkelse (1000); }

irrecv.resume (); // Motta neste verdi} forsinkelse (100); } void wifisend (strengdata) {if ((WiFiMulti.run () == WL_CONNECTED)) {HTTPClient http; USE_SERIAL.print ("[HTTP] begynner … / n"); // konfigurer traged server og url http.begin ("https:// [bruker]: [pass]@[ip]: [port]/chromecastpause? data =" + data); USE_SERIAL.print ("[HTTP] FÅ … / n"); // start tilkoblingen og send HTTP -header int httpCode = http. GET (); // httpCode vil være negativ ved feil hvis (httpCode> 0) {// HTTP -topptekst er sendt og Server -responsoverskrift er blitt håndtert USE_SERIAL.printf ("[HTTP] GET … code: %d / n", // fil funnet på server

if (httpCode == HTTP_CODE_OK) {String nyttelast = http.getString (); USE_SERIAL.println (nyttelast); }} annet {USE_SERIAL.printf ("[HTTP] FÅ … mislyktes, feil: %s / n", http.errorToString (httpCode).c_str ()); } http.end (); forsinkelse (100); }}

Dette er koden jeg brukte på min nodemcu. Du må ha disse bibliotekene installert.

Du kan teste med seriell skjerm og trykke på fjernkontrollknappene du la til i koden for å se svaret.

I rekken:

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

Du må bytte [bruker] til brukeren din og så videre. UTEN braketter. parenteser er der for å vise heksefelt som skal endres.

Den linjen vil heller ikke fungere før vi konfigurerer strømmen vår i nodered.

Trinn 4: Opprette en flyt i Nodered

Opprette en flyt i Nodered
Opprette en flyt i Nodered
Opprette en flyt i Nodered
Opprette en flyt i Nodered
Opprette en flyt i Nodered
Opprette en flyt i Nodered
Opprette en flyt i Nodered
Opprette en flyt i Nodered

Som nevnt i begynnelsen bruker jeg hass.io med nodered. Hvis du kjører et annet oppsett, må du gjøre dette annerledes! Du kan se på bildet at når du trykker på en knapp, vises det i feilsøkingsvinduet …

Endringsnyttelastnoden kunne sannsynligvis ha blitt hoppet over hvis jeg hadde valgt noe annet som data = i forrige trinn. Bryternoden jeg bruker er mye større enn bare pause, men det er bare slik at jeg kan legge til flere ir -signaler for å bruke chromecast for radiostasjoner osv.

For bare å spille pause kan du bruke flyten i det andre bildet.

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

Jeg fjernet navnet userpass og url fra dette, så du må kanskje redigere det.

legg til en bryternode hvis du vil reagere på mer enn bare pause (se for eksempel bilde)

I hjemmeassistentnoden for pause bruk:

navn: play pause chromecastdomain: media_playerService: media_play_pausedata: {"entity_id": "media_player. [chromecast her]"}}

for neste spor, bare kopier den noden og rediger tjenesten til: media_next_track og navn til: neste chromecast

Trinn 5: Valgfri Alexa Pause Chromecast

Valgfri legg til alexa -kommando for pause chromecast:

Det er alternativer her.. Du kan lage en alexa nnode kalt pause chromecast som setter chromecast på pause, eller du kan lage en som heter pause -tv som sjekker gjeldende harmoniaktivitet og stopper avhengig av det.

Jeg legger til dette her senere..

Anbefalt: