hn/ginlong-solis

GitHub: hn/ginlong-solis

Solis 逆变器数据日志与固件逆向项目,解决 Modbus/RS485 协议采集与 WiFi 棍固件替换的集成难题。

Stars: 150 | Forks: 23

# Ginlong Solis 太阳能逆变器 ## 前言 [Ginlong Solis](https://www.ginlong.com/) 是全球知名的串式太阳能逆变器制造商。 几乎其所有产品都具备 [Modbus](https://en.wikipedia.org/wiki/Modbus) [RS-485](https://en.wikipedia.org/wiki/RS-485) 接口,用于读取实时状态和统计数据。 快速入门指南如下: - [使用 ESP8266 将逆变器或出口功率管理器集成到 Home Assistant 的 ESPHome 解决方案](#software-esphome) - [通过替换 Solis S3 WiFi 棍固件,使用 ESPHome 将逆变器或出口功率管理器集成到 Home Assistant](#replacing-the-main-application) - [使用 ESP8266 通过 ModBus/RS485 将逆变器数据推送到 InfluxDB 的 Arduino 解决方案](#software-arduino) - [连接逆变器到 ESP8266 的 ModBus/RS485 接线图](#hardware) ESPHome 解决方案还具备一些高级功能,例如限制逆变器输出功率、通过 NTP 同步逆变器时间等。 如果有疑问,我建议选择 Solis S3 棍配合替代固件。目前 Solis S3 棍售价约 20 欧元,并配有坚固防水的保护壳、外置天线等。这个价格无法单独购买并组装这些部件。 请帮我一个忙:👍 如果您使用了这里的信息或代码,请链接回本页。 :star: 同时,请考虑给这个项目加星⭐。我很喜欢了解谁在使用它来做有创意的事情,特别是如果您来自世界其他地区。 :smiley: 欢迎您打开问题来报告您的个人成功项目并与他人分享。 ![Solis ESPHome 示例屏幕](solis-esphome.png "Solis ESPHome Homeassistant") ## ESP8266 Solis 接口 ### 硬件 您需要一个专有的 [Exceedconn](http://www.exceedconn.com/) [EC04681-2014-BF](http://www.exceedconn.com/e_products_detail.asp?id=76) 连接器 (在 eBay 上可用,或者 [nextguyover](https://github.com/hn/ginlong-solis/issues/37) 提供 [3D 打印模型](https://insertnewline.com/blog/Solis-solar-esphome/)) 以及一个 RS485-to-serial 适配器(一个 [不带 DE/RE 引脚的廉价型号](https://arduino.stackexchange.com/questions/83501/when-it-comes-to-uart-to-rs485-communication-what-is-the-difference-between-the) 即可,例如 `HW-0519`、`XY-K485` 或 `XY-017`)。将所有组件连接到例如 Wemos D1 mini(也提供带有 SMA 连接器和外置天线的“专业”版本,以获得更好的接收效果),接线方式如下: ![Solis ESP8266 接线图](solis-esp8266-wiring.jpg "Solis ESP8266 接线图") 有一点奇怪,您必须 [将 `HW-0519` 适配器的 RX 引脚连接到 ESP 的 RX 引脚](https://arduino.stackexchange.com/a/83668)(而 TX 引脚连接到 TX 引脚),因此不需要像通常那样交叉连接 RX-TX。 ### 软件(ESPHome) 特别推荐如果您使用 Home Assistant,[solis-esphome-esp8266.yaml](solis-esphome-esp8266.yaml) 是一个开箱即用的 配置文件,适用于 [ESPHome](https://esphome.io/),使用 ESP8266。通过 [ESPHome Device Builder](https://esphome.io/guides/getting_started_hassio/#installing-esphome-device-builder) 您可以通过用户友好的网页界面轻松设置系统,只需点击几下即可完成。 ### 软件(Arduino) 使用 [solis2influx.ino](solis2influx.ino) 可以通过 Modbus 读取所有逆变器数据(状态和统计数据)并推送到 InfluxDB。 它使用 [WiFiManager](https://github.com/tzapu/WiFiManager) 来设置 WiFi,因此您需要先连接到 `SOLIS2INFLUX` 热点并使用您的手机进行配置。 读取数据在配置 WiFi 后立即开始。数据不会发送到 InfluxDB 服务器,直到读取到逆变器的序列号,这可能需要一点时间(序列号作为强制标签添加以区分多个逆变器): ``` DC voltage 1 = 243.70V DC current 1 = 0.90A Inverter temperature = 22.50°C Grid frequency = 49.98Hz Writing to influxDB: solis,serialnumber=1801020221230123 DC\ voltage\ 1=243.70,DC\ current\ 2=0.90,Inverter\ temperature=22.5,Grid\ frequency=49.98 Energy last month = 234kWh Energy today = 1.23kWh Energy last day = 3.45kWh Writing to influxDB: solis,serialnumber=1801020221230123 Energy\ last\ month=234i,Energy\ today=1.23,Energy\ last\ day=3.45 ``` ## Solis S3 WiFi 数据记录棍(第三代) WiFi 棍是 Solis 连接逆变器到其“SolisCloud”平台的当前解决方案 (由 [Alibaba China](https://www.alibabacloud.com/) 运营)。 您可以通过前面板上的三个 LED 和背面的复位按钮识别第三代棍。 ### 软件 棍的固件支持连接家庭 WiFi 并显示基本逆变器统计数据。该固件(至少当前版本 `1012F`)是一种测试版且不完整,因为它缺少上一代 WiFi 棍的重要功能。特别是,缺少设置第二个远程记录服务器(称为“Server B”)的功能。 网页界面使用 HTTP 简单认证,保护用户名为 `admin`、密码为 `123456789`。__在将棍连接到家庭 WiFi 后,网页密码会无通知地更改为您的 WiFi 密码。__ 因此,您需要使用 `admin` 和您的 WiFi 密码登录网页管理界面。 这种有些奇怪的行为再次表明固件尚不成熟。 由于当前固件不支持设置自己的远程记录服务器,因此有 [solis2influx.pl](solis2influx.pl) 可从网页界面(`/inverter.cgi`)读取基础统计数据并发布到 InfluxDB。 棍固件基于 [Alibaba's AliOS-Things 3.0.0](https://github.com/alibaba/AliOS-Things/tree/rel_3.0.0) 嵌入式操作系统 (不确定是否混入了 [MXCHIPS 的 MiCO OS](https://github.com/MXCHIP/mico-os) 的某些部分)。 它使用 [硬编码 DNS 服务器](https://github.com/alibaba/AliOS-Things/blob/rel_3.0.0/middleware/linkkit/wrappers/os/dns.c)(`public1.alidns.com` 和 `public2.alidns.com`)并频繁将数据推送到 `*.iot-as-mqtt.*.aliyuncs.com`(根据您的地理位置选择此服务器 [取决于地理位置](https://github.com/alibaba/AliOS-Things/blob/rel_3.0.0/middleware/linkkit/infra/infra_defs.c))。 ### 硬件 棍硬件基于 [MXCHIP's](https://en.mxchip.com/) [EMW3080-E MCU](https://en.mxchip.com/productinfo/244846.html) (ARM Cortex-M4F,2.4GHz IEEE 802.11 b/g/n WiFi,后缀 `-E` 表示 `IPEX 天线,MX1290 处理器`)。 数据手册:[V2.2](https://m.eleparts.co.kr/data/_gextends/good-pdf/202103/good-pdf-10094810-2.pdf)。 :raised_hand: 与所有可用的数据手册相反,EMW3080-E(至少我手中的 Solis S3 棍) 并不 *具备* 2MB 闪存,而是使用 [8MB 闪存模块](https://github.com/libretiny-eu/libretiny/issues/91#issuecomment-1480153212)。 EMW3080 是某种重命名(可以称之为同一家族) [RTL8710BN](https://www.realtek.com/en/products/communications-network-ics/item/rtl8710bn) MCU(Ameba-Z 系列)。 更多关于 EMW3080 的信息请参见 [A_D Electronics](https://web.archive.org/web/20220309073607/https://adelectronics.ru/2017/11/07/%D1%81%D1%85%D0%B5%D0%BC%D0%BE%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0-%D0%B8-%D0%BE%D0%B1%D0%B7%D0%BE%D1%80-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F-emw3080/) 和 [esp8266.ru 的讨论](https://esp8266.ru/forum/threads/emw3080.3013/)。 棍通过一种专有的 [Exceedconn](http://www.exceedconn.com/) [EC04681-2014-BF](http://www.exceedconn.com/e_products_detail.asp?id=76) 连接器连接到逆变器(圆形引脚排列:1=VCC=5V,2=GND,3=RS485+,4=RS485-)。 外部天线通过标准 [SMA 连接器](https://en.wikipedia.org/wiki/SMA_connector) 连接。 您可以通过按下 [凹槽](solis-wifi-stick-s3-cap.jpg) 向中心按压来打开 [外壳](solis-wifi-stick-s3-case.jpg)。 ![Solis WiFi 棍 PCB 正面](solis-wifi-stick-s3-pcb-front.jpg "Solis WiFi 棍 PCB 正面") ![Solis WiFi 棍 PCB 背面](solis-wifi-stick-s3-pcb-back.jpg "Solis WiFi 棍 PCB 背面") PCB 上有一个串行接口(LogCLI),连接到 MCU 的 `UART2_Log_TX` 和 `UART2_Log_RX`(115200 8N1,3.3 伏)。 更新:截至 2022 年底,有一个 [新 PCB 版本包含硬件看门狗](https://github.com/hn/ginlong-solis/issues/13#issuecomment-1636475754)。 您可以通过丝印标识 `22.34`(可能对应年份和周数)来识别这些新板。 ### 通过串口进行分析 您可以通过检查 `UART2_Log` 输出获得第一印象: CODE_BLOCK_1/> 请参阅 [完整的(匿名)启动日志](solis-wifi-stick-s3-bootlog.txt) 获取更多细节。 在启动时按住 `w` 键会启动一个极其有限的 [2ndboot](https://github.com/alibaba/AliOS-Things/tree/rel_3.0.0/middleware/uagent/ota/2ndboot) CLI: ``` 2ndboot image start Press key 'w' to 2ndboot cli menu in 100ms. 2ndboot ver: 2ndboot-1.0.0-20210917.200018 Please input 1-2 to select functions [1] Uart Ymodem Upgrade [2] System Reboot [h] Help Info 2ndboot# h 2ndboot ver: 2ndboot-1.0.0-20210917.200018 Please input 1-2 to select functions 2ndboot# ``` 在启动时将 TX 引脚 21(`PA_30`)拉低,设备会等待 xmodem 传输(`UART 启动模式`): ``` ROM:[V0.1] FLASHRATE:4 UARTIMG_Download 2 Open xModem Transfer on Log UART... ``` 在此模式下,您可以使用 [RTLtool](https://github.com/pvvx/RTL0B_SDK/blob/master/mkb/rtltool.py)(依赖 Python2) (更新:[ltchiptool](https://github.com/libretiny-eu/ltchiptool) 现在是更好的选择): ``` $ python2 ./rtltool.py -p /dev/ttyUSB0 gf Connecting... Flash Status value: 0x40 $ python2 ./rtltool.py -p /dev/ttyUSB0 rf 0x8000000 0x800000 dump-0x8000000-0x800000.bin Connecting... Read Flash data from 0x08000000 to 0x08800000 in file: dump-0x8000000-0x800000.bin ... Done! ``` ### 固件 1012F 的内存内容分析 转储包含各种有趣的内容(`AOS-R-3.0.0` 和 `sdk-c-3.0.1` 明显指向 AliOS-Things 3.0.0)。 借助 [Realtek AmebaZ 内存布局](https://raw.githubusercontent.com/ambiot/amb1_sdk/master/doc/UM0111%20Realtek%20Ameba-Z%20memory%20layout.pdf)、 [Ameba-Z SDK 简介](https://raw.githubusercontent.com/ambiot/amb1_sdk/master/doc/UM0112%20Realtek%20Ameba-Z%20SDK%20quick%20start.pdf) 和 [mk3080/flash_partitions.c](https://github.com/alibaba/AliOS-Things/blob/rel_3.0.0/board/mk3080/flash_partitions.c) 可以重构在地址 `0x800e320` 处找到的闪存分区表: ``` DESCRIPTION START_ADDR LENGTH Bootloader 0x0 0x8000 // = AliOS-Things/platform/mcu/rtl8710bn/bin/boot_all.bin Recovery 0xb000 0x6000 // 2ndboot Application 0x19000 0x127000 OTA Storage 0x150000 0x127000 Parameter1 0x2a0000 0x2000 Parameter2 0x2a2000 0x2000 // WiFi credentials @ 0x2a3000 Parameter3 0x2a4000 0x2000 // AliOS PK+PS+DN+DS Parameter4 0x2a6000 0x2000 Parameter5 0x2a8000 0x10000 Parameter55 0x2b8000 0x1000 Parameter33 0x7fe000 0x1000 // Backup of Parameter3 ? Offline 0x300000 0x4fe000 // 0x1000 zeros + some noise ``` ### 与阿里巴巴 IOT 平台交互 分区 'Parameter3' 包含连接到 [阿里巴巴 IOT 平台](https://www.alibabacloud.com/help/en/iot-platform/latest/establish-a-connection-between-a-device-and-iot-platform) 所需的 '产品密钥'(PK)和 '设备密钥'(DS)。 棍的序列号用作 '设备名称'(DN)。 使用 [Link SDK for Python](https://www.alibabacloud.com/help/en/iot-platform/latest/link-sdk-for-python) 您可以轻松冒充逆变器并向 SolisCloud 发送 MQTT 数据。 ### 固件 1012F 的主应用程序分析 主应用程序从 `0x19000` 开始,包含用于 闪存原位执行(XIP)的 `TEXT` 段。 随后是 `DATA` 段用于 RAM 执行。我将这一部分称为 'APP1'。 完整的 APP1(OTA 包格式,包括校验和)从 `0x19000` 开始,长度为 797628,MD5 校验和为 `0a88cb5556ab28ffba63a8d56e131d56`。 使用 [decode-alios-ota-firmware.pl](decode-alios-ota-firmware.pl) 可以 查看所有详细信息并验证校验和: ``` $ ./decode-alios-ota-firmware.pl solis-s3-app-1012F_ota.bin # Segment .text 0x00000000: Signature = 0x3831393538373131 (OK) 0x00000008: Code length = 790112 0x0000000c: Address = 0x00000000 (FLASH XIP) 0x00000010: Reserved = 0xffffffffffffffffffffffffffffffff 0x00000020: Code = (byte code) # Segment .data 0x000c0e80: Signature = 0x3831393538373131 (OK) 0x000c0e88: Code length = 7420 0x000c0e8c: Address = 0x10005000 (RAM) 0x000c0e90: Reserved = 0xffffffffffffffffffffffffffffffff 0x000c0ea0: Code = (byte code) # Segments checksum 0x000c2b9c: Checksum = 0x25249404 (OK) # OTA trailer 0x000c2ba0: Magic = 0xefefefef (OK) 0x000c2ba4: Size = 797600 (OK) 0x000c2ba8: MD5 checksum = 0x85a615f88804cfb7784ffab81c27795b (OK) 0x000c2bb8: Reserved = 0xffffffff # End of data 0x000c2bbc: Filesize = 0xc2bbc = 797628 (OK) ``` 出乎意料的是,APP1 部分之后是第二个应用程序('APP2'),从 `0xdbbbc` 开始(长度 222276),`DATA` 位于 `0x112020`(长度 3656)。 此 APP2 与 [AliOS ate.bin](https://github.com/alibaba/AliOS-Things/blob/rel_3.0.0/board/mk3080/ate.bin) 二进制完全相同。 目前尚不清楚它是否被使用,怀疑它是用于 [自动测试设备](https://en.wikipedia.org/wiki/Automatic_test_equipment) 的 ATE 固件或用于设置 [eFuses](https://en.wikipedia.org/wiki/EFuse)/RDP。 ### 篡改主应用程序(固件 1012F) 了解源代码后,很容易在转储中找到对应的字节码。 例如,[Mbed TLS](https://github.com/Mbed-TLS/mbedtls) [包装代码](https://github.com/alibaba/AliOS-Things/blob/rel_3.0.0/middleware/linkkit/wrappers/os/HAL_TLS_mbedtls.c) ``` if (ca_crt != NULL) { mbedtls_ssl_conf_authmode(&(pTlsData->conf), MBEDTLS_SSL_VERIFY_REQUIRED); ``` 对应二进制代码 ``` 0803fb86 ba f1 00 0f cmp.w r10,#0x0 0803fb8a 2f d0 beq LAB_0803fbec 0803fb8c 02 21 movs r1,#0x2 // 0x2 = MBEDTLS_SSL_VERIFY_REQUIRED 0803fb8e 2e e0 b LAB_0803fbee ``` 因此,如果将偏移量 `0x3fb8c` 处的值 `02 21` 更改为 `00 21`(0x0 = `MBEDTLS_SSL_VERIFY_NONE`), 将不再检查目标 SSL 证书,您可以进行中间人攻击或 重定向 SSL 流量(MQTT、HTTP、... 到阿里云)。 使用 RTLtool 写入闪存时(`wf` 命令),请确保始终写入 完整的 4096 字节对齐数据块(闪存 `SECTOR_SIZE 0x1000`)。 :warning: 警告:显然写入闪存内存是危险的,可能会永久损坏您的设备。 ### 替换主应用程序 感谢 [LibreTiny](https://github.com/libretiny-eu/libretiny) 团队的努力,Arduino 兼容核心 可用于 RTL8710B 芯片。更好的是,LibreTiny [现已成为 ESPHome 的一部分](https://esphome.io/changelog/2023.9.0.html)。 使用 [solis-esphome-emw3080.yaml](solis-esphome-emw3080.yaml) 可以读取所有 相关状态和统计数据,并将数据推送到 Home Assistant。 按照以下步骤安装 ESPHome 固件到 S3 棍: 1. 安装 [ESPHome Device Builder](https://esphome.io/guides/getting_started_hassio/#installing-esphome-device-builder) 用于 Home Assistant(至少版本 2023.9.0)。 2. 如果还没有 `secrets.yaml`,请向 ESPHome 插件添加一个 `secrets.yaml`,至少包含 `wifi_ssid`、`wifi_password`、`wifi_ap_ssid`、`wifi_ap_password`、`api_encryption_key` 和 `ota_password`。 3. 将 [solis-esphome-emw3080.yaml](solis-esphome-emw3080.yaml) 添加到 ESPHome 插件。 4. 根据您的设备类型(标准逆变器 `INV`、混合逆变器 `ESINV` 或出口功率管理器 `EPM`), 复制 [solis-modbus-inv.yaml](solis-modbus-inv.yaml)、[solis-modbus-esinv.yaml](solis-modbus-esinv.yaml) 或 [solis-modbus-epm.yaml](solis-modbus-epm.yaml)。 5. 在 `solis-esphome-emw3080.yaml` 中编辑设备类型(`packages` 部分中的 `include` 语句)。 6. 点击三点按钮,然后选择“安装”和“手动下载”。 7. 等待编译过程完成并下载“UF2 包”。 8. 设置 MCU 为 `UART 启动模式`(在启动时 [拉低 TX 引脚](https://github.com/hn/ginlong-solis/issues/48#issuecomment-2371866988) —— 不需要焊接, 只需 [插入一些跳线](https://github.com/hn/ginlong-solis/issues/9#issuecomment-1595643051) 即可)。 确保您的串行适配器使用 3.3V 电压作为 RX 和 TX 引脚(通常有一个跳线用于此)。 VCC 应连接到 5V 电压(3.3V 可能有效,但 5V 更稳定)。 仔细阅读以下关于这些适配器可能带来挑战的注意事项。 9. 使用 [ltchiptool](https://github.com/libretiny-eu/ltchiptool)(也提供 Win GUI 版本)备份原厂固件: $ ltchiptool -V ltchiptool v4.10.1 # 请使用至少此版本 $ ltchiptool flash read -d /dev/ttyUSB0 RTL8710B solis-s3-firmware-1012f.bin I: 正在连接到 '/dev/ttyUSB0' 上的 'Realtek AmebaZ',波特率 1500000 I: 读取闪存(8 MiB) $ ls -l solis-s3-firmware-1012f.bin 8388608 # 文件大小应正好为此,否则可能出错 10. 刷写 ESPHome 镜像(替换原厂 AliOS 2ndboot 和主应用程序)非常简单: $ ltchiptool flash write -d /dev/ttyUSB0 solis-emw3080.uf2 刷写后,您可以重新连接 S3 WiFi 棍到逆变器,状态数据将神奇地出现在 Home Assistant 中。 后续更新可以简单地通过 ESPHome 插件进行 OTA 上传。 :warning: 警告:显然写入闪存内存是 危险的,可能会永久损坏您的设备。请小心并让儿童远离。 :warning: 建议使用 [优质](https://zeptobars.com/en/read/FTDI-FT232RL-real-vs-fake-supereal) 的 FTDI FT232RL USB 串行适配器 进行转储和刷写。其他适配器可能会遇到 [所需高传输速率的问题](https://github.com/hn/ginlong-solis/issues/9#issuecomment-1604134701)。 在某些情况下,串行适配器或 USB 端口无法提供足够的功率来刷写棍,可以尝试更换适配器或 USB 端口。 :bulb: 此集成使用了一个 [修补过的](libretiny-ringbuffer-workaround.diff) 版本 的 [ArduinoCore-API](https://github.com/hn/ArduinoCore-API此变通方案是必要的,直到 得到修复。 :bulb: 与 EMW3080 数据手册匹配,理论上应使用 `generic-rtl8710bn-2mb-788k` 配置文件 用于 LibreTiny。但由于 Solis WiFi 棍具有 8MB 版本的特殊 MCU 和 OTA 地址为 0x100000,因此这里使用了 不完全匹配的配置文件 `generic-rtl8710bx-4mb-980k`,手动在 PlatformIO 选项中 [设置 MCU 类型和频率](https://github.com/libretiny-eu/libretiny/issues/91#issuecomment-1476792864) 为正确值。 ## Solis Modbus 寄存器映射和 RS-485 文档 Solis 产品至少具有两种不同的 Modbus 寄存器映射, `ESINV`(储能逆变器)映射主要使用 3xxxx(万位)范围的寄存器, 而 `INV`(逆变器)映射使用 3xxx(千位)范围。 建议(未经彻底测试)查询寄存器 35000(“逆变器类型定义”)并根据读取值的前两位 (十进制)(文档说明:“高 8 位表示协议版本,低 8 位表示逆变器型号”,但我认为如果将其解释为某种“十进制位”则更正确): - `10`:参见 [RS485_MODBUS (INV-3000IDEPM-36000ID) 逆变器协议](https://api.library.loxone.com/downloader/file/1197/RS485_MODBUS%20Communication%20Protocol_Solis%20Inverters.pdf) - `20`:参见 [RS485_MODBUS (ESINV-33000ID) 储能逆变器协议](https://forum.iobroker.net/assets/uploads/files/1619515984065-_without-control-hybrid-en-2020.9.15_rs485_modbus-esinv-33000id-hybrid-inverter.pdf) 对于 `INV` 3xxx 寄存器映射,需要在总线上发送前减去偏移量 1 (请参见文档第 5.3 节的说明)。 [Dr. Brian Coghlan](https://www.scss.tcd.ie/Brian.Coghlan/) 在 2018 年将 `ESINV`-Modbus [逆变器通信协议](https://www.scss.tcd.ie/Brian.Coghlan/Elios4you/RS485_MODBUS-Hybrid-BACoghlan-201811228-1854.pdf) 从中文翻译成英文, 但现在看来已被上述官方 Solis 版本所取代。 ## 其他信息 - 根据 [序列号命名规则](https://ginlongsolis.freshdesk.com/support/solutions/articles/36000044079-serial-number-naming-rule) 和 [Ginlong Solis 序列号解码器 V1.1.pdf](https://ginlongsolis.freshdesk.com/helpdesk/attachments/36042847221) Solis 逆变器序列号由 12 位或 15 位数字组成。补充以 [有用注释](https://github.com/hn/ginlong-solis/issues/1), 可推导出以下扩展语法: MM-0-YYMDD-SSSS(12 位格式) D-O-0-MM-0-YYMDD-SSSS(15 位格式) D-O-0-MMM-0-YYMDD-SSSS(16 位格式) - 有趣的是,Solis S3 WiFi 棍的 HTML 源文件可以在 [此仓库](https://github.com/c45449210/fs) 中找到。 ## 致谢 - [kuba2k2](https://github.com/kuba2k2) 提供了 LibreTiny 并耐心帮助解决问题和补丁。 - [fboundy](https://github.com/fboundy/) 提供了各种 Solis 棍的 [全面概述](https://github.com/fboundy/ha_solis_overview) 并展示了连接它们的多种选项。
标签:ESP8266, ESPhome, Ginlong Solis, Home Assistant, NTP 同步, RS-485, S3 WiFi Stick, 固件反向工程, 太阳能逆变器, 嵌入式开发, 开源固件, 数据记录器, 物联网, 物联网数据, 电源管理, 硬件接口, 能源监控, 输出功率限制, 逆向工具