Forum użytkowników automatyki budynkowej
Z-wave => Fibaro - sceny => Wątek zaczęty przez: v41n w Sierpień 27, 2016, 12:29:48 pm
-
Cześć,
Proszę o pomoc dlaczego poniższy kod zwraca błąd: [DEBUG] 13:28:30: line 7: attempt to concatenate a nil value
--[[
%% properties
%% globals
isNight
--]]
fibaro:debug("Wartość: "..fibaro:getGlobalValue("isNight"))
Z góry dziękuje za pomoc.
-
scene uruchomiles z palca i dostales taki komunikat czy scena zostala uruchomiona na podstawie globala ?
-
Z palca.
-
no i wszytko jasne. Wartosc zmiennej jest pusta.
zrob nowa scene ktora ustawia wartość isNight, albo wpisz jakas w wartość w panelu zmiennych a dopiero pozniej uruchom z palca ta scene. Pamietaj ze wartosci zmiennych globalnych po restarcie centrali znow sa puste, wiec warto miec scene ktora ustawia zmienne przy starcie centrali.
-
No ok.
Korzystam ze sceny użytkownika Traktor69. Czy jest to prawidłowe ustawienie zmiennej bo mam wrażenie, że nadal jest pusta.
--[[
1303 value
%% properties
%% globals
%% autostart
--]]
-- Initial parameters -------------------------------------------------------
sunriseDelay = 0
sunsetDelay = 0
-- Functions -----------------------------------------------------------------
-- funkcja zamienia czas w formacie tekstowym "HH:MM" lub os.date("*t")
-- na liczbę minut od północy
function toMinutes(czasHHMM)
local a
if type(czasHHMM) == "string" then
a = tonumber(string.sub(czasHHMM, 1, 2)) * 60 + tonumber(string.sub(czasHHMM, 4, 5))
else
a = tonumber(czasHHMM.hour) * 60 + tonumber(czasHHMM.min)
end
return a
end
-- funkcja zamienia liczbę minut od północy na format tekstowy godziny "HH:MM"
function toHHMM(minutes)
local b = string.format("%02d",((minutes/60*100) - ((minutes/60*100) % 100))/100)
local c = string.format("%02d",minutes - (tonumber(b)*60))
local d = b..":"..c
return d
end
-- end of Functions-----------------------------------------------------------
while true do
-- ustalenie ilości minut od północy do godziny wschodu i zachodu słońca
local sunriseMinutes = toMinutes(fibaro:getValue(1, 'sunriseHour'))
local sunsetMinutes = toMinutes(fibaro:getValue(1, 'sunsetHour'))
-- ustalenie ilości minut od północy do teraz
local nowMinutes = toMinutes(os.date("*t"))
-- ustawienie zmiennej globalnej isNight
if nowMinutes > (sunriseMinutes + sunriseDelay)
and nowMinutes < (sunsetMinutes + sunsetDelay)
then
fibaro:setGlobal("isNight", "0")
else
fibaro:setGlobal("isNight", "1")
end
-- debug --------------------------------------------------------------------
fibaro:debug("Teraz jest: "..toHHMM(nowMinutes))
fibaro:debug("Wschód słońca: "..fibaro:getValue(1, 'sunriseHour'))
fibaro:debug("Zachód słońca: "..fibaro:getValue(1, 'sunsetHour'))
fibaro:debug("isNight = "..fibaro:getGlobalValue("isNight"))
fibaro:debug("-----------------------------------------")
-----------------------------------------------------------------------------
fibaro:sleep(60*1000)
end -- end while
-
a co masz w debug tej sceny? po co dopisales 1303 value jak scena ma autostart i nigdy sie nie konczy?
-
W debugu mam to: attempt to concatenate a nil value
A 1303 to przez przypadek jak kopiowałem z inne sceny.
-
no to co sie dziwisz ze nie dziala ;-)
-
Zmieniłem kod, komunikat z debugu:
[DEBUG] 13:17:29: Teraz jest: 13:17
[DEBUG] 13:17:29: Wschód słońca: 05:56
[DEBUG] 13:17:29: Zachód słońca: 19:12
[DEBUG] 13:17:29: line 68: attempt to concatenate a nil value
?
--[[
%% autostart
%% properties
%% globals
--]]
-- Initial parameters -------------------------------------------------------
sunriseDelay = 0
sunsetDelay = 0
-- Functions -----------------------------------------------------------------
-- funkcja zamienia czas w formacie tekstowym "HH:MM" lub os.date("*t")
-- na liczbę minut od północy
function toMinutes(czasHHMM)
local a
if type(czasHHMM) == "string" then
a = tonumber(string.sub(czasHHMM, 1, 2)) * 60 + tonumber(string.sub(czasHHMM, 4, 5))
else
a = tonumber(czasHHMM.hour) * 60 + tonumber(czasHHMM.min)
end
return a
end
-- funkcja zamienia liczbę minut od północy na format tekstowy godziny "HH:MM"
function toHHMM(minutes)
local b = string.format("%02d",((minutes/60*100) - ((minutes/60*100) % 100))/100)
local c = string.format("%02d",minutes - (tonumber(b)*60))
local d = b..":"..c
return d
end
-- end of Functions-----------------------------------------------------------
while true do
-- ustalenie ilości minut od północy do godziny wschodu i zachodu słońca
local sunriseMinutes = toMinutes(fibaro:getValue(1, 'sunriseHour'))
local sunsetMinutes = toMinutes(fibaro:getValue(1, 'sunsetHour'))
-- ustalenie ilości minut od północy do teraz
local nowMinutes = toMinutes(os.date("*t"))
-- ustawienie zmiennej globalnej isNight
if nowMinutes > (sunriseMinutes + sunriseDelay)
and nowMinutes < (sunsetMinutes + sunsetDelay)
then
fibaro:setGlobal("isNight", "0")
else
fibaro:setGlobal("isNight", "1")
end
-- debug --------------------------------------------------------------------
fibaro:debug("Teraz jest: "..toHHMM(nowMinutes))
fibaro:debug("Wschód słońca: "..fibaro:getValue(1, 'sunriseHour'))
fibaro:debug("Zachód słońca: "..fibaro:getValue(1, 'sunsetHour'))
fibaro:debug("isNight = "..fibaro:getGlobalValue("isNight"))
fibaro:debug("-----------------------------------------")
-----------------------------------------------------------------------------
end -- end while
-
Dobra poradziłem sobie. Działa.