Inhoudsopgave:

Chromcast pauzeren met een afstandsbediening: 5 stappen
Chromcast pauzeren met een afstandsbediening: 5 stappen

Video: Chromcast pauzeren met een afstandsbediening: 5 stappen

Video: Chromcast pauzeren met een afstandsbediening: 5 stappen
Video: Maak elke TV slim dankzij deze Google TV Chromecast met afstandsbediening 2024, Juli-
Anonim
Image
Image
uitrusting
uitrusting

Ik heb een Logitech Harmony-afstandsbediening en draai Home Assistant op een Raspberry Pi.

Ik wilde Chromecast kunnen pauzeren vanaf mijn afstandsbediening, maar ik heb een oude tv die dit niet ondersteunt via HDMI. Mijn idee was toen om een NodeMcu te gebruiken om het ir-signaal op te vangen en te pauzeren.

Als je het niet aan het werk kunt krijgen of vragen hebt, kun je hieronder reageren

Stap 1: Uitrusting

uitrusting
uitrusting
uitrusting
uitrusting

Vereiste uitrusting:

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

Ir-ontvanger (zoals deze:

dupont draden

Micro usb-kabel (power nodemcu)

Ik gebruik Logitech Harmony -hub

Voor mijn aanpak heb je een Raspberry pi nodig met hass.io geïnstalleerd en nodered. Ik ga hier niet in op het opzetten van homeassistant-dingen. Als je iets anders gebruikt dan homeassistant moet je zelf dingen aanpassen.

Je moet Nodemcu op Arduino IDE kunnen gebruiken, want daar ga ik hier niet op in

Stap 2: Signaal op afstand

Signaal op afstand
Signaal op afstand
Signaal op afstand
Signaal op afstand
Signaal op afstand
Signaal op afstand
Signaal op afstand
Signaal op afstand

De manier waarop ik het deed was het kopiëren van een signaal van een afstandsbediening die ik niet gebruik naar de Harmony-afstandsbediening.

Ik heb een afstandsbediening gebruikt voor panasonic tv-model TXL32C3E, omdat die mijn apparatuur op mijn eerste verdieping niet hindert. Dat is een tv die ik boven heb.

Als u geen harmonie gebruikt, kunt u dit overslaan.

Dus voor het vinden van het signaal heb ik deze schets gebruikt:

/* * IRremoteESP8266: IRrecvDumpV2 - dump details van IR-codes met IRrecv * Een IR-detector/demodulator moet worden aangesloten op de ingang RECV_PIN. * * Copyright 2009 Ken Shirriff, https://arcfn.com * Copyright 2017 David Conran * * Voorbeeld schakelschema: * https://arcfn.com * * Wijzigingen: * Versie 0.3 november 2017 * - Ondersteuning voor A/C decoderen voor sommige protocollen. * Versie 0.2 april 2017 * - Decoderen van een kopie van de gegevens, zodat we sneller kunnen beginnen met vastleggen, * verklein de kans op foutieve opnamen. * Gebaseerd op Ken Shirriff's IrsendDemo versie 0.1 juli 2009, */

#ifndef UNIT_TEST

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

// ==================== begin van AFSTELBARE PARAMETERS ====================

// Een IR-detector/demodulator is aangesloten op GPIO-pin 14 // b.v. D5 op een NodeMCU-bord. #define RECV_PIN 14

// De baudrate van de seriële verbinding.

// d.w.z. het statusbericht wordt met deze baudrate naar de pc verzonden. // Probeer lage snelheden zoals 9600 te vermijden, omdat u berichten zult missen en // andere problemen zult veroorzaken. 115200 (of sneller) wordt aanbevolen. // OPMERKING: zorg ervoor dat u uw seriële monitor op dezelfde snelheid instelt. #define BAUD_RATE 115200

// Aangezien dit programma een speciale capture/decoder is, gebruiken we een grotere

// dan de normale buffer zodat we de afstandsbedieningscodes van de airconditioner kunnen verwerken. #define CAPTURE_BUFFER_SIZE 1024

// TIMEOUT is de Nr. van milliseconden niet-meer-gegevens voordat we een beschouwen

// bericht beëindigd. // Deze parameter is een interessante afweging. Hoe langer de time-out, hoe meer // complexer een bericht kan worden vastgelegd. bijv. Sommige apparaatprotocollen verzenden // meerdere berichtpakketten snel achter elkaar, zoals afstandsbedieningen van airconditioners. // Air Conditioner-protocollen hebben vaak een aanzienlijke kloof (20-40+ms) tussen //-pakketten. // Het nadeel van een grote time-outwaarde is dat er veel minder complexe protocollen zijn // meerdere berichten verzenden wanneer de knop van de afstandsbediening wordt ingedrukt. De kloof tussen // hen is vaak ook rond de 20+ms. Dit kan ertoe leiden dat de onbewerkte gegevens 2-3+ // keer groter zijn dan nodig is, omdat er 2-3+ berichten zijn vastgelegd in een enkele // opname. Het instellen van een lage time-outwaarde kan dit oplossen. // Dus het kiezen van de beste TIMEOUT-waarde voor uw specifieke gebruik is // nogal genuanceerd. Veel succes en plezier met jagen. // OPMERKING: Overschrijd MAX_TIMEOUT_MS niet. Meestal 130 ms. #if DECODE_AC #define TIMEOUT 50U // Sommige airco-units hebben hiaten in hun protocollen van ~40ms. // bijv. Kelvinator // Een waarde van deze omvang kan herhalingen van sommige protocollen inslikken #else // DECODE_AC #define TIMEOUT 15U // Geschikt voor de meeste berichten, terwijl niet veel herhalingen worden ingeslikt. #endif // DECODE_AC // Alternatieven: // #define TIMEOUT 90U // Geschikt voor berichten met grote hiaten zoals XMP-1 en sommige airconditioning // eenheden, maar kan per ongeluk herhaalde berichten inslikken // in de rawData-uitvoer. // #define TIMEOUT MAX_TIMEOUT_MS // Dit stelt het in op ons momenteel toegestane // maximum. Waarden die zo hoog zijn, zijn problematisch // omdat het ongeveer de typische grens is // waar de meeste berichten worden herhaald. // bijv. Het zal stoppen met het decoderen van een bericht en // het naar serieel sturen op precies // het tijdstip waarop het volgende bericht waarschijnlijk // zal worden verzonden, en kan het missen.

// Stel de kleinste "ONBEKENDE" berichtpakketten in waar we echt om geven.

// Deze waarde helpt de fout-positieve detectiesnelheid van IR-achtergrond // ruis als echte berichten te verminderen. De kans dat IR-achtergrondruis wordt gedetecteerd // als een bericht neemt toe met de lengte van de TIMEOUT-waarde. (Zie hierboven) // Het nadeel van het te groot instellen van dit bericht is dat je een aantal geldige // korte berichten kunt missen voor protocollen die deze bibliotheek nog niet kan decoderen. // // Stel hoger in als je veel willekeurige korte ONBEKENDE berichten krijgt terwijl niets // een bericht zou moeten verzenden. // Stel lager in als u zeker weet dat uw installatie werkt, maar geen berichten // van uw apparaat ziet. (bijv. Andere IR-afstandsbedieningen werken.) // OPMERKING: Stel deze waarde zeer hoog in om ONBEKENDE detectie effectief uit te schakelen. #define MIN_UNKNOWN_SIZE 12 // =================== einde van AFSTELBARE PARAMETERS ====================

// Gebruik de functie voor het opslaan van buffers inschakelen voor een completere opnamedekking.

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

decode_results resultaten; // Ergens om de resultaten op te slaan

// Geef de voor mensen leesbare status van een A/C-bericht weer als dat mogelijk is.

void dumpACInfo(decode_results *results) { String description = ""; #if DECODE_DAIKIN if (resultaten->decode_type == DAIKIN) { IRDaikinESP ac (0); ac.setRaw(resultaten->staat); beschrijving = ac.toString(); } #endif // DECODE_DAIKIN #if DECODE_FUJITSU_AC if (results->decode_type == FUJITSU_AC) { IRFujitsuAC ac (0); ac.setRaw(resultaten->staat, resultaten->bits / 8); beschrijving = ac.toString(); } #endif // DECODE_FUJITSU_AC #if DECODE_KELVINATOR if (results->decode_type == KELVINATOR) { IRKelvinatorAC ac (0); ac.setRaw(resultaten->staat); beschrijving = ac.toString(); } #endif // DECODE_KELVINATOR #if DECODE_TOSHIBA_AC if (results->decode_type == TOSHIBA_AC) { IRToshibaAC ac (0); ac.setRaw(resultaten->staat); beschrijving = ac.toString(); } #endif // DECODE_TOSHIBA_AC #if DECODE_MIDEA if (results->decode_type == MIDEA) { IRMideaAC ac (0); ac.setRaw(resultaten->waarde); // Midea gebruikt waarde in plaats van staat. beschrijving = ac.toString(); } #endif // DECODE_MIDEA // Als we een voor mensen leesbare beschrijving van het bericht hebben, laat het dan zien. if (beschrijving != "") Serial.println("Berichtbeschrijving: " + beschrijving); }

// Het codegedeelte wordt slechts één keer uitgevoerd bij het opstarten.

void setup () { Serial.begin (BAUD_RATE, SERIAL_8N1, SERIAL_TX_ONLY); vertraging (500); // Wacht even tot de seriële verbinding tot stand is gebracht.

#if DECODE_HASH

// Negeer berichten met minder dan minimum aan of uit pulsen. onrecv.setUnknownThreshold (MIN_UNKNOWN_SIZE); #endif // DECODE_HASH irrecv.enableIRIn(); // Start de ontvanger}

// Het herhalende gedeelte van de code

// void loop() { // Controleer of de IR-code is ontvangen. if (irrecv.decode(&results)) { // Geef een ruwe tijdstempel weer. uint32_t nu = millis(); Serial.printf("Tijdstempel: %06u.%03u\n", nu / 1000, nu % 1000); if (results.overflow) Serial.printf("WAARSCHUWING: IR-code is te groot voor buffer (>= %d). " "Dit resultaat mag niet worden vertrouwd totdat dit is opgelost. " "Bewerken en CAPTURE_BUFFER_SIZE vergroten.\n ", CAPTURE_BUFFER_SIZE); // Geef de basisuitvoer weer van wat we hebben gevonden. Serial.print(resultToHumanReadableBasic(&results)); dumpACInfo(&resultaten); // Geef extra airco-info weer als we die hebben. opbrengst(); // Voer de WDT in, aangezien het even kan duren voordat de tekstuitvoer is afgedrukt.

// Geef de bibliotheekversie weer waarmee het bericht is vastgelegd.

Serial.print("Bibliotheek: v"); Serial.println(_IRREMOTEESP8266_VERSION_); Serieel.println();

// Output RAW timing info van het resultaat.

Serial.println(resultToTimingInfo(&results)); opbrengst(); // Voer de WDT (opnieuw)

// Voer de resultaten uit als broncode

Serial.println(resultToSourceCode(&results)); Serieel.println(""); // Blanco regel tussen ingangen opbrengst (); // Voer de WDT (opnieuw) } }

Wanneer deze scetch is geüpload en wordt uitgevoerd met de seriële monitor open, wordt de code voor het indrukken van de knop weergegeven (zie afbeelding)

Noteer de codes die u wilt gebruiken voor later gebruik. Ik gebruikte Excel om te noteren wat ik kreeg voor knoppen die ik wilde gebruiken (zie afbeelding)

Ik heb de knoppen in mijn Netflix-activiteit bewerkt om een pauzesignaal van de Panasonic-afstandsbediening te verzenden.. (zie afbeelding)

Stap 3: De code schrijven voor verzending naar Nodered

De code schrijven voor verzending naar Nodered
De code schrijven voor verzending naar Nodered

#ifndef UNIT_TEST#include #endif #include

#erbij betrekken

#erbij betrekken

#erbij betrekken

#erbij betrekken

#erbij betrekken

const char* ssid = ""; // Voer hier SSID in char* wachtwoord = ""; //Voer hier het wachtwoord in const char *host = ""; // IP-adres #define USE_SERIAL Serieel ESP8266WiFiMulti WiFiMulti; uint16_t RECV_PIN = 14; IRrecv irrecv(RECV_PIN); decode_results resultaten; void setup() { irrecv.enableIRIn(); // Start de ontvanger 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] WACHT %d…\n", t); USE_SERIAL.flush(); vertraging (1000); } WiFi.mode(WIFI_STA); WiFiMulti.addAP(ssid, wachtwoord); } void loop() { if (irrecv.decode(&resultaten)) {

// Verander deze signaalwaarde voor degene die je hebt

if (results.value == 0x40040D00606D){ USE_SERIAL.println("pauze Signaal ontvangen"); wifisend (pauze); vertraging (1000);

} if (resultaten.waarde == 0x400401007273){

USE_SERIAL.println("vorige");

wifisend("vorige"); vertraging (1000); } if (results.value == 0x40040100F2F3){ USE_SERIAL.println("volgende"); wifisend("volgende"); vertraging (1000); }

irrev.resume(); // Ontvang de volgende waarde} vertraging (100); } void wifisend(String data){ if((WiFiMulti.run() == WL_CONNECTED)) { HTTPClient http; USE_SERIAL.print("[HTTP] begin…\n"); // configureer traged server en url http.begin("https://[user]:[pass]@[ip]:[port]/chromecastpause?data=" + data); USE_SERIAL.print("[HTTP] GET…\n"); // start verbinding en verzend HTTP-header int httpCode = http. GET(); // httpCode zal negatief zijn bij fout als (httpCode > 0) { // HTTP-header is verzonden en serverresponsheader is afgehandeld USE_SERIAL.printf("[HTTP] GET… code: %d\n", // bestand gevonden op server

if(httpCode == HTTP_CODE_OK) { String payload = http.getString(); USE_SERIAL.println(lading); } } else { USE_SERIAL.printf("[HTTP] GET… mislukt, fout: %s\n", http.errorToString(httpCode).c_str()); } http.end(); vertraging (100); } }

Dit is de code die ik op mijn nodemcu heb gebruikt. U moet die bibliotheken hebben geïnstalleerd.

U kunt testen met een seriële monitor en op externe knoppen drukken die u in code hebt toegevoegd om het antwoord te zien.

In de rij:

http.begin("https://[gebruiker]:[pas]@[ip]:[poort]/chromecastpause?data=" + data);

U moet [gebruiker] wijzigen in uw gebruiker enzovoort. ZONDER beugels. haakjes zijn er om te laten zien welke velden moeten worden gewijzigd.

Die regel zal ook niet werken totdat we onze stroom hebben ingesteld in nodered.

Stap 4: Een stroom maken in Nodered

Een stroom maken in Nodered
Een stroom maken in Nodered
Een stroom maken in Nodered
Een stroom maken in Nodered
Een stroom maken in Nodered
Een stroom maken in Nodered
Een stroom maken in Nodered
Een stroom maken in Nodered

Zoals in het begin vermeld, gebruik ik hass.io met nodered. Als u een andere installatie uitvoert, moet u deze anders maken! U kunt in de afbeelding zien dat wanneer een knop wordt ingedrukt, deze wordt weergegeven in het foutopsporingsvenster …

Het change payload-knooppunt had waarschijnlijk kunnen worden overgeslagen als ik in de vorige stap iets anders had gekozen dat data=. Het schakelknooppunt dat ik gebruik is veel groter dan alleen pauzeren, maar dat is alleen maar zodat ik meer ir-signalen kan toevoegen om Chromecast te gebruiken voor radiostations enz.

Voor alleen afspeelpauze kun je de stroom in de andere afbeelding gebruiken.

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

Ik heb de naam userpass en url hiervan verwijderd, dus misschien moet je dat aanpassen.

voeg een schakelknooppunt toe als je op meer wilt reageren dan alleen pauzeren (zie bijvoorbeeld afbeelding)

In de home assistant node voor pauzegebruik:

naam: play pause chromecastdomain: media_playerService: media_play_pausedata: { "entity_id": "media_player.[uw chromecast hier]" }

kopieer voor het volgende nummer dat knooppunt en bewerk de service naar: media_next_track en naam naar: volgende chromecast

Stap 5: Optionele Alexa Pause Chromecast

Optioneel voeg alexa-opdracht toe voor pauze chromecast:

Er zijn hier opties.. Je kunt één alexa nnode genaamd pause chromecast maken die chromecast pauzeert, of je kunt er een maken genaamd pauze tv die de huidige harmonie-activiteit controleert en afhankelijk daarvan pauzeert.

Ik zal dit hier later toevoegen..

Aanbevolen: