This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

Mainboard (BMC)

Mainboard RESTful API documentation

These examples are meant to be run on the device!
If you want to run them from a remote computer, you need to change “localhost” to the IP/hostname.
You will also need to generate an access token and use the “auth basic” method.
You may also want to use the secure protocol https://.

Generic

Base URL:

<HOSTNAME>/api/bmc/<version>/

Version check and device selection

See Version check and device selection

Error response

See Error Response

Voltage

GET /voltage

Returns the voltage in millivolt.

Request:

Method: GET
URL: <HOSTNAME>/api/bmc/<version>/<slot>/voltage

Parameters:

No body parameters

Response:

{
  "voltage_1v8": <mV>,
  "voltage_rtc": <mV>
}

Example

Request:

curl http://localhost/api/bmc/1.0/0/voltage

Response:

{
  "voltage_1v8": 1788,
  "voltage_rtc": 2949
}

Temperature

GET /temperature

Returns the temperature in Celsius. The “ntc_0” shows the temperature emitted by the SoC while the “ntc_1” shows the ambient temperature. The unit is degree Celsius.

Location on the board:

ntc_0: close to the SoC/CPU

ntc_1: close to the buzzer/version information (temp. typically lower)

Request:

Method: GET
URL: <HOSTNAME>/api/bmc/<version>/<slot>/temperature

Parameters:

No body parameters

Response:

{
  "ntc_0": <Temp. in Celsius (float)>,
  "ntc_1": <Temp. in Celsius (float)>
}

Example

Request:

curl http://localhost/api/bmc/1.0/0/temperature

Response:

{
  "ntc_0": 38.703,
  "ntc_1": 29.587
}

Buzzer

POST /buzzer

Controls the integrated buzzer.

“mode” can be:
0 = Internal sounds are disabled
1 = Internal sounds are enabled
2 = Sound 1 played for duration
3 = Sound 2 played for duration
4 = Sound 3 played for duration
5 = Sound 4 played for duration

“duration” must be >= 1 and <= 1000 (milliseconds)

Request:

Method: POST
URL: <HOSTNAME>/api/bmc/<version>/<slot>/buzzer

Parameters:

{
  "mode": <int>,
  "duration": <ms>
}

Response:

{
  "status": "success"
}

Example

Request:

curl http://localhost/api/bmc/1.0/0/buzzer --header "Content-Type: application/json" --request POST --data '{"mode": 4, "duration": 100}'

Response:

{
  "status": "success"
}

Watchdog

Controls the internal watchdog function which hard resets the device if the timeout expires.

GET /watchdog

Returns the timeout values in milliseconds.

timeout: current timeout setting

timeout_left: time left until reset

shutdown_timeout: time after the device is reset if a shutdown was initialized

emergency_mode: shows if the device is in emergency mode (storage corrupted, no r/w)

Request:

Method: GET
URL: <HOSTNAME>/api/bmc/<version>/<slot>/watchdog

Parameters:

No body parameters

Response:

{
  "timeout": <ms>,
  "timeout_left": <ms>,
  "shutdown_timeout": <ms>,
  "emergency_mode": <bool>
}

Example

Request:

curl http://localhost/api/bmc/1.0/0/watchdog

Response:

{
  "timeout": 0,
  "timeout_left": 0,
  "shutdown_timeout": 600000,
  "emergency_mode": false
}

POST /watchdog

Enables the watchdog timeout. The timeout is disabled after reset if the config is not saved.

timeout: timeout setting in milliseconds Value must be >= 1000 and <= 600000, 0 means disabled

Request:

Method: POST
URL: <HOSTNAME>/api/bmc/<version>/<slot>/watchdog

Parameters:

{
  "timeout": <ms>,
}

Response:

{
  "status": "success"
}

Example

Request:

curl http://localhost/api/bmc/1.0/0/watchdog --header "Content-Type: application/json" --request POST --data '{"timeout": 0}'

Response:

{
  "status": "success"
}

POST /watchdog/sw_shutdown_timeout

Changes the shutdown timeout. The timeout is always stored persistent.

timeout: timeout setting in milliseconds Value must be >= 10000 and <= 600000

Request:

Method: POST
URL: <HOSTNAME>/api/bmc/<version>/<slot>/watchdog/sw_shutdown_timeout

Parameters:

{
  "timeout": <ms>,
}

Response:

{
  "status": "success"
}

Example

Request:

curl http://localhost/api/bmc/1.0/0/watchdog/sw_shutdown_timeout --header "Content-Type: application/json" --request POST --data '{"timeout": 100000}'

Response:

{
  "status": "success"
}

POST /watchdog/shutdown

Starts the shutdown watchdog counter. This is the same procedure as triggered by the hardware switch.

Request:

Method: POST
URL: <HOSTNAME>/api/bmc/<version>/<slot>/watchdog/shutdown

Parameters:

{
  "shutdown": "start",
}

Response:

{
  "status": "success"
}

Example

Request:

curl http://localhost/api/bmc/1.0/0/watchdog/shutdown --header "Content-Type: application/json" --request POST --data '{"shutdown": "start"}'

Response:

{
  "status": "success"
}

GET /watchdog/alive

Resets the watchdog counter.

Request:

Method: GET
URL: <HOSTNAME>/api/bmc/<version>/<slot>/watchdog/alive

Parameters:

No body parameters

Response:

{
  "status": "success"
}

Example

Request:

curl http://localhost/api/bmc/1.0/0/watchdog/alive

Response:

{
  "status": "success"
}

GET /watchdog/save

Saves the current timeout configuration persistent.

Request:

Method: GET
URL: <HOSTNAME>/api/bmc/<version>/<slot>/watchdog/save

Parameters:

No body parameters

Response:

{
  "status": "success"
}

Example

Request:

curl http://localhost/api/bmc/1.0/0/watchdog/save

Response:

{
  "status": "success"
}

USB Hub

Controls the USB hub states.

GET /usbhub

Returns the states of all slots/ports and the hub itself.

state can be “enabled”, “disabled” or “not available”.

Request:

Method: GET
URL: <HOSTNAME>/api/bmc/<version>/<slot>/usbhub

Parameters:

No body parameters

Response:

{
  "hub_state": <state>,
  "port_slot_0": <state>,
  "port_slot_1": <state>,
  "port_slot_2": <state>,
  "port_slot_3": <state>,
  "port_slot_4": <state>,
  "port_slot_5": <state>,
  "port_slot_6": <state>,
  "port_slot_7": <state>,
}

Example

Request:

curl http://localhost/api/bmc/1.0/0/usbhub

Response:

{
  "hub_state": "enabled",
  "port_slot_0": "not available",
  "port_slot_1": "not available",
  "port_slot_2": "enabled",
  "port_slot_3": "enabled",
  "port_slot_4": "enabled",
  "port_slot_5": "enabled",
  "port_slot_6": "enabled",
  "port_slot_7": "disabled",
}

GET /usbhub/devices

Returns all devices connected to the usb hub.
It maps the physical usb port number to the slot number.

Request:

Method: GET
URL: <HOSTNAME>/api/bmc/<version>/<slot>/usbhub/devices

Parameters:

No body parameters

Response:

{
  "devices": [
    {
      "slot": <int>,
      "usb_port": <int>,
      "manufacturer": <string>,
      "product": <string>,
      "serial_code": <string>,
      "system_path": <string/path>
    }
  ]
}

Example

Request:

curl http://localhost/api/bmc/1.0/0/usbhub/devices

Response:

{
  "devices": [
    {
      "slot": 2,
      "usb_port": 3,
      "manufacturer": "NOREYA",
      "product": "ETHERNET V1.1.0",
      "serial_code": "099990002",
      "system_path": "/sys/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3"
    }
  ]
}

POST /usbhub

Enables or disables the USB Hub. The /reset command must be used to apply the settings.
The state is boolean and can be true or false.

Request:

Method: POST
URL: <HOSTNAME>/api/bmc/<version>/<slot>/usbhub

Parameters:

{
  "state": boolean,
}

Response:

{
  "status": "success"
}

Example

Request:

curl http://localhost/api/bmc/1.0/0/usbhub --header "Content-Type: application/json" --request POST --data '{"state": true}'

Response:

{
  "status": "success"
}

POST /usbhub/slot/

Enables or disables the usb port on the slot.
The /usbhub/reset command must be used to apply the settings.
The state is boolean and can be true or false.

Request:

Method: POST
URL: <HOSTNAME>/api/bmc/<version>/<slot>/usbhub/slot/<number>

Parameters:

{
  "state": <boolean>,
}

Response:

{
  "status": "success"
}

Example

Request:

curl http://localhost/api/bmc/1.0/0/usbhub/slot/7 --header "Content-Type: application/json" --request POST --data '{"state": true}'

Response:

{
  "status": "success"
}

POST /usbhub/reset

Resets the USB Hub and applies the saved setting.
CAUTION: On reset all USB devices are disconnected and may drop their connection!

Request:

Method: POST
URL: <HOSTNAME>/api/bmc/<version>/<slot>/usbhub/reset

Parameters:

{
  "reset": "yes",
}

Response:

{
  "status": "success"
}

Example

Request:

curl http://localhost/api/bmc/1.0/0/usbhub/reset --header "Content-Type: application/json" --request POST --data '{"reset": "yes"}'

Response:

{
  "status": "success"
}

USB Bootloader

POST /usb_bootloader

Enables the USB Bootloader which allows to access the internal storage (SDCARD/EMMC) via the USB port.
The mode is activated after next reset.
A host device must be connected via USB cable and the USB Bootloader must be activated within 90 seconds otherwise the device will reset to normal mode.

The bootloader tool can be found here.

“enabled” can be true or false ”timeout” must be <= 3600000 milliseconds

Request:

Method: POST
URL: <HOSTNAME>/api/bmc/<version>/<slot>/usb_bootloader

Parameters:

{
  "enabled": <boolean>,
  "timeout": <ms>,
}

Response:

{
  "status": "success"
}

Example

Request:

curl http://localhost/api/bmc/1.0/0/usb_bootloader --header "Content-Type: application/json" --request POST --data '{"enabled": false, "timeout": 100000}'

Response:

{
  "status": "success"
}

Hard Reset

POST /hard_reset

Hard resets the device.

Request:

Method: POST
URL: <HOSTNAME>/api/bmc/<version>/<slot>/hard_reset

Parameters:

{
  "reset": "yes"
}

Response:

{
  "status": "success"
}

Example

Request:

curl http://localhost/api/bmc/1.0/0/hard_reset --header "Content-Type: application/json" --request POST --data '{"reset": "yes"}'

Response:

{
  "status": "success"
}

1 - BMC examples

These examples are meant to be run on the device!
If you want to run them from a remote computer, you need to change “localhost” to the IP/hostname.
You will also need to generate an access token and use the “auth basic” method.
You may also want to use the secure protocol https://.

Python examples

Get temperature

Example:

import requests

# For tokens see http://noreya-nexus.local/nexuscontrolui/system/settings#access-token
login=("token", "")
hostname="localhost"

resp = requests.get("http://" + hostname + "/api/bmc/1.0/", auth=login)
if resp.status_code == requests.codes.ok:
  response = resp.json()
  for device in response['devices']:
    print("Temperature values for BMC on slot " + str(device['slot_number']) + ":")
    resp = requests.get("http://" + hostname + "/api/bmc/1.0/" + str(device['slot_number']) + "/temperature", auth=login)
    if resp.status_code == requests.codes.ok:
      response = resp.json()
      print("Temperature sensor next to SoC: " + str(response['ntc_0']) + "°C")
      print("Temperature sensor ambient: " + str(response['ntc_1']) + "°C")
    else:
      print("Error response for slot " + str(device['slot_number']))
else:
  print("Error response")

Output:

Temperature values for BMC on slot 0:
Temperature sensor next to SoC: 38.674°C
Temperature sensor ambient: 29.638°C

Watchdog configuration

Example:

import requests
import time

# For tokens see http://noreya-nexus.local/nexuscontrolui/system/settings#access-token
login=("token", "")
hostname="localhost"

response = requests.get("http://" + hostname + "/api/bmc/1.0/", auth=login)
if response.status_code == requests.codes.ok:
  response = response.json()
  for device in response['devices']:
    slot_number = device['slot_number']
    print("Watchdog config for BMC on slot " + str(slot_number) + ":")

    response = requests.get("http://" + hostname + "/api/bmc/1.0/" + str(slot_number) + "/reset", auth=login)
    if response.status_code == requests.codes.ok:
      print("Successfully reset device")  # We do "write" requests so we need to get a defined state

    request = {"timeout": 2000 }
    response = requests.post("http://" + hostname + "/api/bmc/1.0/" + str(slot_number) + "/watchdog", json=request, auth=login)
    if response.status_code == requests.codes.ok:
      print("Watchdog enabled with timeout " + str(request['timeout']) + 'ms')
      response = requests.get("http://" + hostname + "/api/bmc/1.0/" + str(slot_number) + "/watchdog/alive", auth=login)
      if response.status_code == requests.codes.ok:
          print("Watchdog updated by /alive")
      else:
          print("Failed reseting watchdog")

      print("Wait a second...")
      time.sleep(1)
      response = requests.get("http://" + hostname + "/api/bmc/1.0/" + str(slot_number) + "/watchdog", auth=login)
      if response.status_code == requests.codes.ok:
        response = response.json()
        print("Time left until reset: " + str(response['timeout_left']) + ' ms')
      else:
        print("Failed getting watchdog status")

      request = {"timeout": 0 }
      response = requests.post("http://" + hostname + "/api/bmc/1.0/" + str(slot_number) + "/watchdog", json=request, auth=login)
      if response.status_code == requests.codes.ok:
        print("Watchdog disabled")
      else:
        print("Failed disabling watchdog")

      response = requests.get("http://" + hostname + "/api/bmc/1.0/" + str(slot_number) + "/reset", auth=login)
      if response.status_code == requests.codes.ok:
        print("Successfully reset device after test")
      print("")
    else:
      print("Error response for slot " + str(device['slot_number']))
else:
  print("Error response")

Output:

Watchdog config for BMC on slot 0:
Successfully reset device
Watchdog enabled with timeout 2000ms
Watchdog updated by /alive
Wait a second...
Time left until reset: 981 ms
Watchdog disabled
Successfully reset device after test