Управляем домотикзом через телеграм

Здесь я опишу один из вариантов управления домотикзом через телеграм.
Если домотикз находится за NAT-ом и порты пробросить нет возможности, этот способ мне показался наименее затратный.

Если еще не создан телеграм-бот, то создаем его.

0. Если еще не установлен python-pip, то устанавливаем его:

sudo apt-get install python-pip

1. Устанавливаем телепот:

sudo pip install telepot

Далее пишем всё "своё" и сторонних компонентов не потребуется.



2. Создаем папку TelegramBot и в ней файл telegrambot.py с таким содержимым:

import sys
import time
import telepot

def handle(msg):
 chat_id = msg['chat']['id']
 command = msg['text']
 
 if chat_id == 585673228:
  if command.startswith('Command: '):
   bot.sendMessage(chat_id, 'ok')
   print('%s' % command)
  else:
   bot.sendMessage(chat_id, 'Command not recognized')
   print('CommandNotRecognized:[%s]' % command)

bot = telepot.Bot('Сюда вставляем ключ телеграма')
bot.message_loop(handle)
time.sleep(3)

Не забываем вставить свои значения ключа телеграма и ID чата.

3. В домотикзе создаем кнопку с именем Alarm (на эту кнопку надо будет повесить какой-нибудь скрипт, например у меня, эта кнопка включает/отключает "сигнализацию", но это я тут описывать не буду).

4. В домотикзе создаем dzVents скрипт TelegramBot (если кнопку назвали как-то иначе, не забываем подставить своё значение):


-- TelegramBot

return {
	on = {
		timer = {'every minute'}
	},
	logging = {
        level = domoticz.LOG_ERROR
    },
	execute = function(dz, item)

		local DeviceAlarm = dz.devices('Alarm')
 
function GetMessage()
	cmd = "python /home/pi/TelegramBot/telegrambot.py"
	dz.utils.osExecute('('..cmd..' > /dev/null)&')
end

function AlarmOn()
	DeviceAlarm.switchOn()
end

function AlarmOff()
	DeviceAlarm.switchOff()
end

		
		if (item.isTimer) then
			GetMessage()
			--print('cmd='..cmd)

			local h        = io.popen(cmd)
			local response = h:read("*a")
			h:close()
			--print('response='..response)

			if (response == nil or response == '') then
				response = ''
			end

			if (string.find(response, 'CommandNotRecognized')) then
				print(response)
				response = ''
			end 

			if (response ~= '') then
				t = {}
				for k, v in string.gmatch(response, "(%w+):%s(.-)\n") do
					t[k] = v
					--print('# '..k..'='..v)
				end

				strCommand = t['Command']

				if (strCommand == 'AlarmOn' and DeviceAlarm.state == 'Off') then
					AlarmOn()
					strMessage = 'Сигнализация включена по команде из телеграма'
					print(strMessage)
				elseif (strCommand == 'AlarmOff' and DeviceAlarm.state == 'On') then
					AlarmOff()
					strMessage = 'Сигнализация отключена по команде из телеграма'
					print(strMessage)
				end

			end

		end
	end
}

5. Проверяем: в чате боту отправляем команду на включение кнопки:

Command: AlarmOn

И для выключение кнопки:

Command: AlarmOff

Результат:




Комментарии

Популярные сообщения