Jakiś czas temu, kiedy to Adrian odrobinę krytycznie odniósł się do serwera domoticz, a raczej do braku info o stanie modułu i o zdalnym potwierdzeniu wykonania akcji, zacząłem kombinować, jak w prosty sposób zrealizować takie powiadomienie.
Jak to często bywa chciałem osiągnąć jedno, a przy okazji zrodziło się drugie.
Do rzeczy, ponieważ powiadomienia drogą e-mail, dochodzą, ale wiąże się to z większym, lub mniejszym opóźnieniem szukałem innej bez kosztowej drogi i tak natrafiłem na Telegram.
Telegram to taki WhatsApp, czyli komunikator, ale posiada on możliwość tworzenia swoich prywatnych API Bot-ów, dzięki czemu możemy takiego bota spersonalizować i nakazać mu wysyłanie do nas wiadomości o ważnych zdarzeniach w naszym systemie automatyki.
Całą instalację Telegramu i tworzenie własnego bota pominę, gdyż wszystko można znaleźć na stronie https://telegram.org/
Ważne jest aby po stworzeniu swojego bota uzyskać dwa ważne parametry
Pierwszy to HTTP API TOKEN , drugi to CHAT ID.
Dla użytkowników Domoticza wszystko jest opisane na stronie
https://www.domoticz.com/wiki/Telegram_Bot#Creating_Your_Bot_and_Getting_Your_Token
Po uzyskaniu „tokena” i chat ID możemy sobie tworzyć adresy URL z dowolną wiadomością tekstową wyglądające np. tak
https://api.telegram.org/bot [TOKEN]/sendMessage?chat_id=12345678&text=dowolny tekst
Oczywiście nie tylko użytkownicy domoticza mogą to wykorzystać.
Kolejną fajną rzeczą jest możliwość otrzymywania oprócz wiadomości tekstowych, zrzutów z kamery – er, tak zwanych snapshotów.
Tworząc prosty skrypt wyglądający np. tak
Nazwijmy go sobie dowolnie np. brama.sh
#!/bin/sh SnapFile="/var/tmp/image.jpg" # Get snapshot via Domoticz server wget -O $SnapFile "http://adresIP kamery/cgi-bin/snapshot.cgi" # Send Telegram message with image curl -s -X POST "https://api.telegram.org/bot[TOKEN]/sendMessage?chat_id=12345678&text=Otwarta brama" curl -s -X POST "https://api.telegram.org/bot[TOKEN]/sendPhoto?chat_id=12345678" -F photo="@$SnapFile" # Remove Image /bin/rm $SnapFile
Co robi powyższy skrypt?
- Najpierw robi fotkę z widoku naszej kamery
- Zapisuje ją w plikach tymczasowych
- Wysyła wiadomość tekstową o treści ”Otwarta brama” a zaraz po niej wysyła zrobioną fotkę
- Usuwa fotkę z plików tymczasowych
Po wykonaniu powyższego skryptu w ciągu kilku sekund otrzymujemy wiadomości od naszego bota, wyglądające tak jak na poniższym foto.
Otwarta brama to jedno, ale wykorzystując „zdolności” naszego bota można np. mając zwykły domofon, lub tylko dzwonek przy furtce, zrobić sobie coś ala wideodomofon.
Montujemy kamerę IP obserwującą furtkę
Pod przycisk dzwonka, lub domofonu podpinamy np. ESP 01 (najmniejszy), zmiana stanu GPIO 0 w ESP uruchamia skrypt . Jak nie ma nas w domu dostajemy po krótkiej chwili wiadomość, że ktoś dzwoni i fotkę z widokiem kto to jest .
Jeżeli to znajomy, który przyszedł z piwem trochę za wcześnie, to dzwonimy do niego lub wysyłamy sms, prosząc, żeby zaczekał na tarasie, otwieramy mu za pomocą GPIO 2 tego samego ESP furtkę i szybko jedziemy do domu, bo najlepsze piwo, to zimne piwo.
Macie inne pomysły, to piszcie, na pytania i wątpliwości, też postaram się w miarę możliwości odpowiedzieć.
PS 1 Żeby do ESP 01 wgrać firmware AFE T5 i wykorzystać je do tego otwierania furtki, muszę poprosić adriana , żeby zwiększył zakres czasowy podtrzymania, bo dwie sekundy dla rygla w furtce to tak zdąży albo nie, 4 sekundy było by super.
Najlepiej moim zdaniem zrobić od 0,5 sek do 4
PS 2 Taki zrzut z kamery oczywiście daje się powiększyć
@isom mógłbyś opisać konfiguracje telegramu uzyskałem HTTP API TOKEN ale coś z CHAT ID nie mogę sobie poradzić
Już sobie poradziłem nie było pytania
Ja używam Pushbullet i polecam ale niestety nie rozgryzłem jak wysyłać wiadomości na kilka telefonów. Można to zrobić w Telegramie ??
W Telegramie jest to jak najbardziej możliwe , do tego między innymi został stworzony , tworzysz sobie grupę osób do , której dodajesz bota , który ma wysyłać powiadomienia i on wysyła do wszystkich członków grupy.
Wcale tak łatwo nie było skonfigurować Telegram dla kilku użytkowników za snapshotem, ale udało się i działa całkiem fajnie. Pewnie dlatego, że działanie tego komunikatora jest trochę inne niż tych których do tej pory używałem.
W skrypcie który jest w pierwszym poście trzeba odkomentować ostatnią linię żeby plik się kasował.
@wo__jo dzięki za zwrócenie uwagi na ostatnią linię w skrypcie , moje niedopatrzenie już poprawiłem.
Nie wiem z czym miałeś problemy ale metody są dwie zawsze można stworzyć dla każdego użytkownika oddzielnego bota i rozbudować skrypt o takie same wpisy z innym tokenem , lub dodać bota do grupy i wysyłać do wszystkich
Tak pomyślałem że mam bramę zwykle otwartą zdarza sie ze ktoś wchodzi bez dzwonienia
jeśli by podłączyć pod czujniki fotokomórki i gdy tylko zostanie przerwana linia podczerwieni w bramie to zdjęcie by sie wysyłało
ktoś pewnie napisze że miałbym zdjęcia wszystkich piesków z okolicy które się wałęsają heheheh
Ale ja dopiero zaczynam z domoticzem więc to odległa przyszłość
Ważne jest aby po stworzeniu swojego bota uzyskać dwa ważne parametry
Pierwszy to HTTP API TOKEN , drugi to CHAT ID.
HTTP API TOKEN już mam ale nie wiem gdzie jest CHAT ID
podpowiesz gdzie go wyszukać?
Jak utworzyłeś już BOTA to w dowolnej przeglądarce wpisz https://api.telegram.org/botxxxxyxyxyxyxyxyxyxyxyxyxy/getUpdates
zamiast tych xyxyxy wstaw swój token zaraz po bot bez spacji . JSON powinien zwrócić coś w tym stylu
{„ok”: true, „result”: [{„update_id”: 939819607,
„message”: {„message_id”: 81, „from”: {„id”: 1234567, „first_name”: „Joe”, „last_name”: „Bloggs”, „username”: „jbloggs”}, „chat” :
{„id”: 1234567, „first_name”: „Joe”, „last_name”: „Bloggs”, „username”: „jbloggs”}, „date”: 1436104501, „text”: „\ / devices Study”}} , {"update_id": 939819608,
„message”: {„message_id”: 82, „from”: {„id”: 1234567, „first_name”: „Joe”, „last_name”: „Bloggs”, „username”: „jbloggs”}, „chat” :
{„id”: 1234567, „first_name”: „Joe”, „last_name”: „Bloggs”, „username”: „jbloggs”}, „date”: 1436104512, „text”: „\ / off 1”}} ]}
Gdzie to co zaznaczyłem będzie twoim Chat ID
Jak utworzyłeś już BOTA to w dowolnej przeglądarce wpisz https://api.telegram.org/botxxxxyxyxyxyxyxyxyxyxyxyxy/getUpdates
zamiast tych xyxyxy wstaw swój token zaraz po bot bez spacji . JSON powinien zwrócić coś w tym stylu
{„ok”: true, „result”: [{„update_id”: 939819607,
„message”: {„message_id”: 81, „from”: {„id”: 1234567, „first_name”: „Joe”, „last_name”: „Bloggs”, „username”: „jbloggs”}, „chat” :
{„id”: 1234567, „first_name”: „Joe”, „last_name”: „Bloggs”, „username”: „jbloggs”}, „date”: 1436104501, „text”: „\ / devices Study”}} , {"update_id": 939819608,
„message”: {„message_id”: 82, „from”: {„id”: 1234567, „first_name”: „Joe”, „last_name”: „Bloggs”, „username”: „jbloggs”}, „chat” :
{„id”: 1234567, „first_name”: „Joe”, „last_name”: „Bloggs”, „username”: „jbloggs”}, „date”: 1436104512, „text”: „\ / off 1”}} ]}Gdzie to co zaznaczyłem będzie twoim Chat ID
coś chyba źle robię - czy to na czerwono dobrze odczytuje?
w domoticz wpisałem key i to id
a czy coś trzeba ustawiać w telegramie na telefonie?
{"ok":true,"result":[{"update_id":20382896,
"message":{"message_id":1,"from":{"id":532242320,"is_bot":false,"first_name":"Tom","last_name":"ting"},"chat":{"id":-317204237,"title":"ticz","type":"group","all_members_are_administrators":true},"date":1570627620,"group_chat_created":true}},{"update_id":20382897,
"message":{"message_id":2,"from":{"id":532246350,"is_bot":false,"first_name":"Tom","last_name":"ting"},"chat":{"id":-317204237,"title":"ticz","type":"group","all_members_are_administrators":true},"date":1570627629,"text":"/start","entities":[{"offset":0,"length":6,"type":"bot_command"}]}},{"update_id":20382898,
"message":{"message_id":3,"from":{"id":532246350,"is_bot":false,"first_name":"Tom","last_name":"ting","language_code":"pl"},"chat":{"id":5555650,"first_name":"Tom","last_name":"Sting","type":"private"},"date":1570627728,"text":"/start","entities":[{"offset":0,"length":6,"type":"bot_command"}]}},{"update_id":20382899,
W telefonie musisz mieć uruchomiony czat z Botem u mnie Bot nazywa się Domoticz https://drive.google.com/file/d/12tA7WsaeJRyf_GQ67kVWHzHj5P94-qYm/view?usp=sharing
ale z tego co widzę to ty nie aktywowałeś żadnego bota przeczytaj sobie dokładnie
https://www.domoticz.com/wiki/Telegram_Bot#Creating_Your_Bot_and_Getting_Your_Token
musisz wysłać wiadomość tekstową do bota zanim wyślesz tą komendę przez przeglądarkę
W telefonie musisz mieć uruchomiony czat z Botem u mnie Bot nazywa się Domoticz https://drive.google.com/file/d/12tA7WsaeJRyf_GQ67kVWHzHj5P94-qYm/view?usp=sharing
ale z tego co widzę to ty nie aktywowałeś żadnego bota przeczytaj sobie dokładnie
https://www.domoticz.com/wiki/Telegram_Bot#Creating_Your_Bot_and_Getting_Your_Token
musisz wysłać wiadomość tekstową do bota zanim wyślesz tą komendę przez przeglądarkę
wysyłam wiadomość a pierwsza wiadomość to była klik na START i wysłało się /start
co mogę robić źle?
zrobiłen nowego bota i mam nowy token i tak:
{"ok":true,"result":[{"update_id":42356133,
"message":{"message_id":2,"from":{"id":511116350,"is_bot":false,"first_name":"Tom","last_name":"Sting","language_code":"pl"},"chat":{"id":531146350,"first_name":"Tom","last_name":"Sting","type":"private"},"date":1170647208,"text":"Ggg"}},{"update_id":41356634,
"message":{"message_id":3,"from":{"id":531146350,"is_bot":false,"first_name":"Tom","last_name":"Sting","language_code":"pl"},"chat":{"id":531111350,"first_name":"Tom","last_name":"Sting","type":"private"},"date":1170647223,"text":"Gfg"}}]}
Po utworzeniu przez BotFather nowego bota musisz wysłać do tego nowego bota dowolną wiadomość tekstową np witaj bez żadnych znaków czy cudzysłowów , nie dostaniesz odpowiedzi , ale te wiadomości zostaną zapisane w skrzynce bota, żeby odczytać te wiadomości wysyłasz z przeglądarki komendę którą już znasz i w zwrotce dostajesz ciąg bardzo podobny do tego , który wstawiłem , potem żeby sprawdzić wyślij przez przeglądarkę
https://api.telegram.org/botxxxxxxxxxxxxxxxxxyxyxyxy/sendMessage?chat_id=abcbcbcbcb&text=Hello
i powinieneś dostać coś w tym stylu
{„ok”: true, „result”: {„update_id”: 939819608,
„message”: {„message_id”: 82, „from”: {„id”: abcbcbcbcb, „first_name”: „Bot”, „last_name”: „Domoticz”, „username”: „Domoticz”}, „chat” :
{„id”: abcbcbccb, „first_name”: „Bot”, „last_name”: „Domoticz”, „username”: „Domoticz”}, „date”: 1436104512, „text”: „Hello from your bot”}}
Jak tego nie dostaniesz to coś jest nie tak
I najlepiej opisz krok po kroku co robisz bo trudno jest pomagać jak się nie wie co robisz po kolei
Troszkę wczoraj się pobawiłem i odpaliłem Telegram.
Instalujemy aplikacje na telefonie, uwierzytelniamy z telefonem i komunikator już działa .
Wyszukujemy bota za pomocą lupki - BotFather
Klikamy w niego i start następnie wybieramy - /newbot
BotFather prosi nas o podanie nazwy dla naszego nowego bot-a, podajemy jeżeli nie jest zajęta zwraca nam info o utworzeniu wraz z API naszego bota.
Więc już połowa sukcesu teraz potrzebujemy chat ID
Wyszukujemy kolejnego bot-a za pomocą lupki o nazwie: @get_id_bot - w ikonie bot-a jest gość z łukiem 😉 klikamy start i zwraca nam chat ID
Wszystko za pierwszym razem zadziałało.
Napisałem ten poradnik bo wiele osób ma problem z pozyskaniem chat ID, samo API przysparza mniej problemów
Tworząc prosty skrypt wyglądający np. tak
Nazwijmy go sobie dowolnie np. brama.sh
Jak / gdzie utworzyć ten skrypt? Wolałbym mieć to po prostu w dzVents. Czy jest taka możliwość? Widzę, że mogę stamtąd zrobić wywołanie, ale raczej nie sam skrypt, racja?
Właśnie z powodzeniem sobie z dzVents wyłałem powiadomienie. Jakby ktoś podpowiedział tylko czy do tego można dorzucić fotkę z tego poziomu, to będę usatysfakcjonowany 🙂
Edit: chyba znalazłem, sprawdzę to.
https://www.domoticz.com/forum/viewtopic.php?t=26729
@isom
Cześć, wrzuciłem ten skrypt jako dzVents do domoticza. Podmieniłem dane w "teleTok", "chatId", "domoReq". Gdzie w tym skrypcie wskazuje np. włącznik po załączaniu którego ma się wykonać zdjęcie i wysłać do Telegrama ? Dla próby nazwę przycisku podałem w trzeciej linii w "devices" ale niestety to nie działa 🙁
return { on = { devices = {'Ośw. pokój gościnny'}, }, execute = function(domoticz, device) if(device.state == 'On') then local teleTok = 'tu jest token' local chatId = 'tu jest id' local snapFile = '/home/pi/domoticz/scripts/camera_' local domoReq = 'http://192.168.8.106:8081/cgi-bin/snapshot.cgi' local camName = 'Kamera' os.execute('wget -O "'..snapFile..camName..'.jpg" "'..domoReq..'"') os.execute('curl -s -X POST "https://api.telegram.org/bot'..teleTok..'/sendPhoto?chat_id='..chatId..'" -F photo="@'..snapFile..camName..'.jpg"') os.execute("rm " ..snapFile..camName..'.jpg') end end }
Samo wysyłanie powiadomień tekstowych z domoticza działa. Zrobiłem wirtualny przycisk po wyzwoleniu którego wykonywane jest odpowiednie polecenie https.
@szmydu skrypt na podstawie zdefiniowanego urządzenia - devices , a konkretnie gdy to urządzenie zostanie włączone zapisuje fotkę z kamery i wysyła za pomocą os.execute curl
na konto wskazanego użytkownika telegram , na końcu kasuje tą fotkę za pomocą polecenia rm.
Co dostajesz w logach domoticz po włączeniu Ośw pokój gościnny ?