Jag undrar om man kan deklarera flera enheter under samma variabel?

Exemplet ovan: local device = 4;

Kan man typ göra såhär: local device = 4, 5, 6; ?

Vill alltså kunna styra flera devices men gärna använda en variabel för att på ett enkelt sätt kunna lägga till fler devices i framtiden.
 
iSnobben skrev:
Jag undrar om man kan deklarera flera enheter under samma variabel?

Exemplet ovan: local device = 4;

Kan man typ göra såhär: local device = 4, 5, 6; ?

Vill alltså kunna styra flera devices men gärna använda en variabel för att på ett enkelt sätt kunna lägga till fler devices i framtiden.
Tanken är rätt, men det är inte riktigt så enkelt. Du måste deklarera en vektor (om LUA har stöd för det) och sen stega dig igenom vektorn när du tänder/släcker.

EDIT: Börja läs här:
http://www.lua.org/pil/11.1.html
http://www.lua.org/pil/2.5.html
 
Redigerat:
Jag hittar inte alla kodsnuttar jag behöver, men principen är denna:

lagra listan såhär: devices = {2, 5, 44, 67}

Sen när du ska släcka/tända så får du kolla hur lång listan är (hur många devices) och sen loopa igenom den. Förmodligen börjar listan med devices[0] eller devices[1] osv.
 
Nyfniken skrev:
Jag hittar inte alla kodsnuttar jag behöver, men principen är denna:

lagra listan såhär: devices = {2, 5, 44, 67}

Sen när du ska släcka/tända så får du kolla hur lång listan är (hur många devices) och sen loopa igenom den. Förmodligen börjar listan med devices[0] eller devices[1] osv.
Tack för dina svar, tyvärr är jag inte så vass på det här med programmering 😃 Med andra ord så förstod jag inte riktigt vad du menade.

En tanke som slog mig kan en virtuell enhet lösa det istället? Tänker mig en enhet med två knappar en som tänder och en som släcker de enheter jag vill kontrollera?
 
Jag kunde inte låta bli :D

Lagra såhär:
local devices = {2, 5, 44, 67}


Såhär skriver du när du ska tända eller släcka:
for i,device in pairs(devices) do
fibaro:call(device, "turnOff")
end
 
Har jag fattat rätt? Behöver jag förresten fortfarande deklarera
local device?

--[[
%% properties
%% autostart
%% globals
--]]


-- Deklarera variabler
local lightsOnWeekday = "06:30";
local lightsOnWeekend = "06:30";
local sunriseOffset = 60;
local lightsOn;
local lightsOut = "00:00";
local devices = {4, 5, 32, 33, 34}
local now = os.date("*t");


-- Räkna om tändtiden till antal minuter sedan midnatt
lightsOnWeekday = string.sub(lightsOnWeekday,1,2) * 60 + string.sub(lightsOnWeekday,4,5)
lightsOnWeekend = string.sub(lightsOnWeekend,1,2) * 60 + string.sub(lightsOnWeekend,4,5)


while true do
-- Hämta aktuell tid
now = os.date("*t");


-- Räkna om aktuell tid till antal minuter sedan midnatt
time = string.format("%02d", now.hour) * 60 + string.format("%02d", now.min);


-- Avgör om det är vardag eller helg och sätt tändtiden därefter
if ((now.wday == 6) or (now.wday == 1)) then
lightsOn = lightsOnWeekend;
else
lightsOn = lightsOnWeekday;
end


-- Hämta tid för soluppgången
lightsOut = fibaro:getValue(1, "sunriseHour");


-- Räkna om tiden för soluppgång tillantalet minuter sedan midnatt och lägg till offset
lightsOut = string.sub(lightsOut,1,2) * 60 + string.sub(lightsOut,4,5) + sunriseOffset


-- Tänd lampan om det är tänd-tid samt att tändtid inte är efter släck-tid
if ((lightsOn <= lightsOut) and (time == lightsOn)) then
for i,device in pairs(devices) do
fibaro:call(device, "turnOn");
end


-- Släck lampan släck-tid, oavsett hur lampan tändes
if (time == lightsOut) then
for i,device in pairs(devices) do
fibaro:call(device, "turnOff");
end


-- Sov 55 sekunder
fibaro:sleep(55*1000);
end
 
Redigerat:
Förmodligen är det väl jag som har gjort fel men det släcktes inte som det skulle nu ikväll. Bifogar även kvällscenen.

--[[
%% properties
%% autostart
%% globals
--]]


local device;
local devices = {4, 5, 32, 33, 34}
local lightsOutWeekday = "00:00";
local lightsOutWeekend = "01:00";
local sunsetOffset = -60;
local lightsOn;
local lightsOut;


local now = os.date("*t");
lightsOutWeekday = string.sub(lightsOutWeekday,1,2) * 60 + string.sub(lightsOutWeekday,4,5)
lightsOutWeekend = string.sub(lightsOutWeekend,1,2) * 60 + string.sub(lightsOutWeekend,4,5)


while true do
now = os.date("*t");
time = string.format("%02d", now.hour) * 60 + string.format("%02d", now.min);
lightsOn = fibaro:getValue(1, "sunsetHour");
lightsOn = string.sub(lightsOn,1,2) * 60 + string.sub(lightsOn,4,5);
lightsOn = lightsOn + sunsetOffset;


if (now.wday <= 5) then
lightsOut = lightsOutWeekday;
else
lightsOut = lightsOutWeekend;
end




if (((lightsOut < 720) or (lightsOn < lightsOut)) and (time == lightsOn)) then
for i,device in pairs(devices) do
fibaro:call(device, "turnOn");
while (time ~= lightsOut) do
now = os.date("*t");
time = string.format("%02d", now.hour) * 60 + string.format("%02d", now.min);
fibaro:sleep(55*1000);
end
for i,device in pairs(devices) do
fibaro:call(device, "turnOff");
end
fibaro:sleep(55*1000);
end
 
OpiMaza
Nyfniken skrev:
Det kan vara det. Hemma hos mig fungerade i alla fall kvälls-scriptet igår.

Kom ihåg att släck-funktionen bara fungerar om scriptet startats före tänd-tid. När lamporna tänds så går den in i släck-loopen och väntar på rätt tid. Om lamporna aldrig tänts så ligger den inte i den loopen.

Vill tillägga att det fungerande lysande i går kväll
 
  • Gilla
mandg och 1 till
  • Laddar…
iSnobben skrev:
if (((lightsOut < 720) or (lightsOn < lightsOut)) and (time == lightsOn)) then
for i,device in pairs(devices) do
fibaro:call(device, "turnOn");
while (time ~= lightsOut) do
Det ser ut som att det fattas ett "end" innan "while" här.

Du ska inte deklarera device "separat". Det görs automagiskt i for-satsen (variablerna i och device) skapas alltså varje gång den stegar igenom arrayen.
 
iSnobben skrev:
while true do
now = os.date("*t");
time = string.format("%02d", now.hour) * 60 + string.format("%02d", now.min);
lightsOn = fibaro:getValue(1, "sunsetHour");
lightsOn = string.sub(lightsOn,1,2) * 60 + string.sub(lightsOn,4,5);
lightsOn = lightsOn + sunsetOffset;


if (now.wday <= 5) then
lightsOut = lightsOutWeekday;​
else
lightsOut = lightsOutWeekend;​
end


if (((lightsOut < 720) or (lightsOn < lightsOut)) and (time == lightsOn)) then
for i,device in pairs(devices) do
fibaro:call(device, "turnOn");
while (time ~= lightsOut) do
now = os.date("*t");
time = string.format("%02d", now.hour) * 60 + string.format("%02d", now.min);
fibaro:sleep(55*1000);​
end
for i,device in pairs(devices) do
fibaro:call(device, "turnOff");​
end
fibaro:sleep(55*1000);​
end​
Jag försökte formatera din While statement ovan för att se hur den loopar - men det verkar fattas kod på slutet eller så fattas det en END någonstans, eller snarare tre...

Edit: Verkar som om min formatering försvinner när jag postar...
 
Redigerat:
Okej men jag har ju bara lagt till den snutten jag fick av Nyfniken och den övriga koden fungerar i sovrummet där jag bara har en lampa...
 
iSnobben skrev:
Okej men jag har ju bara lagt till den snutten jag fick av Nyfniken och den övriga koden fungerar i sovrummet där jag bara har en lampa...
...
if (((lightsOut < 720) or (lightsOn < lightsOut)) and (time == lightsOn)) then
for i,device in pairs(devices) do
fibaro:call(device, "turnOn");
end
while (time ~= lightsOut) do
...
 
Fattas det inte ytterligare en END sist eller så - hur skall annars WHILE loopen fungera? Eller missar jag något?
 
Bamsefar skrev:
Fattas det inte ytterligare en END sist eller så - hur skall annars WHILE loopen fungera? Eller missar jag något?
Jag har räknat efter och tycker att det ser ut att stämma...
 
Vi vill skicka notiser för ämnen du bevakar och händelser som berör dig.