2019. nov 01.

Hogyan használjuk a Telegramot "távoli MQTT szervernek"?

írta: vampywiz17
Hogyan használjuk a Telegramot "távoli MQTT szervernek"?



Sziasztok!

Először is köszönöm a lehetőséget eNeS-nek hogy ez a kis tutorial megjelenhetett az oldalon!

Az esetek többségében ha szenzorok közötti kommunikációról beszélünk, akkor MQTT-t használunk, esetleg HTTP requestet. Viszont két esetben hasznos lehet az általam itt megosztott módszer is.

  • Ha távoli szenzorok adatait szeretnénk leolvasni, viszont nem akarjuk ezeket a szenzorokat közvetlenül a netre tenni, illetve a VPN nem megoldható, komplikált.
  • Ha az adott szenzort semmilyen szabványosabb megoldással sem tudjuk a rendszerünkbe illeszteni (föntebb említett MQTT-vel pl) Csak pl IFTTT áll a rendelkezésünkre, viszont a szerverünk szintén nem akarjuk kitenni a netre. (Ez pedig szükséges lenne, ha IFTTT üzeneteket/webhook-okat akarunk fogadni)

Nyilván létezik olyan MQTT szerver szolgáltatás, amit lehet használni ilyen esetekben (pl https://www.cloudmqtt.com) viszont ezek nagy része fizetős és/vagy mindenki számára publikus csatornákat használ.

Ezek kiváltására lehet tökéletes a Telegram. Maga a szoftver alapesetben egy Chat kliens viszont hála annak a lehetőségnek, hogy nagyon könnyen és gyorsan lehet benne chatbotokat létrehozni, így könnyen átalakítható akár egy ingyenes, korlátlan MQTT szerverré is!

Mit kell tennünk?

Első körben létre kell hoznunk két chatbotot, hívjuk őket „küldő“-nek és „fogadó“-nak (itt leírják a menetét: https://core.telegram.org/bots) Valamint privát csatornákat, (private channels) alapból a csatorna amit létrehozunk publikus, ezen kis leírás alapján viszont könnyen priváttá tehetjük: (https://runastartup.com/make-public-channel-private-telegram/)

Ezek után a botokat hozzá kell adnunk a csatornákhoz mint adminisztrátorokat:

  • nyisd meg a Channel info menüt (bökj a csatorna nevére)
  • válaszd ki az „Administrators” menüt
  • bökj az „Add Administrator” gombra 
  • keress rá a bot felhasználónevére
  • bökj a „make it as administrator” szövegre.

Jelenleg tehát van x darab privát csatornánk, illetve két botunk, amik posztolhatnak/olvashatnak ezekben. A botokat a legegyszerűbben web requestekkel tudjuk „etetni”. Ehhez szükség van a bot ID-jára és a létrehozásakor generált API kulcsra. (ezeket a létrehozáskor mindenképp mentsük le valahová!) Ezen sor után van a lényeg:
Use this token to access the HTTP API:XXXXXXXX:YYYYYYYYYYYYYYYYYYYYYY " (az X jelenti a bot ID-ját, a Y pedig az API key)

Most derítsük ki, mik a csatornáink ID-jai!

  • Jelentkezzünk be a Telegram webes interfészén: https://web.telegram.org/#/login
  • Válasszuk ki a keresett csatornát balról
  • Az URL valami ilyesmi lesz: https://web.telegram.org/#/im?p=c1018013852_555990343349619165
  • Ebben az esetben a 1018013852 a csatorna ID-ja. Fontos tudni, hogy a csatorna ID mindig 13 karakterből áll, és negatív előjelű. Adjuk hozzá az elejéhez a -100 at. Tehát pontosan így néz ki: -1001018013852

Most már minden adatunk megvan, nincs más hátra mint egy teszt!

A “küldő” botunk egy szimpla Webhook-al tud üzenetet küldeni, az alábbi formátummal (használjuk most a curl-t, de simán böngészővel is működik):

curl -X POST "https://api.telegram.org/botXXX:YYYY/sendMessage" -d "chat_id=-
zzzzzzzzzz&text=tesztüzenet"

Ha mindent jól csináltunk, akkor az adott ID-vel rendelkező csatornán meg fog jelenni a „tesztüzenet” szöveg.
(A küldött üzenet lehet JSON formátumú is, azt a legegyszerűbb feldolgozni)

Mivel olvassuk?

Erre a legegyszerűbb megoldás a Node-RED (https://nodered.org/) a megfelelő Node-al (https://flows.nodered.org/node/node-red-contrib-telegrambot)

  • Adjuk hozza a „fogadó” botot a frissen telepitett Node konfigjához (kell az ID és az API kulcs), majd az „Event” node-ot húzzuk bele a flowba. A node-ot megnyitva az eventek között válasszuk ki a „Channel Post”-ot.

    Tegyünk a kimenetre egy debug node-ot és máris láthatjuk, ahogy a küldő bot üzenetei szépen érkeznek be!

    A „chatId” alapján már tudunk „topicokra” szűrni majd az üzenetet egy lokális MQTT-be továbbítani. Tehát innen már minden a „szokásos”. :)

    Természetesen azt is meg lehet csinálni, hogy a küldő oldalon is egy Node-RED van, nem pedig webhook és a „sender” node-al tápláljuk a csatornát. Ilyen esetben természetesen ezen az oldalon a „küldő” botot kell felvennünk. A „sender” node leírásában megtalálható, miképp kell az üzenetet formáznunk. (chatId, etc...)

    Nem csak üzenetek küldésére van lehetőség ilyen módon, médiát (képet, videót) is át tudunk így juttatni.



    Előnyök

  • Mivel a csatornáink privátak, ezért más az üzenetekhez nem fér hozzá (szemben a publikus MQTT szerverekkel)
  • A webhook https-t használ, tehát az üzenetek titkosítottak. A botok API kódja szintén erős védelmet biztosít (nem egy egyszerű felh.név/jelszó páros)
  • Sem a küldő, sem a fogadó oldalon nem kell semmilyen eszközünket kiengedni a netre (port forward)
  • Korlátlan csatorna/bot hozható létre, szemben az ingyenes MQTT szerverekkel.
  • Lehet médiát (videó, audió, kép) is küldeni


    Hátrányok

  • „Harmadik fél” szerverét használjuk, tehát függünk attól, működik-e a Telegram épp.
  • Nincs rá garancia, hogy a Telegram (mint cég) nem tud beleolvasni az üzenetekbe.

 

A hátrányoknál szereplő két pont lényegében bármelyik szolgáltatásra (Amazon Alexa, Google Home, etc...) Igaz, szóval nem feltétlen „hátrány”, inkább tény, amivel nem árt tisztában lenni.

Ennyi lett volna a „Telegram mint MQTT” használata, remélem segítettem vele, illetve adtam ötleteket a felhasználásra!

 

Vamp

Szólj hozzá

érzékelő okosotthon MQTT Telegram Node-RED