Table des matières:

Mettre Chromcast en pause avec une télécommande : 5 étapes
Mettre Chromcast en pause avec une télécommande : 5 étapes

Vidéo: Mettre Chromcast en pause avec une télécommande : 5 étapes

Vidéo: Mettre Chromcast en pause avec une télécommande : 5 étapes
Vidéo: TEST CHROMECAST avec GOOGLE TV : TÉLÉCOMMANDE et NOUVELLE INTERFACE, pour le meilleur ? 2024, Novembre
Anonim
Image
Image
Équipement
Équipement

J'ai une télécommande Logitech Harmony et j'exécute Home assistant sur un Raspberry Pi.

Je voulais pouvoir mettre en pause Chromecast à partir de ma télécommande, mais j'ai un vieux téléviseur qui ne prend pas en charge cela via HDMI. Mon idée était alors d'utiliser un NodeMcu pour capter leur signal et faire une pause.

Si vous ne parvenez pas à le faire fonctionner ou si vous avez des questions, veuillez commenter ci-dessous

Étape 1: Équipement

Équipement
Équipement
Équipement
Équipement

Équipement nécessaire:

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

Ir reciver (comme par exemple:

fils dupont

Câble micro usb (power nodemcu)

J'utilise Logitech Harmony -hub

Pour mon approche, vous avez besoin d'un Raspberry pi avec hass.io installé et connecté. Je n'entrerai pas dans la configuration de l'assistant à domicile ici. Si vous utilisez autre chose que l'assistant à domicile, vous devez adapter les choses vous-même.

Vous devez pouvoir utiliser Nodemcu sur Arduino IDE car je n'entrerai pas dans cela ici

Étape 2: Signal à distance

Signal à distance
Signal à distance
Signal à distance
Signal à distance
Signal à distance
Signal à distance
Signal à distance
Signal à distance

La façon dont je l'ai fait était de copier un signal d'une télécommande que je n'utilise pas dans la télécommande Harmony.

J'ai utilisé une télécommande pour le modèle de télévision Panasonic TXL32C3E car cela n'interfère pas avec mon équipement au premier étage. C'est une télé que j'ai en haut.

Si vous n'utilisez pas l'harmonie, vous pouvez sauter ceci.

Donc, pour trouver le signal, j'ai utilisé ce scetch:

/* * IRremoteESP8266: IRrecvDumpV2 - vidage des détails des codes IR avec IRrecv * Un détecteur/démodulateur IR doit être connecté à l'entrée RECV_PIN. * * Copyright 2009 Ken Shirriff, https://arcfn.com * Copyright 2017 David Conran * * Exemple de schéma de circuit: * https://arcfn.com * * Modifications: * Version 0.3 novembre 2017 * - Support pour A/C décodage pour certains protocoles. * Version 0.2 avril 2017 * - Décoder à partir d'une copie des données afin que nous puissions commencer à capturer plus rapidement et ainsi * réduire la probabilité d'erreurs de capture. * Basé sur la version 0.1 d'IrsendDemo de Ken Shirriff, juillet 2009, */

#ifndef UNIT_TEST

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

// ==================== début des PARAMETRES AJUSTABLES ====================

// Un détecteur/démodulateur IR est connecté à la broche GPIO 14 // par ex. D5 sur une carte NodeMCU. #define RECV_PIN 14

// Le débit en bauds de la connexion série.

// c'est-à-dire que le message d'état sera envoyé au PC à ce débit en bauds. // Essayez d'éviter les vitesses lentes comme 9600, car vous manquerez des messages et // provoquerez d'autres problèmes. 115200 (ou plus rapide) est recommandé. // REMARQUE: Assurez-vous de régler votre moniteur série sur la même vitesse. #define BAUD_RATE 115200

// Comme ce programme est une capture/décodeur à usage spécial, utilisons un plus grand

// que le tampon normal afin que nous puissions gérer les codes à distance du climatiseur. #define CAPTURE_BUFFER_SIZE 1024

// TIMEOUT est le Nr. de millisecondes de plus de données avant de considérer un

// message terminé. // Ce paramètre est un compromis intéressant. Plus le délai d'expiration est long, plus // un message qu'il peut capturer est complexe. par exemple. Certains protocoles d'appareils enverront // plusieurs paquets de messages en succession rapide, comme les télécommandes de climatiseur. // Les protocoles de climatiseurs ont souvent un écart considérable (20-40+ms) entre // les paquets. // L'inconvénient d'une valeur de délai d'attente élevée est que de nombreux protocoles moins complexes // envoient plusieurs messages lorsque le bouton de la télécommande est maintenu enfoncé. L'écart entre // eux est souvent également d'environ 20+ms. Cela peut entraîner des données brutes 2-3+ // fois plus grandes que nécessaire car elles ont capturé 2-3+ messages en une seule // capture. La définition d'une valeur de délai d'attente faible peut résoudre ce problème. // Ainsi, le choix de la meilleure valeur de TIMEOUT pour votre cas particulier d'utilisation est // assez nuancé. Bonne chance et bonne chasse. // REMARQUE: Ne dépassez pas MAX_TIMEOUT_MS. Typiquement 130ms. #if DECODE_AC #define TIMEOUT 50U // Certaines unités A/C ont des lacunes dans leurs protocoles de ~40ms. // par exemple. Kelvinator // Une valeur aussi grande peut avaler les répétitions de certains protocoles #else // DECODE_AC #define TIMEOUT 15U // Convient à la plupart des messages, tout en n'avalant pas beaucoup de répétitions. #endif // DECODE_AC // Alternatives: // #define TIMEOUT 90U // Convient aux messages avec de gros écarts comme XMP-1 et certaines unités // de climatisation, mais peut accidentellement avaler des messages répétés // dans la sortie rawData. // #define TIMEOUT MAX_TIMEOUT_MS // Cela le définira sur notre // maximum actuellement autorisé. Des valeurs aussi élevées sont problématiques // car il s'agit à peu près de la limite typique // où la plupart des messages se répètent. // par exemple. Il arrêtera de décoder un message et // commencera à l'envoyer en série au moment précis // où le prochain message est susceptible // d'être transmis, et il peut le manquer.

// Définit les plus petits paquets de messages "INCONNUS" dont nous nous soucions réellement.

// Cette valeur permet de réduire le taux de détection de faux positifs // de bruit de fond IR en tant que messages réels. Les chances de détection de bruit IR de fond // en tant que message augmentent avec la longueur de la valeur TIMEOUT. (Voir ci-dessus) // L'inconvénient de définir ce message trop grand est que vous pouvez manquer des // messages courts valides pour des protocoles que cette bibliothèque ne décode pas encore. // // Défini plus haut si vous recevez beaucoup de messages courts UNKNOWN aléatoires alors que rien // ne devrait envoyer de message. // Réglez plus bas si vous êtes sûr que votre configuration fonctionne, mais qu'elle ne voit pas les messages // de votre appareil. (par exemple, d'autres télécommandes IR fonctionnent.) // REMARQUE: définissez cette valeur très élevée pour désactiver efficacement la détection UNKNOWN. #define MIN_UNKNOWN_SIZE 12 // ==================== fin des PARAMETRES AJUSTABLES =====================

// Activez la fonction de sauvegarde du tampon pour une couverture de capture plus complète.

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

decode_results résultats; // Quelque part pour stocker les résultats

// Affiche l'état lisible par l'homme d'un message A/C si nous le pouvons.

void dumpACInfo(decode_results *results) { String description = ""; #if DECODE_DAIKIN if (résultats->decode_type == DAIKIN) { IRDaikinESP ac(0); ac.setRaw(résultats->état); description = ac.toString(); } #endif // DECODE_DAIKIN #if DECODE_FUJITSU_AC if (results->decode_type == FUJITSU_AC) { IRFujitsuAC ac(0); ac.setRaw(results->state, results->bits/8); description = ac.toString(); } #endif // DECODE_FUJITSU_AC #if DECODE_KELVINATOR if (results->decode_type == KELVINATOR) { IRKelvinatorAC ac(0); ac.setRaw(résultats->état); description = ac.toString(); } #endif // DECODE_KELVINATOR #if DECODE_TOSHIBA_AC if (results->decode_type == TOSHIBA_AC) { IRToshibaAC ac(0); ac.setRaw(résultats->état); description = ac.toString(); } #endif // DECODE_TOSHIBA_AC #if DECODE_MIDEA if (results->decode_type == MIDEA) { IRMideaAC ac(0); ac.setRaw(résultats->valeur); // Midea utilise la valeur au lieu de l'état. description = ac.toString(); } #endif // DECODE_MIDEA // Si nous avons une description lisible du message, affichez-la. if (description != "") Serial.println("Mesg Desc.: " + description); }

// La section de code exécutée une seule fois au démarrage.

void setup() { Serial.begin(BAUD_RATE, SERIAL_8N1, SERIAL_TX_ONLY); retard (500); // Attendez un peu que la connexion série soit établie.

#if DECODE_HASH

// Ignore les messages avec des impulsions d'activation ou de désactivation inférieures au minimum. irrecv.setUnknownThreshold(MIN_UNKNOWN_SIZE); #endif // DECODE_HASH irrecv.enableIRIn(); // Démarrer le récepteur }

// La section répétitive du code

// void loop() { // Vérifie si le code IR a été reçu. if (irrecv.decode(&results)) { // Affiche un horodatage brut. uint32_t maintenant = millis(); Serial.printf("Horodatage: %06u.%03u\n", maintenant / 1000, maintenant % 1000); if (results.overflow) Serial.printf("AVERTISSEMENT: le code IR est trop gros pour le tampon (>= %d). " "Ce résultat ne doit pas être fiable tant que cela n'est pas résolu. " "Modifiez et augmentez CAPTURE_BUFFER_SIZE.\n ", CAPTURE_BUFFER_SIZE); // Affiche la sortie de base de ce que nous avons trouvé. Serial.print(resultToHumanReadableBasic(&results)); dumpACInfo(&results); // Affiche toutes les informations supplémentaires sur la climatisation si nous les avons. rendement(); // Alimente le WDT car la sortie de texte peut prendre un certain temps à s'imprimer.

// Affiche la version de la bibliothèque avec laquelle le message a été capturé.

Serial.print("Bibliothèque: v"); Serial.println(_IRREMOTEESP8266_VERSION_); Serial.println();

// Affiche les informations de synchronisation RAW du résultat.

Serial.println(resultToTimingInfo(&results)); rendement(); // Nourrir le WDT (encore)

// Sortir les résultats sous forme de code source

Serial.println(resultToSourceCode(&results)); Serial.println(""); // Ligne vierge entre les entrées yield(); // Nourrir le WDT (à nouveau) } }

Lorsque ce scetch est téléchargé et exécuté avec le moniteur série ouvert, il affichera le code pour appuyer sur le bouton (voir image)

Notez les codes que vous souhaitez utiliser pour une utilisation ultérieure. J'ai utilisé Excel pour noter ce que j'ai obtenu pour les boutons que je voulais utiliser (voir photo)

J'ai modifié les boutons de mon activité Netflix pour envoyer le signal de pause de la télécommande panasonic.. (voir photo)

Étape 3: Rédaction du code pour l'envoi à Nodered

Écriture du code pour l'envoi à Nodered
Écriture du code pour l'envoi à Nodered

#ifndef UNIT_TEST#include #endif #include

#comprendre

#comprendre

#comprendre

#comprendre

#comprendre

const char* ssid = ""; // Entrez le SSID hereconst char* password = ""; //Entrez le mot de passe ici const char *host = ""; //Adresse IP #define USE_SERIAL Série ESP8266WiFiMulti WiFiMulti; uint16_t RECV_PIN = 14; IRrecv irrecv(RECV_PIN); decode_results résultats; void setup() { irrecv.enableIRIn(); // Démarrez le récepteur 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] ATTENDRE %d…\n", t); USE_SERIAL.flush(); retard(1000); } WiFi.mode(WIFI_STA); WiFiMulti.addAP(ssid, mot de passe); } boucle vide() { if (irrecv.decode(&results)) {

// Changer cette valeur de signal pour celle que vous avez

if (results.value == 0x40040D00606D){ USE_SERIAL.println("pause signal reçu"); envoi wifi(pause); retard(1000);

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

USE_SERIAL.println("précédent");

wifisend("préc"); retard(1000); } if (results.value == 0x40040100F2F3){ USE_SERIAL.println("next"); wifisend("suivant"); retard(1000); }

irrecv.resume(); // Recevoir la valeur suivante } delay(100); } void wifisend(String data){ if((WiFiMulti.run() == WL_CONNECTED)) { HTTPClient http; USE_SERIAL.print("[HTTP] début…\n"); // configurer le serveur et l'url traged http.begin("https://[user]:[pass]@[ip]:[port]/chromecastpause?data=" + data); USE_SERIAL.print("[HTTP] GET…\n"); // démarre la connexion et envoie l'en-tête HTTP int httpCode = http. GET(); // httpCode sera négatif en cas d'erreur if(httpCode > 0) { // L'en-tête HTTP a été envoyé et l'en-tête de réponse du serveur a été géré USE_SERIAL.printf("[HTTP] GET… code: %d\n", // fichier trouvé sur le serveur

if(httpCode == HTTP_CODE_OK) { String payload = http.getString(); USE_SERIAL.println(charge utile); } } else { USE_SERIAL.printf("[HTTP] GET… a échoué, erreur: %s\n", http.errorToString(httpCode).c_str()); } http.end(); retard (100); } }

C'est le code que j'ai utilisé sur mon nodemcu. Vous aurez besoin d'avoir ces bibliothèques installées.

Vous pouvez tester à l'aide d'un moniteur série et appuyer sur les boutons de la télécommande que vous avez ajoutés dans le code pour voir la réponse.

Dans la ligne:

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

Vous devez remplacer [user] par votre utilisateur et ainsi de suite. SANS crochets. les parenthèses sont là pour montrer les champs de sorcière à changer.

Cette ligne ne fonctionnera pas non plus tant que nous n'aurons pas configuré notre flux dans nodered.

Étape 4: Création d'un flux dans Nodered

Créer un flux dans Nodered
Créer un flux dans Nodered
Créer un flux dans Nodered
Créer un flux dans Nodered
Créer un flux dans Nodered
Créer un flux dans Nodered
Créer un flux dans Nodered
Créer un flux dans Nodered

Comme mentionné au début, j'utilise hass.io avec nodered. Si vous exécutez une configuration différente, vous devrez la rendre différente ! Vous pouvez voir dans l'image que lorsqu'un bouton est enfoncé, il apparaît dans la fenêtre de débogage…

Le nœud de charge utile de changement aurait probablement pu être ignoré si j'avais choisi quelque chose de différent que data= à l'étape précédente. Le nœud de commutation que j'utilise est beaucoup plus gros qu'une simple pause, mais c'est juste pour que je puisse ajouter plus de signaux infrarouges pour utiliser Chromecast pour les stations de radio, etc.

Pour juste jouer la pause, vous pouvez utiliser le flux dans l'autre image.

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

J'ai supprimé le nom d'utilisateur et l'URL de ceci, vous devrez donc peut-être les modifier.

ajoutez un nœud de commutation si vous souhaitez réagir à plus qu'une simple pause (voir l'image par exemple)

Dans le nœud de l'assistant domestique pour une utilisation en pause:

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

pour la piste suivante, copiez simplement ce nœud et modifiez le service dans: media_next_track et nommez-le: next chromecast

Étape 5: Alexa Pause Chromecast en option

Ajouter une commande alexa facultative pour la pause chromecast:

Il y a des options ici.. Vous pouvez créer un nœud alexa appelé pause chromecast qui met en pause le chromecast, ou vous pouvez en créer un appelé pause tv qui vérifie l'activité d'harmonie actuelle et une pause en fonction de cela.

Je l'ajouterai ici plus tard..

Conseillé: