모션 센서를 활용한 재실및 인원 체크,이동 경로 확인 및 에너지 제어에 적용하는 방법
"Panel"은 난방,냉방,습도,스프링쿨러,보안 같은 기능을 제공하는 관련장치들을(센서,디바이스..)그룹으로 쉽게 관리할수 있게 해주는 기능인데,패널을 사용하면 별다른 프로그래밍 기술이 없더라도 강력한 기능을 누구나 쉽게 만들수 있습니다.
예를 들어 Panel을 냉난방에 활용하면 각방마다 마치 NEST 온도조절기가 설치된 것 같은 지능적인 환경의 냉난방 컨트롤이 가능해집니다.
변수를 지정했으면 이제 Fibaro의 스크립트 언어인 Lua로 다음을 작성합니다.
대부분의 컨트롤러는 전문 스크립팅 기능을 제공하므로 파워 유저가 보다 효율적이거나 복잡한 장면을 프로그래밍 할 수 있습니다.
Fibaro 컨트롤러의 고급 장면기능은 LUA1 (일반적인 홈 오토메이션 스크립팅 언어)로 프로그래밍됩니다.
Z-Wave 시스템의 거의 모든 자동화는 '장면'에 의해 제어됩니다.
예를 들어, 하루 중 특정 시간대에 모션이 감지되면 조명이 켜지거나 리모콘의 간단한 버튼 누름으로 여러 가지 일이 발생합니다.
이러한 장면의 대부분은 표준 장면 편집기에서 만들수 있지만 더 복잡한 장면은 실제로 스크립팅 언어를 사용하여 훨씬 쉽게 만들 수 있으며 일부 극단적인 경우 스크립트를 사용하여야만 만들 수 있습니다.
이런 예로는 복잡한 다중 구역 냉난방 시스템2 또는 보다 진보된 동작 활성화 조명 제어 같은 경우에 특히 해당됩니다.
Fibaro 에서 Scenes 를 선택후 Add scene한 후 원하는 이름을 지정하고 방의 위치도 지정합니다.
저의 경우
이름은 : 아이들방 재실인원
위치 : 공부방 으로 했습니다.
그후 Advanced 탭을 선택합니다.
local motionInside = **
local motionOutside = **
이부분에의 **를 2번 ,1번 모션센서 id로 교체해야합니다.
모션센서 ID 알수 있는 방법은 위의 사진에 있습니다.
우리는 재실여부와 재실인원을 카운터 하고자 하는 경우이니 방안에 있는 1번 모션센서가 local motionInside
거실쪽의 2번 모션센서가 local motionOutside = ** 입니다.
--[[
%% properties
325 value
330 value
%% globals
--]]
-- change these and the triggers to match the IDs of the two motion sensors
local motionInside = **
local motionOutside = **
-- this scene should only be run from the sensors
local trigger = fibaro:getSourceTrigger()
if (trigger['type'] ~= 'property') then
fibaro:abort()
end
-- Only allow one instance of the current scene to run at a time
if (fibaro:countScenes() > 1) then
fibaro:abort()
end
local debugLevel = 5
function dbug (message, level)
if (debugLevel >= level) then
fibaro:debug(message)
end
end
local firstTrigger = tonumber(trigger['deviceID'])
local lastTrigger = 0
local both = false
local motionOnInside = false
local motionOnOutside = false
repeat
motionOnInside = (tonumber(fibaro:getValue(motionInside, 'value')) > 0)
motionOnOutside = (tonumber(fibaro:getValue(motionOutside, 'value')) > 0)
if ((motionOnInside or motionOnOutside) and (not (motionOnInside and motionOnOutside))) then
if both then
dbug('motionOnInside: ' .. tostring(motionOnInside), 20)
dbug('motionOnOutside: ' .. tostring(motionOnOutside), 20)
if (motionOnInside) then
lastTrigger = motionInside
dbug('So! Last Trigger: ' .. lastTrigger, 20)
else
lastTrigger = motionOutside
dbug('Now! Last Trigger: ' .. lastTrigger, 20)
end
end
else
both = true
end
fibaro:sleep(10) -- let's be a little bit nice to the processor!
until not (motionOnInside or motionOnOutside)
local count = tonumber(fibaro:getGlobalValue('PeopleCount'))
if (lastTrigger ~= 0) then
dbug('First Trigger: ' .. firstTrigger, 15)
dbug('Last Trigger: ' .. lastTrigger, 15)
dbug('motionInside: ' .. motionInside, 15)
dbug('motionOutside: ' .. motionOutside, 15)
if (firstTrigger ~= lastTrigger) then
if (firstTrigger == motionInside) then
dbug('Going out!', 10)
if (count > 0) then
count = count - 1
end
else
dbug('Coming in!', 10)
count = count + 1
end
else
if (firstTrigger == motionInside) then
dbug('Out and in.', 10)
else
dbug('In and out.', 10)
end
end
fibaro:setGlobal('PeopleCount', count)
dbug('Count: ' .. count, 5)
else
dbug('Ignore', 11)
end
-----------------------------------------------------------------------------------
모션센서를 보면 감지되는 영역이 있습니다.
각도 상하좌우 얼마 이런식이죠.
감지범위가 넓다면 보안기능에 적용할시는 상당히 좋지만,
우리가 필요로 하는 것은 정확한 재실과 카운터 기능입니다.
위의 그림과 같이 설치를 하면 일반적인 모션 센서의 감지 영역입니다.
감지 영역이 넓어지면 재실과 카운터를 위해선 정확도가 떨어지고, 간혹 오류가 납니다.
저도,이부분에 대해서 시행착오와 어려움이 많았는데 다음과 같은 방법으로 해결했고 지금은 특수한 경우를 제외하고는 오차가없습니다.
모션센서의 감지 범위를 좁히기 위해(레이저처럼 측면에서 일자로 디텍팅이 되면 가장 좋음) 모션센서 양쪽에 플라스틱을 가이드처럼 붙혀 해결했습니다.
이렇게 하면 거의 정확한 결과를 얻을수 있습니다.
제가 100% 정확하다고 하지 않고 거의라고 한 이유는 만약 아이를 업거나,안아서 통과하는 경우,그리고 연달아 두사람이 1초이내에 빨리 방문을 통과하는 경우에는 1명으로 카운터 됩니다.
이 경우 말고는 일반적인 상황에서 99% 정확도 입니다.
'저에너지.패시브하우스를 위한 스마트장비 적용' 카테고리의 다른 글
대구 천연가스 기반 에너지 자립형 주거타운 (4) | 2018.01.02 |
---|---|
패시브하우스를 위한 보다 스마트한 난방방법에 대해.... (4) | 2017.12.13 |