Cuprins:

Întrerupeți Chromcast cu telecomandă: 5 pași
Întrerupeți Chromcast cu telecomandă: 5 pași

Video: Întrerupeți Chromcast cu telecomandă: 5 pași

Video: Întrerupeți Chromcast cu telecomandă: 5 pași
Video: 10 sfaturi și trucuri avansate pentru Windows 10 pentru 2020 2024, Noiembrie
Anonim
Image
Image
Echipament
Echipament

Am o telecomandă armonie Logitech și rulez Home Assistant pe un raspberry pi.

Am vrut să pot întrerupe chromecastul de la telecomandă, dar am un televizor vechi care nu acceptă acest lucru prin HDMI. Ideea mea a fost atunci să folosesc un NodeMcu pentru a prinde semnalul ir și a face o pauză.

Dacă nu reușiți să funcționeze sau aveți întrebări, vă rugăm să comentați mai jos

Pasul 1: Echipament

Echipament
Echipament
Echipament
Echipament

Echipament necesar:

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

Receiver (ca de ex:

fire dupont

Cablu micro USB (putere nodemcu)

Folosesc Logitech Harmony -hub

Pentru abordarea mea Aveți nevoie de un Raspberry pi cu hass.io Instalat și Nodered. Nu voi intra în a configura lucruri care să reziste aici. Dacă folosiți altceva decât rezistența la domiciliu, trebuie să vă adaptați lucrurile.

Trebuie să poți folosi Nodemcu pe Arduino IDE deoarece nu voi intra aici

Pasul 2: semnal la distanță

Semnal la distanță
Semnal la distanță
Semnal la distanță
Semnal la distanță
Semnal la distanță
Semnal la distanță
Semnal la distanță
Semnal la distanță

Modul în care am făcut-o a fost să copiez un semnal de pe o telecomandă pe care nu o folosesc în telecomandă de armonie.

Am folosit o telecomandă pentru modelul TV panasonic TXL32C3E deoarece nu interferează cu echipamentul meu de la primul etaj. E un televizor pe care îl am la etaj.

Dacă nu folosești armonia, poți sări peste asta.

Deci, pentru a găsi semnalul, am folosit acest scetch:

/ * * IRremoteESP8266: IRrecvDumpV2 - descărcați detaliile codurilor IR cu IRrecv * Un detector / demodulator IR trebuie conectat la intrarea RECV_PIN. * * Copyright 2009 Ken Shirriff, https://arcfn.com * Copyright 2017 David Conran * * Exemplu de diagramă: * https://arcfn.com * * Modificări: * Versiunea 0.3 noiembrie 2017 * - Suport pentru A / C decodare pentru unele protocoale. * Versiunea 0.2 aprilie 2017 * - Decodează dintr-o copie a datelor, astfel încât să putem începe să capturăm mai rapid, astfel * reducem probabilitatea de capturi greșite. * Bazat pe versiunea IrsendDemo a lui Ken Shirriff 0.1 iulie 2009, * /

#ifndef UNIT_TEST

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

// ==================== începutul TAMEABLE PARAMETERS ====================

// Un detector / demodulator IR este conectat la pinul GPIO 14 // de ex. D5 pe o placă NodeMCU. #define RECV_PIN 14

// Rata de transmisie a conexiunii seriale.

// adică mesajul de stare va fi trimis la computer la această rată de transmisie. // Încercați să evitați viteza lentă, cum ar fi 9600, deoarece veți pierde mesajele și // veți provoca alte probleme. 115200 (sau mai rapid) este recomandat. // NOTĂ: Asigurați-vă că setați monitorul serial la aceeași viteză. #define BAUD_RATE 115200

// Întrucât acest program este un scop special de captare / decodare, să ne folosim unul mai mare

// decât tamponul normal, astfel încât să putem gestiona codurile de la distanță ale aparatului de aer condiționat. #define CAPTURE_BUFFER_SIZE 1024

// TIMEOUT este Nr. de milli-secunde de no-more-data înainte de a lua în considerare a

// mesajul s-a încheiat. // Acest parametru este un compromis interesant. Cu cât expirarea este mai lungă, cu atât poate fi capturat un mesaj // mai complex. de exemplu. Unele protocoale de dispozitiv vor trimite // mai multe pachete de mesaje în succesiune rapidă, cum ar fi telecomandele pentru aer condiționat. // Protocoalele Air Coniditioner au adesea un decalaj considerabil (20-40 + ms) între // pachete. // Dezavantajul unei valori mari de expirare este o mulțime de protocoale mai puțin complexe // trimite mai multe mesaje când butonul telecomenzii este ținut apăsat. Decalajul dintre ele este adesea de aproximativ 20 + ms. Acest lucru poate duce la ca datele brute să fie de 2-3 + // ori mai mari decât este necesar, deoarece a capturat 2-3 + mesaje într-o singură // captură. Setarea unei valori de expirare reduse poate rezolva acest lucru. // Deci, alegerea celei mai bune valori TIMEOUT pentru cazul dvs. particular este // destul de nuanțată. Noroc și vânătoare fericită. // NOTĂ: Nu depășiți MAX_TIMEOUT_MS. De obicei 130ms. #if DECODE_AC #define TIMEOUT 50U // Unele unități de climatizare au lacune în protocoalele lor de ~ 40ms. // de exemplu. Kelvinator // O valoare atât de mare poate înghiți repetările unor protocoale #else // DECODE_AC #define TIMEOUT 15U // Se potrivește cu majoritatea mesajelor, în timp ce nu înghite multe repetări. #endif // DECODE_AC // Alternative: // #define TIMEOUT 90U // Se potrivește cu mesaje cu goluri mari precum XMP-1 și unele unități de aer condiționat //, dar poate înghiți accidental mesaje repetate // în ieșirea rawData . // #define TIMEOUT MAX_TIMEOUT_MS // Acest lucru îl va seta la // permis în prezent // maxim. Valorile atât de mari sunt problematice // deoarece este aproximativ limita tipică // unde se repetă majoritatea mesajelor. // de exemplu. Se va opri decodarea unui mesaj și // va începe să-l trimită la serial exact la // momentul la care următorul mesaj este // probabil transmis // și poate fi ratat.

// Setează cele mai mici pachete de mesaje „NECUNOSCUTE” de care ne pasă.

// Această valoare ajută la reducerea ratei de detectare fals pozitivă a zgomotului de fond IR // ca mesaje reale. Șansele ca zgomotul IR de fundal să fie detectat // pe măsură ce un mesaj crește odată cu lungimea valorii TIMEOUT. (A se vedea mai sus) // Dezavantajul setării acestui mesaj prea mare este că puteți pierde câteva // mesaje scurte valide pentru protocoale pe care această bibliotecă nu le decodează încă. // // Setați mai mare dacă primiți o mulțime de mesaje scurte necunoscute aleatorii atunci când nimic // nu ar trebui să trimită un mesaj. // Setează mai jos dacă ești sigur că configurarea funcționează, dar nu apare mesajele // de pe dispozitiv. (de exemplu, alte telecomenzi IR funcționează.) // NOTĂ: Setați această valoare foarte mare pentru a dezactiva efectiv detectarea necunoscută. #define MIN_UNKNOWN_SIZE 12 // ==================== sfârșitul PARAMETRILOR TUNEABLE ====================

// Utilizați activați caracteristica buffer de salvare pentru o acoperire mai completă a capturilor.

IRrecv irrecv (RECV_PIN, CAPTURE_BUFFER_SIZE, TIMEOUT, adevărat);

rezultate decode_results; // Undeva pentru a stoca rezultatele

// Afișează starea lizibilă a unui mesaj A / C dacă putem.

void dumpACInfo (decode_results * results) {Descriere șir = ""; #if DECODE_DAIKIN if (results-> decode_type == DAIKIN) {IRDaikinESP ac (0); ac.setRaw (rezultate-> stare); description = ac.toString (); } #endif // DECODE_DAIKIN #if DECODE_FUJITSU_AC if (results-> decode_type == FUJITSU_AC) {IRFujitsuAC ac (0); ac.setRaw (rezultate-> stare, rezultate-> biți / 8); description = ac.toString (); } #endif // DECODE_FUJITSU_AC #if DECODE_KELVINATOR if (results-> decode_type == KELVINATOR) {IRKelvinatorAC ac (0); ac.setRaw (rezultate-> stare); description = ac.toString (); } #endif // DECODE_KELVINATOR #if DECODE_TOSHIBA_AC if (results-> decode_type == TOSHIBA_AC) {IRToshibaAC ac (0); ac.setRaw (rezultate-> stare); description = ac.toString (); } #endif // DECODE_TOSHIBA_AC #if DECODE_MIDEA if (results-> decode_type == MIDEA) {IRMideaAC ac (0); ac.setRaw (rezultate-> valoare); // Midea folosește valoare în loc de stare. description = ac.toString (); } #endif // DECODE_MIDEA // Dacă avem o descriere a mesajului citită de om, afișați-o. if (description! = "") Serial.println ("Mesg Desc.:" + description); }

// Secțiunea de cod rulează o singură dată la pornire.

configurare nulă () {Serial.begin (BAUD_RATE, SERIAL_8N1, SERIAL_TX_ONLY); întârziere (500); // Așteptați puțin până când conexiunea serială va fi stabilită.

#iface DECODE_HASH

// Ignorați mesajele cu impulsuri de pornire sau oprire mai mici decât minimul. irrecv.setUnknownThreshold (MIN_UNKNOWN_SIZE); #endif // DECODE_HASH irrecv.enableIRIn (); // Porniți receptorul}

// Secțiunea repetată a codului

// void loop () {// Verificați dacă a fost primit codul IR. if (irrecv.decode (& rezultate)) {// Afișați un timestamp brut. uint32_t acum = millis (); Serial.printf ("Timestamp:% 06u.% 03u / n", acum / 1000, acum% 1000); if (results.overflow) Serial.printf ("AVERTISMENT: codul IR este prea mare pentru buffer (> =% d)." "Acest rezultat nu ar trebui să fie de încredere până când acest lucru nu este rezolvat." "Editați și măriți CAPTURE_BUFFER_SIZE. / n ", CAPTURE_BUFFER_SIZE); // Afișați rezultatul de bază al ceea ce am găsit. Serial.print (resultToHumanReadableBasic (& results)); dumpACInfo (& rezultate); // Afișați orice informații suplimentare despre A / C dacă le avem. Randament(); // Alimentați WDT, deoarece textul poate dura puțin timp pentru a imprima.

// Afișați versiunea bibliotecii cu care a fost capturat mesajul.

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

// Afișați informațiile de sincronizare RAW ale rezultatului.

Serial.println (resultToTimingInfo (& results)); Randament(); // Alimentați WDT (din nou)

// Afișați rezultatele ca cod sursă

Serial.println (resultToSourceCode (& results)); Serial.println (""); // Linie goală între intrări yield (); // Alimentați WDT (din nou)}}

Când această descărcare este încărcată și rulează cu monitorul serial deschis, va emite codul pentru apăsarea butonului (vezi imaginea)

Notați codurile pe care doriți să le utilizați pentru o utilizare ulterioară. Am folosit Excel pentru a nota ce am primit pentru butoanele pe care am vrut să le folosesc (vezi poza)

Am editat butoanele din activitatea mea Netflix pentru a trimite semnal de pauză de la telecomanda panasonic.. (vezi poza)

Pasul 3: Scrierea codului pentru trimiterea către Nodered

Scrierea codului pentru trimiterea către Nodered
Scrierea codului pentru trimiterea către Nodered

#ifndef UNIT_TEST # include #endif #include

#include

#include

#include

#include

#include

const char * ssid = ""; // Introduceți SSID hereconst char * password = ""; // Introduceți parola aici const char * host = ""; // IP addresse #define USE_SERIAL Serial ESP8266WiFiMulti WiFiMulti; uint16_t RECV_PIN = 14; IRrecv irrecv (RECV_PIN); rezultate decode_results; void setup () {irrecv.enableIRIn (); // Porniți receptorul USE_SERIAL.begin (115200); // USE_SERIAL.setDebugOutput (adevărat); USE_SERIAL.println (); USE_SERIAL.println (); USE_SERIAL.println ();

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

USE_SERIAL.printf ("[SETUP] WAIT% d … / n", t); USE_SERIAL.flush (); întârziere (1000); } WiFi.mode (WIFI_STA); WiFiMulti.addAP (ssid, parolă); } void loop () {if (irrecv.decode (& results)) {

// Schimbați această valoare a semnalului pentru cel pe care l-ați primit

if (results.value == 0x40040D00606D) {USE_SERIAL.println ("pauză Semnal primit"); wifisend (pauză); întârziere (1000);

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

USE_SERIAL.println („precedent”);

wifisend ("prev"); întârziere (1000); } if (results.value == 0x40040100F2F3) {USE_SERIAL.println („următorul”); wifisend („următorul”); întârziere (1000); }

irrecv.resume (); // Primiți următoarea valoare} întârziere (100); } void wifisend (String data) {if ((WiFiMulti.run () == WL_CONNECTED)) {HTTPClient http; USE_SERIAL.print ("[HTTP] începe … / n"); // configurați serverul și adresa URL urmărite http.begin ("https:// [utilizator]: [trece] @ [ip]: [port] / chromecastpause? date =" + date); USE_SERIAL.print ("[HTTP] GET … / n"); // pornește conexiunea și trimite antetul HTTP int httpCode = http. GET (); // httpCode va fi negativ la eroare dacă (httpCode> 0) {// antetul HTTP a fost trimis și antetul de răspuns al serverului a fost tratat USE_SERIAL.printf ("[HTTP] GET … cod:% d / n", // fișier găsit pe server

if (httpCode == HTTP_CODE_OK) {String payload = http.getString (); USE_SERIAL.println (sarcină utilă); }} else {USE_SERIAL.printf ("[HTTP] GET … a eșuat, eroare:% s / n", http.errorToString (httpCode).c_str ()); } http.end (); întârziere (100); }}

Acesta este codul pe care l-am folosit pe nodemcu. Va trebui să aveți aceste biblioteci instalate.

Puteți testa folosind monitorul serial și apăsați butoanele de la distanță pe care le-ați adăugat în cod pentru a vedea răspunsul..

In linie:

http.begin ("https:// [utilizator]: [trece] @ [ip]: [port] / chromecastpause? date =" + date);

Trebuie să schimbați [utilizator] cu utilizatorul dvs. și așa mai departe. FĂRĂ paranteze. parantezele sunt acolo pentru a arăta câmpurile vrăjitoarei de modificat.

De asemenea, această linie nu va funcționa până când nu vom seta fluxul în cap.

Pasul 4: Crearea unui flux în Nodered

Crearea unui flux în Nodered
Crearea unui flux în Nodered
Crearea unui flux în Nodered
Crearea unui flux în Nodered
Crearea unui flux în Nodered
Crearea unui flux în Nodered
Crearea unui flux în Nodered
Crearea unui flux în Nodered

După cum sa menționat la început, folosesc hass.io cu nodered. Dacă rulați o configurare diferită, va trebui să faceți acest lucru diferit! Puteți vedea în imagine că atunci când este apăsat un buton, acesta apare în fereastra de depanare …

Nodul de schimbare a sarcinii utile ar fi putut fi omis probabil dacă aș fi ales ceva diferit că data = în pasul anterior. Nodul de comutare pe care îl folosesc este mult mai mare, apoi doar pauză, dar este doar așa că aș putea adăuga mai multe semnale ir pentru a utiliza chromecastul pentru posturile de radio etc.

Pentru doar o pauză de redare, puteți utiliza fluxul din cealaltă imagine.

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

Am eliminat numele userpass și adresa URL din acesta, deci este posibil să fie necesar să editați acest lucru.

adăugați un nod de comutare dacă doriți să reacționați la mai mult decât doar pauză (a se vedea imaginea de exemplu)

În nodul asistent de acasă pentru utilizare pauză:

name: play pause chromecastdomain: media_playerService: media_play_pausedata: {"entity_id": "media_player. [chromecastul dvs. aici]"}

pentru următorul track, trebuie doar să copiați acel nod și să editați serviciul în: media_next_track și denumiți în: next chromecast

Pasul 5: opțional Alexa Pause Chromecast

Comandă opțională de adăugare Alexa pentru pauză chromecast:

Există opțiuni aici.. Puteți crea un nnode Alexa numit pauză chromecast care întrerupe chromecastul, sau puteți face una numită pauză TV care verifică activitatea armoniei curente și pauză în funcție de aceasta.

Voi adăuga asta aici mai târziu..

Recomandat: