Home Assistant (ESPHome)+ ESP32+리드센서를 이용한 원격 가스검침 하기

  • 카카오톡 공유하기
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 링크 복사하기

요즘은 원격 검침이 흔한 컨셉일테지만, 아직도 기술의 그늘(?)에 있는 오래된 집의 가구에서는 원격 검침 자체가 어려운 환경인 곳이 많습니다. 자주 이용하는 카페에서 구형 가스 게이지에 리드 센서를 부착하여 검침 바늘이 회전하면서 자력이 감지되는 사이클을 이용한 원격가스 검침을 시도한 경우가 있어서 실제 사용을 해본 사례입니다.

ESP Aduino를 사용해야 하는 경우에는 ESPHome에 대해서도 학습이 필요한데, 다음 링크(https://esphome.io/)를 통해서 주요 예제, 구문 등에 대하여 미리 알아두시길 바랍니다.

가스검침을 어떻게 원격으로 하나?

컨셉은 이렇습니다. 가스 게이지의 맨 우측의 3자리 카운터는 가스 사용에 따라 숫자가 증가되는데, 숫자중에 한 곳에 자석이 붙어있으므로, 자석이 리드센서와 가까이 붙으면서 사이클이 1회 진행된 것을 감지하여 이를 카운트 하여 최종의 사용량을 산정하는 방식입니다.

<계량기 기업별 리드센서>
<리드 센스 연결>
<실제 배선 연결>

ESP-WROOM-32 와 리드센스 연결도

보드는 ESP-WROOM-32입니다.
관련링크: https://lastminuteengineers.com/esp32-wroom-32-pinout-reference/
연결은 USB로 부터 공급받는 5V(C-type)연결 및 리드센스 연결로 비교적 간단합니다.
보드와 각 핀드의 연결은 아래의 그림을 참고해주시길 바랍니다.

ESP보드에 플러싱할 코드

esphome:
  name: gasmeter
  friendly_name: gasMeter

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

preferences: 
  flash_write_interval: 60min  

# Enable Home Assistant API
api:
  encryption:
    key: "********************************************"

  #나중에 개발자 옵션에서 서비스로 gas_meter_calibration을 불러와서 원하는 값으로 글로벌 값을 수정할수 있습니다.
  services: 
    - service: meter_calibration
      variables:
        meter_counter: float
      then:
        - globals.set:
            id: gas_meter_global
            value: !lambda |-
              return id(gas_meter_global) = meter_counter;

        - sensor.template.publish:
            id: gas_meter
            state: !lambda 'return id(gas_meter_global);'

ota:
  - platform: esphome
    password: !secret ota_password

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip:
    static_ip: 192.168.***.***
    gateway: 192.168.***.***
    subnet: 255.255.255.0

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: !secret ap_ssid
    password: !secret ap_password

captive_portal:

globals:
  - id: gas_meter_global
    type: float
    restore_value: true
    initial_value: '1428.98' #// 초기 값은 0.0 으로 하시고 나중에 HA의 서비스에서 값을 변경하셔도 됩니다.

sensor:
  - platform: template
    name: "gasMeter Total"
    id: gas_meter
    update_interval: never
    unit_of_measurement:
    accuracy_decimals: 2 #간혹 검침기의 리드스위치가 소숫점 둘째 자리가 아니라 셋째 자리를 기준으로 한다면 여기를 3으로 변경하시기 바랍니다.
    state_class: 'total_increasing'
    device_class: 'gas'
    icon: mdi:counter

binary_sensor:
  - platform: gpio
    name: "gasMeter Pulse Counter"
    pin:
      number: GPIO33
      mode: INPUT_PULLUP
      inverted: true
    filters:
      - delayed_on: 100ms
      - delayed_off: 100ms
    on_press:
      then: #간혹 검침기의 리드스위치가 소숫점 둘째 자리가 아니라 셋째 자리를 기준으로 한다면 여기를 0.001으로 변경하시기 바랍니다.
        - globals.set:
            id: gas_meter_global
            value: !lambda |-
              return id(gas_meter_global) += 0.01; 
        - sensor.template.publish:
            id: gas_meter
            state: !lambda 'return id(gas_meter_global);'  
  - platform: status
    name: "Gas Meter Status"
    

위 코드를 보드에 등록하기 위해 USB연결을 통해서 한번은 플러싱을 해줘야 합니다. 이후 Wifi모듈을 통해서 HA를 통해 해당 모듈에 대한 수정 및 업데이트가 가능합니다. 와이파이 연결 정보 및 핀(GPI033)에 대한 정보를 정확하게 해줘야 합니다.

플러싱을 위해 USB와 보드 연결을 도와주는 유틸을 아래 경로에서 다운로드 받았습니다.

https://www.silabs.com/developer-tools/usb-to-uart-bridge-vcp-drivers?tab=downloads
https://docs.espressif.com/projects/esp-test-tools/en/latest/esp32/production_stage/tools/flash_download_tool.html#tool-overview

HA에 접속하여 설정 > 애드온 > ESP Home Device Builder 로 이동합니다. (Core버전 기준입니다. HACS에서는 직접 ESP Home을 소개 페이지로 이동할수 있었던것으로 기억합니다.)


여기서 “웹UI 열기”로 들어가 “New Device”를 클릭합니다.

디바이스명(“Gas Meter”)을 입력합니다.

USB로 ESP보드를 연결하여 “Connect”를 누릅니다. 시리얼 포트에서 연결이 가능한 포트를 선택하고 , 플러싱을 진행합니다.

이후 수정에 대해서는 ESP Home에서 “Edit”, 또는 Install (Wirelessly) 을 해서 새로운 수정을 wifi로 반영할수 있습니다.

Gas Meter로 부터 매일 늘어난 부분에 대한 증가량을 기준으로 에너지 영역에서 대시보드로 모니터링할 수 있습니다.

위와 같은 그래프를 얻기 위해서는 디바이스로 부터 받은 값을 utility_meter로 정의해줘야 하며, configuration.yaml에 다음과 같이 정의하였습니다. sensor.gasmeter_gasmeter_total 로 정의된 센서로 누적된 값을 기간별로 잘라서 에너지 영역에서 활용할 수 있도록 해줘야 합니다.

# confifuration.yaml

utility_meter:
  gas_yearly_meter:
    source: sensor.gasmeter_gasmeter_total
    name: Gas Yearly Meter
    cycle: yearly
  gas_monthly_meter:
    source: sensor.gasmeter_gasmeter_total
    name: Gas Monthly Meter
    cycle: monthly
  gas_weekly_meter:
    source: sensor.gasmeter_gasmeter_total
    name: Gas Weekly Meter
    cycle: weekly
  gas_daily_meter:
    source: sensor.gasmeter_gasmeter_total
    name: Gas Daily Meter
    cycle: daily
  gas_hourly_meter:
    source: sensor.gasmeter_gasmeter_total
    name: Gas Hourly Meter
    cycle: hourly 

위 설정을 통해서 대시보드에서는 한시간, 하루, 주당, 월당 사용량을 얻을 수 있습니다.

결론

도시가스의 원격검침은 조만간 금방 실생활로 확대 될수 있을것 같습니다. 우선, 지금의 상황에서 할수 있는 방법을 카페와 인터넷을 뒤져서 방법을 찾아서 만들어 보았습니다. 허나, 다음과 같은 문제점이 있었습니다.

  1. ESP Board에 전력공급이 끊기는 동안은 기록이 되지 않음. (메모리에 담아서 재 연결되는 시점에 갭을 보완하는 방법이 필요)
  2. 센서에 의한 카운팅이 실제 사용량에 대한 오차가 매달 발생됨.

그러나, 카운팅에 대한 오차가 발생하더라도 전체 사용에 대한 추세를 이해하는데는 어려움이 없어서 지속적으로 사용하기로 결정하였습니다. 비교적 간단한 구성이지만, 과정에 대한 이해가 필요하여 향후 비슷한 도전을 하시는 분들에게도 도움이 되었으면 합니다.

같이 보면 재미있는 글:

[Home Assistant] 삼성SDS 이지온 월패드(SHT-7170) + HA 연동하기 [실패기]

댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다