● HA작업) DIY 가정용 에너지 모니터를 HAOS 에 연결 구동 준비: ESP32 + CT 센서 + Emonlib
♨ 카랜더 일정 :
2023년07월24일
본문
● DIY 가정용 에너지 모니터를 HAOS 에 연결 구동 준비: ESP32 CT 센서 Emonlib
기본정보 출처
https://www.speaktothegeek.co.uk/2022/08/esphome-ct-clamp-power-and-energy-monitor/
1차 구성 제품
https://t1.daumcdn.net/cfile/tistory/9914094C5B9D3EFA0D?original
https://ko.aliexpress.com/item/1005002434622543.html
esp32 5일배송 정보
1차 구입한 전류센서 구동 확인
주) 실제 측정과 상이하고 많은 튜닝이 필요합니다.
PIN14> A0 > OUT
PIN1> vdd 3.3v
PIN2,PIN2 > GND
1차 많은 정보 찾아 튜닝을 해야 하고 실제 값과 맞추기가 어렵다
예) 선풍기 37w를 동작중일째 맞추기와 전원 off시 0w로 맞추어 투닝
튜닝 예) 선풍기 37w를 동작중일째 는 맞출수 있는데
전원 off시 0w로 맞추기가 어렵고 중간 다른 장비 소비전력 측정시 맞는지 ,,,튜닝 필요함
==================> 실제 동작 사례를 적용한 소스가 있는 제품 구입 필요
기본정보 출처
https://www.speaktothegeek.co.uk/2022/08/esphome-ct-clamp-power-and-energy-monitor/
의 소스를 편집 맞추기가 어렵고 여기서 사용한 하드웨어 구입 필요
https://esphome.io/components/sensor/ct_clamp.html
https://www.ebay.com/itm/134557203318
https://www.speaktothegeek.co.uk/2022/08/esphome-ct-clamp-power-and-energy-monitor/
https://savjee.be/blog/Home-Energy-Monitor-ESP32-CT-Sensor-Emonlib/
https://www.speaktothegeek.co.uk/2022/08/esphome-ct-clamp-power-and-energy-monitor/
SCT-013-010 AC 전류 센서 10A 1V 비 침습성 분할 코어 전류 변압기 출력 전압
https://ko.aliexpress.com/item/32920116326.html
시하스 스마트 전력 미터 PMM-300 단상형 Wi-Fi/ ZIGBEE ST/HA(z2m) / 삼성스마트 싱스
상품 가격55,000원
https://smartstore.naver.com/sihas/products/5090577864
DIY Home Energy Monitor & CT sensors explained
어느 날 저는 궁금했습니다. 현재 우리 아파트에 전기가 얼마나 흐르고 있습니까? 온라인에서 Smappee 및 Sense와 같은 다양한 센서 장치를 찾았지만 상대적으로 비싸고 구독이 필요합니다. 그래서 ESP32와 SCT-013 센서로 나만의 것을 만들기로 결정했습니다. 전력 소비를 위한 나만의 Fitbit!
이 게시물 이후로 개선된 버전을 만들었습니다. 홈 에너지 모니터 V2에 대한 자세한 내용은 여기를 참조하십시오.
목표
시작하기 전에 프로젝트에 대해 다음 목표를 설정했습니다.
- 전체 아파트에 대해 비침습적 에너지 모니터를 만드십시오 . 의미: 와이어 커팅이 없고 모든 소켓과 전구 사이에 미터를 두지 않습니다.
- 전기 소비량을 정확하게 파악하기 위해 매초마다 측정을 합니다 .
- 나중에 사용 및 분석을 위해 모든 데이터를 클라우드에 저장하십시오 .
- 데이터를 시각화하고 시간 경과에 따른 추세를 분석하는 간단한 앱이 있습니다 .
이를 염두에 두고 저는 저만의 가정용 에너지 모니터링 장치를 만들기 시작했습니다!
부품
나는 AliExpress에서 부품을 찾는 것으로 시작했습니다. 저는 전기 회로 전문가가 아니므로 OpenEnergyMonitor 의 이 가이드를 따라 결국 다음 부품에 도달했습니다.
안건 | 가격 |
---|---|
ESP32 | €3,98 |
LCD 디스플레이(I2C) | €1,95 |
프로토보드 | €2,05 |
헤드폰 잭 | €3,30 |
커패시터(10µF) | €0,66 |
CT 센서 (YHDC SCT-013) | €10,99 |
저항기(10k ~ 470k Ω) | 이미 가지고 있었다 |
총 | €22,93 |
가장 중요한 두 가지 구성 요소는 분명히 ESP32 마이크로 컨트롤러와 CT 센서입니다.
ESP32
ESP32는 이전에 소규모 프로젝트에서 사용해 본 적이 있기 때문에 생각할 필요가 없습니다. 그들은 작고 프로그래밍하기 쉽고(Arduino 호환 가능) 많은 전력(240MHz 듀얼 코어 프로세서, 520K 메모리)을 가지고 있으며 인터넷에 직접 연결할 수 있는 내장 WiFi가 있습니다. 허브가 필요하지 않습니다.
CT 센서
다른 중요한 부분은 CT 센서(Current Transformer)입니다. 이 센서는 집의 메인 케이블을 고정하고 케이블 주변의 자기장을 전압으로 변환합니다.
저는 최대 30암페어(약 7000와트)의 전류를 측정할 수 있는 YHDC SCT-013-030을 선택했습니다. 내 작은 아파트에 충분합니다. 이 모델은 ESP32에 내장된 ADC를 사용하여 측정하기 쉬운 0과 1 사이의 전압을 출력합니다.
기타
나는 또한 장치 자체에서 실시간으로 전력 소비를 표시하기 위해 작은 LCD 디스플레이를 주문했습니다.
그리고 마지막으로 3,5mm 헤드폰 잭을 주문했습니다. 왜? CT 센서에는 3,5mm 커넥터가 있습니다. 내 초기 생각은 그것을 잘라서 와이어를 ESP에 직접 연결하는 것이 었습니다. 하지만 실제 3,5mm 잭을 사용하는 것이 더 좋을 것이라고 생각했습니다. 그렇게 하면 필요한 경우 센서를 교체할 수 있습니다.
배선
구성 요소가 도착하면 모든 것을 다음과 같이 연결했습니다.
참고: 저는 2x 100kΩ 저항을 사용했지만 10k에서 470k 사이의 저항 값을 사용할 수 있습니다. R1과 R2가 같은 값인지 확인하십시오.
먼저 모든 것이 작동하는지 확인하기 위해 브레드보드에서 시도한 다음 나중에 프로토보드로 옮겼습니다.
참고 사항: 더 이상 ESP32를 프로토보드에 직접 납땜하지 마십시오. 대신 이 암 커넥터를 사용하여 ESP32를 쉽게 교체할 수 있습니다(또는 나중에 용도 변경).
Fusion360에서 케이스 설계
프로토보드는 그다지 나빠 보이지 않습니다. 하지만 섹시하지도 않습니다. 그래서 소비자 제품이 될 수 있도록 케이스를 디자인하려는 의도로 Fusion 360을 시작했습니다(스포일러 경고: 그렇게 되지는 않을 것입니다).
저는 측면에 두 개의 컷아웃이 있는 케이스를 디자인하는 것부터 시작했습니다. 하나는 마이크로 USB 커넥터(모든 것에 전원을 공급하는 데 사용됨)용이고 다른 하나는 헤드폰 잭용(CT 센서를 연결할 수 있도록)입니다. 또한 프로토보드와 디스플레이를 지원하기 위해 중간에 여러 스탠드오프를 추가했습니다.
이것이 내가 끝낸 것입니다.
스탠드오프 위에 디스플레이를 장착하는 방법은 다음과 같습니다.
스탠드오프 상단에 디스플레이를 장착하고 아래 프로토보드를 위한 공간을 남겨두는 방법의 모형.
궁금한 점이 있으신가요? 예, 디스플레이와 나사의 더미 모델을 만들었습니다. 저는 3D 프린터로 보내기 전에 모든 것이 어떻게 잘 맞는지 확인하고 싶습니다.
케이스를 마무리하기 위해 두 개의 나사로 고정되고 디스플레이용 컷아웃이 있는 상단 뚜껑을 디자인했습니다. 아, 그리고 디스플레이는 덮개 상단과 같은 높이에 있습니다. 달콤한!
데이터 수집(AWS 사용)
그 후, 판독값을 분석할 수 있는 시스템으로 가져오고 싶은 방법에 대해 생각할 시간이었습니다.
OpenEnergyMonitor 직원들은 EmonCMS 라는 오픈 소스 시스템을 가지고 있습니다 . 에너지 모니터에서 데이터를 수집하도록 특별히 설계되었습니다. 직접 호스팅하는 Raspberry Pi에서 실행되거나 클라우드 서비스를 사용할 수 있습니다. 내 자신의 Pi를 호스팅하는 것은 의문의 여지가 없습니다. 나는 그것을 관리하고, 백업을 하고, 손상된 SD 카드 문제를 극복하는 데 관심이 없습니다. 클라우드 서비스를 사용하면 아무 것도 직접 할 필요가 없으며 데이터 피드당 연간 £1의 비용만 듭니다. 그러나 10초에 한 번만 데이터를 게시할 수 있으며 초당 하나의 데이터 포인트를 저장하고 싶었습니다.
그래서 나는 그것을 재미있는 연습으로 만들고 이 데이터를 수집할 수 있는 백엔드를 스스로 구축하기로 결정했습니다. 저는 AWS의 열렬한 사용자이며 그들의 IoT 서비스, Lambda 및 DynamoDB에 대한 경험이 있습니다. 따라서 AWS로 가는 것은 쉬운 일이 아니었습니다!
아키텍처를 설계하기 전에 몇 가지 목표를 (다시) 설정했습니다.
- 서버리스여야 합니다. 서버를 관리하고 싶지 않습니다.
- 고정 비용이 없습니다(사용한 만큼 지불).
- 여러 센서를 처리할 수 있어야 합니다(미래가 어떻게 될지 알 수 없음).
- 모든 데이터 속도를 처리할 수 있어야 합니다(이상적으로는 매초 1회 읽기).
- 절대 데이터를 버리지 마세요! 항상 보관하고 미래를 위해 보관하십시오. 흥미로운 것이 무엇인지 결코 알 수 없습니다.
이것은 내가 생각해 낸 아키텍처입니다.
설명하겠습니다. 왼쪽에 모니터링 장치가 있습니다. 30초마다 AWS IoT 서비스에 대한 MQTT 연결을 통해 30개의 판독값을 전송합니다. 메시지가 수신되면 원시 읽기를 DynamoDB 테이블에 쓰는 IoT 규칙이 트리거됩니다. 이것은 하루에 2880번(분당 2번, 하루에 1440분) 발생합니다.
작은 참고 사항: 기본적으로 AWS는 장치에서 오는 메시지를 하나 이상의 "리스너"(예: Lambda 함수)로 발송하는 메시지 브로커를 사용합니다. 그러나 이 경우에는 여러 소비자가 없습니다. 데이터는 바로 Dynamo로 이동해야 합니다. 따라서 AWS IoT의 기본 수집 기능 (25% 더 저렴함)을 사용하지 않아도 됩니다 .
데이터 보관
DynamoDB에 원시 데이터를 저장하면 최신 판독값을 쿼리하거나 오늘의 개요를 표시할 수 있어 좋습니다. 그러나 장기적으로 최선의 해결책은 아닙니다. 센서는 매일 2880개의 데이터 포인트를 생성합니다. 즉, 지난달 전기 소비량에 대한 개요를 보려면 DynamoDB가 최소 30*2880 또는 86.400 데이터 포인트를 반환해야 합니다. 이것은 많은 RCU(읽기 용량 단위)를 소비합니다.
대신 오래된 데이터를 DynamoDB에 계속 저장할 필요가 없다는 것을 깨달았습니다. 오래된 데이터를 오프로드하고 대신 S3에 저장할 수 있습니다! 그래서 저는 밤에 트리거되고 지난 날의 모든 판독값을 S3의 단일 CSV 파일에 보관하는 Lambda 함수를 만들었습니다.
(압축되지 않은 파일의 크기는 1.2MB이고 gzip 압축은 280KB로 줄어듭니다. 1년 분량의 데이터를 저장하려면 최대 438MB 또는 약 100MB 압축이 필요합니다.)
이렇게 하면 스토리지 비용이 절감될 뿐만 아니라 오래된 데이터를 훨씬 더 효율적으로 검색할 수 있습니다. 과거 특정 날짜의 모든 판독값을 가져오는 것은 S3에서 파일 1개를 가져오는 것만큼 간단합니다.
이 Lambda 함수를 설정한 후 DynamoDB의 TTL 기능을 활성화하여 원시 판독값이 7일 후에 테이블에서 자동으로 제거되도록 했습니다.
총 소비량 계산
이 야간 Lambda 함수는 전날에 사용된 총 전기량(kWh)도 계산합니다. 그런 다음 이 지표를 사용하여 시간 경과에 따른 일일 소비량을 시각화할 수 있습니다.
이 계산된 값은 DynamoDB에 저장되므로 빠르게 검색할 수 있고 다시 계산할 필요가 없습니다.
다음은 하루가 끝날 때 일어나는 일을 요약한 것입니다.
소송 비용
이 모든 비용은 정확히 $0 입니다 . 이 전체 아키텍처는 AWS 프리 티어에 속합니다(S3에 5GB 이상의 아카이브 데이터가 있거나 DynamoDB에 25GB 이상이 저장될 때까지).
아두이노 소프트웨어
클라우드 아키텍처가 준비되어 센서 데이터를 기다리고 있습니다! 이제 ESP32에서 실행할 소프트웨어 작업을 시작했습니다. Arduino 프레임워크를 사용하기로 결정한 이유는 설명서가 훌륭하고 사용할 준비가 된 라이브러리가 많이 있기 때문입니다(또한 Espressif SDK를 사용하는 것이 약간 두려웠기 때문입니다).
코드를 여러 섹션으로 나누겠습니다. 필요한 모든 라이브러리를 가져오고 몇 가지 구성 변수를 정의하는 것으로 시작했습니다.
그런 다음 현재 에너지 소비량과 IP 주소를 LCD 디스플레이에 쓰는 두 가지 도우미 함수를 작성했습니다. 그렇게 하면 코드의 다른 부분에서 재사용할 수 있습니다.
ESP가 계속해서 클라우드로 판독값을 보내길 원하므로 WiFi 연결이 필요합니다. 다시 말하지만 이를 위해 도우미 함수를 만들었습니다. WiFi...
연결을 시도하는 동안 디스플레이에 표시됩니다 . 또한 네트워크에서 신속하게 식별할 수 있도록 맞춤 호스트 이름을 사용하도록 ESP를 구성했습니다.
뷰PDF 1,2
office view
관련자료
-
링크
-
첨부
-
이전
-
다음
댓글목록
11qkr님의 댓글
11qkr 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 아이피 (192.♡.0.1) 작성일
# ct_clamp 기본설정
# Example configuration entry
sensor:
- platform: ct_clamp
sensor: adc_sensor
name: "Measured Current"
update_interval: 60s
# Example source sensor
- platform: adc
pin: A0
id: adc_sensor
====== 2차 수정 정보 =========
# Example configuration entry
sensor:
- platform: ct_clamp
sensor: adc_sensor
name: "Measured Current"
update_interval: 60s
filters:
- calibrate_linear:
# Measured value of 0 maps to 0A
- 0 -> 0
# Known load: 4.0A
# Value shown in logs: 0.1333A
- 0.1333 -> 4.0
# Example source sensor
- platform: adc
pin: A0
id: adc_sensor
11qkr님의 댓글
11qkr 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 아이피 (192.♡.0.1) 작성일
# 1차 동작 확인만 한 튜닝중인 소스입니다( 값이 맞지 않음)
esphome:
name: "lcd-pcf8574"
friendly_name: lcd-pcf8574
esp32:
board: esp32dev
framework:
type: arduino
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "Eg9F01BlbNKLrl71jUeP9d???U12pfhs="
ota:
password: "3dafa830aed9c91c94352b?????d"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Guest-Br-Node Fallback Hotspot"
password: "XtxEeD48klE6"
captive_portal:
# ===============================================================
binary_sensor:
- platform: gpio
pin: GPIO2
name: "PIR_Sensor"
device_class: motion
id: pin_d2
i2c:
scl: GPIO22
sda: GPIO21
time:
- platform: homeassistant
id: homeassistant_time
timezone: Asia/Seoul
sensor:
- platform: bme680
temperature:
name: "BME680 Temperature"
oversampling: 16x
filters:
- calibrate_linear:
- 0 -> 0
- 44.0 -> 42.2
pressure:
name: "BME680 Pressure"
humidity:
name: "BME680 Humidity"
filters:
- calibrate_linear:
- 0 -> 0
- 0.80 -> 0.76
gas_resistance:
name: "BME680 Gas Resistance"
address: 0x77
update_interval: 60s
- platform: homeassistant
id: temperature
entity_id: sensor.lcd_pcf8574_bme680_temperature
internal: true
- platform: homeassistant
id: humidity
entity_id: sensor.lcd_pcf8574_bme680_humidity
internal: true
- platform: homeassistant
id: current
entity_id: sensor.lcd_pcf8574_measured_current
internal: true
- platform: homeassistant
id: power
entity_id: sensor.lcd_pcf8574_power_sensor_live_power
internal: true
- platform: adc
pin: A0
id: adc_sensor
internal: true
- platform: ct_clamp
sensor: adc_sensor
name: "Power Sensor Live Power"
id: power_sensor_live_power
update_interval: 3s
accuracy_decimals: 0
filters:
- calibrate_linear:
- 0.0008 -> 0.03
- 0.036 -> 6.85
# - lambda: return x * id(power).state;
unit_of_measurement: "W"
display:
- platform: lcd_pcf8574
dimensions: 20x4
address: 0x27
id: mydisplay
user_characters:
- position: 1
data:
- 0b00000
- 0b00010
- 0b00101
- 0b00010
- 0b00000
- 0b00000
- 0b00000
- 0b00000
- position: 2
data:
- 0b01000
- 0b10101
- 0b01011
- 0b00110
- 0b01100
- 0b11010
- 0b10101
- 0b00110
lambda: |-
it.print(0, 0, "8574 > Power> ");
it.printf(14, 0, "%.1f W", id(power).state);
it.strftime(0, 1, "Date > %Y-%b-%d", id(homeassistant_time).now());
it.strftime(0, 2, "Time > %H:%M %a", id(homeassistant_time).now());
it.printf(0, 3, "Temp > %.1f C", id(temperature).state);
it.printf(11, 3, "\x01");
it.printf(14, 3, "%.1f ", id(humidity).state);
it.printf(18, 3, "\x02");
# https://esphome.io/components/display/lcd_display.html
# https://esphome.io/components/sensor/bme680.html?highlight=bme680
# 20230722_2101_38
11qkr님의 댓글
11qkr 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 아이피 (192.♡.0.1) 작성일♥간단_메모글♥
-
등록일 04.15가입 인사드립니다.댓글 6
-
등록일 04.09가입인사.댓글 4
-
등록일 03.03안녕하세여댓글 1
-
등록일 02.13
최근글
새댓글
-
등록자 유나아빠 등록일 13:14
-
등록자 닉넴짓기어려워 등록일 11.22
-
등록자 글자사랑 등록일 11.22
-
등록자 삽질황제 등록일 11.21
-
등록자 changgeol 등록일 11.21
오늘의 홈 현황
QR코드
☞ QR코드 스캔은 kakao앱 자체 QR코드