DESIGN YOUR SMARTHOME



사람의 재실여부와 공간에 몇명의 사람이 있는지,그리고 실내에서 사람이 어느공간에서 어느 공간으로 이동했는지 정확하게 알수 있는 방법은 참 어렵습니다.

저의 경우도 여러 방법을 고민하다가 비콘의 indoor location 기능으로 어느 정도 해결을 했는데....문제는 항상 스마트폰같은  식별할수 있는 기기를 지니고 있어야 한다는 단점이 있습니다.

하지만,사람이 집에서 생활하면서 항상 스마트폰을 몸에 지니고 다니지는 않습니다.
사람몸에 chip을 이식하지 않는 한 사람의 재실여부나 몇명의 사람이 방안에 있는지 같은 정확한 정보를 알아내기는 정말 어렵습니다.

아파트의 경우는 평면이지만 주택의 경우는 보통 2층으로 되어있는 구조이고, 아파트 보다 공간이 가진 변수가 너무나 많기 때문에 더더욱 어려운 문제이기도 합니다.

 여기까지는 서론이고, 재실여부와 인원수 체크,사람의 이동이 주택의 에너지와 어떤관계가 있는지  최대한 간단하게 적겠습니다.

패시브하우스 라고 많이 들어보셨을겁니다.
냉난방비가 아주 절약이 되는집이죠.
패시브하우스는 현재의 기술로 지을수 있는 가장 과학적인 집입니다.

에너지를 적게 쓰면서 실내의 열을 외부와 최대한 차단해 불필요한 에너지 낭비를 없애기 위해  여러 기술을 사용합니다.

패시브하우스는 지금같은 계절의 난방에너지원을  
낮에 실내로 들어오는 태양열 열원, 
실내에서 발생하는 전자기기 발열,
실내공간에서의 인체의 발열을 주된 열원으로 여깁니다.

사람의 발열량도 1인당 68~70W 입니다.
만약 4인가족 기준으로 가족당 하루에 평균 10시간 실내에 있다고 예상하면 

70W x 3650시간( 10시간 x 365일) = 255,500W
255,500 X 4(인) = 1,022,000w/년    
1년에 1,022kwh 의 많은 에너지 입니다.

그런데,패시브 하우스의  난방부하는 10W/㎡ 는 입니다. 
(한국패시브건축협회의 자료 http://www.phiko.kr/bbs/board.php?bo_table=z3_01&wr_id=333  참고)

약 30평 주택(100㎡)의  패시브하우스 라면, 실제 난방이 필요한 면적은 85㎡이므로 난방부하는 10w x 85 = 850w/h 라는 계산입니다.
헤어 드라이기의 열량이 850w 이므로 집 전체를 난방하는데 드라이기 한대로 난방이 가능하다는 이야기가 됩니다.

정리하자면 만약 33 (약 10평)의 방을 난방한다면 330w/h 의 에너지가 필요하고 현재 방에서 사용중인 전자기기 발열,인체의 발열을 뺀 나머지 에너지만 투입하면 난방이 가능하다는 말이죠.

330w/h - 70w/h(인체) - ??(가전기기 발열 ) = *** w/h (난방에 필요한 에너지)

벌써 여기까지 읽고 다음에 제가 무슨 말을 할지 눈치를 채신분들도 있을겁니다.

주택의 내부에 사람이 몇명이 있는지 어느방에 있는지 어느방에 몇명이 있는지 방에서 방으로 이동한 사람이 정확히 체크가 된다면, 이 정보에 맞춰서 각실별로 정확한 난방에너지를 투입할수 있다는 계산이 나옵니다.

여기까지는  다음에 제가 구현한 방법을 이해하기 위한 사전지식입니다.

이제 실제 구현 방법입니다. 모션센서 2대로 재실및 인원카운터까지 하는 방법에 대한 내용입니다.

실재 제가 하고있는 프로젝트에 적용이 됩니다.

구현은 Fibaro로 구현을 했으며,아직 다른 Z-wave 컨트롤러로는 확인하지 않았습니다.

Fibaro는 컨트롤러의 성능도 뛰어나지만 각종 센서나 디바이스의 성능도 타 제품들에 비해서 뛰어납니다.

실시간 이라고 해도 무방할만큼 동시응답/동시반응을 보여주는 제품입니다.

복잡한 동작뿐만 아니라,동시에 여러 동작을 한꺼번에 처리하는 상황에서도 느려짐이나 버벅임은  전혀 없습니다.

Fibaro의 모션센서는 1초의 정확도로 동작을 정확하게 감지합니다.

그럼 이를 이용해 두 모션센서를 방문의 양쪽에 두고 입실과 퇴실 상황에서  두 모션센서간의 동작감지 시간차를 이용하면 재실센서와 사람인원까지 파악하는 카운터센서까지 가능하다는 결론이 도출됩니다.




방문을 기준으로 거실이나 복도쪽에 모션센서(2번), 방 안에 모션 센서(1번)가  있습니다.

2번이 먼저 디텍팅이 되고 방문을 통과해 1번이 디텍팅이 되면 +1명 카운터
위가 반복되면 다시 +1명 카운터 되어 +2명
반대의 경우 1번이 먼저 디텍팅이 되고 방문통과해 2번이 디텍팅 되면 -1 카운터

이렇게 프로그래밍 하면 된다는 계산이죠.

일단 Fibaro 모션센서를 더 민감하게 셋팅하기 위해 Fibaro 설정을 바꾸도록 하겠습니다.

Fibaro 허브 접속 후  device 에서 복도 모션센서를 선택하고 advanced 를 선택합니다.

* 여기서 모션센서 ID : 22 를 꼭 기억하세요 .


여기에서 parameter 1 = 8 , parameter 2 = 0 , parameter 6 = 1s 로 센서의 민감도를 재설정합니다.


다음은 사람을 카운터하기 위해 변수가 필요한데 변수는 각방마다 정해도 되고 특정방만 재실과,인원을 카운터하고 싶다면 원하는 갯수만큼 변수를 만들면 됩니다.

Fibaro 허브에서 panels 탭을 선택합니다.


Variables panel 을 선택후 Variables  란에 add후 People 변수를 지정합니다.

여기서 값에 1이 지정이 되어 있는데 현재 설정할 방에 사람이 먼저 있으면 사람수 대로 숫자를 적습니다.
아무도 없으면 0입니다.

여기서,참고로 "Panel"은 Fibaro의 막강한 기능입니다.

"Panel" 난방,냉방,습도,스프링쿨러,보안 같은 기능을 제공하는 관련장치들을(센서,디바이스..)그룹으로 쉽게 관리할수 있게 해주는 기능인데,패널을 사용하면 별다른 프로그래밍 기술이 없더라도 강력한 기능을 누구나 쉽게 만들수 있습니다.

예를 들어 Panel을 냉난방에 활용하면 각방마다 마치 NEST 온도조절기가 설치된 것 같은 지능적인 환경의 냉난방 컨트롤이 가능해집니다.

변수를 지정했으면 이제 Fibaro의 스크립트 언어인 Lua로 다음을 작성합니다. 

대부분의 컨트롤러는 전문 스크립팅 기능을 제공하므로 파워 유저가 보다 효율적이거나 복잡한 장면을 프로그래밍 할 수 있습니다.

Fibaro 컨트롤러의 고급 장면기능은 LUA1 (일반적인 홈 오토메이션 스크립팅 언어)로 프로그래밍됩니다.

Z-Wave 시스템의 거의 모든 자동화는 '장면'에 의해 제어됩니다. 

예를 들어, 하루 중 특정 시간대에 모션이 감지되면 조명이 켜지거나 리모콘의 간단한 버튼 누름으로 여러 가지 일이 발생합니다. 

이러한 장면의 대부분은 표준 장면 편집기에서 만들수 있지만 더 복잡한 장면은 실제로 스크립팅 언어를 사용하여 훨씬 쉽게 만들 수 있으며 일부 극단적인 경우 스크립트를 사용하여야만 만들 수 있습니다. 

이런 예로는 복잡한 다중 구역 냉난방 시스템2 또는 보다 진보된 동작 활성화 조명 제어 같은 경우에 특히 해당됩니다.

Fibaro 에서 Scenes 를 선택후 Add scene한 후 원하는 이름을 지정하고 방의 위치도 지정합니다.

저의 경우

이름은 : 아이들방 재실인원   

위치 : 공부방 으로 했습니다.

그후 Advanced 탭을 선택합니다.


advanced 탭에서 
다음의 코드를 복사해서 붙혀넣으면 됩니다.

여기서 2번 ,1번 모션 센서의 Id를 입력해야 합니다. 
아래 코드에서 

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% 정확도 입니다.



실제 동작이 되는 화면입니다. 입실,퇴실 정확히 체크 되며  사람의 카운터까지 정확히 체크 됩니다.

이때 사람이 몇명인지 볼려면 Panel -> variable panel -> peoplecount 에 보시면 카운터된 인원수가 나타납니다.

전 이런식으로 구성을 해서 현재 집안에 몇명이 있는지 어떤방에서 어떤방으로 이동했는지 1층에 몇명있는지 2층의 방에 몇명이 있는지 정확히 알수 있었습니다.

현관문이나 중문에 셋팅하면 외부인까지 체크가 정확히 됩니다.

다른 컨트롤러로도 적용이 될지는 모르지만 Fibaro제품들의 실시간 처리 능력으로 위와 같은 기능을 충분히 구현할수 있습니다.

이제 더이상  실내에서 스마트폰을 들고다니면서 접속정보로 재실을 판단 한다든지 카운터센서를 설치해서 사람을 체크하지 않으셔도 됩니다.

그냥 맨몸으로 실내를 다니셔도 원하시는 기능이 됩니다.

조명을 제어하고 도어락을 자동으로 제어하고 냉난방을 네스트로 제어하는 것은 쉽습니다.

이런 장비들을 이용해 쾌적한 주택환경과 정확한 에너지 제어에 활용할수 있는 방법은 아직 많지 않습니다.

또한 건축환경에 대한 지식과 홈 오토메이션의 기술을 어떤식으로 접목을 시킬것인지도 어렵습니다.

제가 정말 하고싶은 것은 건축환경과 에너지 제어,홈 오토메이션의 멋진 조화입니다.