YOGYUI

힐스테이트 광교산::도어폰 카메라 - 애플 홈킷 연동 (2) 본문

홈네트워크(IoT)/힐스테이트 광교산

힐스테이트 광교산::도어폰 카메라 - 애플 홈킷 연동 (2)

요겨 2022. 7. 27. 21:27
반응형

 

2. FFServer + FFMpeg 환경 구축

광교아이파크때와 마찬가지로 라즈베리파이에 FFMpeg와 FFServer를 설치하고, 도어폰 Composite 비디오 신호를 웹으로 스트리밍해보자

Raspberry Pi - ffmpeg + ffserver 동작환경 설정하기

 

Raspberry Pi - ffmpeg + ffserver 동작환경 설정하기

ffserver는 ffmpeg 패키지 빌드 N-89274-g6b35a83(2018-01-06) 버전부터 제외되었다 때문에 최신 버전 라즈비안에서는 ffserver를 사용할 수 없다 ffserver가 포함된 최종 commit 버전은 2ca65fc이므로 git에서..

yogyui.tistory.com

라즈베리파이로 Apple HomeKit 카메라 만들기 (Homebridge)

 

라즈베리파이로 Apple HomeKit 카메라 만들기 (Homebridge)

라즈베리파이에 장착된 카메라를 애플 홈킷의 카메라 액세서리로 등록해서 집안을 실시간으로 모니터링하는 간단한 방법을 알아보자 구현 방안을 요약하면 다음과 같다 라즈베리파이 + 카메라

yogyui.tistory.com

 

ffserver 환경설정 파일 역시 아이파크때와 유사하게 작성해주자

$ sudo nano /etc/ffserver_hillstate_door.conf
HTTPPort 8090
HTTPBindAddress 0.0.0.0
MaxHTTPConnections 2000
maxClients 1000
MaxBandwidth 10000

<Feed feed.ffm>
  File /tmp/ff_feed_hillstate_door.ffm
  FileMaxSize 200M
</Feed>

<Stream main>
  Feed feed.ffm
  Format mpjpeg
  VideoFrameRate 30
  VideoSize 480x320
  VideoBufferSize 80000
  VideoBitRate 10000
  NoAudio
</Stream>

<Stream stat.html>
  Format status
</Stream>

<Redirect index.html>
  URL http://www.ffmpeg.org/
</Redirect>

스트리밍 포트로 8090을 잡아준 뒤, nginx 설정 파일에서 8091 포트로 SSL 접속이 가능하게 설정해주자

(homebridge는 SSL이 필요없긴 하지만..)

$ sudo nano /etc/nginx/sites-available/home_network_server.conf
server {
    listen 8091;
    listen [::]:8091;
    server_name {공유기의 DDNS}
    
    ssl on;
    ssl_certificate {SSL 인증서 파일 경로}
    ssl_certificate_key {SSL 키 파일 경로}
    
    proxy_buffering off;
    
    location / {
        proxy_pass http://localhost.8090;
        proxy_set_header Host $host;
        proxy_redirect http:// https://;
        proxy_http_version 1.1;
    }
}

nginx 관련 설정 및 방화벽 설정법은 다음 링크 참고

광교아이파크::Bestin 현관카메라 애플 홈킷 연동 (2) - Final

 

광교아이파크::Bestin 현관카메라 애플 홈킷 연동 (2) - Final

[라즈베리파이 환경] Motherboard Raspberry Pi 4 Model B Rev 1.2 Kernel Linux 5.10.52-v7I+ (armv7I) Operating System Raspbian GNU/Linux 10 (buster) 5. 라즈베리파이에서 영상 확인 라즈베리파이에서 간단..

yogyui.tistory.com

 

3. Homebridge 액세서리 추가

{
    "platform": "Camera-ffmpeg",
    "mqtt": 127.0.0.1,
    "portmqtt": 1883,
    "usermqtt": "mqtt auth id",
    "passmqtt": "mqtt auth password",
    "cameras": [
        {
            "name": "doorphone",
            "manufacturer": "Hyundai HT",
            "model": "HDC-100S",
            "motion": true,
            "switches": true,
            "videoConfig": {
                "source": "-i 127.0.0.1:8091/main",
                "maxStreams": 2,
                "maxWidth": 480,
                "maxHeight": 320,
                "maxFPS": 30
            },
            "mqtt": {}
        }
    ]
}

Homebridge config 파일을 위와 같이 수정후 재시작해준 뒤, 아이폰으로 도어폰 비디오 영상이 잘 들어오는지 확인해보자 (월패드 '현관보기' 기능을 켜둔 채로)

영상이 잘 보인다! ㅎㅎ

인증용(?) 동영상도 하나 찍어봤다

 

4. 월패드 조작 없이 카메라 전원 켜기 기능 추가

힐스테이트 광교산::도어폰 카메라 - 애플 홈킷 연동 (1)

 

힐스테이트 광교산::도어폰 카메라 - 애플 홈킷 연동 (1)

현관문 옆에 매립되어 있는 도어폰은 카메라와 마이크가 장착되어 있으며, 영상과 음성이 거실의 월패드로 전송된다 (초인종을 호출했을 때 방문자의 사진이 월패드에 기록된다) 도어폰에 제품

yogyui.tistory.com

앞서 도어폰 UTP 케이블을 분석했을 때, 카메라 전원에 해당하는 6번선 (라벨명 CPWR)의 전압 레벨은 월패드 '현관보기' 기능이 꺼져있을 때는 0V, 켜져있을 때는 DC +12V였다

그런데, 3번선 (라벨명 SUB12V)는 카메라 전원 On/Off 유무와 상관없이 항상 DC +12V가 월패드로부터 인가되고 있었기 때문에 3번선을 6번선에 단락(short)시켰을 때 카메라 전원이 월패드 조작없이 켜지는 것을 확인할 수 있었다!

 

항상 단락시켜둘 수는 없기에, 라즈베리파이의 GPIO와 릴레이(Relay)를 사용해서 월패드 조작없이 외부에서 카메라에 전원을 On/Off할 수 있는 기능을 만들어보기로 했다

 

UTP케이블 - 릴레이 - 라즈베리파이를 다음과 같은 결선도로 구성해봤다

릴레이모듈 연결
라즈베리파이 GPIO 연결

 

그리고 기존 홈네트워크 파이썬 코드에 'DoorPhone' 클래스를 추가하고 단순히 GPIO로 릴레이를 동작시켜 카메라 전원을 On/Off할 수 있게 구현~ (RPi.GPIO 모듈 활용하면 코드 한줄로 I/O 제어가 가능하다)

import json
from Device import *
import RPi.GPIO as GPIO

class DoorPhone(Device):
    gpio_cam_relay: int = 0

    def __init__(self, name: str = 'DoorPhone', **kwargs):
        super().__init__(name, **kwargs)
        self.state_cam_relay = 0
        self.setParams(18)
    
    def __repr__(self):
        repr_txt = f'<{self.name}({self.__class__.__name__} at {hex(id(self))})'
        repr_txt += '>'
        return repr_txt
    
    def publish_mqtt(self):
        obj = {"cam_power": self.state_cam_relay}
        if self.mqtt_client is not None:
            self.mqtt_client.publish(self.mqtt_publish_topic, json.dumps(obj), 1)

    def setParams(self, gpio_cam_relay: int):
        self.gpio_cam_relay = gpio_cam_relay
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(self.gpio_cam_relay, GPIO.OUT)
    
    def updateState(self, state: int, **kwargs):
        if not self.init:
            self.publish_mqtt()
            self.init = True

    def turn_on_camera(self):
        self.state_cam_relay = 1
        GPIO.output(self.gpio_cam_relay, GPIO.HIGH)
        self.publish_mqtt()
    
    def turn_off_camera(self):
        self.state_cam_relay = 0
        GPIO.output(self.gpio_cam_relay, GPIO.LOW)
        self.publish_mqtt()

 

월패드 조작없이 카메라 전원 제어가 가능한지 테스트해보자

Very Good~!!

 

이제 남은건 EXTDEV-1A, 1B 선에서 오가던 시리얼 패킷 후킹, 그리고 DPLN 신호로 오가는 음성 신호까지 연동해보는 작업들... 일단 쉬워보이는 시리얼 통신부터 해보기로 ㅎㅎ

 

To be continued...

 

반응형