Innehållsförteckning:

Pausa Chromcast med en fjärrkontroll: 5 steg
Pausa Chromcast med en fjärrkontroll: 5 steg

Video: Pausa Chromcast med en fjärrkontroll: 5 steg

Video: Pausa Chromcast med en fjärrkontroll: 5 steg
Video: 🔴CHROMECAST GOOGLE TV 5 SECRET FEATURES 2024, Juli
Anonim
Image
Image
Utrustning
Utrustning

Jag har en Logitech Harmony -fjärrkontroll och kör hemassistent på en hallonpi.

Jag ville kunna pausa chromecast från min fjärrkontroll, men jag har en gammal tv som inte stöder detta via hdmi. Min idé var då att använda en NodeMcu för att fånga IR -signalen och pausa.

Om du inte kan få det att fungera eller har frågor vänligen kommentera nedan

Steg 1: Utrustning

Utrustning
Utrustning
Utrustning
Utrustning

Utrustning som behövs:

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

Ir-mottagare (som ex:

dupont -trådar

Micro usb -kabel (power nodemcu)

Jag använder Logitech Harmony -hub

För mitt tillvägagångssätt Du behöver en hallon pi med hass.io installerat och Nodered. Om du använder något annat än hemassistent måste du anpassa saker själv.

Du måste kunna använda Nodemcu på Arduino IDE eftersom jag inte går in på det här

Steg 2: Fjärrsignal

Fjärrsignal
Fjärrsignal
Fjärrsignal
Fjärrsignal
Fjärrsignal
Fjärrsignal
Fjärrsignal
Fjärrsignal

Sättet jag gjorde det var att kopiera en signal från en fjärrkontroll som jag inte använder till harmonifjärrkontrollen.

Jag använde en fjärrkontroll för panasonic tv -modell TXL32C3E eftersom det inte stör min utrustning på min första våning. Det är en tv jag har på övervåningen.

Om du inte använder harmoni kan du hoppa över detta.

Så för att hitta signalen använde jag denna skiss:

/ * * IRremoteESP8266: IRrecvDumpV2 - dumpdetaljer för IR -koder med IRrecv * En IR -detektor/demodulator måste anslutas till ingången RECV_PIN. * * Copyright 2009 Ken Shirriff, https://arcfn.com * Copyright 2017 David Conran * * Exempel på kretsschema: * https://arcfn.com * * Ändringar: * Version 0.3 november, 2017 * - Stöd för A/C avkodning för några protokoll. * Version 0.2 april, 2017 * - Avkoda från en kopia av data så att vi kan börja fånga snabbare och därmed * minska sannolikheten för missuppfattningar. * Baserat på Ken Shirriffs IrsendDemo Version 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 är ansluten till GPIO -stift 14 // t.ex. D5 på ett NodeMCU -kort. #define RECV_PIN 14

// Den seriella anslutningens överföringshastighet.

// dvs statusmeddelande kommer att skickas till datorn med denna överföringshastighet. // Försök att undvika långsamma hastigheter som 9600, eftersom du kommer att sakna meddelanden och // orsaka andra problem. 115200 (eller snabbare) rekommenderas. // OBS: Se till att du ställer in din seriella bildskärm till samma hastighet. #define BAUD_RATE 115200

// Eftersom det här programmet är ett specialfångst/avkodare, låt oss använda en större

// än normal buffert så att vi kan hantera fjärrkoder för luftkonditionering. #define CAPTURE_BUFFER_SIZE 1024

// TIMEOUT är Nr. av milli-sekunder av icke-mer-data innan vi överväger a

// meddelandet slutade. // Denna parameter är en intressant avvägning. Ju längre timeout, desto mer // komplext meddelande kan det fånga. t.ex. Vissa enhetsprotokoll skickar // flera meddelandepaket i snabb följd, till exempel luftkonditioneringsfjärrkontroller. // Air Coniditioner-protokoll har ofta ett stort avstånd (20-40+ms) mellan // paket. // Nackdelen med ett stort timeout -värde är många mindre komplexa protokoll // skicka flera meddelanden när fjärrkontrollens knapp hålls nedtryckt. Klyftan mellan // dem är ofta också cirka 20+ms. Detta kan resultera i att rådata blir 2-3+ // gånger större än vad som behövs eftersom det har fångat in 2-3+ meddelanden i en enda // fångst. Att ställa in ett lågt timeout -värde kan lösa detta. // Så att välja det bästa TIMEOUT -värdet för ditt specifika fall är // ganska nyanserat. Lycka till och glad jakt. // OBS! Överskrid inte MAX_TIMEOUT_MS. Typiskt 130 ms. #if DECODE_AC #define TIMEOUT 50U // Vissa A/C -enheter har luckor i sina protokoll på ~ 40 ms. // t.ex. Kelvinator // Ett värde som är så stort kan svälja upprepningar av vissa protokoll #else // DECODE_AC #define TIMEOUT 15U // Passar de flesta meddelanden utan att svälja många upprepningar. #endif // DECODE_AC // Alternativ: // #define TIMEOUT 90U // Passar meddelanden med stora luckor som XMP-1 och vissa luftkonditionerade // enheter, men kan av misstag svälja upprepade meddelanden // i rawData -utmatningen. // #define TIMEOUT MAX_TIMEOUT_MS // Detta ställer in det tillåtna // maximalt. Värden som är så höga är problematiska // eftersom det är ungefär den typiska gränsen // där de flesta meddelanden upprepas. // t.ex. Det kommer att sluta avkoda ett meddelande och // börja skicka det till följetong vid exakt // den tid då nästa meddelande sannolikt // ska överföras, och kan missa det.

// Ställ in de minsta "okända" meddelandepaket som vi faktiskt bryr oss om.

// Detta värde hjälper till att minska den falskt positiva detektionshastigheten för IR-bakgrund // brus som riktiga meddelanden. Chansen att bakgrunds -IR -brus upptäcks // när ett meddelande ökar med TIMEOUT -värdet. (Se ovan) // Nackdelen med att ställa in detta meddelande för stort är att du kan missa några giltiga // korta meddelanden för protokoll som detta bibliotek ännu inte har avkodat. // // Ställ in högre om du får massor av slumpmässiga korta okända meddelanden när ingenting // ska skicka ett meddelande. // Ställ in lägre om du är säker på att installationen fungerar, men det visas inga meddelanden // från din enhet. (t.ex. andra IR -fjärrkontroller fungerar.) // OBS: Ställ in detta värde mycket högt för att effektivt stänga av okänd detektion. #define MIN_UNKNOWN_SIZE 12 // ==================== slutet av TUNEABLE PARAMETERS =====================

// Använd slå på sparbuffertfunktionen för mer fullständig inspelningstäckning.

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

resultat avkodningsresultat; // Någonstans att lagra resultaten

// Visa det mänskliga läsbara tillståndet för ett A/C -meddelande om vi kan.

void dumpACInfo (decode_results *results) {String description = ""; #if DECODE_DAIKIN if (results-> decode_type == DAIKIN) {IRDaikinESP ac (0); ac.setRaw (resultat-> tillstånd); description = ac.toString (); } #endif // DECODE_DAIKIN #if DECODE_FUJITSU_AC if (results-> decode_type == FUJITSU_AC) {IRFujitsuAC ac (0); ac.setRaw (resultat-> tillstånd, resultat-> bitar / 8); description = ac.toString (); } #endif // DECODE_FUJITSU_AC #if DECODE_KELVINATOR if (results-> decode_type == KELVINATOR) {IRKelvinatorAC ac (0); ac.setRaw (resultat-> tillstånd); description = ac.toString (); } #endif // DECODE_KELVINATOR #if DECODE_TOSHIBA_AC if (results-> decode_type == TOSHIBA_AC) {IRToshibaAC ac (0); ac.setRaw (resultat-> tillstånd); description = ac.toString (); } #endif // DECODE_TOSHIBA_AC #if DECODE_MIDEA if (results-> decode_type == MIDEA) {IRMideaAC ac (0); ac.setRaw (resultat-> värde); // Midea använder värde istället för stat. description = ac.toString (); } #endif // DECODE_MIDEA // Om vi har en läsbar beskrivning av meddelandet, visa det. if (description! = "") Serial.println ("Mesg Desc.:" + description); }

// Kodavsnittet körs bara en gång vid start.

void setup () {Serial.begin (BAUD_RATE, SERIAL_8N1, SERIAL_TX_ONLY); fördröjning (500); // Vänta lite tills seriell anslutning upprättas.

#if DECODE_HASH

// Ignorera meddelanden med mindre eller lägsta på eller av -pulser. irrecv.setUnknownThreshold (MIN_UNKNOWN_SIZE); #endif // DECODE_HASH irrecv.enableIRIn (); // Starta mottagaren}

// Den upprepande delen av koden

// void loop () {// Kontrollera om IR -koden har tagits emot. if (irrecv.decode (& resultat)) {// Visa en rå tidsstämpel. uint32_t nu = millis (); Serial.printf ("Tidsstämpel: %06u. %03u / n", nu / 1000, nu %1000); if (results.overflow) Serial.printf ("VARNING: IR -koden är för stor för buffert (> = %d)." "Detta resultat ska inte lita på förrän detta är löst." "Redigera och öka CAPTURE_BUFFER_SIZE. / n ", CAPTURE_BUFFER_SIZE); // Visa grundutmatningen för det vi hittade. Serial.print (resultToHumanReadableBasic (& resultat)); dumpACInfo (& resultat); // Visa eventuell extra A/C -information om vi har den. avkastning(); // Mata in WDT eftersom textutmatningen kan ta ett tag att skriva ut.

// Visa biblioteksversionen som meddelandet fångades med.

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

// Utmatning RAW -timinginformation av resultatet.

Serial.println (resultToTimingInfo (& resultat)); avkastning(); // Mata WDT (igen)

// Mata ut resultaten som källkod

Serial.println (resultToSourceCode (& resultat)); Serial.println (""); // Tom rad mellan poster avkastning (); // Mata WDT (igen)}}

När denna hämtning laddas upp och körs med seriell bildskärm öppen kommer den att mata ut koden för knapptryckning (se bild)

Skriv ner koder du vill använda för senare användning. Jag använde Excel för att notera vad jag fick för knappar jag ville använda (se bild)

Jag redigerade knapparna i min Netflix -aktivitet för att skicka paussignal från panasonics fjärrkontroll.. (se bild)

Steg 3: Skriva koden för att skicka till Nodered

Skriva koden för att skicka till Nodered
Skriva koden för att skicka till Nodered

#ifndef UNIT_TEST #inkluderar #endif #include

#omfatta

#omfatta

#omfatta

#omfatta

#omfatta

const char* ssid = ""; // Ange SSID hereconst char* password = ""; // Ange lösenord här const char *host = ""; // Ip addresse #define USE_SERIAL Serial ESP8266WiFiMulti WiFiMulti; uint16_t RECV_PIN = 14; IRrecv irrecv (RECV_PIN); resultat avkodningsresultat; void setup () {irrecv.enableIRIn (); // Starta mottagaren USE_SERIAL.begin (115200); // USE_SERIAL.setDebugOutput (true); USE_SERIAL.println (); USE_SERIAL.println (); USE_SERIAL.println ();

för (uint8_t t = 4; t> 0; t--) {

USE_SERIAL.printf ("[SETUP] WAIT %d … / n", t); USE_SERIAL.flush (); fördröjning (1000); } WiFi.mode (WIFI_STA); WiFiMulti.addAP (ssid, lösenord); } void loop () {if (irrecv.decode (& resultat)) {

// Ändra detta signalvärde för det du fick

if (results.value == 0x40040D00606D) {USE_SERIAL.println ("pausa signal mottagen"); wifisend (paus); fördröjning (1000);

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

USE_SERIAL.println ("föregående");

wifisend ("prev"); fördröjning (1000); } if (results.value == 0x40040100F2F3) {USE_SERIAL.println ("nästa"); wifisend ("nästa"); fördröjning (1000); }

irrecv.resume (); // Få nästa värde} fördröjning (100); } void wifisend (strängdata) {if ((WiFiMulti.run () == WL_CONNECTED)) {HTTPClient http; USE_SERIAL.print ("[HTTP] börjar … / n"); // konfigurera traged server och url http.begin ("https:// [användare]: [pass]@[ip]: [port]/chromecastpause? data =" + data); USE_SERIAL.print ("[HTTP] FÅ … / n"); // starta anslutningen och skicka HTTP -rubrik int httpCode = http. GET (); // httpCode kommer att vara negativ vid fel om (httpCode> 0) {// HTTP -rubrik har skickats och serversvarhuvud har hanterats USE_SERIAL.printf ("[HTTP] GET … code: %d / n", // filen hittades på servern

if (httpCode == HTTP_CODE_OK) {String nyttolast = http.getString (); USE_SERIAL.println (nyttolast); }} annat {USE_SERIAL.printf ("[HTTP] FÅR… misslyckades, fel: %s / n", http.errorToString (httpCode).c_str ()); } http.end (); fördröjning (100); }}

Detta är koden jag använde på min nodemcu. Du måste ha dessa bibliotek installerade.

Du kan testa med seriell bildskärm och trycka på fjärrknappar som du lade till i koden för att se svaret.

I raden:

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

Du måste byta [användare] till din användare och så vidare. UTAN fästen. parenteser finns för att visa häxfält som ska ändras.

Den raden fungerar inte heller förrän vi ställer in vårt flöde i noderat.

Steg 4: Skapa ett flöde i Nodered

Skapa ett flöde i Nodered
Skapa ett flöde i Nodered
Skapa ett flöde i Nodered
Skapa ett flöde i Nodered
Skapa ett flöde i Nodered
Skapa ett flöde i Nodered
Skapa ett flöde i Nodered
Skapa ett flöde i Nodered

Som nämnts i början använder jag hass.io med nodered. Om du kör en annan installation måste du göra detta annorlunda! Du kan se på bilden att när en knapp trycks visas den i felsökningsfönstret …

Ändringsnyttolastnoden kunde förmodligen ha hoppats över om jag hade valt något annat som data = i föregående steg. Omkopplingsnoden jag använder är mycket större än paus, men det är bara så att jag kan lägga till fler IR -signaler för att använda Chromecast för radiostationer etc.

För att bara spela paus kan du använda flödet i den andra bilden.

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

Jag tog bort namn userpass och url från detta så du kan behöva redigera det.

lägg till en switchnod om du vill reagera på mer än bara pausa (se bild till exempel)

I hemassistentnoden för pausanvändning:

namn: spela paus chromecastdomain: media_playerService: media_play_pausedata: {"entity_id": "media_player. [din chromecast här]"}

för nästa spår, kopiera bara den noden och redigera tjänsten till: media_next_track och namn till: nästa chromecast

Steg 5: Valfri Alexa Paus Chromecast

Valfritt lägg till alexa -kommando för paus chromecast:

Det finns alternativ här.. Du kan göra en alexa nnod som kallas pausa chromecast som pausar chromecast, eller så kan du göra en kallad paus -tv som kontrollerar aktuell harmoniaktivitet och pausar beroende på det.

Jag lägger till det här senare..

Rekommenderad: