Управление лампой Xiaomi Smart LED Lamp E14 Bulb (Philips) в домотикзе
Купить можно на алиэкспресс.
Предлагаемый тут метод позволяет включать/выключать лампу и отображает текущее состояние лампы.Управление яркостью и температурой мне не нужно, поэтому я это не делал, но в скрипте есть все необходимые заготовки и при небольшой доработке можно прикрутить и яркость и оттенок а при желании и даже сцены.
Инструкцию пишу по памяти, когда уже всё давно настроено и работает, возможно некоторые мелкие нюансы подзабыл и не описал.
Источник информации: 4pda.ru
0. Подготовка
Необходим компонент: python-miio, и команда из его состава miceil .
Для проверки, можно запустить эту команду в консоли, и если все хорошо, должно выдать что-то похожее:
miceil
You have to give ip and token!
Если python-miio не установлен, устанавливаем его командой:
sudo pip3 install python-miio
Или по инструкции.
sudo pip3 install python-miio
Или по инструкции.
1. Сбор информации
Также, нам обязательно понадобится IP адрес и токен лампы. 
IP адрес - задаем статичный адрес на маршрутизаторе (обычно где-то в настройках DHCP)
Вариантов получения токена несколько:
    1 - сбросить лампу, и запустить команду 
        miio discover  
        (у меня лампа привязана к MiHome, отвязывать не хотелось, поэтому я этот способ не проверял)
    2 - получить токен из базы данных MiHome старой версии по инструкции. Внимание: токен не может состоять полностью из одних нулей!
2. Настройка домотикза
2.1 Создаем виртуальное (dummy) устройство с типом "переключатель" (switch) и запоминаем имя которое ему присвоили (я назвал его Lampa).
2.2 Создаем dzVents скрипт, в котором подставляем IP адрес лампы, токен лампы, и имя виртуального переключателя лампы (в скрипте имя датчика Lampa встречается два раза).
Для удобства, я выделил разными цветами то что надо менять.
Для удобства, я выделил разными цветами то что надо менять.
| 
-- PhilipsLampE14 
return { 
 on = { 
  timer = {'every minute'}, 
  devices = {'Lampa'}     -- Device name 
 }, 
 logging = { 
  level = domoticz.LOG_ERROR 
 }, 
 execute = function(dz, item) 
  local Device   = dz.devices('Lampa')      -- dummy switch - type:Selector Switch 
  local IP    = '192.168.0.77'        -- Device IP 
  local Token    = 'a967827d6160f4678c432b78bbaac210'   -- token 
function GetStatus() 
 cmd = "miceil --ip "..IP.." --token "..Token.." status" 
 --dz.utils.osExecute('('..cmd..' > /dev/null)&') 
end 
function PowerOn() 
 cmd = "miceil --ip "..IP.." --token "..Token.." on" 
 dz.utils.osExecute('('..cmd..' > /dev/null)&') 
end 
function PowerOff() 
 cmd = "miceil --ip "..IP.." --token "..Token.." off" 
 dz.utils.osExecute('('..cmd..' > /dev/null)&') 
end 
--[[ 
function SetBrightness(brightness) 
 cmd = "miceil --ip "..IP.." --token "..Token.." set_brightness "..brightness 
 dz.utils.osExecute('('..cmd..' > /dev/null)&') 
end 
function SetColorTemperature(temperature) 
 cmd = "miceil --ip "..IP.." --token "..Token.." set_color_temperature "..temperature 
 dz.utils.osExecute('('..cmd..' > /dev/null)&') 
end 
]]-- 
function parseInt(str) 
 local retValue = 0 
 if (str ~= nil and str ~= '') then 
  _, _, num = string.find(str, "(%d+)") 
  --print('num='..num) 
  retValue = tonumber(num) 
 end 
 return retValue 
end 
function parseDec(str) 
 local retValue = 0.0 
 if (str ~= nil and str ~= '') then 
  _, _, num1, num2 = string.find(str, "(%d+)[^%d]+(%d+)") 
  --print('num1='..num1) 
  --print('num2='..num2) 
  retValue = tonumber(num1.."."..num2) 
 end 
 return retValue 
end 
  if (item.isDevice) then 
   if (item.state == 'On') then 
    PowerOn() 
   else 
    PowerOff() 
   end 
  end 
  if (item.isTimer) then 
   GetStatus() 
   --print('cmd='..cmd) 
   local h  = io.popen(cmd) 
   local response = h:read("*a") 
   h:close() 
   --print('response='..response) 
--[[ 
Power: on 
Brightness: 1 
Color temperature: 1 
Scene: 0 
Smart Night Light: False 
Auto CCT: False 
Countdown of the delayed turn off: 0 seconds 
??? Error: Unable to discover the device... 
--]] 
   if (response == nil or response == '' or string.find(response, 'Error: Unable to discover the device')) then 
    response = '' 
   else  
    t = {} 
    for k, v in string.gmatch(response, "(%w+):%s(.-)\n") do 
     t[k] = v 
     --print('# '..k..'='..v) 
    end 
    strState    = t['Power']   -- состояние 
    --strBrightness  = t['Brightness']   -- яркость 
    --strTemperature = t['temperature']   -- оттенок 
    -- состояние 
    if (strState == nil or strState == '') then 
     State = -1 
    else 
     if (strState == 'on') then 
      State = 1 
     else 
      State = 0 
     end 
    end 
    --Brightness   = parseInt(strBrightness) 
    --Temperature  = parseInt(strTemperature) 
    --print('PhilipsLamp State='..State..';') 
    if (State == 1) then 
     if (Device.state ~= 'On') then 
      Device.switchOn().checkFirst().silent() 
     end 
    elseif (State == 0) then 
     if (Device.state ~= 'Off') then 
      Device.switchOff().checkFirst().silent() 
     end 
    elseif (State == -1) then 
     print('PhilipsLamp Не удалось узнать состояние устройства') 
    end 
   end 
  end 
 end 
} | 
UPDATE 2022-01-03:
В последней версии python-miio статус лампы получается командой:
/usr/local/bin/miiocli philipsbulb --ip 192.168.1.55 --token 1234567890987654321 status

Не знаю как с E14, но с E27 у меня были проблемы (используя этот скрипт).
ОтветитьУдалитьИногда лампа не включалась, потому что запрос не отрабатывался корректно + какие то задержки в обработке и тогда ругался сам домотикз
По умолчанию, если домотикз скрипт требует на обработку более 10 сек. то это ошибка.
Пришлось делать на bash свои скрипты с разной логикой обхода ошибок и добавлять уже в сценарий.
Теперь работает отлично.
А так, статья отличная, все нужные ссылки для понимания как работать с лампами нашёл, но сделал по своему.