Samwoo Lithium Battery Display with W6100 SNMPv2c, Web Monitor, and RS-485 Pack Polling
ESP32-S3 7-inch display that polls two Samwoo lithium packs over RS-485 and serves them over a W6100 wired port via SNMPv2c, a web monitor, and IP Finder.
0
Project description
Overview
This project is the firmware and field tooling for a battery display module that reads two Samwoo lithium battery packs over RS-485 and shows the same values in three places: a 7-inch touch screen, a web monitor, and an SNMPv2c agent. The hardware is a Sunton ESP32-8048S070 board (ESP32-S3 with a 7-inch RGB touch panel) connected to a WIZ610 / W6100 SPI Ethernet module, and that wired port is the only path for SNMP, the web pages, and the IP Finder discovery service. Wi-Fi is used only to pull firmware updates, and Bluetooth LE is used only to give the device its Wi-Fi credentials and the update command.
This article describes the repository as of 2026-09-15, the date of its last push. The README points to Version.h for the current firmware version, and a pre-build script raises the patch number by one on every esp32_samwoo build, so the repository has no fixed release tag to cite.
The repository is more than a firmware folder. Next to src/ it carries a Flutter app (IFTECH SAMWOO) with a release APK, an SNMP MIB file (mib/SAMWOO_BAT_MIB_VER_01.MIB), an HTML user manual, a board interface drawing in DXF, Python tools including a packaged IPFinder.exe, and a Samwoo pack simulator. The README shows web screens that it says were captured from the device, and it reports a smoke test and a soak test. Both tests were run against the pack simulator, not against real Samwoo packs, and the repository contains no record of a field installation.
Hardware & Software Configuration
The device is built from off-the-shelf boards rather than a custom main board. The table below lists the parts that the README and source name.
| Part | What the repository says |
|---|---|
| Display and MCU | Sunton ESP32-8048S070: ESP32-S3 driving a 7-inch RGB touch panel directly, drawn with LVGL |
| Wired Ethernet | WIZ610 / W6100 module on SPI, RJ45 (TCP/IP) |
| Pack link | RS-485 on Serial1, 19200 8N1, battery packs at addresses 1 and 2 |
| Clock | DS1307 RTC |
| Board connectors | Power (0 / +48), TCP/IP (Ethernet), RS-485, drawn in doc/BoardInterface.dxf |
The board drawing is a DXF render rather than a photo; the drawing source is doc/BoardInterface.dxf with the silk label INVT_IPATH_DISP Rev2.0. The user manual also contains a photo of the main screen running on the device.
Additional photos are available in the original repository: https://github.com/kimjinhwa/DisplayModuleFonSunElecComAndSamwoo
On the software side, the project is a PlatformIO build. The default environment esp32_samwoo is the product firmware, and three more environments (hwtest_rtc, hwtest_rs485, hwtest_w610) each exercise a single chip on its own. The product environment pulls in khoih-prog/Ethernet_Generic@^2.8.1 and sets -DUSING_W6100. The screen layout is a SquareLine export under src/SquareUi/ (including the 16-cell view), the SNMP agent uses the Arduino_SNMP library, and the web pages live in SPIFFS. The flash layout is default_8MB.csv with app0/app1 OTA slots and a 1.5 MB spiffs partition.
pio run -e esp32_samwoo
pio run -e esp32_samwoo -t upload
The Python folder holds the tools that a technician or tester uses around the device: upload_web.py pushes the HTML from UploadFiles/, check_bms_web.py runs the smoke test, soak_bms.py runs the long test, snmp_check.py reads OIDs, and IPFinder.exe / SnmpFinder.py find the device on the LAN.
System Architecture
flowchart LR
P1["Samwoo pack 1"] -->|"RS-485<br/>19200 8N1"| MCU
P2["Samwoo pack 2"] -->|"RS-485<br/>19200 8N1"| MCU
APP["IFTECH SAMWOO app"] -->|"BLE: ssid, update"| MCU
OTA["OTA server<br/>esp32_samwoo.json"] -->|"Wi-Fi after reboot"| MCU
MCU["ESP32-S3<br/>Sunton ESP32-8048S070"] -->|"RGB, LVGL"| LCD["7-inch touch panel"]
MCU -->|"SPI, CS GPIO10"| W["WIZ610 / W6100"]
W -->|"UDP 161"| NMS["SNMP manager"]
W -->|"HTTP port 80"| WEB["Web browser"]
W -->|"UDP 1234"| IPF["IP Finder"]
![]()
The firmware runs as one cooperative main loop. In src/samwoo_poll.cpp the ESP32-S3 opens Serial1 at 19200 baud and polls pack addresses 1 and 2 with a framed request that starts with 0x3A and ends with an LRC checksum. The README is explicit that this is not standard Modbus. Polling is non-blocking (samwooPollTick()), so the loop keeps calling lv_timer_handler() for the screen and servicing the network in between. The decoded registers are kept in one table (samwooRegs), and paintMain() reads voltage, current, cell values, and temperature for each pack from it.
All three network services read that same register table. The README states that the web server, the SNMP agent, and IP Finder use the W6100 SPI bus only from loop(), and that there is no separate Ethernet task. The web endpoint /api/snmp-get, for example, does not open a second UDP socket; it reads samwooRegs directly. Keeping every SPI access on one thread is the project's own answer to bus contention between the display, the RS-485 poller, and the Ethernet chip.
Firmware updates take a different path on purpose. The phone app connects over BLE to a device named IFTECH_SW_<MAC> and sends the SSID, password, and then update. The device only stores an isUpdate flag and reboots; the README notes that BLE and Wi-Fi are never on at the same time. On the next boot src/main.cpp checks isUpdate before starting BLE, joins Wi-Fi, reads esp32_samwoo.json, compares its latest field with the device's VERSION, and flashes the newer image with Update.writeStream(). One inconsistency is worth knowing before deployment: the README gives the public update URL on port 80, while src/wifiOTA.cpp defines FW_UPDATE_BASE as http://ift.iptime.org:81/Esp32UploadFirmware.
The README reports two test runs, both against the bundled pack simulator. The smoke test got HTTP 200 for the login page and login, ok=true for both packs on /api/bms (simulator values 54.0 V and 52.8 V), and the value 540 for SNMP OID 1.3.6.1.2.1.32.1.8.0. The soak test, polling HTTP every 2 seconds plus SNMP, reached n=380 at about 13 minutes with http_err=0 and snmp_err=0, and HTTP responses took roughly 20–40 ms. The soak log itself is gitignored, so only the README summary is in the repository.
Market Perspective
The device sits in the battery monitoring system market, and the size of that market depends heavily on who is counting. For 2025, the three research pages that were opened directly put it between USD 7.78B (TechSci Research via GII) and USD 11.05B (Fortune Business Insights), and a fourth figure of USD 3.52B from Bosson Research was seen only in a search summary. Forecast growth rates run from 10.3% to 19.64% a year. Each firm defines the market differently, so these figures cannot be combined. The one figure that touches this project's niche directly is from a single source: Fortune Business Insights names telecommunication as the largest end-user group, at about 32%, driven by backup batteries at towers, data centers, and network hubs.
The same configuration already appears in commercial telecom lithium systems. EverExceed describes using RS485 to gather all battery data, uploading it to the LAN through SNMP, and showing the status of the batteries on a cabinet door display, and it pitches remote monitoring for unattended sites. DFUN sells battery monitoring for data centers and telecom sites with SNMP, Modbus, MQTT, and IEC61850. Neither publishes a price. The closest priced 7-inch alternative found is Victron's GX Touch 70 with its Cerbo GX base unit, but that pair is aimed at marine and off-grid use, its SNMP support was not checked, and the Cerbo GX is discontinued in favor of an MK2 model.
| Item | Price range | Source |
|---|---|---|
| Victron GX Touch 70 (7-inch commercial monitor screen) | $323.85 to $381.00 | Signature Solar |
| Victron Cerbo GX base unit (single source, bundled range with S-GX) | $217.60 to $248.20 | InvertersRUs |
| Sunton ESP32-8048S070 display board (model named in the README) | $21 to $28 | atomic14 |
| WIZ610io W6100 + RJ45 module (representative part of the same spec) | $9.29 to $15.67 | Arrow, X-On |
Adding the two Victron prices gives a commercial screen-plus-base cost of $541.45 at the low end ($323.85 + $217.60) and $629.20 at the high end ($381.00 + $248.20). On the parts side, the display board and the Ethernet module together come to $30.29 at the low end ($21 atomic14 lower bound + $9.29 Arrow 5,000-unit price) and $43.67 at the high end ($28 atomic14 upper bound + $15.67 X-On single-unit price). The README names the Ethernet part only as "WIZ610 / W6100", so WIZ610io is used here as the representative part of the same spec, and all three WIZ610io prices come from search summaries. The RS-485 transceiver and DS1307 RTC modules are cheap but priced in other currencies, and the 48 V power stage, enclosure, PCB assembly, and certification are not included, so this sum is a reference for the gap to a product, not a product cost.
The README never says why the design uses wired Ethernet. It only states that Ethernet carries SNMP, the web pages, and IP Finder, and that Wi-Fi is for OTA. A plausible reason, by inference, is that data centers and IT rooms commonly poll equipment with SNMP over Ethernet from a DCIM or NMS. Whether battery rooms make wireless impractical was not confirmed. The likely buyers would be pack suppliers or system integrators taking it as an OEM part, since it is built for one pack maker's two-pack setup, but actual customers and volumes were not found. Public pricing for SNMP battery monitors in the telecom and data center segment is scarce.
Role of the WIZnet W6100
The W6100 is the device's only wired network path, and every LAN-facing feature goes through it. The MCU is the ESP32-S3 on the Sunton board, and the module hangs off its SPI bus. src/board_pins.h sets chip select to GPIO 10 with MOSI 11, SCLK 12, and MISO 13, and notes that there is no RST or INT GPIO: the module is reset only by its own hardware reset. The firmware therefore polls the chip from the main loop instead of waiting for an interrupt.
The chip is on by default, not an option. In platformio.ini, the default environment esp32_samwoo adds khoih-prog/Ethernet_Generic@^2.8.1 with -DUSE_ETHERNET_GENERIC, -DETHERNET_USE_ESP32, and -DUSING_W6100, and it excludes the vendored eModbus and stock Ethernet libraries through lib_ignore. The W5500 references found in the repository belong to those excluded eModbus examples.
Bring-up happens in ethW610Begin() in src/eth_w610.cpp. It calls Ethernet.init(PIN_W610_CS) and Ethernet.begin(mac, ip, dns, gateway, subnet) with the static address stored on the device, then confirms the part with Ethernet.getChip() == w6100. setup() calls it once, and if it fails, loop() retries every 5 seconds and logs [ETH] retry W610.
Three services then open sockets on the chip through the Ethernet_Generic socket API. src/snmp_battery.cpp creates the SNMPv2c agent with community public and hands it a W6100 UDP socket with snmp.setUDP(ethW610SnmpUdp()). It serves pack 1 under 1.3.6.1.2.1.32.1 and pack 2 under 1.3.6.1.2.1.32.2, and port 161 comes from the Arduino_SNMP default rather than an explicit setting in the code. The web server in src/web_impl.inc, compiled into eth_w610.cpp, is an EthernetServer subclass started with sHttp->begin(sWebPort), factory port 80, serving /api/bms, /api/login, and /fileupload. src/ip_finder.cpp listens on UDP 1234 with sIpFinder.begin(ethW610IpFinderUdp()), answers discovery requests, and saves new IP, subnet, gateway, and web port values to NVS.
Put together, the data flow is: Samwoo pack registers arrive over RS-485 into samwooRegs on the ESP32-S3, the main loop formats them into SNMP responses, JSON for the web page, or IP Finder replies, and the ESP32-S3 writes those payloads to W6100 sockets over SPI. The W6100 handles UDP and TCP and sends them out of the RJ45 to the management LAN. Firmware images never travel over this path; they arrive over Wi-Fi. A separate hwtest_w610 environment (src/hwtests/hwtest_w610.cpp) checks the chip on its own and prints which WIZnet part it detected.
FAQ
Does the Ethernet port carry firmware updates? No. The README says wired Ethernet is for SNMP, the web pages, and IP Finder only. Updates are started over BLE from the IFTECH SAMWOO app and downloaded over Wi-Fi after a reboot.
Is the pack link Modbus? No. The README describes it as RS-485 at 19200 8N1 and says it is not standard Modbus; src/samwoo_poll.cpp builds frames that start with 0x3A and end with an LRC checksum.
How is the device found and re-addressed on a LAN? IP Finder (python/release/IPFinder.exe or python/SnmpFinder.py) searches on UDP 1234. The device answers, and the tool can change its IP, subnet, gateway, and web on/off and port. The README lists the default SNMP address as 192.168.0.57.
What are the default credentials? The web login defaults to admin / admin, and the SNMP community is public. Both should be changed before the device is placed on a shared network.
Has it been tested with real battery packs? The repository shows tests against a pack simulator only: a smoke test and a soak test of about 13 minutes with zero HTTP and SNMP errors. No test with real Samwoo packs or field installation is recorded.
About the Author
The repository is published under the GitHub account kimjinhwa, which has no public name or profile details. The project names point to IFTECH: the companion app is IFTECH SAMWOO (package com.iftech.iftech_samwoo_app), the device advertises itself as IFTECH_SW_<MAC> over BLE, and the OTA server sits under ift.iptime.org. The repository is organized like a delivered product, with a printable user manual, a field upgrade guide, a release APK, a packaged discovery tool, and per-chip hardware test builds alongside the firmware.
개요

이 프로젝트는 삼우 리튬 배터리 팩 2대를 RS-485로 읽어, 같은 값을 7인치 터치 화면·웹 모니터·SNMPv2c 에이전트 세 곳에 보여 주는 배터리 표시 모듈의 펌웨어와 현장 도구다. 하드웨어는 Sunton ESP32-8048S070 보드(7인치 RGB 터치 패널을 붙인 ESP32-S3)에 WIZ610 / W6100 SPI 이더넷 모듈을 연결한 구성이고, SNMP·웹·IP Finder 검색 서비스는 모두 이 유선 포트로만 나간다. Wi-Fi는 펌웨어 업데이트를 받을 때만, BLE는 장치에 Wi-Fi 정보와 업데이트 명령을 넣을 때만 쓴다.
이 글은 마지막 푸시 날짜인 2026-09-15 기준의 저장소를 다룬다. README는 현재 펌웨어 버전을 Version.h에서 보라고 하고, 빌드 전 스크립트가 esp32_samwoo 빌드마다 patch 번호를 1씩 올리므로 인용할 고정 릴리스 태그는 없다.
저장소에는 펌웨어만 있는 것이 아니다. src/ 옆에 Flutter 앱(IFTECH SAMWOO)과 배포 APK, SNMP MIB 파일(mib/SAMWOO_BAT_MIB_VER_01.MIB), HTML 사용설명서, DXF 보드 인터페이스 도면, IPFinder.exe를 포함한 Python 도구, 삼우 팩 시뮬레이터가 함께 있다. README는 장비에서 캡처했다는 웹 화면을 싣고 스모크 시험과 소크 시험 결과를 적었다. 두 시험 모두 실제 삼우 팩이 아니라 팩 시뮬레이터에 붙여 돌렸고, 현장에 설치했다는 기록은 저장소에 없다.
하드웨어·소프트웨어 구성
이 장치는 전용 메인보드가 아니라 시판 보드를 조합해 만들었다. 아래 표는 README와 소스가 밝힌 부품이다.
| 부품 | 저장소 기재 내용 |
|---|---|
| 화면·MCU | Sunton ESP32-8048S070: ESP32-S3가 7인치 RGB 터치 패널을 직접 구동하고 LVGL로 그린다 |
| 유선 이더넷 | WIZ610 / W6100 모듈, SPI 연결, RJ45(TCP/IP) |
| 팩 연결 | Serial1 RS-485, 19200 8N1, 팩 주소 1·2 |
| 시계 | DS1307 RTC |
| 보드 커넥터 | 전원(0 / +48), TCP/IP(이더넷), RS-485. doc/BoardInterface.dxf에 도면이 있다 |
보드 도면은 사진이 아니라 DXF 렌더이며, 원본은 실크 표기 INVT_IPATH_DISP Rev2.0의 doc/BoardInterface.dxf다. 사용설명서에는 장비에서 동작 중인 메인 화면 사진도 들어 있다.
추가 사진은 원본 저장소에서 볼 수 있다: https://github.com/kimjinhwa/DisplayModuleFonSunElecComAndSamwoo
소프트웨어는 PlatformIO 빌드다. 기본 env esp32_samwoo가 제품 펌웨어이고, hwtest_rtc·hwtest_rs485·hwtest_w610 세 env는 칩 하나씩을 단독으로 확인한다. 제품 env는 khoih-prog/Ethernet_Generic@^2.8.1을 넣고 -DUSING_W6100을 정의한다. 화면은 src/SquareUi/의 SquareLine 내보내기(셀 16개 화면 포함)이고, SNMP 에이전트는 Arduino_SNMP 라이브러리를, 웹 페이지는 SPIFFS를 쓴다. 플래시 배치는 default_8MB.csv로 app0/app1 OTA 슬롯과 1.5MB spiffs 파티션을 둔다.
pio run -e esp32_samwoo
pio run -e esp32_samwoo -t upload
Python 폴더에는 장비 주변에서 쓰는 도구가 있다. upload_web.py는 UploadFiles/의 HTML을 올리고, check_bms_web.py는 스모크 시험을, soak_bms.py는 장시간 시험을 돌리며, snmp_check.py는 OID를 읽고, IPFinder.exe·SnmpFinder.py는 랜에서 장치를 찾는다.
시스템 구조

![]()
펌웨어는 하나의 메인 루프로 돈다. src/samwoo_poll.cpp에서 ESP32-S3가 Serial1을 19200 baud로 열고, 0x3A로 시작해 LRC 체크섬으로 끝나는 프레임으로 팩 주소 1·2를 폴링한다. README는 이것이 표준 Modbus가 아니라고 분명히 적는다. 폴링은 논블로킹(samwooPollTick())이라 루프는 그 사이에 화면용 lv_timer_handler()를 부르고 네트워크를 처리한다. 해석한 레지스터는 한 테이블(samwooRegs)에 모이고, paintMain()이 여기서 팩별 전압·전류·셀 값·온도를 읽어 화면에 그린다.
세 네트워크 서비스도 같은 레지스터 테이블을 읽는다. README에 따르면 웹 서버·SNMP 에이전트·IP Finder는 loop()에서만 W6100 SPI를 쓰고, 별도의 이더넷 태스크는 없다. 예를 들어 웹의 /api/snmp-get은 UDP 소켓을 하나 더 열지 않고 samwooRegs를 바로 읽는다. 모든 SPI 접근을 한 스레드에 두는 것이 화면·RS-485 폴러·이더넷 칩 사이의 버스 경합에 대한 이 프로젝트의 답이다.
펌웨어 업데이트는 일부러 다른 경로를 탄다. 휴대폰 앱이 BLE로 IFTECH_SW_<MAC> 장치에 붙어 SSID·암호를 보내고 이어서 update를 보낸다. 장치는 isUpdate 플래그만 저장하고 재부팅하며, README는 BLE와 Wi-Fi를 동시에 켜지 않는다고 적는다. 다음 부팅에서 src/main.cpp는 BLE를 켜기 전에 isUpdate를 확인하고, Wi-Fi에 붙어 esp32_samwoo.json을 읽은 뒤 latest 값이 장치 VERSION보다 크면 Update.writeStream()으로 새 이미지를 쓴다. 배치 전에 알아 둘 불일치가 하나 있다. README의 공개 업데이트 URL은 80번 포트인데, src/wifiOTA.cpp는 FW_UPDATE_BASE를 http://ift.iptime.org:81/Esp32UploadFirmware로 정의한다.
README가 밝힌 시험은 두 가지이고 모두 동봉된 팩 시뮬레이터를 상대로 했다. 스모크 시험에서는 로그인 페이지와 로그인이 HTTP 200, /api/bms가 팩1·팩2 모두 ok=true(시뮬레이터 값 54.0 V / 52.8 V), SNMP OID 1.3.6.1.2.1.32.1.8.0이 540이었다. HTTP 2초 주기와 SNMP 주기로 돌린 소크 시험은 약 13분 시점에 n=380, http_err=0, snmp_err=0이었고 HTTP 응답은 대략 20–40 ms였다. 소크 로그는 gitignore되어 저장소에는 README의 요약만 있다.
시장성 고찰
이 장치는 배터리 모니터링 시스템 시장에 속하는데, 시장 규모는 누가 세느냐에 따라 크게 다르다. 페이지를 직접 연 조사기관 세 곳의 2025년 값은 USD 7.78B(TechSci Research, GII 게재)에서 USD 11.05B(Fortune Business Insights) 범위이고, 검색 요약으로만 본 Bosson Research는 USD 3.52B다. 예측 연평균 성장률은 10.3%~19.64%다. 기관마다 시장 정의가 달라 이 값들을 섞어 쓸 수는 없다. 이 프로젝트의 틈새와 직접 닿는 값은 단일 출처다. Fortune Business Insights는 통신을 최대 최종 사용자군(약 32%)으로 꼽고, 통신 타워·데이터센터·네트워크 허브의 백업 배터리를 동인으로 든다.
같은 구성은 이미 상용 통신용 리튬 시스템에 있다. EverExceed는 RS485로 배터리 데이터를 모으고 SNMP로 LAN에 올리며 캐비닛 문 화면에 배터리 상태를 보여 주는 구성을 설명하고, 원격 감시로 무인 운용을 내세운다. DFUN은 SNMP·Modbus·MQTT·IEC61850을 지원하는 데이터센터·통신 사이트용 배터리 감시 제품을 판다. 둘 다 가격을 공개하지 않는다. 가격이 확인된 가장 가까운 7인치 대체재는 Victron GX Touch 70과 본체 Cerbo GX 조합이지만, 마린·오프그리드 용도이고 SNMP 지원은 확인하지 않았으며 Cerbo GX는 단종되어 MK2로 넘어가는 중이다.
| 항목 | 가격 범위 | 출처 |
|---|---|---|
| Victron GX Touch 70(상용 7인치 감시 화면) | $323.85~$381.00 | Signature Solar |
| Victron Cerbo GX 본체(단일 출처, S-GX와 묶은 범위 표기) | $217.60~$248.20 | InvertersRUs |
| Sunton ESP32-8048S070 화면 보드(README 명시 모델) | $21~$28 | atomic14 |
| WIZ610io W6100 + RJ45 모듈(같은 사양의 대표 부품) | $9.29~$15.67 | Arrow, X-On |
Victron 두 판매처 값을 더하면 상용 화면+본체 비용은 최저 $541.45($323.85 + $217.60), 최고 $629.20($381.00 + $248.20)이다. 부품 쪽에서는 화면 보드와 이더넷 모듈 둘만 더해 최저 $30.29(atomic14 하한 $21 + Arrow 5,000개 단가 $9.29), 최고 $43.67(atomic14 상한 $28 + X-On 1개 단가 $15.67)이다. README는 이더넷 부품을 "WIZ610 / W6100"으로만 적어서 여기서는 WIZ610io를 같은 사양의 대표 부품으로 썼고, WIZ610io 가격 세 건은 모두 검색 요약에서 본 값이다. RS-485 트랜시버와 DS1307 RTC 모듈은 싸지만 통화가 달라 합계에 넣지 않았고, 48V 전원부·인클로저·PCB 조립·인증 비용도 빠져 있다. 따라서 이 합계는 제품 원가가 아니라 제품화까지의 격차를 가늠하는 참고값이다.
README는 유선 이더넷을 택한 이유를 직접 말하지 않는다. 이더넷이 SNMP·웹·IP Finder용이고 Wi-Fi는 OTA용이라고만 적는다. 데이터센터·IT실에서 DCIM·NMS가 SNMP over Ethernet으로 장비를 폴링하는 관행이 있어, SNMPv2c로 관리망에 붙는 이 장치가 유선을 쓰는 이유로 추론할 수 있다. 배터리실에서 무선이 실제로 어려운지는 확인하지 못했다. 특정 팩 제조사의 팩 2대 구성 전용이라 팩 공급사나 시스템 통합사가 OEM 부속으로 가져갈 것으로 보이지만, 실제 구매자와 물량은 찾지 못했다. 통신·데이터센터용 SNMP 배터리 감시 제품의 가격은 공개 자료가 적다.
WIZnet W6100의 역할
W6100은 이 장치의 유일한 유선 네트워크 경로이고, 랜을 향하는 기능은 모두 이 칩을 거친다. MCU는 Sunton 보드의 ESP32-S3이고 모듈은 그 SPI 버스에 붙는다. src/board_pins.h는 칩 선택을 GPIO 10으로, MOSI 11·SCLK 12·MISO 13으로 정하고, RST·INT GPIO가 없어 모듈 자체의 하드웨어 리셋만 쓴다고 적는다. 그래서 펌웨어는 인터럽트를 기다리지 않고 메인 루프에서 칩을 돌아본다.
이 칩은 옵션이 아니라 기본으로 켜진다. platformio.ini의 기본 env esp32_samwoo가 khoih-prog/Ethernet_Generic@^2.8.1과 -DUSE_ETHERNET_GENERIC·-DETHERNET_USE_ESP32·-DUSING_W6100을 넣고, lib_ignore로 벤더 eModbus와 기본 Ethernet 라이브러리를 뺀다. 저장소에서 보이는 W5500 언급은 이렇게 제외된 eModbus 예제에 속한다.
초기화는 src/eth_w610.cpp의 ethW610Begin()이 맡는다. Ethernet.init(PIN_W610_CS)와 장치에 저장된 고정 주소로 Ethernet.begin(mac, ip, dns, gateway, subnet)을 부른 뒤 Ethernet.getChip() == w6100으로 칩을 확인한다. setup()이 한 번 부르고, 실패하면 loop()가 5초마다 [ETH] retry W610을 남기며 다시 시도한다.
그 위에서 세 서비스가 Ethernet_Generic 소켓 API로 칩의 소켓을 연다. src/snmp_battery.cpp는 community public으로 SNMPv2c 에이전트를 만들고 snmp.setUDP(ethW610SnmpUdp())로 W6100 UDP 소켓을 넘긴다. 팩1은 1.3.6.1.2.1.32.1, 팩2는 1.3.6.1.2.1.32.2 아래에 있고, 161번 포트는 코드에서 따로 지정하지 않고 Arduino_SNMP 기본값을 쓴다. eth_w610.cpp 안에 함께 컴파일되는 src/web_impl.inc의 웹 서버는 EthernetServer를 상속한 클래스로, sHttp->begin(sWebPort)로 공장 포트 80에서 시작해 /api/bms·/api/login·/fileupload를 처리한다. src/ip_finder.cpp는 sIpFinder.begin(ethW610IpFinderUdp())로 UDP 1234를 듣고, 검색 요청에 응답하며, 새 IP·서브넷·게이트웨이·웹 포트를 NVS에 저장한다.
데이터 흐름을 이으면 이렇다. 삼우 팩 레지스터가 RS-485로 ESP32-S3의 samwooRegs에 들어오고, 메인 루프가 이를 SNMP 응답·웹용 JSON·IP Finder 응답으로 만든 뒤 SPI로 W6100 소켓에 쓴다. W6100이 UDP와 TCP를 처리해 RJ45로 관리용 랜에 내보낸다. 펌웨어 이미지는 이 경로로 오지 않고 Wi-Fi로 들어온다. 별도의 hwtest_w610 env(src/hwtests/hwtest_w610.cpp)가 칩만 단독으로 확인하고 어떤 WIZnet 칩이 감지됐는지 출력한다.
자주 묻는 질문
이더넷 포트로 펌웨어를 업데이트하나? 아니다. README는 유선 이더넷이 SNMP·웹·IP Finder 전용이라고 적는다. 업데이트는 IFTECH SAMWOO 앱에서 BLE로 시작하고, 재부팅 뒤 Wi-Fi로 내려받는다.
팩 통신이 Modbus인가? 아니다. README는 RS-485 19200 8N1이며 표준 Modbus가 아니라고 적고, src/samwoo_poll.cpp는 0x3A로 시작해 LRC 체크섬으로 끝나는 프레임을 만든다.
랜에서 장치를 어떻게 찾고 주소를 바꾸나? IP Finder(python/release/IPFinder.exe 또는 python/SnmpFinder.py)가 UDP 1234로 검색한다. 장치가 응답하면 IP·서브넷·게이트웨이·웹 on/off와 포트를 바꿀 수 있다. README의 SNMP 기본 IP는 192.168.0.57이다.
기본 계정은 무엇인가? 웹 로그인 기본값은 admin / admin이고 SNMP community는 public이다. 공유 네트워크에 두기 전에 바꿔야 한다.
실제 배터리 팩으로 시험했나? 저장소에 있는 것은 팩 시뮬레이터 상대 시험뿐이다. 스모크 시험과 약 13분 소크 시험에서 HTTP·SNMP 오류가 0이었다. 실제 삼우 팩 시험이나 현장 설치 기록은 없다.
저자 소개
저장소는 GitHub 계정 kimjinhwa로 공개되어 있고, 공개 이름이나 프로필 정보는 없다. 프로젝트 이름들은 IFTECH를 가리킨다. 함께 쓰는 앱 이름이 IFTECH SAMWOO(패키지 com.iftech.iftech_samwoo_app)이고, 장치는 BLE에서 IFTECH_SW_<MAC>으로 보이며, OTA 서버는 ift.iptime.org 아래에 있다. 저장소는 펌웨어와 함께 인쇄용 사용설명서, 현장 업그레이드 안내, 배포 APK, 검색 도구 실행 파일, 칩별 H/W 시험 빌드를 갖춘 납품형 제품 저장소처럼 짜여 있다.
Market Evidence
| 주장 | 값 | 출처 URL | 날짜 | 확인 방식 | 종류 |
|---|---|---|---|---|---|
| Sunton ESP32-8048S070(원문 명시 모델) 통상 가격 | "Typical price $21-28 (street, varies)", 본문에 "~$22". ESP32-S3 N16R8, 7인치 800x480 IPS(ST7262 RGB), GT911 터치 | https://www.atomic14.com/esp32/boards/sunton-esp32-8048s070/ | undated | page loaded | 1차 자료 |
| 같은 모델명 표기(Jingcai ESP32-8048S070C)의 유럽 판매가 | €37.25(VAT 포함), €30.79(VAT 제외). 판매 상태 "Discontinued", 대체품(V0.1) 재고 안내 | https://www.tinytronics.nl/en/development-boards/microcontroller-boards/with-wi-fi/jingcai-esp32-8048s070c-7-inch-tft-lcd-display-800*480-pixels-with-touchscreen-esp32-s3 | undated | page loaded | 1차 자료 |
| W6100 이더넷 모듈 사양(원문은 "WIZ610 / W6100 SPI"로만 표기, 같은 사양의 대표 부품으로 WIZ610io) | W6100 하드와이어드 TCP/IP 칩 + PHY + RJ45(MAG-JACK) 일체, SPI, 22.70 x 23.00 mm. 페이지에 가격 없음 | https://docs.wiznet.io/Product/ioModule/WIZ610io | undated | page loaded | 1차 자료 |
| WIZ610io 판매가(Kitone) | $9.90, 40개 단위 박스 판매 | https://shop.kitone.com/en/network-module/34-wiz610io.html | undated | search snippet | 1차 자료 |
| WIZ610io 판매가(Arrow) | 약 $9.65, 5,000개에서 약 $9.29. 최소 주문 80개, 재고 없음, 제조사 리드타임 4주 | https://www.arrow.com/en/products/wiz610io/wiznet | undated | search snippet | 1차 자료 |
| WIZ610io 판매가(X-On Electronics) | 1개 약 $15.67, 1,000개 약 $8.88. 재고 0 | https://www.xonelec.com/mpn/wiznet/wiz610io | undated | search snippet | 1차 자료 |
| RS-485 트랜시버 모듈(원문에 모델명 없음, 같은 사양의 대표 부품으로 MAX485 모듈) 판매가 | 1개 £0.69(정가 £0.99), 5~9개 £0.66, 10개 이상 £0.62. VAT 포함 여부 표기 없음 | https://kunkune.co.uk/shop/communication-boards/max485-ttl-to-rs-485-converter-module/ | undated | page loaded | 1차 자료 |
| RS-485 TTL 모듈(같은 사양의 대표 부품) 인도 판매가 | 1개 Rs.75.00, 1,000개 이상 Rs.63.75 | https://sunrom.com/p/rs485-ttl-module | undated | search snippet | 1차 자료 |
| DS1307 RTC 모듈(칩은 원문 명시, 모듈은 같은 사양의 대표 부품) 판매가 | €1.84, 24C32 EEPROM 포함, 배터리 미포함 | https://funduinoshop.com/en/electronic-modules/interfaces-converters/rtc/ds1307-i2c-rtc-module-tiny-rtc | undated | search snippet | 1차 자료 |
| DS1307 RTC 모듈(DFRobot Gravity) 판매가 | £4.30 | https://thepihut.com/products/real-time-clock-module-ds1307-v1-1 | undated | search snippet | 1차 자료 |
| 상용 7인치 배터리·시스템 모니터 화면 Victron GX Touch 70 가격 | 표시 가격 $381.00과 $323.85(어느 쪽이 할인가인지 라벨 없음). "7 Inch Touchscreen", "Designed for use with Victron Cerbo GX" | https://signaturesolar.com/victron-energy-gx-touch-70 | undated | page loaded | 1차 자료 |
| Victron GX Touch 70 다른 판매처 가격 | 할인가 $323.85, 정가 $383.85(통화 표기 미확인) | https://emarineinc.com/products/victron-gx-touch-70 | undated | search snippet | 1차 자료 |
| GX Touch 70이 붙는 본체 Victron Cerbo GX 가격 | Cerbo GX·Cerbo S-GX 묶음 표기 $217.60~$248.20. "Cerbo S and Cerbo GX have been discontinued by the manufacturer", MK2 권장. 원격 접속은 VRM 포털 | https://invertersrus.com/product/victron-cerbo-gx-bpp900450100/ | undated | page loaded | 1차 자료 |
| 통신용 리튬 배터리 상용 사례(EverExceed): 같은 구성 | "Using RS485 parallel to summarize all the battery data", "the host can upload all the battery information to the LAN through SNMP", "the operational status of the 6 batteries can be viewed at any time on the cabinet door display", 원격 감시로 무인 운용 | https://www.everexceed.com/telecom-lithium-battery-backup-power-solution_n538 | undated | page loaded | 1차 자료 |
| 데이터센터·통신 사이트용 배터리 감시 상용 제품(DFUN) | "Support for SNMP, Modbus, MQTT, and IEC61850 communication protocols", 용도에 Data Centers, Telecom Sites. 가격 비공개(문의) | https://www.dfuntech.com/dfun-bms-solutions-for-data-center.html | undated | page loaded | 1차 자료 |
| 데이터센터·IT실에서 SNMP over Ethernet 관행 | SNMP over Ethernet이 데이터센터·IT실에서 흔하며 DCIM·NMS가 상태를 폴링하고 트랩으로 알람을 받는다. Modbus RTU는 SCADA와 긴 RS-485 배선에 적합 | https://electricaltrader.com/blogs/news/ups-integration-facility-management-systems | undated | search snippet | 1차 자료 |
| 배터리 모니터링 시스템 세계 시장 규모(Fortune Business Insights) | 2025년 USD 11.05B, 2026년 USD 13.22B에서 2034년 USD 55.49B, CAGR 19.64% | https://fortunebusinessinsights.com/industry-reports/battery-monitoring-system-market-101075 | 2026-10-19 | page loaded | 조사기관 추정 |
| 같은 보고서의 최종 사용자 구성 | 통신(Telecommunication)이 최대 최종 사용자군으로 약 32%, 통신 타워·데이터센터·네트워크 허브 백업 배터리가 동인 | https://fortunebusinessinsights.com/industry-reports/battery-monitoring-system-market-101075 | 2026-10-19 | page loaded | 조사기관 추정 |
| 배터리 모니터링 시스템 세계 시장 규모(TechSci Research, GII 게재) | 2025년 USD 7.78B에서 2031년 USD 20.17B, CAGR 17.21%(2026~2031). 통신은 최종 사용자 4개 구분 중 하나 | https://www.giiresearch.com/report/tsci1938355-battery-monitoring-system-market-global-industry.html | 2026-01-19 | page loaded | 조사기관 추정 |
| 배터리 모니터링 시스템 세계 시장 규모(Spherical Insights) | 2025년 USD 9,292.42M에서 2035년 USD 49,087.76M, CAGR 18.11%(2026~2035) | https://www.sphericalinsights.com/reports/battery-monitoring-system-market | 2026-10 | page loaded | 조사기관 추정 |
| 배터리 모니터링 시스템 세계 시장 규모(Bosson Research) | 2025년 USD 3.52B, CAGR 10.3% | https://www.marketresearch.com/Bosson-Research-v4252/Global-Battery-Monitoring-System-Research-44581197/ | undated | search snippet | 조사기관 추정 |
