Forum użytkowników automatyki budynkowej
Z-wave => Fibaro - sceny => Wątek zaczęty przez: peterhi w Sierpień 15, 2015, 06:38:04 pm
-
Witam, mam problem ze scena, ktora mialaby uruchamiac listwe LED gdy dostaje powiadomienie z centralki na TV. Zalozenie jest aby LED zaswiecila sie na dany kolor (np. green-powiadomienia, red-ostrzezenia lub alarmy,) przez 1s gdy system wysyla wiadomosc na ekran TV. Po zaswieceniu LED wraca do poprzedniego stanu (np. OFF lub swieci wybrany wczesniej kolor). Zerknijcie na kod czy jest wszystko git, albo moze znacie prostsze komendy do osiagniacia takiego efektu.
To jest moja scena:
--[[
%% properties
60 value
--]]
local startSource = fibaro:getSourceTrigger();
local ledState = fibaro:getValue(90, "value");
local ledColor = fibaro:getValue(90, "color" lub "lastColorSet");
fibaro.debug(ledState);
fibaro:debug(ledColor);
if
tonumber(fibaro:getValue(60, "value")) > 0;
and
tonumber(fibaro:getValue(90, "value")) == 0;
then
fibaro:call(90, "setG", "255");
fibaro:sleep(1*1000)
fibaro:call(90, "turnoff")
elseif
( tonumber(fibaro:getValue(60, "value")) > 0 )
and
( tonumber(fibaro:getValue(90, "value")) > 0 )
then
fibaro:call(90, "setG", "255");
fibaro:sleep(1*1000);
local RGBTable= {};
local i = 1;
for value in string.gmatch(ledColor,"(%d+)") do
RGBTable = value;
i = i + 1;
end
fibaro:debug('R:'..RGBTable[1]);
fibaro:debug('G:'..RGBTable[2]);
fibaro:debug('B:'..RGBTable[3]);
fibaro:call(90, "setColor", RGBTable[1], RGBTable[2], RGBTable[3])
-
A może dopisz co nie działa :-)
Wysłane z iPad za pomocą Tapatalk
-
W scenie bylo kilka bledow, ktore poprawilem. Dalej jednak mam problem z pobieraniem poprzednich ustawien.
Narazie ustawilem na sztywno jeden kolor, ktory uzywam w salonie. Chialbym jednak aby scena byla bardziej uniwersalna, do wykorzystania w innych miejscach i by sama pobierala ustawienia.
Teraz wyglada to tak:
--[[
%% properties
23 value
%% globals
--]]
local startSource = fibaro:getSourceTrigger();
if
( tonumber(fibaro:getValue(23, "value")) > 0 ) -- MotionSensor wykryje ruch
and
( tonumber(fibaro:getValue(90, "value")) == 0 ) -- LED-y sa wylaczone
then
fibaro:call(90, "setG", "255");
fibaro:sleep(300)
fibaro:call(90, "turnOff");
elseif
( tonumber(fibaro:getValue(23, "value")) > 0 ) -- MotionSensor wykryje ruch
and
( tonumber(fibaro:getValue(90, "value")) > 0 ) -- LED-y sa wlaczone
then
fibaro:call(90, "setG", "255");
fibaro:sleep(300)
fibaro:call(90, "setColor", "0" , "0" , "0" , "0")
fibaro:sleep(200)
fibaro:call(90, "setColor", "124","50","34","0")
end
-
peterhi to czego Ci brakuje to:
fibaro:getValue(90, "lastColorSet")
Zrob tak:
1) jesli ledy wlaczone,
2) zapisz do zmiennej wynik getValue [LastColorSet]
3) wykonaj mrugniecie czy co tam chcesz
4) ustaw kolory ktore zapisales w zmiennej
-
Czy udało się zrobić tą scenę? :)
-
Sorry za dluga nieobecnosc... problem rozwiazany, dzieki marecki_0luk1 za naprowadzenie. Udalo mi sie rozwiazac problem bez uzycia zmiennej globalnej, tylko local. Od teraz uzywam tasmyLED na scianie i za TV do sygnalizowania zdarzen (np: 1x zielony gdy ktos jest w korytarzu, lub 3x zielony gdy skonczy sie pranie, lub 10x czerwony gdy alarm lub zalanie). Po zasygnalizowaniu zdarzenia tasmaLED wraca do poprzednio ustawionego koloru.
Czesc kodu odpowiedzialna za powrot do poprzedniego koloru:
--pobierz ostatnie ustawienie koloru
local colorSet = fibaro:getValue(90, "lastColorSet")
fibaro:debug(colorSet)
--miejsce na akcje
fibaro:call(90, "setColor", "0", "255", "0", "0")
fibaro:sleep(500)
--ustaw poprzedni kolor
local RGBWTable= {};
local i = 1;
for value in string.gmatch(colorSet,"(%d+)") do
RGBWTable[i] = value;
i = i + 1;
end
fibaro:debug('R:'..RGBWTable[1]);
fibaro:debug('G:'..RGBWTable[2]);
fibaro:debug('B:'..RGBWTable[3]);
fibaro:debug('W:'..RGBWTable[4]);
fibaro:call(90, "setColor", RGBWTable[1], RGBWTable[2], RGBWTable[3], RGBWTable[4]);
Przykladowy kod, ktory daje znac gdy ktos otworzy drzwi wejsciowe i wejdzie do korytarza:
--[[
%% properties
23 value
--]]
if (fibaro:countScenes() > 1) or
fibaro:getValue(23, "value") == 0
then
fibaro:debug("Scena wywolana kilkukrotnie lub czujka zmienila stan z 1 na 0")
fibaro:abort()
end
if
( tonumber(fibaro:getValue(23, "value")) > 0 )
and
( tonumber(fibaro:getValue(90, "value")) == 0 )
then
fibaro:setGlobal("text", "FIBARO: %0A%0AMotion Detected in Hall - Light ON")
fibaro:call(76, "pressButton", "1")
fibaro:setGlobal("koditext", "Motion Detected in Hall - Light ON");
fibaro:call(150, "pressButton", "2");
fibaro:call(90, "setG", "255")
fibaro:sleep(300)
fibaro:call(90, "turnOff")
elseif
( tonumber(fibaro:getValue(23, "value")) > 0 )
and
( tonumber(fibaro:getValue(90, "value")) > 0 )
then
--get last color
local colorSet = fibaro:getValue(90, "lastColorSet")
fibaro:debug(colorSet)
fibaro:setGlobal("text", "FIBARO: %0A%0A[Eng] Motion Detected in Hall - Light ON")
fibaro:call(76, "pressButton", "1")
fibaro:setGlobal("koditext", "Motion Detected in Hall - Light ON");
fibaro:call(150, "pressButton", "2");
--start Info Sequence
fibaro:call(90, "setG", "255");
fibaro:sleep(300)
--set old color
local RGBWTable= {};
local i = 1;
for value in string.gmatch(colorSet,"(%d+)") do
RGBWTable[i] = value;
i = i + 1;
end
fibaro:debug('R:'..RGBWTable[1]);
fibaro:debug('G:'..RGBWTable[2]);
fibaro:debug('B:'..RGBWTable[3]);
fibaro:debug('W:'..RGBWTable[4]);
fibaro:call(90, "setColor", RGBWTable[1], RGBWTable[2], RGBWTable[3], RGBWTable[4]);
end