İçindekiler:

Uzaktan Kumandayla Chromcast'i Duraklatın: 5 Adım
Uzaktan Kumandayla Chromcast'i Duraklatın: 5 Adım

Video: Uzaktan Kumandayla Chromcast'i Duraklatın: 5 Adım

Video: Uzaktan Kumandayla Chromcast'i Duraklatın: 5 Adım
Video: How to Insert Battery Into Google Chromecast TV Remote 2024, Temmuz
Anonim
Image
Image
ekipman
ekipman

Logitech uyumlu bir uzaktan kumandam var ve bir ahududu pi'de Ev asistanını çalıştırıyorum.

Uzaktan kumandamdan chromecast'i duraklatmak istedim, ancak bunu hdmi üzerinden desteklemeyen eski bir televizyonum var. Benim fikrim o zaman sinyallerini yakalamak ve duraklatmak için bir NodeMcu kullanmaktı.

Çalışmasını sağlayamıyorsanız veya sorularınız varsa lütfen aşağıya yorum yapın

Adım 1: Ekipman

ekipman
ekipman
ekipman
ekipman

Gerekli ekipman:

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

Ir alıcısı (eski gibi:

dupont teller

Mikro usb kablosu (power nodemcu)

Logitech Harmony -hub kullanıyorum

Benim yaklaşımım için hass.io Kurulu ve Nodered ile bir Ahududu pi'ye ihtiyacınız var. Burada ev asistanı şeyler ayarlamaya gitmeyeceğim. Ev yardımcısı dışında bir şey kullanıyorsanız, malzemeleri kendiniz uyarlamanız gerekir.

Nodemcu'yu Arduino IDE'de kullanabilmeniz gerekiyor, çünkü buna burada girmeyeceğim

2. Adım: Uzak Sinyal

Uzak Sinyal
Uzak Sinyal
Uzak Sinyal
Uzak Sinyal
Uzak Sinyal
Uzak Sinyal
Uzak Sinyal
Uzak Sinyal

Bunu yapma şeklim, kullanmadığım bir kumandadan gelen bir sinyali harmoni kumandasına kopyalamaktı.

Birinci katımdaki ekipmanımı etkilemediği için panasonic tv modeli TXL32C3E için bir uzaktan kumanda kullandım. Bu, üst katta sahip olduğum bir televizyon.

Harmoni kullanmıyorsanız bunu atlayabilirsiniz.

Bu yüzden sinyali bulmak için bu taslağı kullandım:

/* * IRremoteESP8266: IRrecvDumpV2 - IRrecv ile IR kodlarının dökümü * RECV_PIN girişine bir IR dedektörü/demodülatörü bağlanmalıdır. * * Telif Hakkı 2009 Ken Shirriff, https://arcfn.com * Telif Hakkı 2017 David Conran * * Örnek devre şeması: * https://arcfn.com * * Değişiklikler: * Sürüm 0.3 Kasım 2017 * - Klima Desteği bazı protokoller için kod çözme. * Sürüm 0.2 Nisan 2017 * - Daha hızlı yakalamaya başlayabilmemiz için verilerin bir kopyasından kodunu çözün, böylece * yanlış yakalama olasılığını azaltın. * Ken Shirriff'in IrsendDemo Sürümü 0.1 Temmuz 2009, */

#ifndef BİRİM_TEST

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

// ==================== AYARLANABİLİR PARAMETRELERİN başlangıcı ====================

// GPIO pin 14'e bir IR dedektörü/demodülatör bağlanır // ör. NodeMCU kartındaki D5. #define RECV_PIN 14

// Seri bağlantı baud hızı.

// yani, bu baud hızında PC'ye durum mesajı gönderilecektir. // Mesajları kaçıracağınız ve // başka sorunlara neden olacağından 9600 gibi yavaş hızlardan kaçınmaya çalışın. 115200 (veya daha hızlı) önerilir. // NOT: Seri Monitörünüzü aynı hıza ayarladığınızdan emin olun. #define BAUD_RATE 115200

// Bu program özel amaçlı bir yakalama/kod çözücü olduğundan, daha büyük bir

// Normal tampondan daha fazla, böylece Klima uzaktan kumanda kodlarını işleyebiliriz. #define CAPTURE_BUFFER_SIZE 1024

// ZAMAN AŞIMI, No. düşünmeden önce mili-saniye artık veri yok

// mesaj sonlandırıldı. // Bu parametre ilginç bir değiş tokuştur. Zaman aşımı ne kadar uzun olursa, yakalayabileceği // karmaşık bir mesaj olur. Örneğin. Bazı cihaz protokolleri, Klima uzaktan kumandaları gibi hızlı bir şekilde arka arkaya // birden fazla mesaj paketi gönderir. // Klima protokolleri genellikle // paketler arasında önemli bir boşluğa (20-40+ms) sahiptir. // Büyük bir zaman aşımı değerinin dezavantajı, çok daha az karmaşık protokollerin olmasıdır // uzaktan kumandanın düğmesi basılı tutulduğunda birden fazla mesaj gönderir. // Aralarındaki boşluk da genellikle 20+ms civarındadır. Bu, tek bir // yakalamada 2-3+ mesajı yakaladığından, ham verilerin gerekenden 2-3+ // kat daha büyük olmasına neden olabilir. Düşük bir zaman aşımı değeri ayarlamak bunu çözebilir. // Bu nedenle, kullanım özel durumunuz için en iyi TIMEOUT değerini seçmek // oldukça nüanslıdır. İyi şanslar ve mutlu avlar. // NOT: MAX_TIMEOUT_MS'yi aşmayın. Tipik olarak 130ms. #if DECODE_AC #define TIMEOUT 50U // Bazı A/C ünitelerinin protokollerinde ~40ms boşluk var. // Örneğin. Kelvinator // Bu kadar büyük bir değer bazı protokollerin tekrarlarını yutabilir #else // DECODE_AC #define TIMEOUT 15U // Birçok tekrarı yutmazken çoğu mesaja uyar. #endif // DECODE_AC // Alternatifler: // #define TIMEOUT 90U // XMP-1 ve bazı klima // birimleri gibi büyük boşlukları olan mesajlara uyar, ancak rawData çıktısında tekrarlanan mesajları yanlışlıkla yutabilir //. // #define TIMEOUT MAX_TIMEOUT_MS // Bu, şu anda izin verilen // maksimum değerimize ayarlayacaktır. Bu kadar yüksek değerler problemlidir // çünkü bu kabaca tipik bir sınırdır // çoğu mesajın tekrarlandığı yerdir. // Örneğin. Bir mesajın kodunu çözmeyi durduracak ve // onu tam olarak // bir sonraki mesajın iletileceği zamanda // seriye göndermeye başlayacak ve onu kaçırabilir.

// Gerçekten önemsediğimiz en küçük boyutlu "UNKNOWN" mesaj paketlerini ayarlayın.

// Bu değer, IR arka planının yanlış pozitif algılama oranını azaltmaya yardımcı olur // gerçek mesajlar olarak gürültü. Arka plan IR gürültüsünün algılanma şansı // TIMEOUT değerinin uzunluğu ile artar. (Yukarıya bakın) // Bu mesajı çok büyük ayarlamanın dezavantajı, bu kütüphanenin henüz kodunu çözmediği protokoller için bazı geçerli // kısa mesajları kaçırabilmenizdir. // // Hiçbir şeyin mesaj göndermemesi gerektiğinde // çok sayıda rastgele kısa UNKNOWN mesajı alırsanız daha yükseğe ayarlayın. // Kurulumunuzun çalıştığından eminseniz, ancak cihazınızdan gelen mesajları görmüyorsa // daha düşük ayarlayın. (ör. Diğer IR uzaktan kumandalar çalışır.) // NOT: BİLİNMEYEN algılamayı etkin bir şekilde kapatmak için bu değeri çok yükseğe ayarlayın. #define MIN_UNKNOWN_SIZE 12 // ==================== AYARLANABİLİR PARAMETRELER sonu ====================

// Daha eksiksiz yakalama kapsamı için arabelleği kaydetme özelliğini açın.

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

decode_results sonuçları; // Sonuçların saklanacağı bir yer

// Yapabiliyorsak, bir A/C mesajının insan tarafından okunabilir durumunu görüntüleyin.

void dumpACInfo(decode_results *results) { Dize açıklaması = ""; #if DECODE_DAIKIN if (sonuçlar->decode_type == DAIKIN) { IRDaikinESP ac(0); ac.setRaw(sonuçlar->durum); açıklama = ac.toString(); } #endif // DECODE_DAIKIN #if DECODE_FUJITSU_AC if (sonuçlar->decode_type == FUJITSU_AC) { IRFujitsuAC ac(0); ac.setRaw(sonuçlar->durum, sonuçlar->bitler / 8); açıklama = ac.toString(); } #endif // DECODE_FUJITSU_AC #if DECODE_KELVINATOR if (sonuçlar->decode_type == KELVINATOR) { IRKelvinatorAC ac(0); ac.setRaw(sonuçlar->durum); açıklama = ac.toString(); } #endif // DECODE_KELVINATOR #if DECODE_TOSHIBA_AC if (sonuçlar->decode_type == TOSHIBA_AC) { IRToshibaAC ac(0); ac.setRaw(sonuçlar->durum); açıklama = ac.toString(); } #endif // DECODE_TOSHIBA_AC #if DECODE_MIDEA if (sonuçlar->decode_type == MIDEA) { IRMideaAC ac(0); ac.setRaw(sonuçlar->değer); // Midea durum yerine değeri kullanır. açıklama = ac.toString(); } #endif // DECODE_MIDEA // Mesajın insan tarafından okunabilir bir açıklaması varsa, onu görüntüleyin. if (açıklama != "") Serial.println("Mesg Açıklama: " + açıklama); }

// Kod bölümü başlangıçta yalnızca bir kez çalıştırılır.

geçersiz kurulum() { Serial.begin(BAUD_RATE, SERIAL_8N1, SERIAL_TX_ONLY); gecikme(500); // Seri bağlantının kurulması için biraz bekleyin.

#if DECODE_HASH

// Minimum açık veya kapalı darbeli mesajları yoksay. irrecv.setUnknownThreshold(MIN_UNKNOWN_SIZE); #endif // DECODE_HASH irrecv.enableIRIn(); // Alıcıyı başlat }

// Kodun yinelenen bölümü

// void loop() { // IR kodunun alınıp alınmadığını kontrol edin. if (irrecv.decode(&results)) { // Kaba bir zaman damgası görüntüleyin. uint32_t şimdi = millis(); Serial.printf("Zaman Damgası: %06u.%03u\n", şimdi / 1000, şimdi % 1000); if (results.overflow) Serial.printf("UYARI: IR kodu arabellek için çok büyük (>= %d). " "Bu sonuç çözülene kadar bu sonuca güvenilmemelidir." "CAPTURE_BUFFER_SIZE öğesini düzenleyin ve artırın.\n ", CAPTURE_BUFFER_SIZE); // Bulduğumuz şeyin temel çıktısını göster. Serial.print(resultToHumanReadableBasic(&results)); dumpACInfo(&sonuçlar); // Varsa, ekstra A/C bilgilerini görüntüleyin. teslim olmak(); // Metin çıktısının yazdırılması biraz zaman alabileceğinden WDT'yi besleyin.

// İletinin yakalandığı kitaplık sürümünü görüntüleyin.

Serial.print("Kütüphane: v"); Serial.println(_IRREMOTEESP8266_VERSION_); Seri.println();

// Sonucun RAW zamanlama bilgisi çıktısı.

Serial.println(resultToTimingInfo(&results)); teslim olmak(); // WDT'yi besle (tekrar)

// Sonuçları kaynak kod olarak çıktıla

Serial.println(resultToSourceCode(&results)); Seri.println(""); // Girdiler arasında boş satır verim(); // WDT'yi besleyin (tekrar) } }

Bu taslak yüklendiğinde ve seri monitör açıkken çalıştırıldığında, düğmeye basma kodunu verecektir (resme bakın)

Daha sonra kullanmak üzere kullanmak istediğiniz kodları yazın. Kullanmak istediğim düğmeler için ne aldığımı not etmek için excel kullandım (resme bakın)

Netflix etkinliğimdeki düğmeleri panasonic uzaktan kumandadan duraklatma sinyali göndermek için düzenledim.. (resme bakın)

Adım 3: Nodered'e Gönderilecek Kodu Yazma

Nodered'e Göndermek İçin Kod Yazma
Nodered'e Göndermek İçin Kod Yazma

#ifndef UNIT_TEST#include #endif #include

#Dahil etmek

#Dahil etmek

#Dahil etmek

#Dahil etmek

#Dahil etmek

const char* ssid = ""; // SSID'yi buraya girinconst char* password = ""; //Şifreyi buraya girin const char *host = ""; //IP adresi #define USE_SERIAL Seri ESP8266WiFiMulti WiFiMulti; uint16_t RECV_PIN = 14; IRrecv geri dönüş(RECV_PIN); decode_results sonuçları; geçersiz kurulum() { irrecv.enableIRIn(); // Alıcıyı başlat 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("[KURULUM] BEKLEYİN %d…\n", t); USE_SERIAL.flush(); gecikme(1000); } WiFi.mode(WIFI_STA); WiFiMulti.addAP(ssid, şifre); } void loop() { if (irrecv.decode(&sonuçlar)) {

// Aldığınız sinyal için bu sinyal değerini değiştirin

if (results.value == 0x40040D00606D){ USE_SERIAL.println("duraklama sinyali alındı"); wifisend(duraklatma); gecikme(1000);

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

USE_SERIAL.println("önceki");

wifisend("önceki"); gecikme(1000); } if (results.value == 0x40040100F2F3){ USE_SERIAL.println("sonraki"); wifisend("sonraki"); gecikme(1000); }

irrecv.özgeçmiş(); // Bir sonraki değeri al } delay(100); } void wifisend(Dize verisi){ if((WiFiMulti.run() == WL_CONNECTED)) { HTTPClient http; USE_SERIAL.print("[HTTP] başla…\n"); // traged sunucuyu ve url'yi yapılandırın http.begin("https://[user]:[pass]@[ip]:[port]/chromecastpause?data=" + data); USE_SERIAL.print("[HTTP] GET…\n"); // bağlantıyı başlat ve HTTP başlığını gönder int httpCode = http. GET(); // httpCode hata durumunda negatif olur if(httpCode > 0) { // HTTP başlığı gönderildi ve Sunucu yanıtı başlığı işlendi USE_SERIAL.printf("[HTTP] GET… code: %d\n", // dosya sunucuda bulundu

if(httpCode == HTTP_CODE_OK) { Dize yükü = http.getString(); USE_SERIAL.println(yük); } } else { USE_SERIAL.printf("[HTTP] GET… başarısız oldu, hata: %s\n", http.errorToString(httpCode).c_str()); } http.end(); gecikme(100); } }

Bu benim nodemcu'mda kullandığım kod. Bu kütüphanelerin kurulu olması gerekir.

Seri monitör kullanarak test edebilir ve kodu eklediğiniz kumanda butonlarına basarak yanıtı görebilirsiniz..

Çizgide:

http.begin("https://[kullanıcı]:[geçiş]@[ip]:[port]/chromecastpause?data=" + veri);

[kullanıcı]'yı kullanıcınıza ve benzeri şekilde değiştirmeniz gerekir. parantez OLMADAN. parantezler, değiştirilecek cadı alanlarını göstermek için var.

Bu satır, akışımızı düğümlü olarak ayarlayana kadar da çalışmayacaktır.

Adım 4: Nodered'de Akış Oluşturma

Nodered'de Akış Oluşturma
Nodered'de Akış Oluşturma
Nodered'de Akış Oluşturma
Nodered'de Akış Oluşturma
Nodered'de Akış Oluşturma
Nodered'de Akış Oluşturma
Nodered'de Akış Oluşturma
Nodered'de Akış Oluşturma

Başlangıçta belirtildiği gibi, hass.io'yu nodred ile kullanıyorum. Farklı bir kurulum çalıştırırsanız, bunu farklı yapmanız gerekecektir! Bir düğmeye basıldığında hata ayıklama penceresinde görüntülendiğini resimde görebilirsiniz…

Önceki adımda data='dan farklı bir şey seçmiş olsaydım, değişiklik yükü düğümü muhtemelen atlanmış olabilirdi. Kullandığım anahtar düğümü sadece duraklatmaktan çok daha büyük ama bu sadece radyo istasyonları vb. için chromecast kullanmak üzere daha fazla ir sinyali ekleyebilmem için.

Sadece duraklatmak için diğer resimdeki akışı kullanabilirsiniz.

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

Kullanıcı şifresini ve url'yi bundan kaldırdım, bu yüzden onu düzenlemeniz gerekebilir.

duraklatmaktan daha fazlasına tepki vermek istiyorsanız bir anahtar düğümü ekleyin (örneğin resme bakın)

Duraklatma kullanımı için ev yardımcısı düğümünde:

ad: oynat duraklat chromecastdomain: media_playerService: media_play_pausedata: { "entity_id": "media_player.[chromecast'iniz burada]" }

sonraki parça için sadece o düğümü kopyalayın ve hizmeti şuraya düzenleyin: media_next_track ve ad: sonraki chromecast

Adım 5: İsteğe Bağlı Alexa Chromecast'i Duraklatın

Chromecast'i duraklatmak için isteğe bağlı alexa komutu ekleyin:

Burada seçenekler var.. chromecast'i duraklatan duraklatma chromecast adlı bir alexa nnode yapabilirsiniz, veya mevcut armoni etkinliğini kontrol eden ve buna bağlı olarak duraklatılan bir duraklama tv yapabilirsiniz.

Bunu daha sonra buraya ekleyeceğim..

Önerilen: