Domoticz. Альтернативная панель — Dashticz V2 (Настройка Часть 3)


Добавляем  другую реализацию радио, фазу луны, и uptime domoticz.

Первая часть тут.

Вторая часть тут.

Фаза луны - модуль Moonphases

Для работы модуля необходимо добавить в нашу систему 2 переменные и 5 виртуальных датчика.

Перейдя в "Настройки" - "Дополнительно" - "Переменные пользователя", создайте 2 строковые переменные с именами: MoonphaseCheck и MoonPicture.

На вкладке "Настройки" - "Оборудование" создайте виртуальное устройство (подробнее тут), если у вас его нет.

Кликая на кнопку "Создать виртуальные датчики" создайте 5 датчиков:

Имя Тип Метка оси
Moon up Текст
Moon under Текст
Moonpercentage Проценты
Moon age Custom Sensor Days
Moonphase Текст

 

На вкладке "Настройки" - "Устройства" увидим 5 добавленных датчиков. Отсюда возьмем номера Idx датчиков для дальнешней настройки плагина.

На вкладке "Настройки" - "Дополнительно" - "События" создайте сценарий на языке Lua, представленный ниже.

Настройте параметры в блоке "Variables to customize", следуя комментариям в сценарии.

Как получить API ключ Weather Underground можно посмотреть тут.

Также необходимо создать файл phase.tmp и установить для него права:

cd /var/tmp/

touch phase.tmp

sudo chmod 777 /var/tmp/phase.tmp

При включении опции отладки, если все сделано верно, в журнале можно увидеть примерно следующее:

2017-10-17 22:18:00.435 dzVents: Moonphase - Collecting data from: http://api.wunderground.com/api/12d**********/astronomy/q/RU/Moscow.json
2017-10-17 22:18:00.845 dzVents: Moonrise: 3:41
2017-10-17 22:18:00.845 dzVents: Moonset: 17:02
2017-10-17 22:18:00.845 dzVents: Percent: 4%
2017-10-17 22:18:00.845 dzVents: Age: 28
2017-10-17 22:18:00.845 dzVents: Picture number: 52 Picture name: moon.52.png
2017-10-17 22:18:11.421 dzVents: MoonPhase - Update not allowed: Difference is 11 seconds
2017-10-17 22:18:21.482 dzVents: MoonPhase - Update not allowed: Difference is 21 seconds
2017-10-17 22:18:41.507 dzVents: MoonPhase - Update not allowed: Difference is 41 seconds

Текст сценария:

-- Variables to customize ------------------------------------------------
local moonpicture = "MoonPicture" -- оставляем без изменений
local checkvar = "MoonphaseCheck" -- оставляем без изменений
local checktime = 3600 -- частота обновления информации в секундах, рекомендую оставить без изменений
local city = "Moscow" -- Имя города в Wunderground API
local countryCode = "RU" -- Код страны в Wunderground API
local idxmoonpercentage ='57' -- Idx датчика Moonpercentage
local idxmoonage ='58' -- Idx датчика ID Moon age
local idxmoonphase ='59' -- Idx датчика Moonphase
local idxmoonrise='55' -- Idx датчика Moon up
local idxmoonset='56' -- Idx датчика Moon under
local wuAPIkey = "12da*********" -- Ваш Weather Underground API Key
local DOMO_IP = "192.***.*.**" -- ip address сервера Domoticz
local DOMO_PORT = "8080" -- Порт Domoticz
local tempfilename = '/var/tmp/phase.tmp' -- темп файл
local debug=true -- false - отладка выключена , true - отладка включена, вспомогательные сообщения выводятся в журнал Domoticz
-------------------------------------------------------------------------

function file_exists(path)
-- function to check if a file exists
local file = io.open(path, "rb")
if file then file:close() end
return file ~= nil
end

function timedifference(s)
-- function to determine the difference in seconds between the current time and a given one
year = string.sub(s, 1, 4)
month = string.sub(s, 6, 7)
day = string.sub(s, 9, 10)
hour = string.sub(s, 12, 13)
minutes = string.sub(s, 15, 16)
seconds = string.sub(s, 18, 19)
t1 = os.time()
t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
difference = os.difftime (t1, t2)
return difference
end

function may_update(device, timeelapsed)
-- function to check whether an update is allowed
return uservariables_lastupdate[device] == nil or timedifference(uservariables_lastupdate[device]) >= timeelapsed
end

commandArray = {}
time = os.date("*t")
url='http://api.wunderground.com/api/'..wuAPIkey..'/astronomy/q/'..countryCode..'/'..city..'.json'
if (may_update(checkvar,checktime)==true) or (file_exists(tempfilename)==false) then

-- read API Wunderground
if debug then print("Moonphase - Collecting data from: "..url) end
os.execute('curl -s '..url..' > '..tempfilename)

-- NOTE: if the command above doens't work in your situation try
-- read = os.execute('curl -s -o '..tempfilename..' "'..url..'"')
-- instead! Thanks to EdKo66

file = io.open(tempfilename, "r")
s= file:read("*a")
s = (string.gsub(s, "%c+", ""))
file:close()

-- moonrise
moonriseHour, moonriseMinute = string.match(s, [["moonrise": {"hour":"(%d+)","minute":"(%d+)"]])
if moonriseHour == nil then moonriseHour = '--' end
if moonriseMinute == nil then moonriseMinute = '--' end
if debug then print("Moonrise:\t"..moonriseHour..":"..moonriseMinute) end

-- moonset
moonsetHour, moonsetMinute = string.match(s, [["moonset": {"hour":"(%d+)","minute":"(%d+)"]])
if moonsetHour == nil then moonsetHour = "--" end
if moonsetMinute == nil then moonsetMinute = "--" end
if debug then print("Moonset:\t"..moonsetHour..":"..moonsetMinute) end

-- percentage of moon illuminated
percentIlluminated = string.match(s, [["percentIlluminated":"(%d+)"]])
if debug then print("Percent:\t"..percentIlluminated.."%") end

-- age of moon since last new moon
age = string.match(s, [["ageOfMoon":"(%d+)"]])
if debug then print("Age:\t\t"..age) end

-- Phase of the moon
-- set the moonPhaseIcon to your appropriate icon number (8 x)
moonPhase = string.match(s, [["phaseofMoon":"(.-)"]])
if moonPhase=="New Moon" then
moonPhase = "Nieuwe maan"
is_waxing = true
end
if moonPhase=="Waxing Crescent" then
moonPhase = "Wassende halve maan"
is_waxing = true
end
if moonPhase=="First Quarter" then
moonPhase = "Eerste kwartier"
is_waxing = true
end
if moonPhase=="Waxing Gibbous" then
moonPhase = "Wassende maan"
is_waxing = true
end
if moonPhase=="Full" then
moonPhase = "Volle maan"
is_waxing = false
end
if moonPhase=="Waning Gibbous" then
moonPhase = "Afnemende maan"
is_waxing = false
end
if moonPhase=="Last Quarter" then
moonPhase = "Laatste kwartier"
is_waxing = false
end
if moonPhase=="Waning Crescent" then
moonPhase = "Afnemende halve maan"
is_waxing = false
end

-- calculate moonphase picture
if percentIlluminated == '0' then
n='50'
else
if waardecheck==false then
picnumber=math.floor(math.abs(percentIlluminated-100)/2)
n=tostring(picnumber)
if n.length==1 then
n='0'+n
end
else
picnumber=math.floor(50+(percentIlluminated/2))
if picnumber == 100 then
picnumber=99
end
end
n=tostring(picnumber)
end
picture='moon.'..n..'.png'
if debug then print('Picture number: '..n..' '..'Picture name: '..picture) end

commandArray['Variable:'..checkvar]=moonPhase
commandArray['Variable:'..moonpicture]=picture
commandArray[1] = {['UpdateDevice'] = idxmoonphase.."|0|"..moonPhase}
commandArray[2] = {['UpdateDevice'] = idxmoonrise.."|0|"..moonriseHour..":"..moonriseMinute}
commandArray[3] = {['UpdateDevice'] = idxmoonset.."|0|"..moonsetHour..":"..moonsetMinute}
commandArray[4] = {['UpdateDevice'] = idxmoonage.."|0|"..age}
commandArray[5] = {['UpdateDevice'] = idxmoonpercentage.."|0|"..percentIlluminated}
else
if debug then print("MoonPhase - Update not allowed: Difference is "..timedifference(uservariables_lastupdate[checkvar]).." seconds") end
end

return commandArray

Настроим отображение модуля в файле CONFIG.js.

Добавим специальную кнопку:

var buttons = {}
buttons.log = {key:'log', width:12, icon:'fa-microchip', title: 'Domoticz Log', log:true, level: 2}
buttons.moon = {width:12, isimage:true, refreshimage:60000, image: 'moon'}

И выведем её в колонку:

columns[4] = {}
columns[4]['blocks'] = ['clock',58,57,buttons.moon,'sunrise',buttons.log,41]
columns[4]['width'] = 2;

Радио

Добавим на панель мою реализацию потокового радио (статья тут), отредактировав файл CONFIG.js:

blocks[26] = {}
blocks[26]['title'] = 'Radio'
blocks[26]['width'] = 12;
blocks[26]['icon'] = 'fa-music';

 

columns[1] = {}
columns[1]['blocks'] = [26,'blocktitle_1','21_1','21_2','blocktitle_2','36_1','36_2','blocktitle_3',1,2,3]
columns[1]['width'] = 5;

Стандартное радио я удалил, так как используется аудио системы в которой открыт веб-интерфейс.

Domoticz Uptime

Добавим на панель Domoticz Uptime (статья тут).

blocks[41] = {}
blocks[41]['title'] = 'Domoticz Uptime'
blocks[41]['width'] = 12;
blocks[41]['switch'] = true;
blocks[41]['icon'] = 'fa-hourglass-half';

 

columns[4] = {}
columns[4]['blocks'] = ['clock',buttons.moon,'sunrise',buttons.log,41]
columns[4]['width'] = 2;

В итоге получилось следующее: