Πίνακας περιεχομένων:

Παύση Chromcast με τηλεχειριστήριο: 5 βήματα
Παύση Chromcast με τηλεχειριστήριο: 5 βήματα

Βίντεο: Παύση Chromcast με τηλεχειριστήριο: 5 βήματα

Βίντεο: Παύση Chromcast με τηλεχειριστήριο: 5 βήματα
Βίντεο: 5 πράγματα που πρέπει να κάνεις στο σεξ για να κολλήσει μαζί σου 2024, Νοέμβριος
Anonim
Image
Image
Εξοπλισμός
Εξοπλισμός

Έχω ένα τηλεχειριστήριο αρμονίας Logitech και τρέχω βοηθό στο σπίτι σε ένα βατόμουρο pi.

Wantedθελα να μπορώ να θέσω σε παύση το chromecast από το τηλεχειριστήριό μου, αλλά έχω μια παλιά τηλεόραση που δεν το υποστηρίζει μέσω hdmi. Η ιδέα μου ήταν τότε να χρησιμοποιήσω ένα NodeMcu για να πιάσω το σήμα ir και να κάνω παύση.

Εάν δεν μπορείτε να το χρησιμοποιήσετε ή έχετε ερωτήσεις, σχολιάστε παρακάτω

Βήμα 1: Εξοπλισμός

Εξοπλισμός
Εξοπλισμός
Εξοπλισμός
Εξοπλισμός

Απαιτούμενος εξοπλισμός:

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

Δέκτης Ir (όπως για παράδειγμα:

καλώδια dupont

Micro USB καλώδιο (power nodemcu)

Χρησιμοποιώ το Logitech Harmony -hub

Για την προσέγγισή μου Χρειάζεστε ένα Raspberry pi με hass.io Installed και Nodered. Δεν θα ασχοληθώ με τη δημιουργία οικιακών βοηθειών εδώ. Εάν χρησιμοποιείτε κάτι άλλο από το homeassistant, πρέπει να προσαρμόσετε τα πράγματα μόνοι σας.

Πρέπει να είστε σε θέση να χρησιμοποιήσετε το Nodemcu στο Arduino IDE, καθώς δεν θα το εξετάσω εδώ

Βήμα 2: Απομακρυσμένο σήμα

Απομακρυσμένο σήμα
Απομακρυσμένο σήμα
Απομακρυσμένο σήμα
Απομακρυσμένο σήμα
Απομακρυσμένο σήμα
Απομακρυσμένο σήμα
Απομακρυσμένο σήμα
Απομακρυσμένο σήμα

Ο τρόπος που το έκανα ήταν να αντιγράψω ένα σήμα από ένα τηλεχειριστήριο που δεν χρησιμοποιώ σε τηλεχειριστήριο αρμονίας.

Χρησιμοποίησα ένα τηλεχειριστήριο για το μοντέλο τηλεόρασης Panasonic TXL32C3E καθώς αυτό δεν επηρεάζει τον εξοπλισμό μου στον πρώτο όροφο. Αυτή είναι μια τηλεόραση που έχω στον επάνω όροφο.

Εάν δεν χρησιμοποιείτε την αρμονία, μπορείτε να το παραλείψετε.

Έτσι για την εύρεση του σήματος χρησιμοποίησα αυτό το σκίτσο:

/ * * IRremoteESP8266: IRrecvDumpV2 - λεπτομέρειες απόρριψης κωδικών IR με IRrecv * Ένας ανιχνευτής/αποδιαμορφωτής IR πρέπει να συνδεθεί στην είσοδο RECV_PIN. * * Πνευματικά δικαιώματα 2009 Ken Shirriff, https://arcfn.com * Πνευματικά δικαιώματα 2017 David Conran * * Παράδειγμα διαγράμματος κυκλώματος: * https://arcfn.com * * Αλλαγές: * Έκδοση 0.3 Νοεμβρίου, 2017 * - Υποστήριξη για κλιματισμό αποκωδικοποίηση για μερικά πρωτόκολλα. * Έκδοση 0.2 Απριλίου, 2017 * - Αποκωδικοποιήστε από ένα αντίγραφο των δεδομένων, ώστε να μπορέσουμε να αρχίσουμε να καταγράφουμε γρηγορότερα έτσι * μειώστε την πιθανότητα λανθασμένων παρεμβάσεων. * Βασισμένο στην έκδοση IrsendDemo του Ken Shirriff 0.1 Ιουλίου, 2009, */

#ifndef UNIT_TEST

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

// ==================== έναρξη ΛΑΜΒΑΝΩΝ ΠΑΡΑΜΕΤΡΩΝ ====================

// Ένας ανιχνευτής IR/αποδιαμορφωτής είναι συνδεδεμένος στον ακροδέκτη GPIO 14 // π.χ. D5 σε έναν πίνακα NodeMCU. #define RECV_PIN 14

// Ο ρυθμός baud της σειριακής σύνδεσης.

// δηλ. το μήνυμα κατάστασης θα σταλεί στον υπολογιστή με αυτόν τον ρυθμό baud. // Προσπαθήστε να αποφύγετε αργές ταχύτητες όπως το 9600, καθώς θα χάσετε μηνύματα και // θα προκαλέσετε άλλα προβλήματα. Συνιστάται 115200 (ή γρηγορότερα). // ΣΗΜΕΙΩΣΗ: Βεβαιωθείτε ότι έχετε ορίσει τη Σειριακή οθόνη στην ίδια ταχύτητα. #define BAUD_RATE 115200

// Δεδομένου ότι αυτό το πρόγραμμα είναι ένα σύλληψη/αποκωδικοποιητής ειδικού σκοπού, ας χρησιμοποιήσουμε ένα μεγαλύτερο

// από το κανονικό buffer, ώστε να μπορούμε να χειριστούμε απομακρυσμένους κωδικούς κλιματιστικού. #define CAPTURE_BUFFER_SIZE 1024

// TIMEOUT είναι το αρ. χιλιοστών του δευτερολέπτου μη-περισσότερων δεδομένων προτού εξετάσουμε το α

// το μήνυμα έληξε. // Αυτή η παράμετρος είναι μια ενδιαφέρουσα αντιστάθμιση. Όσο μεγαλύτερο είναι το χρονικό όριο, τόσο πιο // πολύπλοκο μπορεί να συλλάβει ένα μήνυμα. π.χ. Ορισμένα πρωτόκολλα συσκευών θα στέλνουν // πακέτα πολλαπλών μηνυμάτων διαδοχικά, όπως τηλεχειριστήρια κλιματιστικού. // Τα πρωτόκολλα Air Coniditioner έχουν συχνά ένα σημαντικό κενό (20-40+ms) μεταξύ των // πακέτων. // Το μειονέκτημα μιας μεγάλης τιμής λήξης είναι πολλά λιγότερο περίπλοκα πρωτόκολλα // αποστολή πολλαπλών μηνυμάτων όταν κρατάτε πατημένο το κουμπί του τηλεχειριστηρίου. Το χάσμα μεταξύ τους // είναι συχνά επίσης περίπου 20+ms. Αυτό μπορεί να έχει ως αποτέλεσμα τα ακατέργαστα δεδομένα να είναι 2-3+ // φορές μεγαλύτερα από όσα χρειάζονται καθώς έχει συλλάβει 2-3+ μηνύματα σε μία // σύλληψη. Η ρύθμιση χαμηλής τιμής λήξης μπορεί να επιλύσει αυτό το πρόβλημα. // Έτσι, η επιλογή της καλύτερης τιμής TIMEOUT για τη συγκεκριμένη θήκη χρήσης σας είναι // αρκετά λεπτή. Καλή τύχη και καλό κυνήγι. // ΣΗΜΕΙΩΣΗ: Μην υπερβαίνετε το MAX_TIMEOUT_MS. Συνήθως 130ms. #if DECODE_AC #define TIMEOUT 50U // Ορισμένες μονάδες κλιματισμού έχουν κενά στα πρωτόκολλά τους. 40ms. // π.χ. Kelvinator // Μια τιμή τόσο μεγάλη μπορεί να καταπιεί επαναλήψεις ορισμένων πρωτοκόλλων #else // DECODE_AC #define TIMEOUT 15U // Ταιριάζει στα περισσότερα μηνύματα, ενώ δεν καταπίνει πολλές επαναλήψεις. #endif // DECODE_AC // Εναλλακτικές λύσεις: // #define TIMEOUT 90U // Ταιριάζει σε μηνύματα με μεγάλα κενά όπως το XMP-1 και μερικές μονάδες aircon //, αλλά μπορεί κατά λάθος να καταπιεί επαναλαμβανόμενα μηνύματα // στην έξοδο rawData . // #define TIMEOUT MAX_TIMEOUT_MS // Αυτό θα το ρυθμίσει στο τρέχον επιτρεπόμενο // μέγιστο. Οι τιμές τόσο υψηλές είναι προβληματικές // επειδή είναι περίπου το τυπικό όριο // όπου επαναλαμβάνονται τα περισσότερα μηνύματα. // π.χ. Θα σταματήσει να αποκωδικοποιεί ένα μήνυμα και // θα αρχίσει να το στέλνει στη σειρά ακριβώς // τη στιγμή που το επόμενο μήνυμα είναι πιθανό // να μεταδοθεί και μπορεί να το χάσει.

// Ορίστε τα μικρότερα μεγέθη πακέτα μηνυμάτων "ΑΓΝΩΣΤΟ" που μας ενδιαφέρουν πραγματικά.

// Αυτή η τιμή συμβάλλει στη μείωση του ποσοστού ψευδώς θετικής ανίχνευσης του θορύβου IR // ως πραγματικών μηνυμάτων. Οι πιθανότητες ανίχνευσης θορύβου IR στο υπόβαθρο // καθώς ένα μήνυμα αυξάνεται με το μήκος της τιμής TIMEOUT. (Δείτε παραπάνω) // Το μειονέκτημα της ρύθμισης αυτού του μηνύματος πολύ μεγάλο είναι ότι μπορείτε να χάσετε μερικά έγκυρα // σύντομα μηνύματα για πρωτόκολλα που δεν έχει αποκωδικοποιήσει ακόμη αυτή η βιβλιοθήκη. // // Ορίστε υψηλότερα εάν λαμβάνετε πολλά τυχαία σύντομα ΑΓΝΩΣΤΑ μηνύματα όταν τίποτα // δεν πρέπει να στέλνει μήνυμα. // Ρυθμίστε χαμηλότερα εάν είστε βέβαιοι ότι η ρύθμιση λειτουργεί, αλλά δεν βλέπει μηνύματα // από τη συσκευή σας. (π.χ. άλλα τηλεχειριστήρια IR.) // ΣΗΜΕΙΩΣΗ: Ορίστε αυτήν την τιμή πολύ υψηλά για να απενεργοποιήσετε αποτελεσματικά την ΑΓΝΩΣΤΗ ανίχνευση. #define MIN_UNKNOWN_SIZE 12 // ==================== τέλος των ΔΥΝΑΜΙΚΩΝ ΠΑΡΑΜΕΤΡΩΝ ====================

// Χρησιμοποιήστε την ενεργοποίηση της λειτουργίας αποθήκευσης αποθήκευσης για πιο πλήρη κάλυψη λήψης.

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

decode_results αποτελέσματα? // Κάπου για να αποθηκεύσετε τα αποτελέσματα

// Εμφάνιση της ανθρώπινης αναγνώσιμης κατάστασης ενός μηνύματος A/C αν μπορούμε.

void dumpACInfo (decode_results *results) {String description = ""; #if DECODE_DAIKIN if (results-> decode_type == DAIKIN) {IRDaikinESP ac (0); ac.setRaw (αποτελέσματα-> κατάσταση); περιγραφή = ac.toString (); } #endif // DECODE_DAIKIN #if DECODE_FUJITSU_AC if (results-> decode_type == FUJITSU_AC) {IRFujitsuAC ac (0); ac.setRaw (αποτελέσματα-> κατάσταση, αποτελέσματα-> bits / 8); περιγραφή = ac.toString (); } #endif // DECODE_FUJITSU_AC #if DECODE_KELVINATOR if (results-> decode_type == KELVINATOR) {IRKelvinatorAC ac (0); ac.setRaw (αποτελέσματα-> κατάσταση); περιγραφή = ac.toString (); } #endif // DECODE_KELVINATOR #if DECODE_TOSHIBA_AC if (results-> decode_type == TOSHIBA_AC) {IRToshibaAC ac (0); ac.setRaw (αποτελέσματα-> κατάσταση); περιγραφή = ac.toString (); } #endif // DECODE_TOSHIBA_AC #if DECODE_MIDEA if (results-> decode_type == MIDEA) {IRMideaAC ac (0); ac.setRaw (αποτελέσματα-> τιμή); // Το Midea χρησιμοποιεί τιμή αντί για κατάσταση. περιγραφή = ac.toString (); } #endif // DECODE_MIDEA // Εάν έχουμε μια αναγνώσιμη από τον άνθρωπο περιγραφή του μηνύματος, εμφανίστε το. if (περιγραφή! = "") Serial.println ("Mesg Desc.:" + περιγραφή); }

// Το τμήμα του κώδικα εκτελείται μόνο μία φορά κατά την εκκίνηση.

void setup () {Serial.begin (BAUD_RATE, SERIAL_8N1, SERIAL_TX_ONLY); καθυστέρηση (500)? // Περιμένετε λίγο για να δημιουργηθεί η σειριακή σύνδεση.

#if DECODE_HASH

// Αγνοήστε μηνύματα με λιγότερους από ελάχιστους παλμούς ενεργοποίησης ή απενεργοποίησης. irrecv.setUnknownThreshold (MIN_UNKNOWN_SIZE); #endif // DECODE_HASH irrecv.enableIRIn (); // Εκκίνηση του δέκτη}

// Το επαναλαμβανόμενο τμήμα του κώδικα

// void loop () {// Ελέγξτε αν έχει ληφθεί ο κωδικός IR. if (irrecv.decode (& results)) {// Εμφάνιση ακατέργαστης χρονικής σήμανσης. uint32_t τώρα = millis (); Serial.printf ("Χρονική σήμανση: %06u. %03u / n", τώρα / 1000, τώρα %1000); if (results.overflow) Serial.printf ("ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Ο κώδικας IR είναι πολύ μεγάλος για προσωρινή μνήμη (> = %d)." "Αυτό το αποτέλεσμα δεν πρέπει να είναι αξιόπιστο μέχρι να επιλυθεί." "Επεξεργασία & αύξηση CAPTURE_BUFFER_SIZE. / n ", CAPTURE_BUFFER_SIZE); // Εμφάνιση της βασικής εξόδου αυτού που βρήκαμε. Serial.print (resultToHumanReadableBasic (& results)); dumpACInfo (& αποτελέσματα); // Εμφανίστε τυχόν επιπλέον πληροφορίες κλιματισμού εάν τις έχουμε. απόδοση παραγωγής(); // Τροφοδοτήστε το WDT καθώς η έξοδος κειμένου μπορεί να διαρκέσει λίγο για την εκτύπωση.

// Εμφάνιση της έκδοσης της βιβλιοθήκης με το οποίο καταγράφηκε το μήνυμα.

Serial.print ("Βιβλιοθήκη: v"); Serial.println (_IRREMOTEESP8266_VERSION_); Serial.println ();

// Έξοδος πληροφορίες χρονισμού RAW του αποτελέσματος.

Serial.println (resultToTimingInfo (& αποτελέσματα)); απόδοση παραγωγής(); // Τροφοδοτήστε το WDT (ξανά)

// Εξάγετε τα αποτελέσματα ως πηγαίο κώδικα

Serial.println (resultToSourceCode (& αποτελέσματα)); Serial.println (""); // Κενή γραμμή μεταξύ απόδοσης καταχωρήσεων (); // Τροφοδοτήστε το WDT (ξανά)}}

Όταν αυτό το σκίτσο μεταφορτωθεί και εκτελείται με σειριακή οθόνη ανοιχτή, θα εξάγει τον κωδικό για το πάτημα του κουμπιού (δείτε την εικόνα)

Γράψτε τους κωδικούς που θέλετε να χρησιμοποιήσετε για μεταγενέστερη χρήση. Χρησιμοποίησα το Excel για να σημειώσω τι πήρα για κουμπιά που ήθελα να χρησιμοποιήσω (δείτε την εικόνα)

Επεξεργάστηκα τα κουμπιά στη δραστηριότητά μου στο Netflix για να στείλω σήμα παύσης από το τηλεχειριστήριο της Panasonic.. (δείτε την εικόνα)

Βήμα 3: Γράφοντας τον κωδικό αποστολής στο Nodered

Γράφοντας τον Κώδικα Αποστολής στο Nodered
Γράφοντας τον Κώδικα Αποστολής στο Nodered

#ifndef UNIT_TEST #include #endif #include

#περιλαμβάνω

#περιλαμβάνω

#περιλαμβάνω

#περιλαμβάνω

#περιλαμβάνω

const char* ssid = ""; // Εισαγάγετε εδώ SSID char* password = ""; // Πληκτρολογήστε τον κωδικό εδώ const char *host = ""; // Ip adresse #define USE_SERIAL Serial ESP8266WiFiMulti WiFiMulti; uint16_t RECV_PIN = 14; IRrecv irrecv (RECV_PIN); decode_results αποτελέσματα? void setup () {irrecv.enableIRIn (); // Εκκινήστε το δέκτη USE_SERIAL.begin (115200); // USE_SERIAL.setDebugOutput (true); USE_SERIAL.println (); USE_SERIAL.println (); USE_SERIAL.println ();

για (uint8_t t = 4; t> 0; t--) {

USE_SERIAL.printf ("[SETUP] WAIT %d… / n", t); USE_SERIAL.flush (); καθυστέρηση (1000)? } WiFi.mode (WIFI_STA); WiFiMulti.addAP (ssid, κωδικός πρόσβασης) } void loop () {if (irrecv.decode (& results))) {

// Αλλάξτε αυτήν την τιμή σήματος για αυτήν που έχετε

if (results.value == 0x40040D00606D) {USE_SERIAL.println ("Παύση σήματος λήφθηκε"); wifisend (παύση)? καθυστέρηση (1000)?

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

USE_SERIAL.println ("προηγούμενο");

wifisend ("προηγούμενο"); καθυστέρηση (1000)? } if (results.value == 0x40040100F2F3) {USE_SERIAL.println ("επόμενο"); wifisend ("επόμενο"); καθυστέρηση (1000)? }

irrecv.resume (); // Λήψη της επόμενης τιμής} καθυστέρηση (100). } void wifisend (Στοιχεία συμβολοσειράς) {if ((WiFiMulti.run () == WL_CONNECTED)) {HTTPClient http; USE_SERIAL.print ("[HTTP] ξεκινήσει… / n"); // διαμορφώστε τον διακομιστή τραγωδίας και τη διεύθυνση URL http.begin ("https:// [χρήστη]: [pass]@[ip]: [port]/chromecastpause? data =" + δεδομένα); USE_SERIAL.print ("[HTTP] GET… / n"); // ξεκινήστε τη σύνδεση και στείλτε κεφαλίδα HTTP int httpCode = http. GET (); // Ο httpCode θα είναι αρνητικός κατά το σφάλμα εάν (httpCode> 0) {// η κεφαλίδα HTTP έχει αποσταλεί και η κεφαλίδα απόκρισης διακομιστή έχει χειριστεί USE_SERIAL.printf ("[HTTP] GET… code: %d / n", // αρχείο που βρέθηκε στο διακομιστή

εάν (httpCode == HTTP_CODE_OK) {String payload = http.getString (); USE_SERIAL.println (ωφέλιμο φορτίο); }} else {USE_SERIAL.printf ("[HTTP] GET… απέτυχε, σφάλμα: %s / n", http.errorToString (httpCode).c_str ()); } http.end (); καθυστέρηση (100)? }}

Αυτός είναι ο κωδικός που χρησιμοποίησα στο nodemcu μου. Θα χρειαστεί να έχετε εγκαταστήσει αυτές τις βιβλιοθήκες.

Μπορείτε να δοκιμάσετε χρησιμοποιώντας σειριακή οθόνη και να πατήσετε απομακρυσμένα κουμπιά που προσθέσατε στον κώδικα για να δείτε την απάντηση..

Στη γραμμή:

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

Πρέπει να αλλάξετε [χρήστη] στον χρήστη σας και ούτω καθεξής. ΧΩΡΙΣ αγκύλες. οι αγκύλες είναι εκεί για να δείξουν τα πεδία μάγισσας να αλλάξουν.

Αυτή η γραμμή επίσης δεν θα λειτουργήσει μέχρι να ρυθμίσουμε τη ροή μας σε nodered.

Βήμα 4: Δημιουργία ροής στο Nodered

Δημιουργία ροής στο Nodered
Δημιουργία ροής στο Nodered
Δημιουργία ροής στο Nodered
Δημιουργία ροής στο Nodered
Δημιουργία ροής στο Nodered
Δημιουργία ροής στο Nodered
Δημιουργία ροής στο Nodered
Δημιουργία ροής στο Nodered

Όπως αναφέρθηκε στην αρχή χρησιμοποιώ hass.io με nodered. Εάν εκτελείτε διαφορετική ρύθμιση, θα πρέπει να το κάνετε διαφορετικό! Μπορείτε να δείτε στην εικόνα ότι όταν πατηθεί ένα κουμπί εμφανίζεται στο παράθυρο εντοπισμού σφαλμάτων…

Ο κόμβος αλλαγής ωφέλιμου φορτίου θα μπορούσε πιθανώς να είχε παραλειφθεί εάν είχα επιλέξει κάτι διαφορετικό από αυτά τα δεδομένα = στο προηγούμενο βήμα. Ο κόμβος διακόπτη που χρησιμοποιώ είναι πολύ μεγαλύτερος από την παύση, αλλά έτσι μπορώ να προσθέσω περισσότερα σήματα ir για να χρησιμοποιήσω το chromecast για ραδιοφωνικούς σταθμούς κλπ.

Για απλή παύση παιχνιδιού, μπορείτε να χρησιμοποιήσετε τη ροή στην άλλη εικόνα.

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

Κατάργησα το όνομα χρήστη και το url από αυτό, ίσως χρειαστεί να το επεξεργαστείτε.

προσθέστε έναν κόμβο διακόπτη εάν θέλετε να αντιδράσετε σε κάτι περισσότερο από μια απλή παύση (δείτε την εικόνα για παράδειγμα)

Στον κόμβο οικιακού βοηθού για παύση:

όνομα: αναπαραγωγή παύσης chromecastdomain: media_playerService: media_play_pausedata: {"unit_id": "media_player. [το chromecast σας εδώ]"}

για το επόμενο κομμάτι απλά αντιγράψτε αυτόν τον κόμβο και επεξεργαστείτε την υπηρεσία στο: media_next_track και το όνομα στο: next chromecast

Βήμα 5: Προαιρετικό Alexa Pause Chromecast

Προαιρετική προσθήκη εντολής alexa για παύση chromecast:

Υπάρχουν επιλογές εδώ.. Μπορείτε να δημιουργήσετε έναν κόμβο alexa που ονομάζεται παύση chromecast που κάνει παύση chromecast, ή μπορείτε να κάνετε μια παύση τηλεόρασης που ελέγχει την τρέχουσα δραστηριότητα αρμονίας και παύση ανάλογα με αυτό.

Θα το προσθέσω εδώ αργότερα..

Συνιστάται: