Spisu treści:

Wstrzymaj Chromcast za pomocą pilota: 5 kroków
Wstrzymaj Chromcast za pomocą pilota: 5 kroków

Wideo: Wstrzymaj Chromcast za pomocą pilota: 5 kroków

Wideo: Wstrzymaj Chromcast za pomocą pilota: 5 kroków
Wideo: chromecast bez wifi ( dane komórkowe) 2024, Lipiec
Anonim
Image
Image
Wyposażenie
Wyposażenie

Mam pilota harmonijnego Logitech i uruchamiam Asystenta domu na Raspberry Pi.

Chciałem mieć możliwość wstrzymania Chromecasta z mojego pilota, ale mam stary telewizor, który nie obsługuje tego przez HDMI. Mój pomysł polegał na użyciu NodeMcu do przechwycenia sygnału i wstrzymania.

Jeśli nie możesz go uruchomić lub masz pytania, skomentuj poniżej

Krok 1: Wyposażenie

Wyposażenie
Wyposażenie
Wyposażenie
Wyposażenie

Potrzebny sprzęt:

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

Odbiornik Ir (np.:

druty dupontowe

Kabel microUSB (węzeł zasilający)

Używam Logitech Harmony -hub

Dla mojego podejścia You Need a Raspberry pi z hass.io Installed i Nodered. Nie będę tutaj konfigurować funkcji homeassistant. Jeśli używasz czegoś innego niż homeassistant, musisz sam dostosować rzeczy.

Musisz mieć możliwość korzystania z Nodemcu na Arduino IDE, ponieważ nie będę o to tutaj chodził

Krok 2: Zdalny sygnał

Zdalny sygnał
Zdalny sygnał
Zdalny sygnał
Zdalny sygnał
Zdalny sygnał
Zdalny sygnał
Zdalny sygnał
Zdalny sygnał

Sposób, w jaki to zrobiłem, polegał na skopiowaniu sygnału z pilota, którego nie używam, do pilota harmonii.

Użyłem pilota do telewizora Panasonic model TXL32C3E, ponieważ nie przeszkadza on w moim sprzęcie na pierwszym piętrze. To telewizor, który mam na górze.

Jeśli nie używasz harmonii, możesz to pominąć.

Więc do znalezienia sygnału użyłem tego szkicu:

/* * IRremoteESP8266: IRrecvDumpV2 - zrzut szczegółów kodów IR z IRrecv * Detektor/demodulator IR musi być podłączony do wejścia RECV_PIN. * * Copyright 2009 Ken Shirriff, https://arcfn.com * Copyright 2017 David Conran * * Przykładowy schemat obwodu: * https://arcfn.com * * Zmiany: * Wersja 0.3 listopad 2017 * - Obsługa klimatyzacji dekodowanie niektórych protokołów. * Wersja 0.2 Kwiecień 2017 * - Dekodowanie z kopii danych, dzięki czemu możemy szybciej rozpocząć przechwytywanie, * zmniejszając w ten sposób prawdopodobieństwo przechwycenia. * Na podstawie IrsendDemo Kena Shirriffa w wersji 0.1 lipca 2009, */

#ifndef TEST_JEDNOSTKI

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

// ==================== początek PARAMETRÓW DOSTRAJALNYCH =====================

// Detektor/demodulator IR podłączony do pinu 14 GPIO // np. D5 na płycie NodeMCU. #zdefiniuj PIN_ODBIORU 14

// Szybkość transmisji połączenia szeregowego.

// tzn. wiadomość o stanie zostanie wysłana do komputera z tą szybkością transmisji. // Staraj się unikać niskich prędkości, takich jak 9600, ponieważ przegapisz wiadomości i // spowodujesz inne problemy. Zalecane jest 115200 (lub szybsze). // UWAGA: Upewnij się, że ustawiłeś monitor szeregowy na tę samą prędkość. #define BAUD_RATE 115200

// Ponieważ ten program jest specjalnym dekoderem do przechwytywania/dekodowania, użyjmy większego

// niż normalny bufor, dzięki czemu możemy obsługiwać zdalne kody klimatyzatora. #define CAPTURE_BUFFER_SIZE 1024

// LIMIT CZASU to Nr. milisekund nie więcej danych, zanim rozważymy a

// wiadomość zakończona. // Ten parametr jest interesującym kompromisem. Im dłuższy limit czasu, tym bardziej // złożona wiadomość może przechwycić. np. Niektóre protokoły urządzeń wysyłają // wiele pakietów wiadomości w krótkich odstępach czasu, na przykład piloty klimatyzatora. // Protokoły klimatyzatora często mają znaczną przerwę (20-40+ms) między // pakietami. // Wadą dużej wartości limitu czasu jest dużo mniej skomplikowanych protokołów // wysyłanie wielu wiadomości po przytrzymaniu przycisku pilota. Odstęp między nimi // często wynosi około 20+ms. Może to spowodować, że surowe dane będą 2-3+ // razy większe niż to konieczne, ponieważ przechwyciły 2-3+ wiadomości w jednym // przechwyceniu. Ustawienie niskiej wartości limitu czasu może rozwiązać ten problem. // Tak więc wybór najlepszej wartości TIMEOUT dla konkretnego przypadku użycia jest // dość zniuansowany. Powodzenia i szczęśliwego polowania. // UWAGA: nie przekraczaj MAX_TIMEOUT_MS. Zwykle 130ms. #if DECODE_AC #define TIMEOUT 50U // Niektóre jednostki klimatyzacyjne mają przerwy w protokołach ~40ms. // np. Kelvinator // Wartość tak duża może połknąć powtórzenia niektórych protokołów #else // DECODE_AC #define TIMEOUT 15U // Pasuje do większości wiadomości, ale nie połyka wielu powtórzeń. #endif // DECODE_AC // Alternatywy: // #define TIMEOUT 90U // Pasuje do komunikatów z dużymi przerwami, takich jak XMP-1 i niektóre jednostki klimatyzacji //, ale może przypadkowo połknąć powtarzające się komunikaty // w danych wyjściowych rawData. // #define TIMEOUT MAX_TIMEOUT_MS // To ustawi go na aktualnie dozwolone // maksimum. Tak wysokie wartości są problematyczne // ponieważ jest to mniej więcej typowa granica // gdzie powtarza się większość wiadomości. // np. Przestanie dekodować wiadomość i // rozpocznie wysyłanie jej do portu szeregowego dokładnie // w momencie, w którym prawdopodobnie // zostanie przesłana następna wiadomość, i może ją przegapić.

// Ustaw najmniejszy rozmiar "NIEZNANYCH" pakietów wiadomości, na których nam zależy.

// Ta wartość pomaga zmniejszyć współczynnik wykrywania fałszywie dodatnich szumów tła w podczerwieni // jako prawdziwych wiadomości. Szansa na wykrycie szumu podczerwieni w tle // podczas wiadomości wzrasta wraz z długością wartości TIMEOUT. (Patrz wyżej) // Wadą ustawienia tej wiadomości na zbyt dużą jest możliwość pominięcia // niektórych ważnych krótkich wiadomości dla protokołów, których ta biblioteka jeszcze nie dekoduje. // // Ustaw wyższą wartość, jeśli otrzymujesz wiele losowych krótkich NIEZNANYCH wiadomości, gdy nic // nie powinno wysyłać wiadomości. // Ustaw niższą, jeśli masz pewność, że konfiguracja działa, ale nie widzisz komunikatów // z Twojego urządzenia. (np. działają inne piloty na podczerwień.) // UWAGA: Ustaw tę wartość bardzo wysoko, aby skutecznie wyłączyć wykrywanie NIEZNANE. #define MIN_UNKNOWN_SIZE 12 // ==================== koniec TUNEABLE PARAMETERS ====================

// Użyj włącz funkcję bufora zapisu, aby uzyskać pełniejszy zakres przechwytywania.

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

decode_results wyniki; // Gdzieś do przechowywania wyników

// Wyświetl czytelny dla człowieka stan wiadomości z klimatyzacji, jeśli to możliwe.

void dumpACInfo(decode_results *results) { Opis ciągu = ""; #if DECODE_DAIKIN if (results->decode_type == DAIKIN) { IRDaikinESP ac(0); ac.setRaw(wyniki->stan); opis = a.doString(); } #endif // DECODE_DAIKIN #if DECODE_FUJITSU_AC if (wyniki->typ_dekodowania == FUJITSU_AC) { IRFujitsuAC ac(0); ac.setRaw(wyniki->stan, wyniki->bity / 8); opis = a.doString(); } #endif // DECODE_FUJITSU_AC #if DECODE_KELVINATOR if (wyniki->typ_dekodowania == KELVINATOR) { IRKelvinatorAC ac(0); ac.setRaw(wyniki->stan); opis = a.doString(); } #endif // DECODE_KELVINATOR #if DECODE_TOSHIBA_AC if (results->decode_type == TOSHIBA_AC) { IRToshibaAC ac(0); ac.setRaw(wyniki->stan); opis = a.doString(); } #endif // DECODE_TOSHIBA_AC #if DECODE_MIDEA if (results->decode_type == MIDEA) { IRMideaAC ac(0); ac.setRaw(wyniki->wartość); // Midea używa wartości zamiast stanu. opis = a.doString(); } #endif // DECODE_MIDEA // Jeśli otrzymaliśmy czytelny dla człowieka opis wiadomości, wyświetl go. if (opis != "") Serial.println("Mesg Opis: " + opis); }

// Sekcja kodu uruchamiana tylko raz podczas uruchamiania.

void setup() { Serial.begin(BAUD_RATE, SERIAL_8N1, SERIAL_TX_ONLY); opóźnienie (500); // Poczekaj chwilę na ustanowienie połączenia szeregowego.

#if DECODE_HASH

// Ignoruj komunikaty z mniej niż minimalnymi impulsami włączania lub wyłączania. irrecv.setUnknownThreshold(MIN_UNKNOWN_SIZE); #endif // DECODE_HASH irrecv.enableIRIn(); // Uruchom odbiornik }

// Powtarzająca się sekcja kodu

// void loop() { // Sprawdź, czy kod IR został odebrany. if (irrecv.decode(&results)) { // Wyświetl prymitywną sygnaturę czasową. uint32_t teraz = milis(); Serial.printf("Znacznik czasu: %06u.%03u\n", teraz / 1000, teraz % 1000); if (results.overflow) Serial.printf("OSTRZEŻENIE: kod IR jest za duży dla bufora (>= %d). " "Nie należy ufać temu wynikowi, dopóki nie zostanie rozwiązany. " "Edytuj i zwiększ CAPTURE_BUFFER_SIZE.\n ", CAPTURE_BUFFER_SIZE); // Wyświetl podstawowe dane wyjściowe tego, co znaleźliśmy. Serial.print(resultToHumanReadableBasic(&wyniki)); dumpACInfo(&wyniki); // Wyświetl wszelkie dodatkowe informacje o klimatyzacji, jeśli je mamy. dawać(); // Nakarm WDT, ponieważ wydrukowanie tekstu wyjściowego może chwilę potrwać.

// Wyświetl wersję biblioteki, z którą wiadomość została przechwycona.

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

// Wyprowadzanie informacji o czasie w formacie RAW dla wyniku.

Serial.println(resultToTimingInfo(&wyniki)); dawać(); // Nakarm WDT (ponownie)

// Wypisz wyniki jako kod źródłowy

Serial.println(ResultToSourceCode(&wyniki)); Serial.println(""); // Pusta linia między wpisami yield(); // Nakarm WDT (ponownie) } }

Gdy ten szkic zostanie załadowany i uruchomiony z otwartym monitorem szeregowym, wyświetli kod do naciśnięcia przycisku (patrz zdjęcie)

Zapisz kody, których chcesz użyć do późniejszego wykorzystania. Użyłem programu Excel, aby zanotować, co mam za przyciski, których chciałem użyć (patrz zdjęcie)

Zmieniłem przyciski w mojej aktywności Netflix, aby wysłać sygnał pauzy z pilota panasonic.. (patrz zdjęcie)

Krok 3: Pisanie kodu do wysłania do Nodered

Pisanie kodu do wysyłania do Nodered
Pisanie kodu do wysyłania do Nodered

#ifndef TEST_JEDNOSTKI#include #endif #include

#włączać

#włączać

#włączać

#włączać

#włączać

const char* ssid = ""; // Wpisz identyfikator SSID hereconst char* hasło = ""; //Wpisz tutaj hasło const char *host = ""; //Adres IP #define USE_SERIAL Serial ESP8266WiFiMulti WiFiMulti; uint16_t PIN_ODBIORU = 14; IRrecv nieodwoł.(RECV_PIN); decode_results wyniki; void setup() { nieodwoł.enableIRIn(); // Uruchom odbiornik USE_SERIAL.begin(115200); // USE_SERIAL.setDebugOutput(prawda); USE_SERIAL.println(); USE_SERIAL.println(); USE_SERIAL.println();

for(uint8_t t = 4; t > 0; t--) {

USE_SERIAL.printf("[USTAWIENIA] CZEKAJ %d…\n", t); USE_SERIAL.flush(); opóźnienie (1000); } Wi-Fi.tryb(WIFI_STA); WiFiMulti.addAP(ssid, hasło); } void loop() { if (irrecv.decode(&wyniki)) {

// Zmień tę wartość sygnału na tę, którą masz

if (results.value == 0x40040D00606D){ USE_SERIAL.println("Wstrzymaj sygnał odebrany"); wifisend(pauza); opóźnienie (1000);

} jeśli (wyniki.wartość == 0x400401007273){

USE_SERIAL.println("poprzedni");

wifisend("poprzedni"); opóźnienie (1000); } if (results.value == 0x40040100F2F3){ USE_SERIAL.println("następny"); wifisend("następny"); opóźnienie (1000); }

nieodzysk.wznowienie(); // Odbierz następną wartość } delay(100); } void wifisend(String data){ if((WiFiMulti.run() == WL_CONNECTED)) { HTTPClient http; USE_SERIAL.print("[HTTP] początek…\n"); // skonfiguruj serwer traged i adres URL http.begin("https://[użytkownik]:[hasło]@[ip]:[port]/chromecastpause?data=" + dane); USE_SERIAL.print("[HTTP] POBIERZ…\n"); // uruchom połączenie i wyślij nagłówek HTTP int httpCode = http. GET(); // httpCode będzie negatywny w przypadku błędu if(httpCode > 0) { // Nagłówek HTTP został wysłany i nagłówek odpowiedzi serwera został obsłużony USE_SERIAL.printf("[HTTP] GET… kod: %d\n", // plik znaleziony na serwerze

if(httpCode == HTTP_CODE_OK) { Ciąg znaków = http.getString(); USE_SERIAL.println(ładunek); } } else { USE_SERIAL.printf("[HTTP] GET… nie powiodło się, błąd: %s\n", http.errorToString(httpCode.c_str()); } http.end(); opóźnienie (100); } }

To jest kod, którego użyłem na moim nodemcu. Musisz mieć zainstalowane te biblioteki.

Możesz przetestować za pomocą monitora szeregowego i nacisnąć przyciski pilota dodane w kodzie, aby zobaczyć odpowiedź.

W linii:

http.begin("https://[użytkownik]:[hasło]@[ip]:[port]/chromecastpause?data=" + dane);

Musisz zmienić [user] na swojego użytkownika i tak dalej. BEZ nawiasów. nawiasy są tam, aby pokazać pola czarownic do zmiany.

Ta linia również nie będzie działać, dopóki nie skonfigurujemy naszego przepływu w nodered.

Krok 4: Tworzenie przepływu w Nodered

Tworzenie przepływu w Nodered
Tworzenie przepływu w Nodered
Tworzenie przepływu w Nodered
Tworzenie przepływu w Nodered
Tworzenie przepływu w Nodered
Tworzenie przepływu w Nodered
Tworzenie przepływu w Nodered
Tworzenie przepływu w Nodered

Jak wspomniano na początku, używam hass.io z nodered. Jeśli uruchomisz inną konfigurację, będziesz musiał to zmienić! Na obrazku widać, że po naciśnięciu przycisku pokazuje się w oknie debugowania…

Węzeł zmiany ładunku mógłby prawdopodobnie zostać pominięty, gdybym wybrał coś innego niż data= w poprzednim kroku. Węzeł przełączający, którego używam, jest znacznie większy niż po prostu pauza, ale to tylko po to, abym mógł dodać więcej sygnałów ir, aby używać chromecasta dla stacji radiowych itp.

Aby po prostu odtworzyć pauzę, możesz użyć przepływu na drugim obrazku.

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

Usunąłem z tego nazwę userpass i adres URL, więc być może trzeba będzie to edytować.

dodaj węzeł przełączania, jeśli chcesz reagować na coś więcej niż tylko pauzę (na przykład patrz zdjęcie)

W węźle asystenta domowego do wstrzymania użycia:

name: play pauza chromecastdomain: media_playerService: media_play_pausedata: { "entity_id": "media_player.[Twój chromecast tutaj]" }

dla następnej ścieżki po prostu skopiuj ten węzeł i edytuj usługę na: media_next_track i nazwę na: następny chromecast

Krok 5: Opcjonalny Chromecast Alexa Pause

Opcjonalnie dodaj polecenie alexa do wstrzymania chromecasta:

Jest tu kilka opcji.. Możesz zrobić jeden węzeł alexa o nazwie pauza chromecast, który wstrzymuje chromecast, lub możesz zrobić jeden o nazwie pauza tv, który sprawdza bieżącą aktywność harmonii i pauzuje w zależności od tego.

Dodam to tutaj później…

Zalecana: