Senaste rörelse

Utvecklar du en smartphone-app? Datorprogramvara? Få hjälp av andra och bidra med dina egna erfaranheter.
Post Reply
Svartbacken
Medlem
Posts: 44
Joined: 02 Mar 2015, 17:01
Location: Uppsala

20 Mar 2015, 07:39

Hej

Jag funderar om man kan få fram värdet som visas i b.l.a iPad appen när hur länge sedan senaste rörelse?
2015-03-20_06-34-09.png
iPad
2015-03-20_06-34-09.png (87.03 KiB) Viewed 5364 times
Bamsefar
Z-Wave Kung
Posts: 1059
Joined: 25 Nov 2013, 15:06
Location: Stockholm

20 Mar 2015, 09:38

Jag tror man kan få tag i senaste när en händelse, vilken som helst, triggades. Men om det bara är rörelse, eller temperaturförändring eller något annat vet jag inte rakt av...

Code: Select all

fibaro:debug("Senaste händelse: "..fibaro:getValue(114, "timeStamp"))
Last edited by Bamsefar on 20 Mar 2015, 09:40, edited 1 time in total.
Reason: La till liten LUA kod...
Använder HomeSeer 3 på Linux - attans så här bra har det aldrig varit!

Lua för nybörjare
Svartbacken
Medlem
Posts: 44
Joined: 02 Mar 2015, 17:01
Location: Uppsala

20 Mar 2015, 09:46

i iPad appen så visar den tiden då någon av rörelse eller dörr sensorerna var triggad. Tänkte det vore snyggt om man kunde snappa upp det värdet utan att behöva fråga varje sensor. Sedan kunde man typ basera det på om någon är hemma eller inte :)
Bamsefar
Z-Wave Kung
Posts: 1059
Joined: 25 Nov 2013, 15:06
Location: Stockholm

20 Mar 2015, 11:00

Inte såvitt jag vet - det är lite udda, man kan slå på t.ex. alarmet från web gränssnittet (eller appen antar jag) - men motsvarande funktion går inte att komma åt via LUA / JSON... Då får man loopa över alla enheter och den vägen per enhet larma på/av - suck...
Använder HomeSeer 3 på Linux - attans så här bra har det aldrig varit!

Lua för nybörjare
jompa68
Proffsmedlem
Posts: 713
Joined: 12 Aug 2012, 08:53
Location: Hofors

20 Mar 2015, 11:17

Code: Select all

fibaro:debug("Last breached:"..os.date("%H:%M:%S",fibaro:getValue(221, "lastBreached"))) 
--------------------------------------------------
http://jonnylarsson.se
jompa68
Proffsmedlem
Posts: 713
Joined: 12 Aug 2012, 08:53
Location: Hofors

20 Mar 2015, 13:15

lite mer info ;)

Code: Select all

elapsedTime = os.difftime(fibaro:getValue(221, "lastBreached"),os.time())

telapsedTime = string.sub(elapsedTime,2) -- don't want the - value.

nHours = string.format("%02.f", math.floor(telapsedTime/3600));
nMins = string.format("%02.f", math.floor(telapsedTime/60 - (nHours*60)));
nSecs = string.format("%02.f", math.floor(telapsedTime - nHours*3600 - nMins *60));
if nHours == "00" then
	fibaro:debug("Last breach was "..nMins.." minutes and "..nSecs.." seconds ago")
elseif nHours ~= "00" then
  	fibaro:debug("Last breach was "..nHours.." hours and"..nMins.." minutes and "..nSecs.." seconds ago")
end

--------------------------------------------------
http://jonnylarsson.se
Bamsefar
Z-Wave Kung
Posts: 1059
Joined: 25 Nov 2013, 15:06
Location: Stockholm

20 Mar 2015, 14:10

jompa68 wrote:

Code: Select all

fibaro:debug("Last breached:"..os.date("%H:%M:%S",fibaro:getValue(221, "lastBreached"))) 
Ser ju jättefint ut - men är det en odokumenterad "egenskap" i Fibaro's Motion sensor? Skälet till att jag frågar är att i 3.590 (som jag kör) så finns inte ens det valet...
Använder HomeSeer 3 på Linux - attans så här bra har det aldrig varit!

Lua för nybörjare
Svartbacken
Medlem
Posts: 44
Joined: 02 Mar 2015, 17:01
Location: Uppsala

20 Mar 2015, 15:46

jompa68 wrote:lite mer info ;)

Code: Select all

elapsedTime = os.difftime(fibaro:getValue(221, "lastBreached"),os.time())

telapsedTime = string.sub(elapsedTime,2) -- don't want the - value.

nHours = string.format("%02.f", math.floor(telapsedTime/3600));
nMins = string.format("%02.f", math.floor(telapsedTime/60 - (nHours*60)));
nSecs = string.format("%02.f", math.floor(telapsedTime - nHours*3600 - nMins *60));
if nHours == "00" then
	fibaro:debug("Last breach was "..nMins.." minutes and "..nSecs.." seconds ago")
elseif nHours ~= "00" then
  	fibaro:debug("Last breach was "..nHours.." hours and"..nMins.." minutes and "..nSecs.." seconds ago")
end

Men man måste då loopa igen alla dörr och rörelse sensorer som man vill ha och sedan visa den som var breached senast. Local variablar i scriptet id:n för sensorer och tiden för senaste rörelse. Och om värdet för senaste rörelse är t.ex över 60 min sätta en variabel till typ Movement = True/False. Hur skulle du enklast göra det?
jompa68
Proffsmedlem
Posts: 713
Joined: 12 Aug 2012, 08:53
Location: Hofors

20 Mar 2015, 16:02

Här är en komplett lösning för motion sensors
Capture.PNG
Capture.PNG (14.89 KiB) Viewed 5306 times

Code: Select all

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

startFunc = function()
mDevicesbl = {}
local httpClient = net.HTTPClient(); 
httpClient:request('http://127.0.0.1:11111/api/devices', { 
    success = function(resp) 
      local devices = json.decode(resp.data) 
      	for i, v in pairs(devices) do
          	if v.baseType == "com.fibaro.motionSensor" then
        		table.insert(mDevicesbl,v.id)
          	end
        end
        motionDevFunc()
    end, 
    error = function(err) 
      print('error = ' .. err) 
    end, 
    options = { 
      method = 'GET' 
    }
})
end

motionDevFunc = function()
	for i = 1,#mDevicesbl do
    	deviceItems = mDevicesbl[i];
		elapsedTime = os.difftime(fibaro:getValue(deviceItems, "lastBreached"),os.time())
		telapsedTime = string.sub(elapsedTime,2) -- don't want the - value.

		nHours = string.format("%02.f", math.floor(telapsedTime/3600));
		nMins = string.format("%02.f", math.floor(telapsedTime/60 - (nHours*60)));
		nSecs = string.format("%02.f", math.floor(telapsedTime - nHours*3600 - nMins *60));
		if nHours == "00" then
			fibaro:debug("Last breach was "..nMins.." minutes and "..nSecs.." seconds ago")
		elseif nHours ~= "00" then
      		fibaro:debug("More then 1hour since last breach")
      		--fibaro:setGlobal("Movement", "True")
  			fibaro:debug("Last breach was "..nHours.." hours and "..nMins.." minutes and "..nSecs.." seconds ago")

		end

	end
end

startFunc()


--------------------------------------------------
http://jonnylarsson.se
Bamsefar
Z-Wave Kung
Posts: 1059
Joined: 25 Nov 2013, 15:06
Location: Stockholm

20 Mar 2015, 16:29

Jag svarar mig själv då jompa inte kan: All kod som jompa skriver är enkom för version 4.x - inget av ovanstående fungerar i v3.590.
Använder HomeSeer 3 på Linux - attans så här bra har det aldrig varit!

Lua för nybörjare
jompa68
Proffsmedlem
Posts: 713
Joined: 12 Aug 2012, 08:53
Location: Hofors

20 Mar 2015, 16:47

Bamsefar wrote:Jag svarar mig själv då jompa inte kan: All kod som jompa skriver är enkom för version 4.x - inget av ovanstående fungerar i v3.590.
Stämmer Bamsen! Det ÄR för v4.x
--------------------------------------------------
http://jonnylarsson.se
Svartbacken
Medlem
Posts: 44
Joined: 02 Mar 2015, 17:01
Location: Uppsala

20 Mar 2015, 17:12

Super Tack.

Funkar kanon. Men :) kan man även få med "com.fibaro.doorSensor" ?
jompa68
Proffsmedlem
Posts: 713
Joined: 12 Aug 2012, 08:53
Location: Hofors

21 Mar 2015, 11:08

Code: Select all

--[[
%% properties

%% globals
--]]

startFunc = function()
mDevicesbl = {}
local httpClient = net.HTTPClient(); 
httpClient:request('http://127.0.0.1:11111/api/devices', { 
    success = function(resp) 
      local devices = json.decode(resp.data) 
      	for i, v in pairs(devices) do
          	if v.baseType == "com.fibaro.motionSensor" or v.baseType == "com.fibaro.doorWindowSensor" then
        		table.insert(mDevicesbl,v.id)
          	end
        end
        motionDevFunc()
    end, 
    error = function(err) 
      print('error = ' .. err) 
    end, 
    options = { 
      method = 'GET' 
    }
})
end

motionDevFunc = function()
	for i = 1,#mDevicesbl do
    	deviceItems = mDevicesbl[i];
		elapsedTime = os.difftime(fibaro:getValue(deviceItems, "lastBreached"),os.time())
		telapsedTime = string.sub(elapsedTime,2) -- don't want the - value.

		nHours = string.format("%02.f", math.floor(telapsedTime/3600));
		nMins = string.format("%02.f", math.floor(telapsedTime/60 - (nHours*60)));
		nSecs = string.format("%02.f", math.floor(telapsedTime - nHours*3600 - nMins *60));
		if nHours == "00" then
			fibaro:debug("Last breach was "..nMins.." minutes and "..nSecs.." seconds ago")
		elseif nHours ~= "00" then
      		fibaro:debug("More then 1hour since last breach of id:"..fibaro:getName(deviceItems))
      		fibaro:debug("Last breach was "..nHours.." hours and "..nMins.." minutes and "..nSecs.." seconds ago")

		end

	end
end

startFunc()
--------------------------------------------------
http://jonnylarsson.se
CQ1
Medlem
Posts: 29
Joined: 03 Jul 2012, 09:57

22 Mar 2015, 09:04

Jag var ute i samma ärende för ett tag sen men gjorde istället en scen som triggas av någon av de sensorer jag är intresserad av. Scenen lagrar när och var i globala variabler som sen visas upp i en virtuell enhet.

Två globala variabler latestMotion och latestMotionID.

En scen (byt förstås ut till egna enhetsid:n under properties-delen):

Code: Select all

--[[
%% properties
268 value
265 value
286 value
271 value
274 value
277 value
280 value
283 value
296 value
299 value

%% globals
--]]

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

local trigger = fibaro:getSourceTrigger();
local sensorID = trigger["deviceID"];
local currentTime=tonumber(os.time());

if (tonumber(fibaro:getValue(sensorID, "value")) == 1 ) then 

  fibaro:setGlobal("latestMotion", currentTime);
  fibaro:setGlobal("latestMotionID", sensorID);

end;
En virtuell enhet med en label lblLatestMotion och en main loop:

Code: Select all

local latestMotion = tonumber(fibaro:getGlobalValue("latestMotion"));
local latestMotionID = fibaro:getGlobalValue("latestMotionID");
local ct = tonumber(os.time());
local diff = math.floor((ct - latestMotion)/(60));
local room =  fibaro:getRoomNameByDeviceID(latestMotionID);
local selfID = fibaro:getSelfId();

fibaro:call(selfID, "setProperty", "ui.lblLatestMotion.value", diff .. " min sedan i " .. room);

fibaro:sleep(1000*60*1);
Skärmavbild 2015-03-22 kl. 08.10.14.png
Skärmavbild 2015-03-22 kl. 08.10.14.png (17.86 KiB) Viewed 5188 times
Det är en ganska användbar lösning då man i scenen kan lägga in t.ex. att en scen ska köras om det är rörelse i ett visst rum samt att virtuella enhetens main loop kan användas till att köra funktioner om det inte varit rörelse i huset på ett tag.

/CQ1
Svartbacken
Medlem
Posts: 44
Joined: 02 Mar 2015, 17:01
Location: Uppsala

24 Mar 2015, 19:51

CQ1 wrote:Jag var ute i samma ärende för ett tag sen men gjorde istället en scen som triggas av någon av de sensorer jag är intresserad av. Scenen lagrar när och var i globala variabler som sen visas upp i en virtuell enhet.

Två globala variabler latestMotion och latestMotionID.

En scen (byt förstås ut till egna enhetsid:n under properties-delen):


/CQ1

Hej

Jag får detta när jag kör scenen.

[ERROR] 18:46:40: Runtime error: /opt/fibaro/FibaroSceneAPI.lua:91: attempt to concatenate local 'deviceId' (a nil value)

Vad kan det vara för fel?
CQ1
Medlem
Posts: 29
Joined: 03 Jul 2012, 09:57

24 Mar 2015, 22:02

Tjena,

Scenen körs automatiskt när någon sensor reagerar. Då finns det ett värde på variabeln. Man ska alltså inte köra scenen manuellt.
Svartbacken
Medlem
Posts: 44
Joined: 02 Mar 2015, 17:01
Location: Uppsala

25 Mar 2015, 06:24

Tack.

Funkar så klart, skulle kanske förstått det :oops:
dadid
Medlem
Posts: 86
Joined: 29 Jan 2013, 16:32

14 Apr 2015, 20:54

Hade det inte varit himla trevligt om fibaro lagt in en sida med grafer eller tidslinjer i gränssnittet. Skulle vilja ha mina rörelsesensorer representerade som vars en linje med synliga pulser när de triggats. Alternativt kinde datan presenteras som olikfärgade flashar på tidslinjen. Linjen bör då vara zoombar.
Nåja, detta kanske kommer i version 6.2



Skickat från min iPad med Tapatalk
Post Reply