logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

TOSA1 TONGOU Tuya Wi-Fi Energy Meter teardown: CB2S BK7231N, BL0942?

_geku_ 29 Mar 2026 08:39 1032 9
REKLAMA
Treść została przetłumaczona angielski » polski Zobacz oryginalną wersję tematu
  • #1 21872909
    _geku_
    Poziom 2  
    Posty: 10
    Ocena: 2
    TONGOU Tuya Smart WiFi Energy Meter - Teardown

    Grafika produktu TONGOU Tuya Smart WiFi Energy Meter z aplikacją i modułem na przewodzie Reklama licznika energii WiFi TONGOU z cewką pomiarową i informacją o dokładności 99,5% Biały moduł pomiaru energii WiFi 100–240V z otworem na przewód i niebiesko-brązowymi przewodami

    Kupiłem ten malutki, błyszczący moduł pomiaru mocy na Aliexpress. Co mamy w środku:

    Moduł: CB2S (BK7231N) - WiFi
    TuyaMCU: STC 8H3K64S2
    Czujnik: BL0942 - pomiar mocy

    Komunikacja między wszystkimi częściami odbywa się za pomocą 2 UARTów.

    Zestaw zawiera 2 płytki i cewkę pomiarową umieszczoną w plastikowej obudowie. Mniejsza płytka to WiFi + TuyaMCU, większa - czujnik pomiaru prądu z przetwornicą ac/dc:

    Zbliżenie zielonej płytki PCB z otworem na przekładnik, kondensatorami i przewodem brązowym oraz niebieskim Zbliżenie zielonej płytki PCB z otworem i przewodem oraz układem BL0942, trzymanej w palcach Płytka elektroniczna z modułem i naklejką „Model: CB2S” na białym tle Zbliżenie na płytkę PCB z układem STC i przyciskiem, trzymaną w palcach. Mała zielona płytka PCB z układem scalonym, przyciskiem i niebieskim modułem po lewej na białym tle Zbliżenie otwartej białej obudowy urządzenia z przewodami i elementem elektronicznym

    Pinout jest klasyczny dla architektury "WiFi - TuyaMCU - Sensor":

    Dwie strony zielonej płytki PCB z modułem CB2S i opisanymi pinami oraz rysunki pinoutu poniżej
    Dalsze badania rzuciły światło na wykorzystywaną przepustowość w stockowym oprogramowaniu układowym:

    1. Moduł UART -> TuyaMCU: 115200
    2. UART TuyaMCU -> Sensor: 38400

    Po odłączeniu dwóch płytek i włączeniu WiFi + TuyaMCU oprogramowanie układowe czasami zatrzymuje się na chwilę, a po zresetowaniu przez EN0 zapętla się, oto próbka komunikacji UART:

    Moduł:

    
    55 AA 00 00 00 00 FF  - Heartbeat (HB)
    55 AA 00 00 00 00 FF  - HB
    55 AA 00 00 00 00 FF  - HB
    55 AA 00 00 00 00 FF  - HB (MCU responded)
    55 AA 00 01 00 00 00  - ask product info
    55 AA 00 02 00 00 01  - ask working mode 
    55 AA 00 03 00 01 02 05 - notify Net status "The module searches for network"
    55 AA 00 03 00 01 03 06 - notify Net status "The module is registered with the network but not connected to the network" 
    55 AA 00 08 00 00 07 - ask sensor info (statuses from dpIds)
    55 AA 00 03 00 01 04 07  - notify Net status "   The module is connected to the network and gets an IP address"
    55 AA 00 08 00 00 07 - ask sensor info (statuses from dpIds) 
    55 AA 00 00 00 00 FF - HB
    55 AA 00 00 00 00 FF - HB 
    55 AA 00 00 00 00 FF - HB
    55 AA 00 00 00 00 FF - HB
    


    MCU:

    
    00 - pause
    55 AA 03 00 00 01 00 03 - HB response
    55 AA 03 01 00 2A 7B 22 ......................................................................... 0F  - product info
    55 AA 03 02 00 00 04 - response working mode - module works with the MCU to process network events
    55 AA 03 07 00 05 6E 04 00 01 0A 8B - dpId 6E (110) status, type Enum, len 0001, value 0A (10) = Under_Voltage_Alarm
    55 AA 03 00 00 01 00 03 - HB response
    55 AA 03 01 00 2A 7B 22 ......................................................................... 0F  - product info
    55 AA 03 02 00 00 04 - response working mode
    55 AA 03 07 00 05 6E 04 00 01 0A 8B - dpId 6E (110) status
    55 AA 03 00 00 01 00 03 - HB reponse
    55 AA 03 01 00 2A 7B 22 ......................................................................... 0F  - product info
    55 AA 03 02 00 00 04 - response working mode
    55 AA 03 07 00 05 6E 04 00 01 0A 8B - dpId 6E (110) status
    55 AA 03 00 00 01 00 03 - HB response
    55 AA 03 01 00 2A 7B 22 ......................................................................... 0F  - product info
    55 AA 03 07 00 05 6E 04 00 01 0A 8B - dpId 6E (110) status
    55 AA 03 02 00 00 04  - response working mode
    55 AA 03 00 00 01 00 03 - HB response
    55 AA 03 01 00 2A 7B 22 ......................................................................... 0F  - product info
    55 AA 03 07 00 05 6E 04 00 01 0A 8B - dpId 6E (110) status
    55 AA 03 02 00 00 04  - response working mode
    ....... looping the same
    


    Również przykład komunikacji BL0942 UART:

    
    55 00 00 00 87 07 00 12 09 00 00 00 00 00 00 00 20 4E 00 02 03 00 36 
    55 00 00 00 87 07 00 DE 07 00 00 00 00 00 00 00 20 4E 00 02 03 00 6C 
    55 00 00 00 87 07 00 F7 07 00 00 00 00 00 00 00 20 4E 00 02 03 00 53 
    55 00 00 00 87 07 00 34 0A 00 00 00 00 00 00 00 20 4E 00 02 03 00 13 
    55 00 00 00 87 07 00 9F 09 00 00 00 00 00 00 00 20 4E 00 02 03 00 A9 
    55 00 00 00 2B 07 00 35 09 00 00 00 00 00 00 00 20 4E 00 02 03 00 6F 
    55 00 00 00 2B 07 00 B8 0B 00 00 00 00 00 00 00 20 4E 00 02 03 00 EA 
    55 00 00 00 2B 07 00 65 0A 00 00 00 00 00 00 00 20 4E 00 02 03 00 3E 
    55 00 00 00 2B 07 00 F8 03 00 00 00 00 00 00 00 20 4E 00 02 03 00 B2 
    55 00 00 00 2B 07 00 3E 05 00 00 00 00 00 00 00 20 4E 00 02 03 00 6A 
    55 00 00 00 2B 07 00 81 05 00 00 00 00 00 00 00 20 4E 00 02 03 00 27 
    55 00 00 00 2B 07 00 CE 03 00 00 00 00 00 00 00 20 4E 00 02 03 00 DC 
    55 00 00 00 2B 07 00 3C 05 00 00 00 00 00 00 00 20 4E 00 02 03 00 6C 
    55 00 00 00 2B 07 00 16 06 00 00 00 00 00 00 00 20 4E 00 02 03 00 91 
    55 00 00 00 2B 07 00 B2 06 00 00 00 00 00 00 00 20 4E 00 02 03 00 F5 
    55 00 00 00 2B 07 00 D4 0C 00 00 00 00 00 00 00 20 4E 00 02 03 00 CD
    


    Badanie na portalu Tuya Dev dało mi kolejną listę dpID:

    
        "result": [
            { "dpId": 1, "dpName": "Total forward energy" },
            { "dpId": 131, "dpName": "CPU Real-time Temp" },
            { "dpId": 6, "dpName": "Phase A" },
            { "dpId": 11, "dpName": "Prepayment Switch" },
            { "dpId": 12, "dpName": "Clear Remaining Electricity" },
            { "dpId": 13, "dpName": "Remaining Electricity" },
            { "dpId": 14, "dpName": "Electricity Charge" },
            { "dpId": 32, "dpName": "Grid supply frequency" },
            { "dpId": 34, "dpName": "Factory Reset" },
            { "dpId": 101, "dpName": "Eletricity Shortage Setting" },
            { "dpId": 102, "dpName": "Over-voltage Setting" },
            { "dpId": 103, "dpName": "Under-voltage Setting" },
            { "dpId": 104, "dpName": "Over-current Setting" },
            { "dpId": 105, "dpName": "Over-power Setting" },
            { "dpId": 107, "dpName": "Temperature Setting" },
            { "dpId": 109, "dpName": "Online state" },
            { "dpId": 110, "dpName": "Event" },
            { "dpId": 113, "dpName": "Restore Default Switch" },
            { "dpId": 50, "dpName": "Overall Power Factor" },
            { "dpId": 114, "dpName": "Current Threshold" },
            { "dpId": 115, "dpName": "Over-voltage Threshold" },
            { "dpId": 116, "dpName": "Under-voltage Threshold" },
            { "dpId": 118, "dpName": "Temperature Threshold" },
            { "dpId": 119, "dpName": "Over-power Threshold" },
            { "dpId": 120, "dpName": "Electricity Shortage Threshold" },
            { "dpId": 125, "dpName": "Forward Electricity" }
        ]
    


    I skompilowałem ją do autoexec.bat . Jest to praca w toku, jeśli chodzi o typy kanałów, więc spodziewaj się kilku zmian później, jeśli wymyślę lepsze pisanie:

    
    clearIO
    
    startDriver TuyaMCU
    tuyaMcu_setBaudRate 115200
    waitFor MQTTState 1
    setMqttAutoDiscovery 0
    
    setChannelLabel 0 "Online state"
    setChannelType 0 Toggle_Inv
    linkTuyaMCUOutputToChannel 109 enum 0
    
    setChannelType 1 Voltage_div10
    setChannelLabel 1 "Real-time Voltage, V"
    setChannelType 2 Current_div1000
    setChannelLabel 2 "Real-time Current, A"
    setChannelType 3 Power
    setChannelLabel 3 "Real-time Power, W"
    linkTuyaMCUOutputToChannel 6 RAW_TAC2121C_VCP
    
    setChannelLabel 5 "CPU °C"
    setChannelType 5 Temperature_div10
    linkTuyaMCUOutputToChannel 131 val 5
    
    setChannelLabel 4 "Total forward energy, kWh"
    setChannelType 4 EnergyTotal_kWh_div100
    linkTuyaMCUOutputToChannel 1 val 4
    
    setChannelLabel 6 "Forward Electricity, kWh"
    setChannelType 6 EnergyTotal_kWh_div100
    linkTuyaMCUOutputToChannel 125 val 6
    
    setChannelLabel 7 "Event"
    setChannelType 7 ReadOnly
    #setChannelType 7 ReadOnlyEnum
    #setChannelEnum 7 0:Normal 1:Over_Current_Trip 2:Over_Power_Trip 3:High_Temp_Trip 4:Over_Voltage_Trip 5:Under_Voltage_Trip 6:Over_Current_Alarm 7:Over_Power_Alarm 8:High_Temp_Alarm 9:Over_Voltage_Alarm 10:Under_Voltage_Alarm 11:Remote_ON 12:Remote_OFF 13:Manual_ON 14:Manual_OFF 15:Leakage_Trip 16:Leakage_Alarm 17:Restore_Default 18:Automatic_Closing 19:Electricity_Shortage 20:Electricity_Shortage_Alarm 21:Timing_switch_ON 22:Timing_switch_OFF 23:Electricity_Reset
    linkTuyaMCUOutputToChannel 110 enum 7
    
    ##############
    # Advanced
    
    setChannelLabel 8 "Restore Default"
    setChannelType 8 Toggle
    linkTuyaMCUOutputToChannel 113 bool 8
    
    setChannelLabel 9 "Frequency"
    setChannelType 9 Frequency_div100
    linkTuyaMCUOutputToChannel 32 val 9
    
    setChannelLabel 10 "Overall Power Factor"
    setChannelType 10 PowerFactor_div100
    linkTuyaMCUOutputToChannel 50 val 10
    
    setChannelLabel 11 "Factory Reset"
    setChannelType 11 Toggle
    linkTuyaMCUOutputToChannel 34 bool 11
    
    #################
    # Prepaid Power Recharge
    
    # Remaining Electricity
    setChannelLabel 12 "Current Remaining Electricity, kWh"
    setChannelType 12 EnergyTotal_kWh_div100
    linkTuyaMCUOutputToChannel 13 val 12
    
    setChannelLabel 13 "Prepayment Switch"
    setChannelType 13 Toggle
    linkTuyaMCUOutputToChannel 11 bool 13
    
    setChannelLabel 14 "Clear Remaining Electricity"
    setChannelType 14 Toggle
    linkTuyaMCUOutputToChannel 12 bool 14
    
    setChannelLabel 15 "Add Electricity Charge, kWh/100"
    setChannelType 15 TextField
    linkTuyaMCUOutputToChannel 14 val 15
    
    #################
    # Feature
    
    # Over-current Setting
    setChannelLabel 16 "Over-current alarm"
    setChannelType 16 Toggle
    linkTuyaMCUOutputToChannel 104 bool 16
    
    setChannelLabel 17 "Current Threshold, 1-50, A"
    setChannelType 17 TextField
    linkTuyaMCUOutputToChannel 114 val 17
    
    # Over-voltage Setting
    setChannelLabel 18 "Over-voltage alarm"
    setChannelType 18 Toggle
    linkTuyaMCUOutputToChannel 102 bool 18
    
    setChannelLabel 19 "Over-voltage Threshold, 100-280, V"
    setChannelType 19 TextField
    linkTuyaMCUOutputToChannel 115 val 19
    
    # Under-voltage Setting
    setChannelLabel 20 "Under-voltage alarm"
    setChannelType 20 Toggle
    linkTuyaMCUOutputToChannel 103 bool 20
    
    setChannelLabel 21 "Under-voltage Threshold, 100-280, V"
    setChannelType 21 TextField
    linkTuyaMCUOutputToChannel 116 val 21
    
    # Over-power Setting
    setChannelLabel 22 "Over-power alarm"
    setChannelType 22 Toggle
    linkTuyaMCUOutputToChannel 105 bool 22
    
    setChannelLabel 23 "Over-power Threshold, 5-12005, W"
    setChannelType 23 TextField
    linkTuyaMCUOutputToChannel 119 val 23
    
    # Temperature Setting
    setChannelLabel 24 "Temperature alarm"
    setChannelType 24 Toggle
    linkTuyaMCUOutputToChannel 107 bool 24
    
    setChannelLabel 25 "Temperature Threshold, -25 - +100, °C"
    setChannelType 25 TextField
    linkTuyaMCUOutputToChannel 118 val 25
    
    # Eletricity Shortage Setting
    setChannelLabel 26 "Balance alarm"
    setChannelType 26 Toggle
    linkTuyaMCUOutputToChannel 101 bool 26
    
    setChannelLabel 27 "Balance Threshold, 10-500, kW.h"
    setChannelType 27 TextField
    linkTuyaMCUOutputToChannel 120 val 27
    
    # WATCHDOG
    
    # Watchdog channel
    setChannelLabel 200 "MCU Watchdog"
    setChannelType 200 ReadOnly
    setChannelPrivate 200 1
    setChannel 200 1
    
    # Reset watchdog on incoming measurements dpIds 6, 32, 50, 131 (channels 1, 2, 3, 9, 10, 5)
    addEventHandler OnChannelChange 1 if $CH200==0 then "setChannel 200 1"
    addEventHandler OnChannelChange 9 if $CH200==0 then "setChannel 200 1"
    addEventHandler OnChannelChange 10 if $CH200==0 then "setChannel 200 1"
    addEventHandler OnChannelChange 5 if $CH200==0 then "setChannel 200 1"
    
    # Toggle online_state if no measurements are received for more than X seconds, to restart MCU reporting
    addRepeatingEvent 7 -1 if $CH200==1 then "setChannel 200 0" else "backlog setChannel 0 1; delay_s 1; setChannel 0 0"
    
    tuyaMcu_sendQueryState
    


    Ustawiłem tylko jedną flagę - Flaga 29 - [NETIF] Użyj krótkiej nazwy urządzenia jako nazwy hosta zamiast długiej nazwy.
    Ponadto wyczyściłem nazwę grupy urządzeń, aby upewnić się, że sterownik DGR się nie ładuje.
    To dało mi całkiem stabilną konfigurację.
    Pomiary są wysyłane co 5 sekund, tak samo jak w standardowym oprogramowaniu - wpadłem na pomysł, aby podłączyć CB2S bezpośrednio do BL0942, być może będzie szybciej.

    Wszystkie eksperymenty zostały wykonane przy użyciu oprogramowania w wersji 1.18.280 dla BK7231N.
  • REKLAMA
  • #2 21873481
    _geku_
    Poziom 2  
    Posty: 10
    Ocena: 2
    Zaktualizowałem oryginalny post o nową konfigurację autoexec.bat i flagi, która dała mi całkiem stabilne wyniki.
  • REKLAMA
  • #3 21873754
    _geku_
    Poziom 2  
    Posty: 10
    Ocena: 2
    Wygląda na to, że nadal mam problemy ze stabilnością:

    Wykres liniowy napięcia w V w czasie, ok. 7:00–9:40, z wahaniami i skokowymi zmianami.

    Co 30 min przestaje wysyłać odczyty V/C/P z raw dpId 6 (faza A - RAW_TAC2121C_VCP). Co widzę w logach... Zauważyłem 2 problemy.

    1. Nieobsługiwany typ punktu danych 201 - błąd. Ale powtarza się za każdym razem, gdy odczyty z dpId 6 są wypychane przez MCU, więc prawdopodobnie nie jest to problem ze stabilnością:

    
    Info:TuyaMCU:Received: 55 AA 03 07 00 0C 06 00 00 08 08 A6 00 00 00 00 00 00 D1 
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 7 (State) len 19
    Info:TuyaMCU:ParseState: id 6 type 0-raw len 8
    Info:GEN:CHANNEL_Set channel 3 has changed to 2214 (flags 0)
    
    Info:TuyaMCU:OnChannelChanged: channel 3: unsupported data point type 201-error
    Info:MQTT:Channel has changed! Publishing 2214 to channel 3 
    Info:MQTT:Publishing val 2214 to home/power/meter/pm1/3/get retain=0
    Info:GEN:No change in channel 4 (still set to 0) - ignoring
    
    Info:GEN:No change in channel 5 (still set to 0) - ignoring
    


    UPDATE: naprawione przez zastąpienie:
    linkTuyaMCUOutputToChannel 6 RAW_TAC2121C_VCP 3

    na
    linkTuyaMCUOutputToChannel 6 RAW_TAC2121C_VCP

    Zaktualizowano oryginalny plik autoexec.bat .

    2. wifi_state_timer ponownie przesuwa się z 59 na 0, Wyśle SetWiFiState 4 pojawi się - brak nowych odczytów z V/C/P dpId 6
    
    ExtraDebug:TuyaMCU:TuyaMCU heartbeat_valid = 1, product_information_valid=1, self_processing_mode = 1, wifi_state_valid = 1, wifi_state_timer=58
    Info:MAIN:Time 1810, idle 170194/s, free 61560, MQTT 1(1), bWifi 1, secondsWithNoPing -1, socks 2/38 
    Info:GEN:dhcp=0 ip=xxx.xxx.xxx.xxx gate=xxx.xxx.xxx.xxx mask=xxx.xxx.xxx.xxx mac=xx:xx:xx:xx:xx:xx
    Info:GEN:sta: 1, softap: 0, b/g/n
    Info:GEN:sta:rssi=-35,ssid=xxxxxxxx,bssid=xx:xx:xx:xx:xx:xx,channel=1,cipher_type:CCMP
    ExtraDebug:TuyaMCU:TuyaMCU heartbeat_valid = 1, product_information_valid=1, self_processing_mode = 1, wifi_state_valid = 1, wifi_state_timer=59
    Info:MAIN:Time 1811, idle 169377/s, free 61560, MQTT 1(1), bWifi 1, secondsWithNoPing -1, socks 2/38 
    ExtraDebug:TuyaMCU:TuyaMCU heartbeat_valid = 1, product_information_valid=1, self_processing_mode = 1, wifi_state_valid = 1, wifi_state_timer=0
    ExtraDebug:TuyaMCU:Will send SetWiFiState 4.
    Info:MAIN:Time 1812, idle 175906/s, free 61560, MQTT 1(1), bWifi 1, secondsWithNoPing -1, socks 2/38 
    Info:TuyaMCU:Received: 55 AA 03 03 00 00 05 
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 3 (WiFiState) len 7
    ExtraDebug:TuyaMCU:TuyaMCU heartbeat_valid = 1, product_information_valid=1, self_processing_mode = 1, wifi_state_valid = 1, wifi_state_timer=2
    Info:MAIN:Time 1813, idle 168585/s, free 61560, MQTT 1(1), bWifi 1, secondsWithNoPing -1, socks 2/38 
    Info:TuyaMCU:Received: 55 AA 03 00 00 01 01 04 
    Info:TuyaMCU:ProcessIncoming[v=3]: cmd 0 (Hearbeat) len 8
    ExtraDebug:TuyaMCU:TuyaMCU heartbeat_valid = 1, product_information_valid=1, self_processing_mode = 1, wifi_state_valid = 1, wifi_state_timer=2
    Info:MAIN:Time 1814, idle 171955/s, free 61560, MQTT 1(1), bWifi 1, secondsWithNoPing -1, socks 2/38 
    


    Dodano po 8 [godzinach] 38 [minutach]:

    To wina samego MCU. I to zachowanie występuje również w przypadku oprogramowania układowego. I nawet reset za pomocą aplikacji SmartLife nie pomógł.
    Po 30 minutach czujnik nadal wysyła dane do MCU przez UART, tak jak wcześniej.
    Bicie serca między MCU a modułem również działa jak zwykle. Ale MCU nie wysyła żadnych pomiarów do modułu.
    Jedna obserwacja - wysyła ostatnio zaktualizowane informacje o stanie, a następnie po 30 sekundach piaskuje kolejną, a następnie zawiesza się.
    Nie wiem, co robić dalej... Aplikacja mówi, że MCU w wersji 1.0.0, a nie ma żadnych aktualizacji.
    Być może po prostu podłączę czujnik bezpośrednio do CB2S UART i całkowicie odlutuję MCU.

    Dodano po 11 [godzinach] 35 [minutach]:

    Alerts\Thresholds również nie działa, gdy MCU utknął, więc wygląda na to, że procedura pomiarowa lub cokolwiek innego, czego używa, naprawdę się zatrzymała.
    Sprawdziłem PIN resetu na MCU i wygląda na to, że jest podciągnięty wysoko, więc reset występuje tylko przy rezystorze 10 Ohm (300 Ohm proponowane przez specyfikację nie działa, nawet 47 i 22 Ohm nie działa) - ale jest to zwarcie, a nie właściwy reset.

    Dodano po 2 [godzinach] 19 [minutach]:

    Raz na godzinę pozwala na 1 odczyt:

    Wykres liniowy napięcia (V) w czasie z nagłymi skokami i odcinkami schodkowymi
  • REKLAMA
  • #4 21875077
    _geku_
    Poziom 2  
    Posty: 10
    Ocena: 2
    W końcu znalazłem rozwiązanie - trzeba przełączać dpId 109 (online_state) tam i z powrotem, a urządzenie zaczyna ponownie wysyłać pomiary.
    Wszystko zaczęło się od analizy specyfikacji urządzenia, którą otrzymałem z Tuya Dev Portal:
    
    [
            {
                "functionSet": {
                    "accessType": "rw",
                    "code": "forward_energy_total",
                    "codeDesc": "",
                    "codeName": "正向总有功电量",
                    "dpFormat": "{\"forward_energy_total\":\"$\"}",
                    "langDict": {
                        "unit": "kW‧h"
                    },
                    "mainDP": "forward_energy_total",
                    "name": "Total forward energy",
                    "remark": "",
                    "valueDesc": "{\"unit\":\"kW·h\",\"min\":0,\"max\":99999999,\"scale\":2,\"step\":1}",
                    "valueType": "Integer"
                },
                "schema": {
                    "accessType": "rw",
                    "code": "forward_energy_total",
                    "langDict": {
                        "unit": "kW‧h"
                    },
                    "name": "Total forward energy",
                    "remark": "forward_energy_total",
                    "valueDesc": "{\"unit\":\"kW·h\",\"min\":0,\"max\":99999999,\"scale\":2,\"step\":1}",
                    "valueType": "Integer"
                }
            },
            {
                "functionSet": {
                    "accessType": "ro",
                    "code": "phase_a",
                    "codeDesc": "",
                    "codeName": "A相电压,电流及功率",
                    "dpFormat": "{\"phase_a\":\"$\"}",
                    "langDict": {
                        "unit": ""
                    },
                    "mainDP": "phase_a",
                    "name": "Phase A",
                    "remark": "",
                    "valueDesc": "{\"maxlen\":128}",
                    "valueType": "Raw"
                },
                "schema": {
                    "accessType": "ro",
                    "code": "phase_a",
                    "langDict": {},
                    "name": "Phase A",
                    "remark": "phase_a",
                    "valueDesc": "{\"maxlen\":128}",
                    "valueType": "Raw"
                }
            },
            {
                "functionSet": {
                    "accessType": "rw",
                    "code": "prepayment_switch",
                    "codeDesc": "",
                    "codeName": "预付费开关",
                    "dpFormat": "{\"prepayment_switch\":\"$\"}",
                    "langDict": {
                        "false": "Off",
                        "true": "On"
                    },
                    "mainDP": "prepayment_switch",
                    "name": "Prepayment Switch",
                    "remark": "",
                    "valueDesc": "{}",
                    "valueType": "Boolean"
                },
                "schema": {
                    "accessType": "rw",
                    "code": "prepayment_switch",
                    "langDict": {
                        "false": "Off",
                        "true": "On"
                    },
                    "name": "Prepayment Switch",
                    "remark": "prepayment_switch",
                    "valueDesc": "{}",
                    "valueType": "Boolean"
                }
            },
            {
                "functionSet": {
                    "accessType": "rw",
                    "code": "clear_energy",
                    "codeDesc": "",
                    "codeName": "剩余可用电量清零",
                    "dpFormat": "{\"clear_energy\":\"$\"}",
                    "langDict": {
                        "false": "OFF",
                        "true": "ON"
                    },
                    "mainDP": "clear_energy",
                    "name": "Clear Remaining Electricity",
                    "remark": "",
                    "valueDesc": "{}",
                    "valueType": "Boolean"
                },
                "schema": {
                    "accessType": "rw",
                    "code": "clear_energy",
                    "langDict": {
                        "false": "OFF",
                        "true": "ON"
                    },
                    "name": "Clear Remaining Electricity",
                    "remark": "clear_energy",
                    "valueDesc": "{}",
                    "valueType": "Boolean"
                }
            },
            {
                "functionSet": {
                    "accessType": "ro",
                    "code": "balance_energy",
                    "codeDesc": "",
                    "codeName": "剩余可用电量显示",
                    "dpFormat": "{\"balance_energy\":\"$\"}",
                    "langDict": {
                        "unit": "kW‧h"
                    },
                    "mainDP": "balance_energy",
                    "name": "Remaining Electricity",
                    "remark": "",
                    "valueDesc": "{\"unit\":\"kW·h\",\"min\":0,\"max\":99999999,\"scale\":2,\"step\":1}",
                    "valueType": "Integer"
                },
                "schema": {
                    "accessType": "ro",
                    "code": "balance_energy",
                    "langDict": {
                        "unit": "kW‧h"
                    },
                    "name": "Remaining Electricity",
                    "remark": "balance_energy",
                    "valueDesc": "{\"unit\":\"kW·h\",\"min\":0,\"max\":99999999,\"scale\":2,\"step\":1}",
                    "valueType": "Integer"
                }
            },
            {
                "functionSet": {
                    "accessType": "rw",
                    "code": "energy_charge",
                    "codeDesc": "",
                    "codeName": "电量充值",
                    "dpFormat": "{\"energy_charge\":\"$\"}",
                    "langDict": {
                        "unit": "kW‧h"
                    },
                    "mainDP": "energy_charge",
                    "name": "Electricity Charge",
                    "remark": "",
                    "valueDesc": "{\"unit\":\"kW·h\",\"min\":0,\"max\":999999,\"scale\":2,\"step\":1}",
                    "valueType": "Integer"
                },
                "schema": {
                    "accessType": "rw",
                    "code": "energy_charge",
                    "langDict": {
                        "unit": "kW‧h"
                    },
                    "name": "Electricity Charge",
                    "remark": "energy_charge",
                    "valueDesc": "{\"unit\":\"kW·h\",\"min\":0,\"max\":999999,\"scale\":2,\"step\":1}",
                    "valueType": "Integer"
                }
            },
            {
                "functionSet": {
                    "accessType": "ro",
                    "code": "supply_frequency",
                    "codeDesc": "",
                    "codeName": "电网供电频率",
                    "dpFormat": "{\"supply_frequency\":\"$\"}",
                    "langDict": {
                        "unit": "Hz"
                    },
                    "mainDP": "supply_frequency",
                    "name": "Grid supply frequency",
                    "remark": "",
                    "valueDesc": "{\"unit\":\"Hz\",\"min\":0,\"max\":9999,\"scale\":2,\"step\":1}",
                    "valueType": "Integer"
                },
                "schema": {
                    "accessType": "ro",
                    "code": "supply_frequency",
                    "langDict": {
                        "unit": "Hz"
                    },
                    "name": "Grid supply frequency",
                    "remark": "supply_frequency",
                    "valueDesc": "{\"unit\":\"Hz\",\"min\":0,\"max\":9999,\"scale\":2,\"step\":1}",
                    "valueType": "Integer"
                }
            },
            {
                "functionSet": {
                    "accessType": "rw",
                    "code": "factory_reset",
                    "codeDesc": "",
                    "codeName": "恢复出厂设置",
                    "dpFormat": "{\"factory_reset\":\"$\"}",
                    "langDict": {
                        "false": "OFF",
                        "true": "ON"
                    },
                    "mainDP": "factory_reset",
                    "name": "Factory Reset",
                    "remark": "",
                    "valueDesc": "{}",
                    "valueType": "Boolean"
                },
                "schema": {
                    "accessType": "rw",
                    "code": "factory_reset",
                    "langDict": {
                        "false": "OFF",
                        "true": "ON"
                    },
                    "name": "Factory Reset",
                    "remark": "factory_reset",
                    "valueDesc": "{}",
                    "valueType": "Boolean"
                }
            },
            {
                "functionSet": {
                    "accessType": "ro",
                    "code": "power_factor",
                    "codeDesc": "",
                    "codeName": "总功率因数",
                    "dpFormat": "{\"power_factor\":\"$\"}",
                    "langDict": {
                        "unit": ""
                    },
                    "mainDP": "power_factor",
                    "name": "Overall Power Factor",
                    "remark": "",
                    "valueDesc": "{\"unit\":\"\",\"min\":-999,\"max\":999,\"scale\":2,\"step\":1}",
                    "valueType": "Integer"
                },
                "schema": {
                    "accessType": "ro",
                    "code": "power_factor",
                    "langDict": {
                        "unit": ""
                    },
                    "name": "Overall Power Factor",
                    "remark": "power_factor",
                    "valueDesc": "{\"unit\":\"\",\"min\":-999,\"max\":999,\"scale\":2,\"step\":1}",
                    "valueType": "Integer"
                }
            },
            {
                "functionSet": {
                    "accessType": "rw",
                    "code": "energy_shortage_set",
                    "codeDesc": "",
                    "codeName": "余额不足报警",
                    "dpFormat": "{\"energy_shortage_set\":\"$\"}",
                    "langDict": {
                        "Alarm": "",
                        "Closed": ""
                    },
                    "mainDP": "energy_shortage_set",
                    "name": "Eletricity Shortage Setting",
                    "remark": "",
                    "valueDesc": "{\"range\":[\"Closed\",\"Alarm\"]}",
                    "valueType": "Enum"
                },
                "schema": {
                    "accessType": "rw",
                    "code": "energy_shortage_set",
                    "langDict": {
                        "Alarm": "",
                        "Closed": ""
                    },
                    "name": "Eletricity Shortage Setting",
                    "remark": "energy_shortage_set",
                    "valueDesc": "{\"range\":[\"Closed\",\"Alarm\"]}",
                    "valueType": "Enum"
                }
            },
            {
                "functionSet": {
                    "accessType": "rw",
                    "code": "ov_set",
                    "codeDesc": "",
                    "codeName": "过压设置",
                    "dpFormat": "{\"ov_set\":\"$\"}",
                    "langDict": {
                        "Alarm": "",
                        "Closed": ""
                    },
                    "mainDP": "ov_set",
                    "name": "Over-voltage Setting",
                    "remark": "",
                    "valueDesc": "{\"range\":[\"Closed\",\"Alarm\"]}",
                    "valueType": "Enum"
                },
                "schema": {
                    "accessType": "rw",
                    "code": "ov_set",
                    "langDict": {
                        "Alarm": "",
                        "Closed": ""
                    },
                    "name": "Over-voltage Setting",
                    "remark": "ov_set",
                    "valueDesc": "{\"range\":[\"Closed\",\"Alarm\"]}",
                    "valueType": "Enum"
                }
            },
            {
                "functionSet": {
                    "accessType": "rw",
                    "code": "uv_set",
                    "codeDesc": "",
                    "codeName": "欠压设置",
                    "dpFormat": "{\"uv_set\":\"$\"}",
                    "langDict": {
                        "Alarm": "",
                        "Closed": ""
                    },
                    "mainDP": "uv_set",
                    "name": "Under-voltage Setting",
                    "remark": "",
                    "valueDesc": "{\"range\":[\"Closed\",\"Alarm\"]}",
                    "valueType": "Enum"
                },
                "schema": {
                    "accessType": "rw",
                    "code": "uv_set",
                    "langDict": {
                        "Alarm": "",
                        "Closed": ""
                    },
                    "name": "Under-voltage Setting",
                    "remark": "uv_set",
                    "valueDesc": "{\"range\":[\"Closed\",\"Alarm\"]}",
                    "valueType": "Enum"
                }
            },
            {
                "functionSet": {
                    "accessType": "rw",
                    "code": "oc_set",
                    "codeDesc": "",
                    "codeName": "过电流设置",
                    "dpFormat": "{\"oc_set\":\"$\"}",
                    "langDict": {
                        "Alarm": "",
                        "Closed": ""
                    },
                    "mainDP": "oc_set",
                    "name": "Over-current Setting",
                    "remark": "",
                    "valueDesc": "{\"range\":[\"Closed\",\"Alarm\"]}",
                    "valueType": "Enum"
                },
                "schema": {
                    "accessType": "rw",
                    "code": "oc_set",
                    "langDict": {
                        "Alarm": "",
                        "Closed": ""
                    },
                    "name": "Over-current Setting",
                    "remark": "oc_set",
                    "valueDesc": "{\"range\":[\"Closed\",\"Alarm\"]}",
                    "valueType": "Enum"
                }
            },
            {
                "functionSet": {
                    "accessType": "rw",
                    "code": "op_set",
                    "codeDesc": "",
                    "codeName": "过功率设置",
                    "dpFormat": "{\"op_set\":\"$\"}",
                    "langDict": {
                        "Alarm": "",
                        "Closed": ""
                    },
                    "mainDP": "op_set",
                    "name": "Over-power Setting",
                    "remark": "",
                    "valueDesc": "{\"range\":[\"Closed\",\"Alarm\"]}",
                    "valueType": "Enum"
                },
                "schema": {
                    "accessType": "rw",
                    "code": "op_set",
                    "langDict": {
                        "Alarm": "",
                        "Closed": ""
                    },
                    "name": "Over-power Setting",
                    "remark": "op_set",
                    "valueDesc": "{\"range\":[\"Closed\",\"Alarm\"]}",
                    "valueType": "Enum"
                }
            },
            {
                "functionSet": {
                    "accessType": "rw",
                    "code": "temp_set",
                    "codeDesc": "",
                    "codeName": "温度设置",
                    "dpFormat": "{\"temp_set\":\"$\"}",
                    "langDict": {
                        "Alarm": "",
                        "Closed": ""
                    },
                    "mainDP": "temp_set",
                    "name": "Temperature Setting",
                    "remark": "",
                    "valueDesc": "{\"range\":[\"Closed\",\"Alarm\"]}",
                    "valueType": "Enum"
                },
                "schema": {
                    "accessType": "rw",
                    "code": "temp_set",
                    "langDict": {
                        "Alarm": "",
                        "Closed": ""
                    },
                    "name": "Temperature Setting",
                    "remark": "temp_set",
                    "valueDesc": "{\"range\":[\"Closed\",\"Alarm\"]}",
                    "valueType": "Enum"
                }
            },
            {
                "functionSet": {
                    "accessType": "rw",
                    "code": "online_state",
                    "codeDesc": "",
                    "codeName": "在线状态",
                    "dpFormat": "{\"online_state\":\"$\"}",
                    "langDict": {
                        "offline": "Offline",
                        "online": "Online"
                    },
                    "mainDP": "online_state",
                    "name": "Online state",
                    "remark": "",
                    "valueDesc": "{\"range\":[\"online\",\"offline\"]}",
                    "valueType": "Enum"
                },
                "schema": {
                    "accessType": "rw",
                    "code": "online_state",
                    "langDict": {
                        "offline": "Offline",
                        "online": "Online"
                    },
                    "name": "Online state",
                    "remark": "online_state",
                    "valueDesc": "{\"range\":[\"online\",\"offline\"]}",
                    "valueType": "Enum"
                }
            },
            {
                "functionSet": {
                    "accessType": "rw",
                    "code": "event",
                    "codeDesc": "",
                    "codeName": "实时事件",
                    "dpFormat": "{\"event\":\"$\"}",
                    "langDict": {
                        "Automatic_Closing": "",
                        "Electricity_Reset": "",
                        "Electricity_Shortage": "",
                        "Electricity_Shortage_Alarm": "",
                        "High_Temp_Alarm": "",
                        "High_Temp_Trip": "",
                        "Leakage_Alarm": "",
                        "Leakage_Trip": "",
                        "Manual_OFF": "",
                        "Manual_ON": "",
                        "Normal": "",
                        "Over_Current_Alarm": "",
                        "Over_Current_Trip": "",
                        "Over_Power_Alarm": "",
                        "Over_Power_Trip": "",
                        "Over_Voltage_Alarm": "",
                        "Over_Voltage_Trip": "",
                        "Remote_OFF": "",
                        "Remote_ON": "",
                        "Restore_Default": "",
                        "Timing_switch_OFF": "",
                        "Timing_switch_ON": "",
                        "Under_Voltage_Alarm": "",
                        "Under_Voltage_Trip": ""
                    },
                    "mainDP": "event",
                    "name": "Event",
                    "remark": "",
                    "valueDesc": "{\"range\":[\"Normal\",\"Over_Current_Trip\",\"Over_Power_Trip\",\"High_Temp_Trip\",\"Over_Voltage_Trip\",\"Under_Voltage_Trip\",\"Over_Current_Alarm\",\"Over_Power_Alarm\",\"High_Temp_Alarm\",\"Over_Voltage_Alarm\",\"Under_Voltage_Alarm\",\"Remote_ON\",\"Remote_OFF\",\"Manual_ON\",\"Manual_OFF\",\"Leakage_Trip\",\"Leakage_Alarm\",\"Restore_Default\",\"Automatic_Closing\",\"Electricity_Shortage\",\"Electricity_Shortage_Alarm\",\"Timing_switch_ON\",\"Timing_switch_OFF\",\"Electricity_Reset\"]}",
                    "valueType": "Enum"
                },
                "schema": {
                    "accessType": "rw",
                    "code": "event",
                    "langDict": {
                        "Automatic_Closing": "",
                        "Electricity_Reset": "",
                        "Electricity_Shortage": "",
                        "Electricity_Shortage_Alarm": "",
                        "High_Temp_Alarm": "",
                        "High_Temp_Trip": "",
                        "Leakage_Alarm": "",
                        "Leakage_Trip": "",
                        "Manual_OFF": "",
                        "Manual_ON": "",
                        "Normal": "",
                        "Over_Current_Alarm": "",
                        "Over_Current_Trip": "",
                        "Over_Power_Alarm": "",
                        "Over_Power_Trip": "",
                        "Over_Voltage_Alarm": "",
                        "Over_Voltage_Trip": "",
                        "Remote_OFF": "",
                        "Remote_ON": "",
                        "Restore_Default": "",
                        "Timing_switch_OFF": "",
                        "Timing_switch_ON": "",
                        "Under_Voltage_Alarm": "",
                        "Under_Voltage_Trip": ""
                    },
                    "name": "Event",
                    "remark": "event",
                    "valueDesc": "{\"range\":[\"Normal\",\"Over_Current_Trip\",\"Over_Power_Trip\",\"High_Temp_Trip\",\"Over_Voltage_Trip\",\"Under_Voltage_Trip\",\"Over_Current_Alarm\",\"Over_Power_Alarm\",\"High_Temp_Alarm\",\"Over_Voltage_Alarm\",\"Under_Voltage_Alarm\",\"Remote_ON\",\"Remote_OFF\",\"Manual_ON\",\"Manual_OFF\",\"Leakage_Trip\",\"Leakage_Alarm\",\"Restore_Default\",\"Automatic_Closing\",\"Electricity_Shortage\",\"Electricity_Shortage_Alarm\",\"Timing_switch_ON\",\"Timing_switch_OFF\",\"Electricity_Reset\"]}",
                    "valueType": "Enum"
                }
            },
            {
                "functionSet": {
                    "accessType": "wr",
                    "code": "rd_set",
                    "codeDesc": "",
                    "codeDescEn": "",
                    "codeName": "恢复默认开关",
                    "dpFormat": "{\"rd_set\":\"$\"}",
                    "langDict": {
                        "false": "OFF",
                        "true": "ON"
                    },
                    "mainDP": "rd_set",
                    "name": "Restore Default Switch",
                    "remark": "",
                    "valueDesc": "{}",
                    "valueType": "Boolean"
                },
                "schema": {
                    "accessType": "wr",
                    "code": "rd_set",
                    "langDict": {
                        "false": "OFF",
                        "true": "ON"
                    },
                    "name": "Restore Default Switch",
                    "remark": "rd_set",
                    "valueDesc": "{}",
                    "valueType": "Boolean"
                }
            },
            {
                "functionSet": {
                    "accessType": "rw",
                    "code": "c_thresh",
                    "codeDesc": "",
                    "codeName": "电流阈值",
                    "dpFormat": "{\"c_thresh\":\"$\"}",
                    "langDict": {
                        "unit": "A"
                    },
                    "mainDP": "c_thresh",
                    "name": "Current Threshold",
                    "remark": "",
                    "valueDesc": "{\"unit\":\"A\",\"min\":1,\"max\":50,\"scale\":0,\"step\":1}",
                    "valueType": "Integer"
                },
                "schema": {
                    "accessType": "rw",
                    "code": "c_thresh",
                    "langDict": {
                        "unit": "A"
                    },
                    "name": "Current Threshold",
                    "remark": "c_thresh",
                    "valueDesc": "{\"unit\":\"A\",\"min\":1,\"max\":50,\"scale\":0,\"step\":1}",
                    "valueType": "Integer"
                }
            },
            {
                "functionSet": {
                    "accessType": "rw",
                    "code": "ov_thresh",
                    "codeDesc": "",
                    "codeName": "过压阈值",
                    "dpFormat": "{\"ov_thresh\":\"$\"}",
                    "langDict": {
                        "unit": "V"
                    },
                    "mainDP": "ov_thresh",
                    "name": "Over-voltage Threshold",
                    "remark": "",
                    "valueDesc": "{\"unit\":\"V\",\"min\":100,\"max\":280,\"scale\":0,\"step\":1}",
                    "valueType": "Integer"
                },
                "schema": {
                    "accessType": "rw",
                    "code": "ov_thresh",
                    "langDict": {
                        "unit": "V"
                    },
                    "name": "Over-voltage Threshold",
                    "remark": "ov_thresh",
                    "valueDesc": "{\"unit\":\"V\",\"min\":100,\"max\":280,\"scale\":0,\"step\":1}",
                    "valueType": "Integer"
                }
            },
            {
                "functionSet": {
                    "accessType": "rw",
                    "code": "uv_thresh",
                    "codeDesc": "",
                    "codeName": "欠压阈值",
                    "dpFormat": "{\"uv_thresh\":\"$\"}",
                    "langDict": {
                        "unit": "V"
                    },
                    "mainDP": "uv_thresh",
                    "name": "Under-voltage Threshold",
                    "remark": "",
                    "valueDesc": "{\"unit\":\"V\",\"min\":100,\"max\":280,\"scale\":0,\"step\":1}",
                    "valueType": "Integer"
                },
                "schema": {
                    "accessType": "rw",
                    "code": "uv_thresh",
                    "langDict": {
                        "unit": "V"
                    },
                    "name": "Under-voltage Threshold",
                    "remark": "uv_thresh",
                    "valueDesc": "{\"unit\":\"V\",\"min\":100,\"max\":280,\"scale\":0,\"step\":1}",
                    "valueType": "Integer"
                }
            },
            {
                "functionSet": {
                    "accessType": "rw",
                    "code": "temp_thresh",
                    "codeDesc": "",
                    "codeName": "温度阈值",
                    "dpFormat": "{\"temp_thresh\":\"$\"}",
                    "langDict": {
                        "unit": "℃"
                    },
                    "mainDP": "temp_thresh",
                    "name": "Temperature Threshold",
                    "remark": "",
                    "valueDesc": "{\"unit\":\"℃\",\"min\":-250,\"max\":1000,\"scale\":1,\"step\":1}",
                    "valueType": "Integer"
                },
                "schema": {
                    "accessType": "rw",
                    "code": "temp_thresh",
                    "langDict": {
                        "unit": "℃"
                    },
                    "name": "Temperature Threshold",
                    "remark": "temp_thresh",
                    "valueDesc": "{\"unit\":\"℃\",\"min\":-250,\"max\":1000,\"scale\":1,\"step\":1}",
                    "valueType": "Integer"
                }
            },
            {
                "functionSet": {
                    "accessType": "rw",
                    "code": "op_thresh",
                    "codeDesc": "",
                    "codeName": "过功率阈值",
                    "dpFormat": "{\"op_thresh\":\"$\"}",
                    "langDict": {
                        "unit": "W"
                    },
                    "mainDP": "op_thresh",
                    "name": "Over-power Threshold",
                    "remark": "",
                    "valueDesc": "{\"unit\":\"W\",\"min\":5,\"max\":12000,\"scale\":0,\"step\":10}",
                    "valueType": "Integer"
                },
                "schema": {
                    "accessType": "rw",
                    "code": "op_thresh",
                    "langDict": {
                        "unit": "W"
                    },
                    "name": "Over-power Threshold",
                    "remark": "op_thresh",
                    "valueDesc": "{\"unit\":\"W\",\"min\":5,\"max\":12000,\"scale\":0,\"step\":10}",
                    "valueType": "Integer"
                }
            },
            {
                "functionSet": {
                    "accessType": "rw",
                    "code": "energy_shortage",
                    "codeDesc": "",
                    "codeName": "余额报警阈值",
                    "dpFormat": "{\"energy_shortage\":\"$\"}",
                    "langDict": {
                        "unit": "kW‧h"
                    },
                    "mainDP": "energy_shortage",
                    "name": "Electricity Shortage Threshold",
                    "remark": "",
                    "valueDesc": "{\"unit\":\"kW·h\",\"min\":10,\"max\":500,\"scale\":0,\"step\":1}",
                    "valueType": "Integer"
                },
                "schema": {
                    "accessType": "rw",
                    "code": "energy_shortage",
                    "langDict": {
                        "unit": "kW‧h"
                    },
                    "name": "Electricity Shortage Threshold",
                    "remark": "energy_shortage",
                    "valueDesc": "{\"unit\":\"kW·h\",\"min\":10,\"max\":500,\"scale\":0,\"step\":1}",
                    "valueType": "Integer"
                }
            },
            {
                "functionSet": {
                    "accessType": "ro",
                    "code": "fap_a",
                    "codeDesc": "",
                    "codeName": "正向总电量",
                    "dpFormat": "{\"fap_a\":\"$\"}",
                    "langDict": {
                        "unit": "kW‧h"
                    },
                    "mainDP": "fap_a",
                    "name": "Forward Electricity",
                    "remark": "",
                    "valueDesc": "{\"unit\":\"kW·h\",\"min\":0,\"max\":99999999,\"scale\":2,\"step\":1}",
                    "valueType": "Integer"
                },
                "schema": {
                    "accessType": "ro",
                    "code": "fap_a",
                    "langDict": {
                        "unit": "kW‧h"
                    },
                    "name": "Forward Electricity",
                    "remark": "fap_a",
                    "valueDesc": "{\"unit\":\"kW·h\",\"min\":0,\"max\":99999999,\"scale\":2,\"step\":1}",
                    "valueType": "Integer"
                }
            },
            {
                "functionSet": {
                    "accessType": "ro",
                    "code": "temp_a",
                    "codeDesc": "",
                    "codeName": "实时温度",
                    "dpFormat": "{\"temp_a\":\"$\"}",
                    "langDict": {
                        "unit": "℃"
                    },
                    "mainDP": "temp_a",
                    "name": "CPU Real-time Temp",
                    "remark": "",
                    "valueDesc": "{\"unit\":\"℃\",\"min\":-250,\"max\":1000,\"scale\":1,\"step\":1}",
                    "valueType": "Integer"
                },
                "schema": {
                    "accessType": "ro",
                    "code": "temp_a",
                    "langDict": {
                        "unit": "℃"
                    },
                    "name": "CPU Real-time Temp",
                    "remark": "temp_a",
                    "valueDesc": "{\"unit\":\"℃\",\"min\":-250,\"max\":1000,\"scale\":1,\"step\":1}",
                    "valueType": "Integer"
                }
            }
        ]
    


    Zauważyłem tam, że online_state to rw , nie ro . Po zmianie typu kanału na Toggle_inv i włączeniu online -> offline -> online, zaczęło działać. Skończyło się na zaktualizowaniu autoexec.bat z watchdog timerem. Ideą jest nasłuchiwanie zmian na dpIds 131, 6, 32, 50 i jeśli nie ma zmian przez ponad 7 sekund - przełączanie online_state .

    Zaktualizowano oryginalny plik autoexec.bat .

    Dodano po 11 [godzinach] 19 [minutach]:

    Działa całkiem stabilnie:
    Wykres liniowy napięcia w czasie (pm1 Real-time Voltage) od 11:00 do 19:00, ok. 214–226 V.
  • #5 21876453
    _geku_
    Poziom 2  
    Posty: 10
    Ocena: 2
    I ponownie autoexec.bat został zaktualizowany - dostrojona część watchdog na końcu pliku. Btw setChannel działa tutaj lepiej niż ToggleChannel.

    Dodano po 12 [minutach]:

    Oryginalny firmware:
    readResult...-12-21.bin (2 MB)Musisz być zalogowany, aby pobrać ten załącznik.
  • #7 21876779
    ferbulous
    Poziom 18  
    Posty: 419
    Pomógł: 8
    Ocena: 56
    Dzięki za wysiłek, kupuję ten układ do monitorowania mojej pojedynczej fazy. Czy nadal planujesz podłączyć chip bezpośrednio do BL942?
  • #8 21877764
    _geku_
    Poziom 2  
    Posty: 10
    Ocena: 2
    >>21876779
    Hej, na razie nie, ponieważ udało mi się sprawić, że działa z TuyaMCU.
    Teraz pracuję nad dodaniem go do mojego HA, a także dostosowaniem autoexec.bat w częściach związanych z "przedpłatą" - ponieważ kWhWh wydaje się wymagać dostosowania. Również dpId 110 - Enum - jest tak duży, że wydaje się, że został przycięty przez oprogramowanie układowe, próbowałem nawet zminimalizować go do czegoś w rodzaju: 0:N 1:O CT 2:O PT ... ale nadal było obcięte. Skończyło się więc na opublikowaniu go jako liczby, a następnie przekonwertowaniu go na wartości enum po stronie HA.

    Z tego, co widziałem, oryginalna 5-sekundowa kadencja działa idealnie z moją "pętlą kontrolną":
    1. Odbiór pomiaru mocy z TOSA1
    2. Zaktualizuj "Moc obciążenia" w moim mikroinwerterze EcoFlow Powerstream - aby nie nadprodukował (nie mam możliwości sprzedaży nadmiernej mocy z powrotem do sieci i mogę za to zapłacić)

    Nie jestem pewien, czy bezpośrednie podłączenie do BL* przyniesie mi jakiekolwiek zauważalne korzyści.

    Ale kupiłem jeszcze jedno urządzenie, więc jeśli/kiedy będę miał czas, chcę spróbować dalej:
    1. Sniffować aktualizację TuyaMCU przez UART - nie znam lepszego podejścia, a wygląda na łatwiejsze niż ustawienie proxy MITM. Będę miał tylko 1 próbę, aby to zrobić.
    2. Kopia zapasowa nietkniętej oryginalnej wersji modułu WiFi
  • #9 21880958
    _geku_
    Poziom 2  
    Posty: 10
    Ocena: 2
    Dotychczas znane problemy:
    1. Balance Threshold/Alert i Over-Power Threshold/Alert - nie zmieniają wartości zdarzeń, być może problem ze skalowaniem, ale jak dotąd nie udało się tego naprawić
  • REKLAMA
  • #10 21884414
    _geku_
    Poziom 2  
    Posty: 10
    Ocena: 2
    Jeśli komuś się to przyda, to właśnie tego używam w HomeAssistant (autodiscovery działa jako podstawowy krok, ale niektóre części interfejsu użytkownika lepiej opisać ręcznie + ma prawidłowe nazewnictwo wartości enum):

    
    mqtt:
      sensor:
        - name: "PM1 Real-time Voltage"
          unique_id: pm1_voltage
          state_topic: "home/power/meter/pm1/1/get"
          unit_of_measurement: "V"
          device_class: voltage
          state_class: measurement
          value_template: "{{ value | float(0) / 10 | round(1) }}"
          suggested_display_precision: 1
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Real-time Current"
          unique_id: pm1_current
          state_topic: "home/power/meter/pm1/2/get"
          unit_of_measurement: "A"
          device_class: current
          state_class: measurement
          value_template: "{{ value | float(0) / 1000 | round(4) }}"
          suggested_display_precision: 4
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Real-time Power"
          unique_id: pm1_power
          state_topic: "home/power/meter/pm1/3/get"
          unit_of_measurement: "W"
          device_class: power
          state_class: measurement
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Total Forward Energy"
          unique_id: pm1_total_forward_energy
          state_topic: "home/power/meter/pm1/4/get"
          unit_of_measurement: "kWh"
          device_class: energy
          state_class: total_increasing
          value_template: "{{ value | float(0) / 100 }}"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 CPU Temperature"
          unique_id: pm1_cpu_temperature
          state_topic: "home/power/meter/pm1/5/get"
          unit_of_measurement: "°C"
          device_class: temperature
          state_class: measurement
          value_template: "{{ value | float(0) / 10 }}"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Forward Electricity"
          unique_id: pm1_forward_electricity
          state_topic: "home/power/meter/pm1/6/get"
          unit_of_measurement: "kWh"
          device_class: energy
          state_class: total_increasing
          value_template: "{{ value | float(0) / 100 }}"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Event"
          unique_id: pm1_event_text
          state_topic: "home/power/meter/pm1/7/get"
          value_template: >-
            {% set v = value | int(-1) %}
            {% set map = {
              0: 'Normal',
              1: 'Over Current Trip',
              2: 'Over Power Trip',
              3: 'High Temp Trip',
              4: 'Over Voltage Trip',
              5: 'Under Voltage Trip',
              6: 'Over Current Alarm',
              7: 'Over Power Alarm',
              8: 'High Temp Alarm',
              9: 'Over Voltage Alarm',
              10: 'Under Voltage Alarm',
              11: 'Remote ON',
              12: 'Remote OFF',
              13: 'Manual ON',
              14: 'Manual OFF',
              15: 'Leakage Trip',
              16: 'Leakage Alarm',
              17: 'Restore Default',
              18: 'Automatic Closing',
              19: 'Electricity Shortage',
              20: 'Electricity Shortage Alarm',
              21: 'Timing Switch ON',
              22: 'Timing Switch OFF',
              23: 'Electricity Reset'
            } %}
            {{ map.get(v, 'Unknown (' ~ v ~ ')') }}
          icon: mdi:alert-outline
          device:
            identifiers:
              - "pm1"
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Event Raw"
          unique_id: pm1_event_raw
          state_topic: "home/power/meter/pm1/7/get"
          icon: mdi:alert-outline
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Frequency"
          unique_id: pm1_frequency
          state_topic: "home/power/meter/pm1/9/get"
          unit_of_measurement: "Hz"
          device_class: frequency
          state_class: measurement
          value_template: "{{ value | float(0) / 100 | round(2) }}"
          suggested_display_precision: 2
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Overall Power Factor"
          unique_id: pm1_power_factor
          state_topic: "home/power/meter/pm1/10/get"
          state_class: measurement
          icon: mdi:alpha-f-circle-outline
          value_template: "{{ value | float(0) / 100 | round(3) }}"
          suggested_display_precision: 3
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Current Remaining Electricity"
          unique_id: pm1_current_remaining_electricity
          state_topic: "home/power/meter/pm1/12/get"
          unit_of_measurement: "kWh"
          value_template: "{{ value | float(0) / 100 }}"
          device_class: energy
          state_class: total
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
      binary_sensor:
        - name: "PM1 Online State"
          unique_id: pm1_online_state
          state_topic: "home/power/meter/pm1/0/get"
          payload_on: "0"
          payload_off: "1"
          device_class: connectivity
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
      switch:
        - name: "PM1 Prepayment Switch"
          unique_id: pm1_prepayment_switch
          state_topic: "home/power/meter/pm1/13/get"
          command_topic: "home/power/meter/pm1/13/set"
          payload_on: "1"
          payload_off: "0"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Over-current Alarm"
          unique_id: pm1_overcurrent_alarm
          state_topic: "home/power/meter/pm1/16/get"
          command_topic: "home/power/meter/pm1/16/set"
          payload_on: "1"
          payload_off: "0"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Over-voltage Alarm"
          unique_id: pm1_overvoltage_alarm
          state_topic: "home/power/meter/pm1/18/get"
          command_topic: "home/power/meter/pm1/18/set"
          payload_on: "1"
          payload_off: "0"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Under-voltage Alarm"
          unique_id: pm1_undervoltage_alarm
          state_topic: "home/power/meter/pm1/20/get"
          command_topic: "home/power/meter/pm1/20/set"
          payload_on: "1"
          payload_off: "0"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Over-power Alarm"
          unique_id: pm1_overpower_alarm
          state_topic: "home/power/meter/pm1/22/get"
          command_topic: "home/power/meter/pm1/22/set"
          payload_on: "1"
          payload_off: "0"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Temperature Alarm"
          unique_id: pm1_temperature_alarm
          state_topic: "home/power/meter/pm1/24/get"
          command_topic: "home/power/meter/pm1/24/set"
          payload_on: "1"
          payload_off: "0"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Balance Alarm"
          unique_id: pm1_balance_alarm
          state_topic: "home/power/meter/pm1/26/get"
          command_topic: "home/power/meter/pm1/26/set"
          payload_on: "1"
          payload_off: "0"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
      button:
        - name: "PM1 Restore Default"
          unique_id: pm1_restore_default
          command_topic: "home/power/meter/pm1/8/set"
          payload_press: "1"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Factory Reset"
          unique_id: pm1_factory_reset
          command_topic: "home/power/meter/pm1/11/set"
          payload_press: "1"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Clear Remaining Electricity"
          unique_id: pm1_clear_remaining_electricity
          command_topic: "home/power/meter/pm1/14/set"
          payload_press: "1"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
      number:
        - name: "PM1 Electricity Charge"
          unique_id: pm1_electricity_charge
          state_topic: "home/power/meter/pm1/15/get"
          command_topic: "home/power/meter/pm1/15/set"
          min: 0
          max: 100000
          step: 0.01
          mode: box
          unit_of_measurement: "kWh"
          value_template: "{{ value | float(0) / 100 }}"
          command_template: "{{ (value | float(0) * 100) | int }}"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Current Threshold"
          unique_id: pm1_current_threshold
          state_topic: "home/power/meter/pm1/17/get"
          command_topic: "home/power/meter/pm1/17/set"
          min: 1
          max: 50
          step: 1
          mode: slider
          unit_of_measurement: "A"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Over-voltage Threshold"
          unique_id: pm1_overvoltage_threshold
          state_topic: "home/power/meter/pm1/19/get"
          command_topic: "home/power/meter/pm1/19/set"
          min: 100
          max: 280
          step: 1
          mode: slider
          unit_of_measurement: "V"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Under-voltage Threshold"
          unique_id: pm1_undervoltage_threshold
          state_topic: "home/power/meter/pm1/21/get"
          command_topic: "home/power/meter/pm1/21/set"
          min: 100
          max: 280
          step: 1
          mode: slider
          unit_of_measurement: "V"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Over-power Threshold"
          unique_id: pm1_overpower_threshold
          state_topic: "home/power/meter/pm1/23/get"
          command_topic: "home/power/meter/pm1/23/set"
          min: 5
          max: 12005
          step: 1
          mode: box
          unit_of_measurement: "W"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Temperature Threshold"
          unique_id: pm1_temperature_threshold
          state_topic: "home/power/meter/pm1/25/get"
          command_topic: "home/power/meter/pm1/25/set"
          min: -25
          max: 100
          value_template: "{{ value | float(0) / 10 | round(1) }}"
          step: 1
          mode: slider
          unit_of_measurement: "°C"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
        - name: "PM1 Balance Threshold"
          unique_id: pm1_balance_threshold
          state_topic: "home/power/meter/pm1/27/get"
          command_topic: "home/power/meter/pm1/27/set"
          min: 10
          max: 500
          step: 1
          mode: slider
          unit_of_measurement: "kWh"
          device:
            identifiers: ["pm1"]
            name: "PM1 Power Meter"
            manufacturer: "Tuya/OpenBeken"
            model: "BK7231N"
    
REKLAMA