সুচিপত্র:

একটি রিমোট কন্ট্রোল দিয়ে ক্রোমকাস্ট থামান: ৫ টি ধাপ
একটি রিমোট কন্ট্রোল দিয়ে ক্রোমকাস্ট থামান: ৫ টি ধাপ

ভিডিও: একটি রিমোট কন্ট্রোল দিয়ে ক্রোমকাস্ট থামান: ৫ টি ধাপ

ভিডিও: একটি রিমোট কন্ট্রোল দিয়ে ক্রোমকাস্ট থামান: ৫ টি ধাপ
ভিডিও: Miracast how to connect to tv all | মোবাইলের স্ক্রিন টিভিতে | Share Mobile Screen To TV | Any-cast 2024, জুলাই
Anonim
Image
Image
উপকরণ
উপকরণ

আমার একটি লজিটেক সাদৃশ্য রিমোট আছে এবং রাস্পবেরি পাইতে হোম অ্যাসিস্ট্যান্ট চালাচ্ছি।

আমি আমার রিমোট থেকে ক্রোমকাস্ট থামাতে সক্ষম হতে চেয়েছিলাম, কিন্তু আমার একটি পুরানো টিভি আছে যা এইচডিএমআই এর মাধ্যমে এটি সমর্থন করে না। আমার আইডিয়া তখন আইআর সিগন্যাল ধরা এবং বিরতি দেওয়ার জন্য একটি NodeMcu ব্যবহার করা ছিল।

আপনি যদি এটি কাজ করতে বা প্রশ্ন করতে না পারেন তবে দয়া করে নীচে মন্তব্য করুন

ধাপ 1: উপকরণ

উপকরণ
উপকরণ
উপকরণ
উপকরণ

সরঞ্জাম প্রয়োজন:

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

আইআর রিসিভার (যেমন এই:

dupont তারের

মাইক্রো ইউএসবি কেবল (পাওয়ার নডেমকু)

আমি Logitech Harmony -hub ব্যবহার করি

আমার পদ্ধতির জন্য আপনার hass.io ইনস্টল এবং নোডেরড সহ একটি রাস্পবেরি পাই দরকার। আপনি যদি হোম এসিসটেন্ট ছাড়া অন্য কিছু ব্যবহার করেন তবে আপনার নিজের জিনিসগুলি মানিয়ে নিতে হবে।

আপনি Arduino IDE তে Nodemcu ব্যবহার করতে সক্ষম হবেন কারণ আমি এখানে ুকবো না

ধাপ 2: দূরবর্তী সংকেত

দূরবর্তী সংকেত
দূরবর্তী সংকেত
দূরবর্তী সংকেত
দূরবর্তী সংকেত
দূরবর্তী সংকেত
দূরবর্তী সংকেত
দূরবর্তী সংকেত
দূরবর্তী সংকেত

আমি যেভাবে এটি করেছি তা ছিল একটি দূরবর্তী থেকে একটি সংকেত অনুলিপি করা আমি সাদৃশ্য রিমোট ব্যবহার করি না।

আমি প্যানাসনিক টিভি মডেল TXL32C3E এর জন্য একটি রিমোট ব্যবহার করেছি কারণ এটি আমার প্রথম তলায় আমার সরঞ্জামগুলিতে হস্তক্ষেপ করে না। এটা একটা টিভি আমার উপরে আছে।

আপনি যদি সম্প্রীতি ব্যবহার না করেন তবে আপনি এটি এড়িয়ে যেতে পারেন।

তাই সিগন্যাল খোঁজার জন্য আমি এই দৃশ্য ব্যবহার করেছি:

/ * * IRremoteESP8266: IRrecvDumpV2 - IRrecv সহ IR কোডের ডাম্প বিবরণ * * কপিরাইট 2009 কেন শিরিফ, https://arcfn.com * কপিরাইট 2017 ডেভিড কনরন * * উদাহরণ সার্কিট ডায়াগ্রাম: * https://arcfn.com * * পরিবর্তন: * সংস্করণ 0.3 নভেম্বর, 2017 * - A/C এর জন্য সমর্থন কিছু প্রোটোকলের জন্য ডিকোডিং। * সংস্করণ 0.2 এপ্রিল, 2017 * - ডেটার একটি অনুলিপি থেকে ডিকোড করুন যাতে আমরা দ্রুত ক্যাপচার শুরু করতে পারি * ভুল ধরার সম্ভাবনা কমায়। * কেন শিরিফ এর IrsendDemo সংস্করণ উপর ভিত্তি করে 0.1 জুলাই, 2009, */

#ifndef UNIT_TEST

#অন্তর্ভুক্ত #endif #অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত #যদি DECODE_AC #অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত #endif // DECODE_AC

// ====================== টিউনেবল প্যারামিটার শুরু ====================

// একটি আইআর ডিটেক্টর/ডিমোডুলেটর জিপিআইও পিন 14 // এর সাথে সংযুক্ত একটি NodeMCU বোর্ডে D5। #RECV_PIN 14 নির্ধারণ করুন

// সিরিয়াল সংযোগ বড হার।

// অর্থাৎ এই বড হারে পিসিতে স্ট্যাটাস মেসেজ পাঠানো হবে। // 9600 এর মতো ধীর গতি এড়ানোর চেষ্টা করুন, কারণ আপনি বার্তাগুলি মিস করবেন এবং // অন্যান্য সমস্যা সৃষ্টি করবেন। 115200 (বা দ্রুত) সুপারিশ করা হয়। // দ্রষ্টব্য: নিশ্চিত করুন যে আপনি আপনার সিরিয়াল মনিটরকে একই গতিতে সেট করেছেন। #BAUD_RATE 115200 নির্ধারণ করুন

// যেহেতু এই প্রোগ্রামটি একটি বিশেষ উদ্দেশ্য ক্যাপচার/ডিকোডার, আসুন আমরা একটি বড় ব্যবহার করি

// স্বাভাবিক বাফারের চেয়ে যাতে আমরা এয়ার কন্ডিশনার রিমোট কোড পরিচালনা করতে পারি। #CAPTURE_BUFFER_SIZE 1024 নির্ধারণ করুন

// TIMEOUT হল Nr। মিলি-সেকেন্ড অব নো-ডোর-ডেটা আমরা বিবেচনা করার আগে a

// বার্তা শেষ। // এই প্যারামিটারটি একটি আকর্ষণীয় ট্রেড-অফ। যত বেশি সময়সীমা, তত // জটিল বার্তা এটি ক্যাপচার করতে পারে। যেমন কিছু ডিভাইস প্রটোকল দ্রুত উত্তরে // একাধিক বার্তা প্যাকেট পাঠাবে, যেমন এয়ার কন্ডিশনার রিমোট। // এয়ার কন্ডিশনার প্রোটোকলগুলিতে প্রায়ই // প্যাকেটের মধ্যে একটি উল্লেখযোগ্য ফাঁক (20-40+ms) থাকে। // একটি বড় টাইমআউট ভ্যালুর নেতিবাচক দিক হল অনেক কম জটিল প্রোটোকল // রিমোটের বোতাম চেপে ধরে একাধিক বার্তা পাঠান। // তাদের মধ্যে ফাঁক প্রায়ই প্রায় 20+ms হয়। এর ফলে কাঁচা তথ্য প্রয়োজনের তুলনায় 2-3+ // গুণ বড় হতে পারে কারণ এটি একক // ক্যাপচারে 2-3+ বার্তা ক্যাপচার করেছে। একটি কম সময়সীমা মান সেট করা এটি সমাধান করতে পারে। // সুতরাং, আপনার ব্যবহারের জন্য সেরা TIMEOUT মান নির্বাচন করা বিশেষ ক্ষেত্রে // বেশ সূক্ষ্ম। শুভকামনা এবং সুখী শিকার। // দ্রষ্টব্য: MAX_TIMEOUT_MS অতিক্রম করবেন না। সাধারণত 130ms। #if DECODE_AC #Dimeine TIMEOUT 50U // কিছু A/C ইউনিটের prot 40ms এর প্রোটোকলে ফাঁক থাকে। // যেমন কেলভিনেটর // একটি বড় এই মান কিছু প্রোটোকলের পুনরাবৃত্তি গ্রাস করতে পারে #অন্যথায় // DECODE_AC #Dimefine TIMEOUT 15U // বেশিরভাগ বার্তাগুলিকে উপযুক্ত করে, অনেকগুলি পুনরাবৃত্তি গ্রাস না করে। #endif // DECODE_AC // বিকল্প: // #TIMEOUT 90U // XMP-1 এবং কিছু এয়ারকন // ইউনিটের মতো বড় ফাঁকযুক্ত বার্তাগুলি স্যুট করে, কিন্তু দুর্ঘটনাক্রমে কাঁচা ডাটা আউটপুটে বারবার বার্তা গ্রাস করতে পারে। // #TIMEOUT MAX_TIMEOUT_MS নির্ধারণ করুন // এটি আমাদের বর্তমানে অনুমোদিত // সর্বাধিক সেট করবে। এই উচ্চ মানগুলি সমস্যাযুক্ত // কারণ এটি মোটামুটি সাধারণ সীমানা // যেখানে বেশিরভাগ বার্তা পুনরাবৃত্তি হয়। // যেমন এটি একটি বার্তা ডিকোড করা বন্ধ করবে এবং // এটিকে ঠিক সিরিয়ালে পাঠানো শুরু করবে // সেই সময় যখন পরবর্তী বার্তাটি সম্ভবত // প্রেরণ করা হবে, এবং এটি মিস করতে পারে।

// ক্ষুদ্রতম আকারের "অচেনা" বার্তা প্যাকেটগুলি সেট করুন যা আমরা আসলে যত্ন করি।

// এই মান IR ব্যাকগ্রাউন্ডের মিথ্যা-ইতিবাচক সনাক্তকরণ হার কমাতে সাহায্য করে // আসল বার্তা হিসাবে গোলমাল। পটভূমি IR শব্দ শনাক্ত হওয়ার সম্ভাবনা // একটি বার্তা TIMEOUT মানের দৈর্ঘ্যের সাথে বৃদ্ধি পায়। (উপরে দেখুন) // এই বার্তাটি খুব বড় সেট করার নেতিবাচক দিক হল আপনি প্রোটোকলের জন্য কিছু বৈধ // সংক্ষিপ্ত বার্তা মিস করতে পারেন যা এই লাইব্রেরি এখনও ডিকোড করে না। // // উচ্চতর সেট করুন যদি আপনি অনেক এলোমেলো সংক্ষিপ্ত অজানা বার্তা পান যখন কিছুই না // একটি বার্তা পাঠানো উচিত। // যদি আপনি নিশ্চিত হন যে আপনার সেটআপ কাজ করছে, তবে এটি আপনার ডিভাইস থেকে // বার্তা দেখতে পায় না। (যেমন অন্যান্য আইআর রিমোট কাজ করে।) // দ্রষ্টব্য: অজানা সনাক্তকরণকে কার্যকরভাবে বন্ধ করতে এই মানটি খুব বেশি সেট করুন। #MIN_UNKNOWN_SIZE 12 সংজ্ঞায়িত করুন

// আরও সম্পূর্ণ ক্যাপচার কভারেজের জন্য সেভ বাফার ফিচার চালু করুন।

IRrecv irrecv (RECV_PIN, CAPTURE_BUFFER_SIZE, TIMEOUT, সত্য);

decode_results ফলাফল; // ফলাফল সংরক্ষণ করার জন্য কোথাও

// যদি আমরা পারি তবে A/C বার্তার মানুষের পাঠযোগ্য অবস্থা প্রদর্শন করুন।

void dumpACInfo (decode_results *results) {স্ট্রিং বর্ণনা = ""; #if DECODE_DAIKIN if (results-> decode_type == DAIKIN) {IRDaikinESP ac (0); ac.setRaw (ফলাফল-> রাষ্ট্র); বর্ণনা = ac.toString (); } #endif // DECODE_DAIKIN #if DECODE_FUJITSU_AC যদি (ফলাফল-> decode_type == FUJITSU_AC) {IRFujitsuAC ac (0); ac.setRaw (ফলাফল-> অবস্থা, ফলাফল-> বিট / 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 যদি (ফলাফল-> 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 (description! = "") Serial.println ("Mesg Desc.:" + description); }

// স্টার্ট-আপের সময় কোডের বিভাগ শুধুমাত্র একবার চালানো হয়।

অকার্যকর সেটআপ () {Serial.begin (BAUD_RATE, SERIAL_8N1, SERIAL_TX_ONLY); বিলম্ব (500); // সিরিয়াল সংযোগ স্থাপনের জন্য একটু অপেক্ষা করুন।

#যদি DECODE_HASH

// ডালের সর্বনিম্ন কম বা বন্ধের সাথে বার্তা উপেক্ষা করুন। irrecv.setUnknownThreshold (MIN_UNKNOWN_SIZE); #endif // DECODE_HASH irrecv.enableIRIn (); // রিসিভার শুরু করুন}

// কোডের পুনরাবৃত্তি বিভাগ

// অকার্যকর লুপ () {// আইআর কোড পেয়েছে কিনা তা পরীক্ষা করুন। if (irrecv.decode (& results)) {// একটি অশোধিত টাইমস্ট্যাম্প প্রদর্শন করুন। uint32_t এখন = মিলিস (); Serial.printf ("টাইমস্ট্যাম্প: %06u। %03u / n", এখন / 1000, এখন %1000); যদি (results.overflow) Serial.printf ("সতর্কতা: বাফারের জন্য IR কোডটি অনেক বড় ", CAPTURE_BUFFER_SIZE); // আমরা যা পেয়েছি তার মৌলিক আউটপুট প্রদর্শন করুন। Serial.print (resultToHumanReadableBasic (& results)); dumpACInfo (& ফলাফল); // যদি আমাদের কাছে কোন অতিরিক্ত A/C তথ্য থাকে তা প্রদর্শন করুন। ফলন (); // WDT কে খাওয়ান কারণ টেক্সট আউটপুট প্রিন্ট হতে কিছু সময় নিতে পারে।

// লাইব্রেরি সংস্করণ প্রদর্শন করুন বার্তাটি ক্যাপচার করা হয়েছিল।

সিরিয়াল.প্রিন্ট ("লাইব্রেরি: v"); Serial.println (_IRREMOTEESP8266_VERSION_); Serial.println ();

// ফলাফলের আউটপুট RAW টাইমিং তথ্য।

Serial.println (resultToTimingInfo (& ফলাফল)); ফলন (); // WDT খাওয়ান (আবার)

// উত্স কোড হিসাবে ফলাফল আউটপুট

Serial.println (resultToSourceCode (& results)); Serial.println (""); // এন্ট্রি ফলনের মধ্যে ফাঁকা রেখা (); // ডব্লিউডিটি খাওয়ান (আবার)}}

যখন এই দৃশ্যটি আপলোড করা হয় এবং সিরিয়াল মনিটর দিয়ে চালানো হয় তখন এটি বোতাম প্রেসের জন্য কোড আউটপুট করবে (ছবি দেখুন)

আপনি পরবর্তীতে ব্যবহারের জন্য যে কোডগুলি ব্যবহার করতে চান তা লিখুন। আমি যে বোতাম ব্যবহার করতে চেয়েছিলাম তার জন্য আমি কী পেয়েছি তা নোট করার জন্য আমি এক্সেল ব্যবহার করেছি (ছবি দেখুন)

আমি প্যানাসনিক রিমোট থেকে বিরতি সংকেত পাঠাতে আমার নেটফ্লিক্স কার্যকলাপের বোতামগুলি সম্পাদনা করেছি। (ছবি দেখুন)

ধাপ 3: নোডারে পাঠানোর জন্য কোড লেখা

নোডারেড পাঠানোর জন্য কোড লেখা
নোডারেড পাঠানোর জন্য কোড লেখা

#ifndef UNIT_TEST #অন্তর্ভুক্ত #endif #অন্তর্ভুক্ত

#অন্তর্ভুক্ত

#অন্তর্ভুক্ত

#অন্তর্ভুক্ত

#অন্তর্ভুক্ত

#অন্তর্ভুক্ত

const char* ssid = ""; // এখানে SSID লিখুন char* password = ""; // এখানে পাসওয়ার্ড লিখুন const char *host = ""; // Ip addresse #define USE_SERIAL Serial ESP8266WiFiMulti WiFiMulti; uint16_t RECV_PIN = 14; IRrecv irrecv (RECV_PIN); decode_results ফলাফল; অকার্যকর সেটআপ () {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] WAIT %d… / n", t); USE_SERIAL.flush (); বিলম্ব (1000); } WiFi.mode (WIFI_STA); WiFiMulti.addAP (ssid, password); } অকার্যকর লুপ () {যদি (irrecv.decode (& ফলাফল)) {

// আপনি যা পেয়েছেন তার জন্য এই সংকেত মান পরিবর্তন করুন

যদি (results.value == 0x40040D00606D) {USE_SERIAL.println ("বিরতি সংকেত প্রাপ্ত"); ওয়াইফাইসেন্ড (বিরতি); বিলম্ব (1000);

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

USE_SERIAL.println ("আগের");

wifisend ("prev"); বিলম্ব (1000); } if (results.value == 0x40040100F2F3) {USE_SERIAL.println ("next"); ওয়াইফাইসেন্ড ("পরবর্তী"); বিলম্ব (1000); }

irrecv.resume (); // পরবর্তী মান গ্রহণ করুন} বিলম্ব (100); } অকার্যকর ওয়াইফাইসেন্ড (স্ট্রিং ডেটা) {যদি ((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", httpCode) পরিচালনা করা হয়েছে;

// ফাইল সার্ভারে পাওয়া গেছে

যদি (httpCode == HTTP_CODE_OK) {স্ট্রিং পেলোড = http.getString (); USE_SERIAL.println (পেলোড); }} অন্য {USE_SERIAL.printf ("[HTTP] পান… ব্যর্থ, ত্রুটি: %s / n", http.errorToString (httpCode).c_str ()); } http.end (); বিলম্ব (100); }}

এই কোডটি আমি আমার নোডেমকুতে ব্যবহার করেছি। আপনাকে সেই লাইব্রেরিগুলি ইনস্টল করতে হবে।

আপনি সিরিয়াল মনিটর ব্যবহার করে পরীক্ষা করতে পারেন এবং প্রতিক্রিয়া দেখতে কোডে যোগ করা রিমোট বোতাম টিপুন।

লাইনের মাঝে:

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

আপনাকে [ব্যবহারকারী] কে আপনার ব্যবহারকারীতে পরিবর্তন করতে হবে এবং তাই। বন্ধনী ছাড়া। বন্ধনীগুলি ডাইনী ক্ষেত্রগুলি পরিবর্তন করার জন্য রয়েছে।

সেই লাইনটিও কাজ করবে না যতক্ষণ না আমরা আমাদের প্রবাহ নোডারে সেট আপ করি।

ধাপ 4: নোডেরডে একটি প্রবাহ তৈরি করা

নোডেরডে একটি প্রবাহ তৈরি করা
নোডেরডে একটি প্রবাহ তৈরি করা
নোডেরডে একটি প্রবাহ তৈরি করা
নোডেরডে একটি প্রবাহ তৈরি করা
নোডেরডে একটি প্রবাহ তৈরি করা
নোডেরডে একটি প্রবাহ তৈরি করা
নোডেরডে একটি প্রবাহ তৈরি করা
নোডেরডে একটি প্রবাহ তৈরি করা

শুরুতে উল্লিখিত হিসাবে আমি nodered সহ hass.io ব্যবহার করি। আপনি যদি একটি ভিন্ন সেটআপ চালান তবে আপনাকে এটি আলাদা করতে হবে! আপনি ছবিতে দেখতে পাচ্ছেন যে একটি বোতাম টিপলে এটি ডিবাগ উইন্ডোতে প্রদর্শিত হয় …

পরিবর্তন প্লেলোড নোডটি সম্ভবত এড়িয়ে যেতে পারত যদি আমি পূর্ববর্তী ধাপে ডাটা = ভিন্ন কিছু বেছে নিয়েছিলাম। আমি যে সুইচ নোডটি ব্যবহার করি তা থামার চেয়ে অনেক বড় কিন্তু এটি ঠিক তাই আমি রেডিও স্টেশন ইত্যাদির জন্য ক্রোমকাস্ট ব্যবহার করতে আরও আইআর সিগন্যাল যুক্ত করতে পারি।

শুধু বিরতির জন্য আপনি অন্য ছবিতে প্রবাহ ব্যবহার করতে পারেন।

[{"id": "e6440c30.4a35a", "type": "http in", "z": "869ceb74.0275c8", "name": "", "url": "chromecastpause", "method": "পান", "আপলোড": মিথ্যা, "swaggerDoc": "", "x": 133, "y": 98, "তারগুলি":

আমি এই থেকে ইউজারপাস এবং ইউআরএল নামটি সরিয়ে দিয়েছি যাতে আপনাকে এটি সম্পাদনা করতে হতে পারে।

আপনি যদি বিরতি দেওয়ার চেয়ে বেশি প্রতিক্রিয়া জানাতে চান তবে একটি সুইচ নোড যুক্ত করুন (উদাহরণস্বরূপ ছবি দেখুন)

বিরাম ব্যবহারের জন্য হোম সহকারী নোডে:

নাম: play pause chromecastdomain: media_playerService: media_play_pausedata: {"entity_id": "media_player। [আপনার ক্রোমকাস্ট এখানে]"}

পরবর্তী ট্র্যাকের জন্য শুধু সেই নোডটি অনুলিপি করুন এবং পরিষেবা সম্পাদনা করুন: media_next_track এবং নাম: পরবর্তী ক্রোমকাস্ট

ধাপ 5: Alexচ্ছিক আলেক্সা বিরাম Chromecast

বিরাম ক্রোমকাস্টের জন্য addচ্ছিক আলেক্সা কমান্ড যোগ করুন:

এখানে অপশন আছে.. আপনি একটি alexa nnode তৈরি করতে পারেন যাকে pause chromecast বলা হয় যা chromecast বিরতি দেয়, অথবা আপনি পজ টিভি নামে একটি তৈরি করতে পারেন যা বর্তমান সাদৃশ্য কার্যকলাপ পরীক্ষা করে এবং এর উপর নির্ভর করে বিরতি দেয়।

আমি এটি পরে এখানে যোগ করব..

প্রস্তাবিত: