Power Module examples

Basic usage 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 voltage, current and power

Example:

import requests

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

resp = requests.get(base_url, auth=login)
if resp.status_code == requests.codes.ok:
  response = resp.json()
  for device in response['devices']:
    print("Voltage, current and power values for Power Module on slot " + str(device['slot_number']) + ":")
    resp = requests.get(base_url + str(device['slot_number']) + "/stats", auth=login)
    if resp.status_code == requests.codes.ok:
      response = resp.json()
      voltage_3v3 = round(response['voltage_3v3']/1000,3)
      voltage_5v0 = round(response['voltage_5v0']/1000,3)
      voltage_12v = round(response['voltage_12v']/1000,3)

      current_3v3 = round(response['current_3v3']/1000,3)
      current_5v0 = round(response['current_5v0']/1000,3)
      current_12v = round(response['current_12v']/1000,3)

      power_3v3 = round(voltage_3v3*current_3v3,3)
      power_5v0 = round(voltage_5v0*current_5v0,3)
      power_12v = round(voltage_12v*current_12v,3)

      print("3V3 rail voltage/current/power: " + str(voltage_3v3) + "V * " + str(current_3v3) + "A = " + str(power_3v3) + "W")
      print("5V0 rail voltage/current/power: " + str(voltage_5v0) + "V * " + str(current_5v0) + "A = " + str(power_5v0) + "W")
      print("12V rail voltage/current/power: " + str(voltage_12v) + "V * " + str(current_12v) + "A = " + str(power_12v) + "W")
    else:
      print("Error response for slot " + str(device['slot_number']))
else:
  print("Error response")

Output:

Voltage, current and power values for Power Module on slot 1:
3V3 rail voltage/current/power: 3.302V * 0.585A = 1.932W
5V0 rail voltage/current/power: 4.938V * 0.397A = 1.96W
12V rail voltage/current/power: 11.945V * 0.002A = 0.024W

Fan control

Example:

import requests
import time

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

def check_fan(slot_number):
  response = requests.get(base_url + str(slot_number) + "/fan", auth=login)
  if response.status_code == requests.codes.ok:
    response = response.json()
    if response['fan_forced']:
      print("Fan is controlled by the driver")
    else:
      print("Fan is controlled by the firmware")

    print("Fan speed is: " + str(response['fan_current_mode']) + '%')
    print("Fan setting is: " + str(response['fan_setting_mode']) + '%')

    if (response['fan_current_mode'] != response['fan_setting_mode']) and response['fan_forced']:
        print ("Fan setting is going to be applied within 10 seconds")
        return True
    elif response['fan_forced']:
      print ("Fan setting applied!")
      print ("")
    return False
  else:
    raise RuntimeError("Could not get fan status")

response = requests.get(base_url, auth=("", ""))
if response.status_code == requests.codes.ok:
  response = response.json()
  for device in response['devices']:
    slot_number = device['slot_number']
    print("Fan control for Power Module on slot " + str(slot_number) + ":")

    response = requests.get(base_url + 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 = {"measurement_enabled": True}
    response = requests.post(base_url + str(slot_number) + "/fan/rpm", json=request, auth=login)
    if response.status_code == requests.codes.ok:
      print("Fan rpm measurement enabled")
    else:
      print("Enabling RPM measurement failed")

    check_fan(slot_number)
    print("")

    request = {"fan_forced": True, "fan_mode": 100}
    response = requests.post(base_url + str(slot_number) + "/fan", json=request, auth=login)
    if response.status_code == requests.codes.ok:
      print("Fan speed set to 100%")
      while check_fan(slot_number):  # Worst case it can take 10 seconds until the mode changes!
        time.sleep(1)
    else:
      print("Could not set fan mode")

    time.sleep(2) # It takes at least a second before the RPM value is available
    response = requests.get(base_url + str(slot_number) + "/fan/rpm", auth=login)
    if response.status_code == requests.codes.ok:
      response = response.json()
      print("Fan rounds-per-minutes: " + str(response['rpm']))
    else:
      print("Could not get fan rpm value")

    response = requests.get(base_url + str(slot_number) + "/reset", auth=login)
    if response.status_code == requests.codes.ok:
      print("Successfully reset device")

else:
  print("Error response")

Output:

Fan control for Power Module on slot 1:
Successfully reset device
Fan rpm measurement enabled
Fan is controlled by the firmware
Fan speed is: 0%
Fan setting is: 100%

Fan speed set to 100%
Fan is controlled by the driver
Fan speed is: 0%
Fan setting is: 100%
Fan setting is going to be applied within 10 seconds
Fan is controlled by the driver
Fan speed is: 0%
Fan setting is: 100%
Fan setting is going to be applied within 10 seconds
Fan is controlled by the driver
Fan speed is: 0%
Fan setting is: 100%
Fan setting is going to be applied within 10 seconds
Fan is controlled by the driver
Fan speed is: 100%
Fan setting is: 100%
Fan setting applied!

Fan rounds-per-minutes: 4500
Successfully reset device