Мазмуну:

Алыстан башкаруу менен Chromcastти тындыруу: 5 кадам
Алыстан башкаруу менен Chromcastти тындыруу: 5 кадам

Video: Алыстан башкаруу менен Chromcastти тындыруу: 5 кадам

Video: Алыстан башкаруу менен Chromcastти тындыруу: 5 кадам
Video: 100%Буроонун ватсабын бузуп кируу 2024, Июль
Anonim
Image
Image
Жабдуу
Жабдуу

Менде Logitech гармониясынын пульту бар жана малина пи боюнча Home жардамчысын иштетем.

Мен пультумдагы chromecastты тындыргым келет, бирок менде муну hdmi аркылуу колдобогон эски сыналгы бар. Менин оюм, анда NodeMcu аркылуу сигналды кармап, тыныгуу болчу.

Эгерде сиз аны иштей албасаңыз же суроолор болсо, төмөндөгү комментарийге жазыңыз

1 -кадам: жабдуу

Жабдуу
Жабдуу
Жабдуу
Жабдуу

Керектүү жабдуулар:

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

Ир кабыл алуучу (мисалы:

дюпонт зымдары

Микро USB кабели (nodemcu power)

Мен Logitech Harmony -hub колдоном

Менин мамилем үчүн сизге hass.io орнотулган жана Nodered менен Raspberry pi керек. Эгер сиз үй жардамчысынан башка нерсени колдонсоңуз, анда өзүңүздү ыңгайлаштырышыңыз керек.

Сиз Nodemcu'ду Arduino IDEде колдоно билишиңиз керек, анткени мен бул жерге кирбейм

2 -кадам: Remote Signal

Алыстан сигнал
Алыстан сигнал
Алыстан сигнал
Алыстан сигнал
Алыстан сигнал
Алыстан сигнал
Алыстан сигнал
Алыстан сигнал

Мен муну алыстан башкаруучу сигналды көчүрүү болчу, мен гармониянын пультуна колдонбойм.

Мен пансионикалык TXL32C3E модели үчүн пультту колдондум, анткени бул менин биринчи кабаттагы жабдууларга кийлигишпейт. Бул менин үстүңкү кабаттагы телевизорум.

Эгерде сиз гармонияны колдонбосоңуз, муну өткөрүп жибере аласыз.

Ошентип, сигналды табуу үчүн мен бул эскизди колдондум:

/ * * IRremoteESP8266: IRrecvDumpV2 - IRrecv менен IR коддорунун төгүндүлөрү * IR детектору/демодулятору RECV_PIN киришине туташтырылышы керек. * * Copyright 2009 Ken Shirriff, https://arcfn.com * Copyright 2017 Дэвид Конран * * Мисал схемасы: * https://arcfn.com * * Өзгөртүүлөр: * Версия 0.3 Ноябрь, 2017 * - А/Сны колдоо кээ бир протокол үчүн декоддоо. * Версия 0.2 Апрель, 2017 * - Маалыматтардын көчүрмөсүн чечип алыңыз, ошентип биз тезирээк басып алууну баштайбыз *, ката кетирүү ыктымалдыгын азайтуу. * Кен Шириффтин IrsendDemo Версиясынын негизинде 0.1 Июль, 2009, */

#ifndef UNIT_TEST

#кошуу #endif #кошуу #кошуу #кошуу #эгер DECODE_AC #кошуу #кошуу #кошуу #кошуу #кошуу #endif // DECODE_AC

// ==================== TUNEABLE PARAMETERS ===================

// IR детектору/демодулятор GPIO пин 14кө туташкан // мис. D5 NodeMCU тактасында. #аныктоо RECV_PIN 14

// Сериялык байланыштын ылдамдыгы.

// б.а. Статус билдирүүсү ЖКга бул ылдамдыкта жөнөтүлөт. // 9600 сыяктуу жай ылдамдыктан оолак болууга аракет кылыңыз, анткени сиз билдирүүлөрдү сагынасыз жана // башка көйгөйлөрдү жаратасыз. 115200 (же тезирээк) сунушталат. // ЭСКЕРТҮҮ: Сериялык мониторду ошол эле ылдамдыкка койгонуңузду текшериңиз. #аныктоо BAUD_RATE 115200

// Бул программа атайын максаттуу тартуу/декодер болгондуктан, келгиле, чоңураакты колдонолу

// кадимки буферге караганда, кондиционердин алыскы коддорун иштете алабыз. 1024

// TIMEOUT - бул Nr. милли-Секунддан ашпаган маалымат бизди кароодон мурун

// билдирүү аяктады. // Бул параметр кызыктуу соода болуп саналат. Тайм -аут канчалык узун болсо, ал басып алышы мүмкүн болгон // татаал билдирүү. мис. Кээ бир түзмөк протоколдору // кондиционердин пульттары сыяктуу тез -тезден // бир нече билдирүү пакетин жөнөтөт. // Эйр кондиционеринин протоколдору көбүнчө // пакеттердин ортосунда бир кыйла ажырымга (20-40+мс) ээ. // Чоң күтүү убактысынын терс жагы - анча татаал эмес протоколдор // алыстан башкаруу баскычы басылып турганда бир нече билдирүүлөрдү жөнөтүү. // алардын ортосундагы ажырым көбүнчө 20+мс айланасында болот. Бул чийки маалыматтын 2-3+ // эсе чоң болушуна алып келиши мүмкүн, анткени ал бир эле учурда 2-3+ билдирүүнү басып алган. Төмөн күтүү убактысын коюу муну чече алат. // Ошентип, сиздин колдонууңуз үчүн эң мыкты TIMEOUT маанисин тандоо - бул өзгөчө нюанс. Ийгилик жана бактылуу мергенчилик. // ЭСКЕРТҮҮ: MAX_TIMEOUT_MS ашпасын. Адатта 130 мс. #if DECODE_AC #deutine TIMEOUT 50U // Кээ бир кондиционерлердин протоколдорунда ~ 40ms боштуктар бар. // мис. Келвинатор // Бул чоңдук кээ бир протоколдордун кайталанышын жутуп алышы мүмкүн #башка // DECODE_AC #define TIMEOUT 15U // Көп билдирүүлөрдү жутпастан, көпчүлүк билдирүүлөргө туура келет. #endif // DECODE_AC // Альтернативалар: // #define TIMEOUT 90U // XMP-1 жана кээ бир aircon // бирдиктери сыяктуу чоң боштуктары бар билдирүүлөргө туура келет, бирок кайталанган билдирүүлөрдү кокусунан жутуп алат // rawData чыгаруу. // #define TIMEOUT MAX_TIMEOUT_MS // Бул аны биздин учурдагы уруксат берилген // максимумга орнотот. Бул жогорку баалуулуктар көйгөйлүү // анткени бул болжолдуу типтүү чек // көпчүлүк билдирүүлөр кайталанат. // мис. Ал билдирүүнү декоддоону токтотот жана // аны так // кийинки кабар жөнөтүлүшү мүмкүн болгон учурда // серияга жөнөтө баштайт жана аны өткөрүп жибериши мүмкүн.

// Биз кызыккан эң кичине "Белгисиз" билдирүү пакеттерин коюңуз.

// Бул маани реалдуу билдирүүлөр катары IR фонунун // жалган позитивдүү аныктоо ылдамдыгын азайтууга жардам берет. ИК ызы -чуусун аныктоо мүмкүнчүлүгү // билдирүү катары TIMEOUT маанисинин узундугу менен көбөйөт. (Жогору караңыз) // Бул билдирүүнү өтө чоң орнотуунун терс жагы, бул китепкана азырынча декоддолбогон протоколдор үчүн кээ бир жарактуу // кыска билдирүүлөрдү өткөрүп жиберишиңиз мүмкүн. // // Эч нерсе // билдирүү жибербеши керек болгон учурда, сиз кокусунан билинбеген көптөгөн билдирүүлөрдү алсаңыз, жогору коюңуз. // Орнотууңуз иштеп жатканына ишенсеңиз, бирок түзмөгүңүздөн келген билдирүүлөрдү көрбөсөңүз, төмөн коюңуз. (мисалы, башка IR пульттары иштейт.) // ЭСКЕРТҮҮ: Бул белгини эффективдүү түрдө БЕЛГИСИЗ аныктоону өчүрүү үчүн орнотуңуз. #dinefine MIN_UNKNOWN_SIZE 12 // ===================== TUNEABLE PARAMETERS ====================

// Толугу менен тартууну камтуу үчүн сактоо буферинин мүмкүнчүлүгүн күйгүзүңүз.

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 (жыйынтыгы-> абалы); Description = ac.toString (); } #endif // DECODE_DAIKIN #if DECODE_FUJITSU_AC if (results-> decode_type == FUJITSU_AC) {IRFujitsuAC ac (0); ac.setRaw (results-> абалы, results-> bits / 8); Description = ac.toString (); } #endif // DECODE_FUJITSU_AC #if DECODE_KELVINATOR if (results-> decode_type == KELVINATOR) {IRKelvinatorAC ac (0); ac.setRaw (жыйынтыгы-> абалы); Description = ac.toString (); } #endif // DECODE_KELVINATOR #if DECODE_TOSHIBA_AC if (results-> decode_type == TOSHIBA_AC) {IRToshibaAC ac (0); ac.setRaw (жыйынтыгы-> абалы); Description = ac.toString (); } #endif // DECODE_TOSHIBA_AC #if DECODE_MIDEA if (results-> decode_type == MIDEA) {IRMideaAC ac (0); ac.setRaw (results-> value); // Midea мамлекеттин ордуна маанини колдонот. Description = ac.toString (); } #endif // DECODE_MIDEA // Эгерде биз билдирүүнүн адам окуй турган сүрөттөмөсүнө ээ болсок, аны көрсөтүңүз. if (description! = "") Serial.println ("Mesg Desc.:" + description); }

// Коддун бөлүмү ишке киргенде бир гана жолу иштейт.

жараксыз орнотуу () {Serial.begin (BAUD_RATE, SERIAL_8N1, SERIAL_TX_ONLY); кечигүү (500); // Сериялык туташуу үчүн бир аз күтө туруңуз.

#эгер ДЕКОД_ХАШ

// Импульс минимумдан азыраак болгон билдирүүлөрдү этибарга албаңыз. irrecv.setUnknownThreshold (MIN_UNKNOWN_SIZE); #endif // DECODE_HASH irrecv.enableIRIn (); // Ресиверди баштаңыз}

// Коддун кайталануучу бөлүмү

// void loop () {// IR коду алынганын текшериңиз. if (irrecv.decode (& results)) {// Чийки убакыт белгисин көрсөтүү. uint32_t азыр = миллис (); Serial.printf ("Убакыт белгиси: %06u. %03u / n", азыр / 1000, азыр %1000); if (results.overflow) Serial.printf ("ЭСКЕРТҮҮ: IR коду буфер үчүн өтө чоң (> = %d)." "Бул чечилмейинче бул жыйынтыкка ишенүүгө болбойт." "CAPTURE_BUFFER_SIZE түзөтүү жана көбөйтүү. / n ", CAPTURE_BUFFER_SIZE); // Биз тапкандын негизги өндүрүшүн көрсөтүү. Serial.print (resultToHumanReadableBasic (& жыйынтыктары)); dumpACInfo (& жыйынтыктар); // Эгерде бизде кошумча А/С маалыматы көрсөтүлсө. киреше (); // WDT бергиле, анткени текстти чыгаруу бир аз убакытты талап кылат.

// Билдирүү алынган китепкана версиясын көрсөтүү.

Serial.print ("Китепкана: v"); Serial.println (_IRREMOTEESP8266_VERSION_); Serial.println ();

// Жыйынтыктын RAW убакыт маалыматын чыгаруу.

Serial.println (resultToTimingInfo (& жыйынтыктары)); киреше (); // WDT бер (кайра)

// Натыйжаларды баштапкы код катары чыгаруу

Serial.println (resultToSourceCode (& жыйынтыктары)); Serial.println (""); // Жазуулардын ортосундагы бош сызык (); // WDT бер (кайра)}}

Бул эскиз жүктөлүп, сериялык монитор ачык турганда, ал баскычты басуу үчүн кодду чыгарат (сүрөттү караңыз)

Кийин колдонуу үчүн колдонгуңуз келген коддорду жазыңыз. Мен колдонгум келген баскычтар үчүн эмнелерди алгандыгымды белгилөө үчүн Excel колдондум (сүрөттү караңыз)

Мен Panasonic пультунан тыныгуу сигналын жөнөтүү үчүн Netflix ишмердүүлүгүмдөгү баскычтарды түзөттүм. (Сүрөттү караңыз)

3 -кадам: Noderedге жөнөтүү үчүн код жазуу

Noderedге жөнөтүү үчүн код жазуу
Noderedге жөнөтүү үчүн код жазуу

#ifndef UNIT_TEST #камтыйт #endif #include

#кошуу

#кошуу

#кошуу

#кошуу

#кошуу

const char* ssid = ""; // SSID киргизиңиз chareconst char* password = ""; // Сырсөздү бул жерге жазыңыз const char *host = ""; // Ip addresse #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 (чыныгы); USE_SERIAL.println (); USE_SERIAL.println (); USE_SERIAL.println ();

үчүн (uint8_t t = 4; t> 0; t--) {

USE_SERIAL.printf ("[SETUP] КҮТҮҮ %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 ("тыныгуу сигналы алынды"); жубайы (тыныгуу); кечигүү (1000);

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

USE_SERIAL.println ("мурунку");

wifisend ("мурунку"); кечигүү (1000); } if (results.value == 0x40040100F2F3) {USE_SERIAL.println ("кийинки"); wifisend ("кийинки"); кечигүү (1000); }

irrecv.resume (); // Кийинки маанини алуу} delay (100); } void wifisend (String data) {if ((WiFiMulti.run () == WL_CONNECTED)) {HTTPClient http; USE_SERIAL.print ("[HTTP] башталат… / n"); // трагедия серверин жана URL дарегин конфигурациялоо http.begin ("https:// [user]: [pass]@[ip]: [port]/chromecastpause? data =" + data); USE_SERIAL.print ("[HTTP] АЛУУ… / n"); // туташууну баштоо жана HTTP башын жөнөтүү int httpCode = http. GET (); // httpCode ката болгондо терс болот (httpCode> 0) {// HTTP аталышы жөнөтүлгөн жана Сервердин жооп башы USE_SERIAL.printf менен иштелген болсо ("[HTTP] GET… code: %d / n", // файл серверден табылды

if (httpCode == HTTP_CODE_OK) {String payload = http.getString (); USE_SERIAL.println (пайдалуу жүк); }} башка {USE_SERIAL.printf ("[HTTP] АЛУУ… ишке ашкан жок, ката: %s / n", http.errorToString (httpCode).c_str ()); } http.end (); кечиктирүү (100); }}

Бул менин nodemcu колдонулган коду. Сиз бул китепканаларды орнотушуңуз керек.

Сиз сериялык монитордун жардамы менен тестирлеп, жоопту көрүү үчүн кодго кошулган алыскы баскычтарды басыңыз.

Сапта:

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

Сиз [колдонуучуну] колдонуучуга өзгөртүүңүз керек ж.б. Кашаалар жок. кашаалар өзгөртүү үчүн бүбү талааларды көрсөтүү үчүн бар.

Бул линия биз агымыбызды жөнгө салынмайынча иштебейт.

4 -кадам: Noderedде Flow түзүү

Nodered ичинде агым түзүү
Nodered ичинде агым түзүү
Nodered ичинде агым түзүү
Nodered ичинде агым түзүү
Nodered ичинде агым түзүү
Nodered ичинде агым түзүү
Nodered ичинде агым түзүү
Nodered ичинде агым түзүү

Башында айтылгандай, мен hass.ioду nodered менен колдоном. Эгерде сиз башка орнотууну иштетсеңиз, анда муну башкача кылышыңыз керек болот! Сүрөттөн көрө аласыз, бир баскыч басылганда, ал мүчүлүштүктөрдү оңдоо терезесинде көрүнөт …

Эгерде мен мурунку кадамда башка маалымат = тандап алсам, жүктүн түйүнүн өзгөртүү, мүмкүн, өткөрүп жиберилген болушу мүмкүн. Мен колдонгон которуштуруу түйүнү бир аз тыныгуудан кийин чоңураак, бирок мен радиостанциялар үчүн chromecastты колдонуу үчүн дагы ир сигналдарын кошо алам.

Жөн эле тыныгуу үчүн башка сүрөттөгү агымды колдонсоңуз болот.

[{"id": "e6440c30.4a35a", "type": "http in", "z": "869ceb74.0275c8", "name": "", "url": "chromecastpause", "method": "алуу", "жүктөө": жалган, "swaggerDoc": "", "x": 133, "y": 98, "зымдар":

Мен колдонуучунун атын жана url'ин алып салдым, андыктан аны түзөтүшүңүз керек болот.

эгер сиз жөн гана тыныгууга жооп бергиңиз келсе, которуштуруучу түйүндү кошуңуз (мисалы, сүрөттү караңыз)

Тыныгуу үчүн үй жардамчысынын түйүнүндө:

аты: ойнотууну токтотуу chromecastdomain: media_playerService: media_play_pausedata: {"entity_id": "media_player. [сиздин chromecast бул жерде]"}

кийинки трек үчүн жөн гана ошол түйүндү көчүрүү жана кызматты түзөтүү: media_next_track жана аталышы: кийинки chromecast

5 -кадам: Кошумча Alexa Pause Chromecast

Chromecast тындыруу үчүн кошумча Alexa буйругун кошуу:

Бул жерде варианттар бар.. Сиз chromecast -ты тындыруучу chrome -pause деп аталган бир alexa түйүнүн жасай аласыз, же учурдагы гармониянын аракетин текшерүүчү тыныгуу телекөрсөтүүсүн жасай аласыз жана ага жараша тыным жасай аласыз.

Мен муну кийинчерээк бул жерге кошом..

Сунушталууда: