Inhaltsverzeichnis:

Chromcast mit einer Fernbedienung anhalten - Gunook
Chromcast mit einer Fernbedienung anhalten - Gunook

Video: Chromcast mit einer Fernbedienung anhalten - Gunook

Video: Chromcast mit einer Fernbedienung anhalten - Gunook
Video: Diese 5 Tipps machen den Chromecast zum Streaming-Monster 2024, Juli
Anonim
Image
Image
Ausstattung
Ausstattung

Ich habe eine Logitech Harmony-Fernbedienung und starte Home Assistant auf einem Raspberry Pi.

Ich wollte Chromecast von meiner Fernbedienung aus anhalten können, aber ich habe einen alten Fernseher, der dies nicht über HDMI unterstützt. Meine Idee war dann, einen NodeMcu zu verwenden, um das IR-Signal zu erfassen und zu pausieren.

Wenn Sie es nicht zum Laufen bringen oder Fragen haben, kommentieren Sie bitte unten

Schritt 1: Ausrüstung

Ausstattung
Ausstattung
Ausstattung
Ausstattung

Benötigte Ausrüstung:

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

IR-Empfänger (wie zum Beispiel hier:

Dupont-Drähte

Micro-USB-Kabel (Power Nodemcu)

Ich verwende Logitech Harmony-Hub

Für meinen Ansatz benötigen Sie einen Raspberry Pi mit hass.io Installed und Nodered. Wenn Sie etwas anderes als eine Haushaltshilfe verwenden, müssen Sie die Dinge selbst anpassen.

Sie müssen in der Lage sein, Nodemcu auf der Arduino IDE zu verwenden, da ich hier nicht darauf eingehen werde

Schritt 2: Fernsignal

Fernsignal
Fernsignal
Fernsignal
Fernsignal
Fernsignal
Fernsignal
Fernsignal
Fernsignal

Ich habe es so gemacht, dass ich ein Signal von einer Fernbedienung, die ich nicht benutze, in die Harmony-Fernbedienung kopiert habe.

Ich habe eine Fernbedienung für das Panasonic-TV-Modell TXL32C3E verwendet, da dies meine Ausrüstung in meinem ersten Stock nicht stört. Das ist ein Fernseher, den ich oben habe.

Wenn Sie keine Harmonie verwenden, können Sie dies überspringen.

Um das Signal zu finden, habe ich diese Skizze verwendet:

/* * IRremoteESP8266: IRrecvDumpV2 - Dump-Details von IR-Codes mit IRrecv * Ein IR-Detektor/Demodulator muss an den Eingang RECV_PIN angeschlossen werden. * * Copyright 2009 Ken Shirriff, https://arcfn.com * Copyright 2017 David Conran * * Beispielschaltplan: * https://arcfn.com * * Änderungen: * Version 0.3 November 2017 * - Unterstützung für Klimaanlagen Decodierung für einige Protokolle. * Version 0.2 April 2017 * - Decodieren Sie eine Kopie der Daten, damit wir schneller mit der Erfassung beginnen können und * reduzieren Sie die Wahrscheinlichkeit von Fehlerfassungen. * Basierend auf Ken Shirriffs IrsendDemo Version 0.1 Juli 2009, */

#ifndef EINHEIT_TEST

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

// ==================== Start der TUNEABLE PARAMETER ====================

// Ein IR-Detektor/Demodulator ist an GPIO-Pin 14 angeschlossen // z. B. D5 auf einer NodeMCU-Platine. #define RECV_PIN 14

// Die Baudrate der seriellen Verbindung.

// d.h. Statusmeldung wird mit dieser Baudrate an den PC gesendet. // Versuchen Sie, langsame Geschwindigkeiten wie 9600 zu vermeiden, da Sie Nachrichten verpassen und // andere Probleme verursachen. 115200 (oder schneller) wird empfohlen. // HINWEIS: Stellen Sie sicher, dass Sie Ihren Serial Monitor auf die gleiche Geschwindigkeit einstellen. #define BAUD_RATE 115200

// Da dieses Programm ein spezieller Capture/Decoder ist, verwenden wir einen größeren

// als normaler Puffer, damit wir die Fernbedienungscodes der Klimaanlage verarbeiten können. #define CAPTURE_BUFFER_SIZE 1024

// TIMEOUT ist die Nr. von Millisekunden keine-mehr-Daten, bevor wir a. betrachten

// Nachricht beendet. // Dieser Parameter ist ein interessanter Kompromiss. Je länger das Timeout, desto komplexer // kann eine Nachricht erfasst werden. z. B. Einige Geräteprotokolle senden // mehrere Nachrichtenpakete in schneller Folge, wie z. B. Klimaanlagen-Fernbedienungen. // Air Conditioner-Protokolle haben oft eine beträchtliche Lücke (20-40+ms) zwischen // Paketen. // Der Nachteil eines großen Timeout-Werts sind viele weniger komplexe Protokolle // mehrere Nachrichten senden, wenn die Taste der Fernbedienung gedrückt gehalten wird. Die Lücke zwischen // ihnen beträgt oft auch etwa 20+ms. Dies kann dazu führen, dass die Rohdaten 2-3+ // mal größer sind als benötigt, da sie 2-3+ Nachrichten in einer einzelnen // Erfassung erfasst haben. Das Festlegen eines niedrigen Timeout-Werts kann dies beheben. // Die Wahl des besten TIMEOUT-Werts für Ihren Anwendungsfall ist also // recht nuanciert. Viel Glück und viel Spaß beim Jagen. // HINWEIS: MAX_TIMEOUT_MS nicht überschreiten. Normalerweise 130 ms. #if DECODE_AC #define TIMEOUT 50U // Einige Klimaanlagen haben Lücken in ihren Protokollen von ~40ms. // z. B. Kelvinator // Ein so großer Wert kann Wiederholungen einiger Protokolle schlucken #else // DECODE_AC #define TIMEOUT 15U // Passt zu den meisten Nachrichten, schluckt aber nicht viele Wiederholungen. #endif // DECODE_AC // Alternativen: // #define TIMEOUT 90U // Passt zu Nachrichten mit großen Lücken wie XMP-1 und einigen Aircon-Einheiten //, kann aber versehentlich wiederholte Nachrichten // in der rawData-Ausgabe schlucken. // #define TIMEOUT MAX_TIMEOUT_MS // Dies wird auf unser derzeit erlaubtes // Maximum gesetzt. So hohe Werte sind problematisch, // weil es ungefähr die typische Grenze ist, // an der sich die meisten Nachrichten wiederholen. // z. B. Es stoppt die Dekodierung einer Nachricht und // beginnt, sie genau zu dem Zeitpunkt // an die Serie zu senden, zu dem die nächste Nachricht wahrscheinlich // übertragen wird, und kann sie verpassen.

// Setzt die kleinsten "UNKNOWN" Nachrichtenpakete, die uns wirklich interessieren.

// Dieser Wert trägt dazu bei, die Falsch-Positiv-Erkennungsrate von IR-Hintergrundrauschen // als echte Nachrichten zu reduzieren. Die Wahrscheinlichkeit, dass IR-Hintergrundrauschen // als Nachricht erkannt wird, steigt mit der Länge des TIMEOUT-Werts. (Siehe oben) // Der Nachteil einer zu großen Einstellung dieser Nachricht besteht darin, dass Sie einige gültige // Kurznachrichten für Protokolle verpassen können, die diese Bibliothek noch nicht dekodiert. // // Höher einstellen, wenn Sie viele zufällige kurze UNBEKANNTE Nachrichten erhalten, wenn nichts // eine Nachricht senden sollte. // Setzen Sie einen niedrigeren Wert, wenn Sie sicher sind, dass Ihr Setup funktioniert, aber keine Nachrichten // von Ihrem Gerät angezeigt werden. (z. B. andere IR-Fernbedienungen funktionieren.) // HINWEIS: Stellen Sie diesen Wert sehr hoch ein, um die UNKNOWN-Erkennung effektiv auszuschalten. #define MIN_UNKNOWN_SIZE 12 // ==================== Ende der TUNEABLE PARAMETER ====================

// Verwenden Sie die Funktion zum Aktivieren des Speicherpuffers, um eine vollständigere Erfassungsabdeckung zu erzielen.

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

decode_results-Ergebnisse; // Irgendwo zum Speichern der Ergebnisse

// Zeigen Sie den für Menschen lesbaren Zustand einer A / C-Nachricht an, wenn wir können.

void dumpACInfo(decode_results *results) { String description = ""; #if DECODE_DAIKIN if (results->decode_type == DAIKIN) { IRDaikinESP ac(0); ac.setRaw(Ergebnisse->Zustand); Beschreibung = ac.toString(); } #endif // DECODE_DAIKIN #if DECODE_FUJITSU_AC if (results->decode_type == FUJITSU_AC) { IRFujitsuAC ac(0); ac.setRaw (Ergebnisse->Zustand, Ergebnisse->Bits / 8); Beschreibung = ac.toString(); } #endif // DECODE_FUJITSU_AC #if DECODE_KELVINATOR if (results->decode_type == KELVINATOR) { IRKelvinatorAC ac(0); ac.setRaw(Ergebnisse->Zustand); Beschreibung = ac.toString(); } #endif // DECODE_KELVINATOR #if DECODE_TOSHIBA_AC if (results->decode_type == TOSHIBA_AC) { IRToshibaAC ac(0); ac.setRaw(Ergebnisse->Zustand); Beschreibung = ac.toString(); } #endif // DECODE_TOSHIBA_AC #if DECODE_MIDEA if (results->decode_type == MIDEA) { IRMideaAC ac(0); ac.setRaw(Ergebnisse->Wert); // Midea verwendet Wert statt Zustand. Beschreibung = ac.toString(); } #endif // DECODE_MIDEA // Wenn wir eine für Menschen lesbare Beschreibung der Nachricht haben, zeigen Sie sie an. if (Beschreibung != "") Serial.println("Mesg Desc.: " + Beschreibung); }

// Der Codeabschnitt wird beim Start nur einmal ausgeführt.

Void setup () { Serial.begin (BAUD_RATE, SERIAL_8N1, SERIAL_TX_ONLY); Verzögerung (500); // Warten Sie ein bisschen, bis die serielle Verbindung aufgebaut ist.

#if DECODE_HASH

// Ignoriere Nachrichten mit weniger als minimalen Ein- oder Ausschaltimpulsen. irrecv.setUnknownThreshold(MIN_UNKNOWN_SIZE); #endif // DECODE_HASH irrecv.enableIRIn(); // Starten Sie den Empfänger }

// Der sich wiederholende Abschnitt des Codes

// Void loop () { // Überprüfen Sie, ob der IR-Code empfangen wurde. if (irrecv.decode(&results)) { // Zeigt einen groben Zeitstempel an. uint32_t now = millis(); Serial.printf("Zeitstempel: %06u.%03u\n", jetzt / 1000, jetzt % 1000); if (results.overflow) Serial.printf("WARNUNG: IR-Code ist zu groß für Puffer (>= %d). " "Diesem Ergebnis sollte nicht vertraut werden, bis dies behoben ist. " "Bearbeiten und erhöhen Sie CAPTURE_BUFFER_SIZE.\n ", CAPTURE_BUFFER_SIZE); // Zeigt die grundlegende Ausgabe dessen an, was wir gefunden haben. Serial.print (resultToHumanReadableBasic (&results)); dumpACInfo(&Ergebnisse); // Zeigen Sie alle zusätzlichen A / C-Informationen an, wenn wir sie haben. Ertrag(); // Füttern Sie das WDT, da das Drucken der Textausgabe eine Weile dauern kann.

// Zeigt die Bibliotheksversion an, mit der die Nachricht erfasst wurde.

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

// RAW-Timing-Informationen des Ergebnisses ausgeben.

Serial.println (resultToTimingInfo (&results)); Ertrag(); // Füttere das WDT (wieder)

// Ergebnis als Quellcode ausgeben

Serial.println (resultToSourceCode (&results)); Serial.println(""); // Leerzeile zwischen den Einträgen yield(); // Füttere den WDT (erneut) } }

Wenn diese Skizze hochgeladen wird und mit geöffnetem seriellen Monitor ausgeführt wird, wird der Code für den Tastendruck ausgegeben (siehe Bild)

Notieren Sie die Codes, die Sie für die spätere Verwendung verwenden möchten. Ich habe Excel verwendet, um zu notieren, was ich für Schaltflächen habe, die ich verwenden wollte (siehe Bild)

Ich habe die Schaltflächen in meiner Netflix-Aktivität bearbeitet, um das Pausesignal von der Panasonic-Fernbedienung zu senden. (siehe Bild)

Schritt 3: Schreiben des Codes zum Senden an Nodered

Schreiben des Codes zum Senden an Nodered
Schreiben des Codes zum Senden an Nodered

#ifndef UNIT_TEST#include #endif #include

#enthalten

#enthalten

#enthalten

#enthalten

#enthalten

const char* ssid = ""; // SSID hier eingebenconst char* password = ""; //Hier Passwort eingeben const char *host = ""; // IP-Adresse #define USE_SERIAL Seriell ESP8266WiFiMulti WiFiMulti; uint16_t RECV_PIN = 14; IRrecv irrecv(RECV_PIN); decode_results-Ergebnisse; Void setup () { irrecv.enableIRIn (); // Starten Sie den Empfänger 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] WARTEN %d…\n", t); USE_SERIAL.flush(); Verzögerung (1000); } WiFi.mode(WIFI_STA); WiFiMulti.addAP(ssid, Passwort); } void loop() { if (irrecv.decode(&results)) {

// Ändern Sie diesen Signalwert für den, den Sie erhalten haben

if (results.value == 0x40040D00606D) { USE_SERIAL.println ("Pause Signal empfangen"); WLAN senden (Pause); Verzögerung (1000);

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

USE_SERIAL.println("vorher");

wifisend("vorher"); Verzögerung (1000); } if (results.value == 0x40040100F2F3) { USE_SERIAL.println("next"); wifisend("weiter"); Verzögerung (1000); }

irrecv.resume(); // Den nächsten Wert empfangen } delay(100); aufrechtzuerhalten. Void wifisend (String data) { if ((WiFiMulti.run() == WL_CONNECTED)) { HTTPClient http; USE_SERIAL.print("[HTTP] beginnen…\n"); // traged server und URL konfigurieren http.begin("https://[user]:[pass]@[ip]:[port]/chromecastpause?data=" + data); USE_SERIAL.print("[HTTP] GET…\n"); // Verbindung starten und HTTP-Header senden int httpCode = http. GET(); // httpCode wird im Fehlerfall negativ if(httpCode > 0) { // HTTP-Header wurde gesendet und Server-Antwort-Header behandelt USE_SERIAL.printf("[HTTP] GET… code: %d\n", // Datei auf dem Server gefunden

if(httpCode == HTTP_CODE_OK) { String-Nutzlast = http.getString(); USE_SERIAL.println (Nutzlast); } } else { USE_SERIAL.printf("[HTTP] GET… fehlgeschlagen, Fehler: %s\n", http.errorToString(httpCode).c_str()); } http.ende(); Verzögerung (100); } }

Dies ist der Code, den ich auf meinem Nodemcu verwendet habe. Sie müssen diese Bibliotheken installiert haben.

Sie können mit dem seriellen Monitor testen und die im Code hinzugefügten Fernbedienungstasten drücken, um die Antwort anzuzeigen.

In der Schlange:

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

Sie müssen [user] in Ihren Benutzer ändern und so weiter. OHNE Klammern. Klammern sind dazu da, die zu ändernden Felder anzuzeigen.

Diese Zeile wird auch nicht funktionieren, bis wir unseren Flow in nodered eingerichtet haben.

Schritt 4: Erstellen eines Flows in Nodered

Erstellen eines Flows in Nodered
Erstellen eines Flows in Nodered
Erstellen eines Flows in Nodered
Erstellen eines Flows in Nodered
Erstellen eines Flows in Nodered
Erstellen eines Flows in Nodered
Erstellen eines Flows in Nodered
Erstellen eines Flows in Nodered

Wie eingangs erwähnt, verwende ich hass.io mit nodered. Wenn Sie ein anderes Setup ausführen, müssen Sie dies anders machen! Sie können im Bild sehen, dass ein gedrückter Button im Debug-Fenster angezeigt wird…

Der Änderungsnutzlastknoten hätte wahrscheinlich übersprungen werden können, wenn ich im vorherigen Schritt etwas anderes als data= gewählt hätte. Der Switch-Knoten, den ich verwende, ist viel größer als nur eine Pause, aber das ist nur, damit ich mehr IR-Signale hinzufügen kann, um Chromecast für Radiosender usw. zu verwenden.

Für eine einfache Wiedergabepause können Sie den Fluss im anderen Bild verwenden.

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

Ich habe den Namen userpass und die URL davon entfernt, sodass Sie dies möglicherweise bearbeiten müssen.

Fügen Sie einen Switch-Knoten hinzu, wenn Sie auf mehr als nur auf eine Pause reagieren möchten (siehe z. B. Bild)

Im Home Assistant-Knoten für die Pause-Nutzung:

name: play pause chromecastdomain: media_playerService: media_play_pausedata: { "entity_id": "media_player.[your chromecast here]" }

Für den nächsten Track kopieren Sie einfach diesen Knoten und bearbeiten Sie den Dienst nach: media_next_track und den Namen nach: next chromecast

Schritt 5: Optionale Alexa Pause Chromecast

Optionaler Add-Alexa-Befehl zum Anhalten von Chromecast:

Hier gibt es zwei Optionen.. Sie können einen Alexa-Knoten namens Chromecast anhalten erstellen, der Chromecast anhält, oder Sie können einen sogenannten Pause-TV erstellen, der die aktuelle Harmonieaktivität überprüft und abhängig davon pausiert.

Ich füge das später hier ein..

Empfohlen: