SONOFF

    SPM-Main HTTP API

    Version: 2.2  Date: 2021-11-15

    SPM-Main HTTP API

    The device type is diy_meter(type=diy_meter) and the device API interface version is 1 (apivers=1).

    Device Status Broadcast

    When the status of the sub-device changes, the DNS TXT must contain the field “id” which is the [chip id] of the sub-device. The sub-device only broadcasts the changed field. If the switch of the sub-device is changed, only the switches field is reported, and the threshold overload_00 field is not reported.

    This example adds line breaks and spaces to make it easier to read, but there are actually no line breaks and spaces.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    //All fields broadcast by sub-device
    {
    	"switches": [
        {
            "outlet":0,
            "switch":"on"
        },
        {
            "outlet":1,
            "switch":"on"
        },
        {
            "outlet":2,
            "switch":"on"
        },
        {
            "outlet":3,
            "switch":"on"
        }
    ],
    
    //_00 represents the value of channel 1, _01 represents the value of channel 2, and so on
    "current_00":100,
    "voltage_00":22000,
    "actPow_00":22000,
    "reactPow_00":22000,
    "apparentPow_00":22000,
      
    "overload_00": 
    {
        "minAP": {
            "en": 0,
            "val": 110000
        },
        "maxAP": {
            "en": 1,
            "val": 10000
        },
        "minV": {
            "en": 1,
            "val": 1000
        },
        "maxV": {
            "en": 0,
            "val": 22000
        },
        "maxC": {
            "en": 1,
            "val": 2000
        },
        "delayTime": 10
    },
    "overload_01":{},
    "overload_02":{},
    "overload_03":{},
    "faultState": {
        "subDevCom": 0,
        "overloadTrig": [
            {
                "outlet": 0,
                "rsn": [1]
            },
            {
                "outlet": 2,
                "rsn": [3]
            }
        ],
        "cse7761Com": [
            1,
            0,
            1,
            1
        ],
        "overTemp": [
            0
        ],
        "overLimit": [
            {
                "outlet": 1,
                "rsn": [0]
            },
            {
                "outlet": 3,
                "rsn": [1]
            }
        ]
    }
    }
    
    //If the switch status of the sub-device changes, only the switches field is reported.
    {
    "switches": [
        {
            "outlet":0,
            "switch":"on"
        },
        {
            "outlet":1,
            "switch":"on"
        },
        {
            "outlet":2,
            "switch":"on"
        },
        {
            "outlet":3,
            "switch":"on"
        }
    ]
    }
    
    //Report the PVC status of channel 1 in real time
    {
    "current_00":100,
    "voltage_00":22000,
    "actPow_00":22000,
    "reactPow_00":22000,
    "apparentPow_00":22000,
    }
    
    
    //Sub-device failure
    
    {
    "faultState": {
        "subDevCom": 0,
        "overloadTrig": [
            {
                "outlet": 0,
                "rsn": [1]
            },
            {
                "outlet": 2,
                "rsn": [3]
            }
        ],
        "cse7761Com": [
            1,
            0,
            1,
            1
        ],
        "overTemp": [
          	1,
            0,
          	1,
          	0
        ],
        "overLimit": [
            {
                "outlet": 1,
                "rsn": [0]
            },
            {
                "outlet": 3,
                "rsn": [1]
            }
        ]
    }
    }

     

    AttributeTypeDescription
    switchesArraySwitch status of all channels
    outletNumberChannel Number, [0,3]
    switchStringon: turn the switch on, off: turn the switch off
    subDevComNumberSub-device 485 communication status. 1: Communication is normal, 0: Communication error
    overloadTrigArrayOverload protection trigger event. This field appears when there is an overload event.
    cse7761ComArraySub-device cse7761 communication error. Array elements are Number type. The quantity is 4. Elements 0-3 are 1-4 channels respectively. [0,1] 1: Communication is normal. 0: Communication error.
    overTempArraySub-device cse7761 over-temperature protection trigger event. Array elements are Number type. The quantity is 4. Elements 0-3 are 1-4 channels respectively. [0,1] 1: Communication is normal. 0: Communication error. This field appears when there is an over-temperature trigger event.
    overLimitArrayLimit value overload protection trigger event. This field appears when there is a limit value overload event.

    Get the Device id

    URL: http://[ip]:[port]/zeroconf/deviceid
    Return value format: json
    Method: HTTP post

    e.g.

    1
    2
    3
    { 
         "data": {} 
     }

     

    Empty object, no attribute is required.

    Response body

    1
    2
    3
    4
    5
    6
    7
    {
    "seq": 2,
    "error": 0,
    "data": {
    "deviceid": "1000012345"
    }
    }

     

    Add Sub-device

    URL: http://[ip]:[port]/zeroconf/add_sub_devices
    Return value format: json
    Method: HTTP post

    e.g.

    1
    2
    3
    4
    { 
        "deviceid": "100000140e", 
        "data": {} 
     }

     

    Empty object, no attribute is required.

    Response body

    1
    2
    3
    4
    {
      "seq": 2,
      "error": 0,
     }

     

    Get the List of Sub-device

    URL: http://[ip]:[port]/zeroconf/subDevList
    Return value format: json
    Method: HTTP post

    e.g.

    1
    2
    3
    4
    { 
        "deviceid": "100000140e", 
        "data": {} 
     }

     

    Empty object, no attribute is required.

    Response body

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    {
      "seq": 2,
      "error": 0,
      "data": {
        "subDevList": [
          {
            "subDevId": "123456",
            "type": 130
          }
        ]
      }
    }

     

    AttributeTypeOptionalDescription
    subDevIdStringNoChip ID of sub-device
    typeNumberNoType of sub-device. 130: Four-channel sub-device

    ON/OFF Switch

    URL: http://[ip]:[port]/zeroconf/switches
    Return value format: json
    Method: HTTP post .

    e.g.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    {
      "deviceid": "100000140e",
      "data": {
        "subDevId": "123456",
        "switches": [
          {
            "switch": "on",
            "outlet": 0
          },
          {
            "switch": "on",
            "outlet": 1
          },
          {
            "switch": "on",
            "outlet": 2
          },
          {
            "switch": "on",
            "outlet": 3
          }
        ]
      }
    }

     

    AttributeTypeOptionalDescription
    switchStringNoon: turn the switch on, off: turn the switch off
    outletNumberNoChannel Number, [0,3]

      Overload Protection

      URL: http://[ip]:[port]/zeroconf/overload
      Return value format: json
      Method: HTTP post

      Request body

      e.g.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      {
      "deviceid": "100000140e",
      "data": {
      "subDevId": "123456",
      "overload_00":
      {
      "minAP": {
      "en": 0,
      "val": 110000
      },
      "maxAP": {
      "en": 1,
      "val": 10000
      },
      "minV": {
      "en": 1,
      "val": 9000
      },
      "maxV": {
      "en": 0,
      "val": 22000
      },
      "maxC": {
      "en": 1,
      "val": 2000
      },
      "delayTime": 10
      },
      "overload_01":{},
      "overload_02":{},
      "overload_03":{}
      },
      }

       

      AttributeTypeOptionalDescription
      minAPNumberNoMin.power, [10,440000], Unit: 0.01 W
      maxAPNumberNoMax.power, [10,440000], Unit: 0.01 W
      minVNumberNoMin.voltage, [9000,24000], Unit: 0.01 V
      maxVNumberNoMax.vpltage, [9000,24000], Unit: 0.01 V
      maxCNumberNoMax.current, [10,2000], Unit: 0.01 A
      delayTimeNumberNoDelay to switch off, [0,180]
      enNumberNo0: Disable overload protection.
      1: Enable overload protection.
      valNumberNoUpper limit or lower limit

      Note:
      -_00 represents the value of channel 1, _01 represents the value of channel 2, and so on.
      -When the power, voltage upper threshold and lower threshold are all open, the upper threshold must be greater than the lower threshold.

        I Am Here

        URL: http://[ip]:[port]/zeroconf/iAmHere
        Return value format: json
        Method: HTTP post

        e.g.

        1
        2
        3
        4
        5
        6
        {
        "deviceid": "100000140e",
        "data": {
        "subDevId": "123456"
        }
        }

         

        Note:
        -This function can find the designated sub-device through the indicator light.

        Set Device Time

        URL: http://[ip]:[port]/zeroconf/time
        Return value format: json
        Method: HTTP post

        e.g.

        1
        2
        3
        4
        5
        6
        7
        {
        "deviceid":"1000001234",
        "data": {
        "timeZone":8,
        "date":"2020-12-15T06:31:14.115Z"
        }
        }

         

        AttributeTypeOptionalDescription
        timeZoneNumberNoTime zone, [-12,+14], can be a decimal, such as 7.5
        dateStringNoUTC

         

        Note:
        -The Historical Data of Sub-devices will only take effect after the time zone information is set, and does not affect the single-time statistics.

        Historical Data of Sub-device

        URL: http://[ip]:[port]/zeroconf/historicalData
        Return value format: json
        Method: HTTP post

        e.g.

        1
        2
        3
        4
        5
        6
        7
        8
        9
        {
          "deviceid": "100000140e",
          "data": {
            "subDevId": "123456",
            "outlet": 3,
            "dateStart": "2020-07-10 05:30",
            "dateEnd": "2020-07-10 19:10"
          }
        }

         

        AttributeTypeOptionalDescription
        outletNumberNoChannel Number,[0,3]
        dateStartStringNoStart time; format: “yyyy-mm-dd hh:mm”
        dateEndStringNoEnd time, format: “yyyy-mm-dd hh:mm”

        Response

        1. Correct response:

        The Content-Type of the response header is application/octet-stream

        Returns Comma-Separated Values(CSV) file data. The file contains header and normal record lines. The title header contains the corresponding name of the record field. Each normal record line is a data record, and each record consists of 9 fields, separated by commas.

        The fields in the order from left to right are as follows:
        | Date | time | Outlet | Current(A) | Voltage(V) | Real power(W) | Reactive power(W) | Apparent power(W) | 5 Minutes Power Consumption(W·s) |

        e.g.
        Users query data from 00: 00 – 00: 20 on October 10, 2021.

        1
        2
        3
        4
        5
        6
         Date, time, Outlet, Current(A), Voltage(V),Real power(W), Reactive power(W), 
        Apparent power(W), 5 Minutes Power Consumption(W·s)
        2021-10-10 , 0:0:0 , 0 , 0.00, 240.94, 0.56, 0.00, 0.55,172.00 2021-10-10 , 0:5:0 , 0 , 0.00, 241.41, 0.60, 0.00, 0.59,172.00 2021-10-10 , 0:10:0 , 0 , 0.00, 241.13, 0.51, 0.00, 0.55,173.00 2021-10-10 , 0:15:0 , 0 , 0.00, 240.94, 0.58, 0.00, 0.56,173.00 2021-10-10 , 0:20:0 , 0 , 0.00, 240.95, 0.57, 0.00, 0.57,173.00
        1. Error response:
          Refer to the general part.

        Note?
        -This function will be released after firmware version 1.1.0.
        -Support query data for up to 1 day.
        e.g. When the dateStart is “2020-07-10 05: 30”, dateEnd can be filled as “2020-07-11 00: 00” at most.

        URL: http://[ip]:[port]/zeroconf/monitor
        Return value format: json
        Method: HTTP post

        e.g.

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        {
            "deviceid": "100000140e",
            "data": {
                "url": "http://www.123.com",
                "port": 7790,
                "subDevId": "123456",
                "outlet": 3,
                "time":180
            }
        }
        AttributeTypeOptionalDescription
        urlStringNoReal-time monitoring data reporting URL, format:”http://www.xxx.com/yyy”
        portNumberNoReal-time monitoring data reporting port, [1024,65535]
        subDevIdStringNoChip ID of sub-device
        outletNumberNoChannel Number, [0,3]
        timeNumberNoReal-time monitoring duration, [1,3600], Unit second

         

        Note:
        -The url only supports non-encrypted connections, and the monitoring data report format is http post request.

        Device report:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        {
          "subDevId": 123456,
          "outlet": 3,
          "current": 100,
          "voltage": 22000,
          "actPow": 22000,
          "reactPow": 22000,
          "apparentPow": 22000
        }

         

        AttributeTypeOptionalDescription
        currentNumberNoReal-time current value, Unit: 0.01 A
        voltageNumberNoReal-time voltage value, Unit: 0.01 V
        actPowNumberNoReal-time actPow value, Unit: 0.01 W
        reactPowNumberNoReal-time reactPow value, Unit: 0.01 W
        apparentPowNumberNoReal-time apparentPow value, Unit: 0.01 W

        Reporting conditions:
        -The current change exceeds 0.03 A.
        -The voltage change exceeds 5 V.
        -The active power, reactive power, or apparent power change exceeds 2 W.

        WiFi SSID and Password Setting

        URL: http://[ip]:[port]/zeroconf/wifi
        Return value format: json
        Method: HTTP post

        e.g.

        1
        2
        3
        4
        5
        6
        7
        {
        "deviceid": "100000140e",
        "data": {
        "ssid": "eWeLink",
        "password": "WeLoveIoT"
        }
        }

         

        AttributeTypeOptionalDescription
        ssidStringNoSSID of the WiFi network to which the device will connect
        passwordStringNoPassword of the WiFi network to which the device will connect

        Note:
        -The new wifi setting will take effect the next time the wifi is connected.

        OTA Firmware

        URL: http://[ip]:[port]/zeroconf/upgrade
        Return value format: json
        Method: HTTP post

        e.g.

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        {
        "deviceid": "1000xxxxxx",
        "data": {
        "binList": [
        {
        "downloadUrl": "http://52.83.223.225:8088/ota/rom/hNLhVpovUgFJcipxmDD8fQv9b2BdJNgT/user1.1024.new.2.bin",
        "digest": "56a013b0f2ea151fb337a24025a5abb2f4390d4617c5ec57b27a79c86d6c4174",
        "name": "user1.bin"
        },
        {
        "downloadUrl": "http://52.83.223.225:8088/ota/rom/hNLhVpovUgFJcipxmDD8fQv9b2BdJNgT/user2.1024.new.2.bin",
        "digest": "62503540c241b4783bdc46026d86035b9d0775e2d48c59e40227be8067cadac6",
        "name": "user2.bin"
        }
        ]
        }
        }

         

        AttributeTypeOptionalDescription
        downloadUrlStringNoThe download address of the new firmware, only supports the HTTP protocol, the HTTP server must support the Range request header.
        sha256sumStringNoSHA256 checksum (hash) of the new firmware, it is used to verify the integrity of the new firmware downloaded.
        nameStringNoFirmware name

         

        The following failure codes are added to the error field of the response body?

        1. 404 Not Found (Download failed).
        2. 409 Firmware verification failed.

        Get Channel Operation Records

        URL: http://[ip]:[port]/zeroconf/record
        Return value format: json
        Method: HTTP post

        e.g.

        1
        2
        3
        4
        5
        6
        7
        8
        {
        "deviceid": "100000140e",
        "data": {
        "subDevId": "123456",
        "rangeStart": 200,
        "rangeEnd": 229
        }
        }

         

        AttributeTypeOptionalDescription
        rangeStartNumberNoStart number of operation records, [0,65535]
        rangeEndNumberNoEnd number of operation records, [0,65535]

        Response body

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        {
        "seq": 2,
        "error": 0,
        "data": {
        "record": [
        {
        "date": "2020-07-29 18:00:05",
        "trigType": 1,
        "outlet": 1,
        "action": 1
        },
        {
        "date": "2020-07-29 18:02:05",
        "trigType": 0,
        "outlet": 1,
        "action": 0
        }
        ]
        }
        }

         

        AttributeTypeOptionalDescription
        dateStringNoOperating time; format: “yyyy-mm-dd hh:mm”
        trigTypeNumberNo[0,3], 0: APP trigger; 1: Device trigger; 2: Overload protection trigger; *3: *Over-temperature protection trigger
        outletNumberNoChannel Number, [0,3]
        actionNumberNo0: Channel closed;
        1: Channel open

        Note:
        -The conditions need to be met: rangeEnd>=rangeStart and rangeEnd-rangeStart<=29.

        Get Device State

        URL: http://[ip]:[port]/zeroconf/getState
        Return value format: json
        Method: HTTP post

        e.g.

        1. Get gateway status:

        1
        2
        3
        4
        5
        {
        "deviceid":"1000001234",
        "data": {
        }
        }

         

        Response body

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        {
        "seq": 2,
        "error": 0,
        "data": {
        "sledOnline":"on",
        "ssid": "eWeLink",
        "fwVersion": "3.5.0",
        "subChipFwVer": "3.5.0",
        "deviceid": "100000140e",
        "bssid": "xx:xx:xx:xx:xx:xx",
        "signalStrength": -10,
        "wifiConnected": true/false
        }
        }

         

        2. Get sub-device status:

        1
        2
        3
        4
        5
        6
        {
        "deviceid":"1000001234",
        "data": {
        "subDevId": "123456"
        }
        }

         

        Response body

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
        75
        {
        "seq": 2,
        "error": 0,
        "data": {
        "fwVersion": "1.1.1",
        "switches": [
        {
        "outlet":0,
        "switch":"on"
        },
        {
        "outlet":1,
        "switch":"on"
        },
        {
        "outlet":2,
        "switch":"on"
        },
        {
        "outlet":3,
        "switch":"on"
        }
        ],
        "overload_00":
        {
        "minAP": {
        "en": 0,
        "val": 110000
        },
        "maxAP": {
        "en": 1,
        "val": 10000
        },
        "minV": {
        "en": 1,
        "val": 1000
        },
        "maxV": {
        "en": 0,
        "val": 22000
        },
        "maxC": {
        "en": 1,
        "val": 2000
        },
        "delayTime": 10
        },
        "overload_01":{},
        "overload_02":{},
        "overload_03":{},
        "faultState": {
        "subDevCom": 0,
        "cse7761Com": [
        1,
        0,
        1,
        1
        ]
        },
        "threshold": {
        "actPow":{
        "min":10,
        "max":440000
        },
        "voltage":{
        "min":10,
        "max":440000
        },
        "current":{
        "min":10,
        "max":440000
        }
        }
        }
        }

         

        AttributeTypeDescription
        subDevComNumberSub-device 485 communication status. 1: Communication is normal. 0: Communication error.
        cse7761ComArraySub-device cse7761 communication error. Array elements are Number type. The quantity is 4. Elements 0-3 are 1-4 channels respectively. [0,1] 1: Communication is normal. 0: Communication error.
        fwVersionStringThe gateway is the firmware version of the main chip, and the sub-device is the firmware version number of the sub-device.
        subChipFwVerStringThe firmware version of the sub-chip.
        wifiCinnectedBoolCheck if wifi is connected. When false, the values of ssid, bssid and signalStrength are invalid.
        thresholdObjectThreshold range.
        actPowObjectReal Power, Unit: 0.01 W
        voltageObjectVoltage, Unit: 0.01 V
        currentObjectCurrent, Unit: 0.01A
        minNumberMinimum
        maxNumberMax

        URL: http://[ip]:[port]/zeroconf/ops_mode
        Return value format: json
        Method: HTTP post

        e.g.

        1
        2
        3
        4
        5
        6
        {
        "deviceid":"1000001234",
        "data": {
        "ops_mode": "ewelink"
        }
        }

         

        Note:
        “ops_mode”: “ewelink” means switch back to ewelink mode.

         

        Pin It on Pinterest