slumpa tändning

Hjälp varandra att vara kreativa för att göra hemmet mer bekvämt.
Post Reply
nohed
Medlem
Posts: 88
Joined: 20 Apr 2013, 14:10
11

jag har en liten kod som jag lånat här i från som der ut så här

fibaro:sleep(math.random(5000,12000));
fibaro:call(7, "turnOn");
fibaro:sleep(math.random(5000,12000));
fibaro:call(57, "turnOn");
fibaro:sleep(math.random(5000,12000));
fibaro:call(61, "turnOn");

men denna kod tänder ju alltid i samma ordning. Kan man få det så att de både slumpar tiden och tändnings ordningen ?
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

Tja det blir ju lite att sätta sig in i då kanske:

Code: Select all

local DeviceList = { 7, 57, 61 }

function fn_TableLength(T)
  local count = 0
  for _ in pairs(T) do count = count + 1 end
  return count
end

local NumberOfDevices = fn_TableLength(DeviceList)

for loop,Device in pairs(DeviceList) do
	IndexOne = math.random(1,NumberOfDevices)
	IndexTwo = math.random(1,NumberOfDevices)
	Temp = DeviceList[IndexOne]
	DeviceList[IndexOne] = DeviceList[IndexTwo]
	DeviceList[IndexTwo] = Temp	
end

for loop,Device in pairs(DeviceList) do
	fibaro:sleep(math.random(5000,12000))
	fibaro:call(Device, "turnOn")
end
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
nohed
Medlem
Posts: 88
Joined: 20 Apr 2013, 14:10
11

fick denna på fibaros forum skall kolla hur denna funkar

local deviceIDs = {7, 57, 61}

for key,value in pairs (deviceIDs) do
fibaro:sleep(math.random(5000,12000))
fibaro:call(value, "turnOn")
end
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

Den snurran loopar igenom listan i den ordningen du angett. Det jag gör i min snurra är att försöka slumpa om ordningen som du önskade....
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Tänk om Lua kunde vara lika enkelt som Ms Access, då skull jag ha ett system som funkade exakt som jag ville :)
ja till 99, 9%iaf
Detta skulle ju vara ett perfekt komplimet till varibeln sun som jag använder som är en virtuell enhet ;)
Nu blir det att försöka sig på detta med befintliga enheter.

Hur funkar det med?
fibaro:call(79, "pressButton", "1") då är det ju inte "turnOn"

Är det ok om jag hijackar din tråd i fortsättningen?
Det gäller ju samma önskemål
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

sonnyboy wrote:Hur funkar det med?
fibaro:call(79, "pressButton", "1") då är det ju inte "turnOn"
Är device 79 en VD?
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Ja det är en VD, en gammal herdelig Nexa :)
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

sonnyboy: Så vad du menar är att du har vanliga "lampor":

Code: Select all

fibaro:call(value, "turnOn") 
Och sedan via VD så styr du NEXA:

Code: Select all

fibaro:call(79, "pressButton", "1")
Och det du vill åstadkomma är en "loop" som gör detta oberoende av om det är en VD eller ett DeviceID?
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Bamsefar wrote:Och det du vill åstadkomma är en "loop" som gör detta oberoende av om det är en VD eller ett DeviceID?
Det är helt korret uppfattat :)
Har inte bytt ut all Nexa än och det kanske är tur det med tanke på alla problem som figurerar runt Fibaros enheter.
Nexan funkar Fortfarande väldigt bra, har bara 5 enheter kvar men snart är det jul och då ökar antalet till runt 10.
Men jag styr dom helt via hc:n Som skickar en stäng till Beyond Measure som ser till att duon tänder och släcker.
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

Eftersom du behöver blanda olika typer av devices, så måste man då testa på vilken typ av device det är man just nu "jobbar" med, och det gör man t.ex. med:

Code: Select all

fibaro:getType(Device)
Så i teorin borde följande snurra fungera:

Code: Select all

--[[
%% properties

%% globals
--]]

local DeviceList = { 7, 57, 61 }

function fn_TableLength(T)
  local count = 0
  for _ in pairs(T) do count = count + 1 end
  return count
end

local NumberOfDevices = fn_TableLength(DeviceList)

for loop,Device in pairs(DeviceList) do
   IndexOne = math.random(1,NumberOfDevices)
   IndexTwo = math.random(1,NumberOfDevices)
   Temp = DeviceList[IndexOne]
   DeviceList[IndexOne] = DeviceList[IndexTwo]
   DeviceList[IndexTwo] = Temp   
end

for loop,Device in pairs(DeviceList) do
   fibaro:sleep(math.random(5000,12000))
	if fibaro:getType(Device) == "virtual_device" then
    	fibaro:call(Device, "pressButton", "1")
    else
		fibaro:call(Device, "turnOn")
    end
end
Men jag har inte testat koden ovan - men i teorin :-)

Edit: Skrev nog fel där - rättat tror jag...
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Detta funkar klockrent även med dimmer, den kommer ihåg sin sista värde och startar det :)
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Har kört koden ovan nu i några dagar, blir lite fundersam om det funkar som det ska, jag tycker att samma lampa tänds först hela tiden, det är alltd den enhet som står först i local "DeviceList = { }"
Jag kör koden där virituella enheter är med.
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Något skumt är det för mig, kör denna lua och får alltid samma output i debuggen,
Visst är det slumpat på några enheter men inte alla, börjar alltid med enhet 38

Code: Select all

--[[
%% properties

%% globals
--]]


if (fibaro:countScenes() > 1) then fibaro:abort() end;

local DeviceList = { 38, 4, 33, 45, 34, 79, 80, 119, 189 }

function fn_TableLength(T)
  local count = 0
  for _ in pairs(T) do count = count + 1 end
  return count
end

local NumberOfDevices = fn_TableLength(DeviceList)

for loop,Device in pairs(DeviceList) do
   fibaro:debug("Index: "..loop.." DeviceID: "..Device)--denns
   IndexOne = math.random(1,NumberOfDevices)
   IndexTwo = math.random(1,NumberOfDevices)
   Temp = DeviceList[IndexOne]
   DeviceList[IndexOne] = DeviceList[IndexTwo]
   DeviceList[IndexTwo] = Temp   
end

for loop,Device in pairs(DeviceList) do
   fibaro:sleep(math.random(5000,12000))
   if fibaro:getType(Device) == "virtual_device" then
       fibaro:call(Device, "pressButton", "1")
    else
      fibaro:call(Device, "turnOn")
    end
end
[DEBUG] 21:04:19: Index: 1 DeviceID: 38
[DEBUG] 21:04:24: Index: 2 DeviceID: 45
[DEBUG] 21:04:31: Index: 3 DeviceID: 34
[DEBUG] 21:04:37: Index: 4 DeviceID: 79
[DEBUG] 21:04:47: Index: 5 DeviceID: 80
[DEBUG] 21:04:54: Index: 6 DeviceID: 189
[DEBUG] 21:05:01: Index: 7 DeviceID: 33
[DEBUG] 21:05:07: Index: 8 DeviceID: 119
[DEBUG] 21:05:13: Index: 9 DeviceID: 4

[DEBUG] 21:08:54: Index: 1 DeviceID: 38
[DEBUG] 21:08:59: Index: 2 DeviceID: 45
[DEBUG] 21:09:06: Index: 3 DeviceID: 34
[DEBUG] 21:09:12: Index: 4 DeviceID: 79
[DEBUG] 21:09:23: Index: 5 DeviceID: 80
[DEBUG] 21:09:29: Index: 6 DeviceID: 189
[DEBUG] 21:09:37: Index: 7 DeviceID: 33
[DEBUG] 21:09:43: Index: 8 DeviceID: 119
[DEBUG] 21:09:48: Index: 9 DeviceID: 4
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

Hmm undrar om du lider av samma som jag hittade någon gång - det blev att jag ändrade lite i min uppstart av min HC2 och slumpade(!) fram ett antal slumptal så att man fick bättre spridning...

Bootar du om mellan ovanstående körningar förresten?
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Jag botade inte om mellen dessa körningar, kan pröva det får jag se om det blir någonskillnad.
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Samma efter omstart tyvärr.

[DEBUG] 21:08:54: Index: 1 DeviceID: 38 [DEBUG] 16:48:23: Index: 1 DeviceID: 38
[DEBUG] 21:08:59: Index: 2 DeviceID: 45 [DEBUG] 16:48:28: Index: 2 DeviceID: 45
[DEBUG] 21:09:06: Index: 3 DeviceID: 34 [DEBUG] 16:48:35: Index: 3 DeviceID: 34
[DEBUG] 21:09:12: Index: 4 DeviceID: 79 [DEBUG] 16:48:41: Index: 4 DeviceID: 79
[DEBUG] 21:09:23: Index: 5 DeviceID: 80 [DEBUG] 16:48:52: Index: 5 DeviceID: 80
[DEBUG] 21:09:29: Index: 6 DeviceID: 189 [DEBUG] 16:48:58: Index: 6 DeviceID: 189
[DEBUG] 21:09:37: Index: 7 DeviceID: 33 [DEBUG] 16:49:06: Index: 7 DeviceID: 33
[DEBUG] 21:09:43: Index: 8 DeviceID: 119 [DEBUG] 16:49:12: Index: 8 DeviceID: 119
[DEBUG] 21:09:48: Index: 9 DeviceID: 4 [DEBUG] 16:49:17: Index: 9 DeviceID: 4
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Det fick bli en annan variant som funkar men utan mina VD får helt enkelt köpa nya enheter.
Om någon är intresserad så kommer luan nedan.

Edit: Fick in en VD nexa, inte snyggt kanske men det funkar.
Edit2: Snyggade till koden lite

Code: Select all

--[[
%% properties

%% globals
--]]

-- REFERENCE
-- zwaveforum.se, forum.fibaro.com
-- Thanks to Bamsefar, Daniel.Knight for good LUA functions code.

if (fibaro:countScenes() > 1) then fibaro:abort() end

local deviceIDs = { 38, 4, 33, 45, 34, 189 }
 
math.randomseed(os.time())

function randomOrder(table)
  local new = {}
   for j,x in pairs(table) do new[j] = x end
    local res = {}
     while (#new > #res) do
      local index = math.random(1,#new)
      if (new[index] > -1) then
      res[#res+1] = new[index]
     new[index] = -1
    end
  end
 return res
end


for Device,device in pairs(randomOrder(deviceIDs)) do
   fibaro:call(device, "turnOn")
    fibaro:debug( Device .. " DeviceID: "..device)
     fibaro:sleep(math.random(5000,12000))
     -- fibaro:call(119, "pressButton", "1")--Endast för VD
end
Last edited by sonnyboy on 11 May 2015, 21:35, edited 2 times in total.
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

Såhär är det, efter lite tester:

math.random har samma slumptalsfrö VARJE gång en VD anropas - men det har INTE en scen.

Dvs om man använder math.random i en VD så ger den ALLTID samma värde, för VARJE anrop.

Men i en Scen fungerar det som det är tänkt...

Kul...
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Funderar på om detta är ytterligare en bugg, eller om det ska vara så här?
Jag kan ju tycka att det borde funka lika i både scener och VD:s.
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
Post Reply