From a03e2e0fa601c8559998d772d1ab2defaec8618d Mon Sep 17 00:00:00 2001
From: Gijs <schoonderbeek@astron.nl>
Date: Mon, 25 Oct 2021 09:43:42 +0000
Subject: [PATCH] Added Thermal test script version 0.1

---
 Jupyter_Pages/DTS_LL_Thermal_Tests.ipynb | 420 +++++++++++++++++++++++
 1 file changed, 420 insertions(+)
 create mode 100644 Jupyter_Pages/DTS_LL_Thermal_Tests.ipynb

diff --git a/Jupyter_Pages/DTS_LL_Thermal_Tests.ipynb b/Jupyter_Pages/DTS_LL_Thermal_Tests.ipynb
new file mode 100644
index 0000000..ac0c542
--- /dev/null
+++ b/Jupyter_Pages/DTS_LL_Thermal_Tests.ipynb
@@ -0,0 +1,420 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "e73610a1",
+   "metadata": {},
+   "source": [
+    "# DTS-Lab-Light Thermal Testing\n",
+    "Measurements done by: Jeroen and Gijs<br>\n",
+    "## Goal of the measurement\n",
+    "Verify that the DTS can run at summer temperatures\n",
+    "## Measurement setup\n",
+    "-  1x UniBoard2c<br>\n",
+    "-  1x APSCT<br>\n",
+    "-  1x APSPU<br>\n",
+    "-  4x RCU2L_QM<br>\n",
+    "-  28x RCU2_Heater<br>"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 134,
+   "id": "c2ace952",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import time\n",
+    "import numpy as np\n",
+    "import pylab as pl"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 135,
+   "id": "875c84fc",
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Ambient temperature in °C:22.5\n"
+     ]
+    }
+   ],
+   "source": [
+    "ambient_temperature = input(\"Ambient temperature in °C:\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 137,
+   "id": "dd54c19e",
+   "metadata": {
+    "scrolled": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "warning, expected RCU device to be in on state, is:  FAULT\n",
+      "warning, expected APSCT device to be in on state, is:  FAULT\n",
+      "warning, expected APSPU device to be in on state, is:  FAULT\n"
+     ]
+    },
+    {
+     "ename": "CommunicationFailed",
+     "evalue": "DevFailed[\nDevError[\n    desc = TRANSIENT CORBA system exception: TRANSIENT_CallTimedout\n  origin = Connection::command_inout()\n  reason = API_CorbaException\nseverity = ERR]\n\nDevError[\n    desc = Timeout (3000 mS) exceeded on device lts/unb2/1, command initialise\n  origin = Connection::command_inout()\n  reason = API_DeviceTimedOut\nseverity = ERR]\n]",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mCommunicationFailed\u001b[0m                       Traceback (most recent call last)",
+      "\u001b[0;32m/tmp/ipykernel_117/3795550939.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     58\u001b[0m \u001b[0mstate\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0munb2c\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     59\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mstate\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"OFF\"\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mstate\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"FAULT\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 60\u001b[0;31m     \u001b[0munb2c\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minitialise\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     61\u001b[0m     \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     62\u001b[0m \u001b[0mstate\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0munb2c\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/device_proxy.py\u001b[0m in \u001b[0;36mf\u001b[0;34m(*args, **kwds)\u001b[0m\n\u001b[1;32m    273\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    274\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 275\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mdp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcommand_inout\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    276\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    277\u001b[0m     \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__doc__\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdoc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/green.py\u001b[0m in \u001b[0;36mgreener\u001b[0;34m(obj, *args, **kwargs)\u001b[0m\n\u001b[1;32m    193\u001b[0m             \u001b[0mgreen_mode\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0maccess\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'green_mode'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    194\u001b[0m             \u001b[0mexecutor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_object_executor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgreen_mode\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 195\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mexecutor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwait\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    196\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    197\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mgreener\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/green.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, fn, args, kwargs, wait, timeout)\u001b[0m\n\u001b[1;32m    107\u001b[0m         \u001b[0;31m# Sychronous (no delegation)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    108\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masynchronous\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0min_executor_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 109\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    110\u001b[0m         \u001b[0;31m# Asynchronous delegation\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    111\u001b[0m         \u001b[0maccessor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdelegate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/connection.py\u001b[0m in \u001b[0;36m__Connection__command_inout\u001b[0;34m(self, name, *args, **kwds)\u001b[0m\n\u001b[1;32m    106\u001b[0m         \u001b[0;34m*\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m*\u001b[0m \u001b[0mparameter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    107\u001b[0m     \"\"\"\n\u001b[0;32m--> 108\u001b[0;31m     \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mConnection\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcommand_inout_raw\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    109\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mDeviceData\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    110\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/connection.py\u001b[0m in \u001b[0;36m__Connection__command_inout_raw\u001b[0;34m(self, cmd_name, cmd_param)\u001b[0m\n\u001b[1;32m    135\u001b[0m     \"\"\"\n\u001b[1;32m    136\u001b[0m     \u001b[0mparam\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m__get_command_inout_param\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcmd_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcmd_param\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 137\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__command_inout\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmd_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparam\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    138\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    139\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;31mCommunicationFailed\u001b[0m: DevFailed[\nDevError[\n    desc = TRANSIENT CORBA system exception: TRANSIENT_CallTimedout\n  origin = Connection::command_inout()\n  reason = API_CorbaException\nseverity = ERR]\n\nDevError[\n    desc = Timeout (3000 mS) exceeded on device lts/unb2/1, command initialise\n  origin = Connection::command_inout()\n  reason = API_DeviceTimedOut\nseverity = ERR]\n]"
+     ]
+    }
+   ],
+   "source": [
+    "#\n",
+    "# Open de OPC-UA devices\n",
+    "#\n",
+    "rcu=DeviceProxy(\"LTS/RECV/1\")\n",
+    "apsct=DeviceProxy(\"LTS/APSCT/1\")\n",
+    "apspu=DeviceProxy(\"LTS/APSPU/1\")\n",
+    "unb2c=DeviceProxy(\"LTS/UNB2/1\")\n",
+    "aps_dev=[]\n",
+    "aps_dev.append(DeviceProxy(\"LTS/UNB2/1\"))\n",
+    "#\n",
+    "# Check RCU interface\n",
+    "#\n",
+    "state = str(rcu.state())\n",
+    "if state == \"OFF\":\n",
+    "    rcu.initialise()\n",
+    "    time.sleep(1)\n",
+    "state = str(rcu.state())\n",
+    "if state == \"STANDBY\":\n",
+    "    rcu.on()\n",
+    "state = str(rcu.state())\n",
+    "if state == \"ON\":\n",
+    "    print(\"RCU device is now in on state\")\n",
+    "else:\n",
+    "    print(\"warning, expected RCU device to be in on state, is: \", state)\n",
+    "#\n",
+    "# Check APSCT interface\n",
+    "#\n",
+    "state = str(apsct.state())\n",
+    "if state == \"OFF\":\n",
+    "    apsct.initialise()\n",
+    "    time.sleep(1)\n",
+    "state = str(apsct.state())\n",
+    "if state == \"STANDBY\":\n",
+    "    rcu.on()\n",
+    "state = str(apsct.state())\n",
+    "if state == \"ON\":\n",
+    "    print(\"APSCT device is now in on state\")\n",
+    "else:\n",
+    "    print(\"warning, expected APSCT device to be in on state, is: \", state)\n",
+    "#\n",
+    "# Check APSPU interface\n",
+    "#\n",
+    "state = str(apspu.state())\n",
+    "if state == \"OFF\":\n",
+    "    apspu.initialise()\n",
+    "    time.sleep(1)\n",
+    "state = str(apspu.state())\n",
+    "if state == \"STANDBY\":\n",
+    "    rcu.on()\n",
+    "state = str(apspu.state())\n",
+    "if state == \"ON\":\n",
+    "    print(\"APSPU device is now in on state\")\n",
+    "else:\n",
+    "    print(\"warning, expected APSPU device to be in on state, is: \", state)\n",
+    "#\n",
+    "# Check is UNB2_HW device is running or else start it up\n",
+    "#\n",
+    "state = str(unb2c.state())\n",
+    "if state == \"OFF\" or state == \"FAULT\":\n",
+    "    unb2c.initialise()\n",
+    "    time.sleep(1)\n",
+    "state = str(unb2c.state())\n",
+    "if state == \"STANDBY\":\n",
+    "    unb2c.on()\n",
+    "state = str(unb2c.state())\n",
+    "if state == \"ON\":\n",
+    "    print(\"UNB2_HW_MON is now in on state\")\n",
+    "else:\n",
+    "    print(\"warning, expected device to be in on state, is: \", state)\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 132,
+   "id": "2029f51f",
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "FPGA power consumption\n",
+      "|---------|----------|----------|----------|----------|----------|----------|----------|----------|\n",
+      "| BRD nr. | Node nr. | Core pwr | ERAM pwr | TrRx pwr | TrTx pwr | TxHx pwr |  IO pwr  | Tot.FPGA |\n",
+      "|---------|----------|----------|----------|----------|----------|----------|----------|----------|\n",
+      "|    0    |     0    |  5.7 W   |  0.1 W   |  0.4 W   |  0.1 W   |  1.1 W   |  0.3 W   |  7.6 W   |\n",
+      "|    0    |     1    |  1.8 W   |  0.2 W   |  0.3 W   |  0.1 W   |  1.2 W   |  0.3 W   |  3.7 W   |\n",
+      "|    0    |     2    |  3.6 W   |  0.1 W   |  0.4 W   | 73091088.0 W   |  1.6 W   |  0.4 W   | 73091094.1 W   |\n",
+      "|    0    |     3    |  2.8 W   |  0.1 W   |  0.4 W   |  0.1 W   |  1.3 W   |  0.2 W   |  4.8 W   |\n",
+      "|    1    |     0    |  nan W   |  nan W   |  nan W   |  nan W   |  nan W   |  nan W   |  nan W   |\n",
+      "|    1    |     1    |  nan W   |  nan W   |  nan W   |  nan W   |  nan W   |  nan W   |  nan W   |\n",
+      "|    1    |     2    |  nan W   |  nan W   |  nan W   |  nan W   |  nan W   |  nan W   |  nan W   |\n",
+      "|    1    |     3    |  nan W   |  nan W   |  nan W   |  nan W   |  nan W   |  nan W   |  nan W   |\n",
+      "|---------|----------|----------|----------|----------|----------|----------|----------|----------|\n",
+      "\n",
+      "Board power consumption\n",
+      "|---------|----------|----------|----------|----------|----------|----------|----------|\n",
+      "| BRD nr. | QSFP N01 | QSFP N23 |Switch 1v2|Switch PHY|  clk pwr | FPGAs pwr| Tot. BRD |\n",
+      "|---------|----------|----------|----------|----------|----------|----------|----------|\n",
+      "|    0    |  5.18 W  |  4.19 W  |  2.11 W  |  0.52 W  |  2.21 W  |   nan W  |  44.94 W |\n",
+      "|    1    |   nan W  |   nan W  |   nan W  |   nan W  |   nan W  |   nan W  |    nan W |\n",
+      "|---------|----------|----------|----------|----------|----------|----------|----------|\n",
+      "\n",
+      "APS power consumption\n",
+      "|---------|----------|\n",
+      "| BRD     | Tot. BRD |\n",
+      "|---------|----------|\n",
+      "|32x RCU2 |  82.09 W |\n",
+      "| UNB2_0  |  44.94 W |\n",
+      "| UNB2_1  |    nan W |\n",
+      "|---------|----------|\n"
+     ]
+    }
+   ],
+   "source": [
+    "#\n",
+    "# Power consumption of the RCU's\n",
+    "#\n",
+    "if 1:\n",
+    "    print(\"FPGA power consumption\")\n",
+    "    print(\"|---------|----------|----------|----------|----------|----------|----------|----------|----------|\")\n",
+    "    print(\"| BRD nr. | Node nr. | Core pwr | ERAM pwr | TrRx pwr | TrTx pwr | TxHx pwr |  IO pwr  | Tot.FPGA |\")\n",
+    "    print(\"|---------|----------|----------|----------|----------|----------|----------|----------|----------|\")\n",
+    "    for brd_cnt in range(2):\n",
+    "        fpgas_pwr = np.zeros(2)\n",
+    "        for node_cnt in range(4):\n",
+    "            stri = \"|    {}    |     {}    |\".format(brd_cnt, node_cnt)\n",
+    "            core_pwr = 0.95 * unb2c.UNB2_FPGA_POL_CORE_IOUT_R[brd_cnt][node_cnt]\n",
+    "            stri +=\" {:4.1f} W   |\".format(core_pwr)\n",
+    "            eram_pwr = unb2c.UNB2_FPGA_POL_ERAM_VOUT_R[brd_cnt][node_cnt]*unb2c.UNB2_FPGA_POL_ERAM_IOUT_R[brd_cnt][node_cnt]\n",
+    "            stri +=\" {:4.1f} W   |\".format(eram_pwr)\n",
+    "            rxgxb_pwr = unb2c.UNB2_FPGA_POL_RXGXB_VOUT_R[brd_cnt][node_cnt]*unb2c.UNB2_FPGA_POL_RXGXB_IOUT_R[brd_cnt][node_cnt]\n",
+    "            stri +=\" {:4.1f} W   |\".format(rxgxb_pwr)\n",
+    "            txgxb_pwr = unb2c.UNB2_FPGA_POL_TXGXB_VOUT_R[brd_cnt][node_cnt]*unb2c.UNB2_FPGA_POL_TXGXB_IOUT_R[brd_cnt][node_cnt]\n",
+    "            stri +=\" {:4.1f} W   |\".format(txgxb_pwr)\n",
+    "            hgxb_pwre = unb2c.UNB2_FPGA_POL_HGXB_VOUT_R[brd_cnt][node_cnt]*unb2c.UNB2_FPGA_POL_HGXB_IOUT_R[brd_cnt][node_cnt]\n",
+    "            stri +=\" {:4.1f} W   |\".format(hgxb_pwre)\n",
+    "            pgm_pwr = unb2c.UNB2_FPGA_POL_PGM_VOUT_R[brd_cnt][node_cnt]*unb2c.UNB2_FPGA_POL_PGM_IOUT_R[brd_cnt][node_cnt]\n",
+    "            stri +=\" {:4.1f} W   |\".format(pgm_pwr)\n",
+    "            tot_fpga = core_pwr + eram_pwr + rxgxb_pwr + txgxb_pwr + hgxb_pwre + pgm_pwr\n",
+    "            fpgas_pwr += tot_fpga\n",
+    "            stri +=\" {:4.1f} W   |\".format(tot_fpga)\n",
+    "            print(stri)\n",
+    "    print(\"|---------|----------|----------|----------|----------|----------|----------|----------|----------|\\n\")\n",
+    "    #\n",
+    "    # Board Powers\n",
+    "    #\n",
+    "    print(\"Board power consumption\")\n",
+    "    print(\"|---------|----------|----------|----------|----------|----------|----------|----------|\")\n",
+    "    print(\"| BRD nr. | QSFP N01 | QSFP N23 |Switch 1v2|Switch PHY|  clk pwr | FPGAs pwr| Tot. BRD |\")\n",
+    "    print(\"|---------|----------|----------|----------|----------|----------|----------|----------|\")\n",
+    "    brd_input=[]\n",
+    "    for brd_cnt in range(2):\n",
+    "        stri = \"|    {}    |\".format(brd_cnt)\n",
+    "        qsfp_n01 = unb2c.UNB2_POL_QSFP_N01_VOUT_R[brd_cnt] * unb2c.UNB2_POL_QSFP_N01_IOUT_R[brd_cnt]\n",
+    "        stri +=\" {:5.2f} W  |\".format(qsfp_n01)\n",
+    "        qsfp_n23 = unb2c.UNB2_POL_QSFP_N23_VOUT_R[brd_cnt] * unb2c.UNB2_POL_QSFP_N23_IOUT_R[brd_cnt]\n",
+    "        stri +=\" {:5.2f} W  |\".format(qsfp_n23)\n",
+    "        sw_1v2 = unb2c.UNB2_POL_SWITCH_1V2_VOUT_R[brd_cnt] * unb2c.UNB2_POL_SWITCH_1V2_IOUT_R[brd_cnt]\n",
+    "        stri +=\" {:5.2f} W  |\".format(sw_1v2)\n",
+    "        sw_phy = unb2c.UNB2_POL_SWITCH_PHY_VOUT_R[brd_cnt] * unb2c.UNB2_POL_SWITCH_PHY_IOUT_R[brd_cnt]\n",
+    "        stri +=\" {:5.2f} W  |\".format(sw_phy)\n",
+    "        clk = unb2c.UNB2_POL_CLOCK_VOUT_R[brd_cnt] * unb2c.UNB2_POL_CLOCK_IOUT_R[brd_cnt]\n",
+    "        stri +=\" {:5.2f} W  |\".format(clk)\n",
+    "        stri +=\" {:5.2f} W  |\".format(fpgas_pwr[brd_cnt])\n",
+    "        brd_input.append(unb2c.UNB2_DC_DC_48V_12V_VOUT_R[brd_cnt] * unb2c.UNB2_DC_DC_48V_12V_IOUT_R[brd_cnt])\n",
+    "        stri +=\" {:6.2f} W |\".format(brd_input[-1])\n",
+    "        print(stri)\n",
+    "    print(\"|---------|----------|----------|----------|----------|----------|----------|----------|\")\n",
+    "rcu_ana_pwr = apspu.APSPU_RCU2A_IOUT_R*apspu.APSPU_RCU2A_VOUT_R\n",
+    "rcu_dig_pwr = apspu.APSPU_RCU2D_IOUT_R*apspu.APSPU_RCU2D_VOUT_R\n",
+    "print(\"\\nAPS power consumption\")\n",
+    "print(\"|---------|----------|\")\n",
+    "print(\"| BRD     | Tot. BRD |\")\n",
+    "print(\"|---------|----------|\")\n",
+    "stri= \"|32x RCU2 | {:6.2f} W |\".format(rcu_ana_pwr + rcu_dig_pwr)\n",
+    "print(stri)\n",
+    "for brd_cnt in range(2):\n",
+    "    stri= \"| UNB2_{}  | {:6.2f} W |\".format(brd_cnt, brd_input[brd_cnt])\n",
+    "    print(stri)\n",
+    "print(\"|---------|----------|\")\n",
+    "        "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 133,
+   "id": "51d0443c",
+   "metadata": {
+    "scrolled": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Hottest UniBoard2 device: Board 0 UNB2_POL_SWITCH_PHY_TEMP_R Temperature 42.6°C, above ambient +21.0\n",
+      "Hottest RCU2 device: Board 3 RCU_TEMP_R Temperature 31.8°C, above ambient +10.2\n",
+      "Hottest apspu device: APSPU_RCU2D_TEMP_R Temperature 28.2°C, above ambient +6.6\n",
+      "Hottest apsct device: APSCT_TEMP_R Temperature 24.4°C, above ambient +2.8\n"
+     ]
+    }
+   ],
+   "source": [
+    "max_temp=0\n",
+    "attr_names = unb2c.get_attribute_list()\n",
+    "for i in attr_names:\n",
+    "    if \"TEMP\" in i:\n",
+    "        exec(\"value = unb2c.{}\".format(i))\n",
+    "        for brd_cnt in range(value.shape[0]):\n",
+    "            if (len(value.shape) > 1):\n",
+    "                for node_cnt in range(value.shape[1]):\n",
+    "                    if (max_temp < value[brd_cnt][node_cnt]):\n",
+    "                        stri = \"Hottest UniBoard2 device: Board {} Item {} {} Temperature {:3.1f}°C, above ambient +{:3.1f}\".format(brd_cnt, node_cnt, i, value[brd_cnt][node_cnt], value[brd_cnt][node_cnt]-float(ambient_temperature))\n",
+    "            else:\n",
+    "                if (max_temp < value[brd_cnt]):\n",
+    "                    stri = \"Hottest UniBoard2 device: Board {} {} Temperature {:3.1f}°C, above ambient +{:3.1f}\".format(brd_cnt, i, value[brd_cnt], value[brd_cnt]-float(ambient_temperature))\n",
+    "print(stri)\n",
+    "\n",
+    "max_temp=0\n",
+    "attr_names = recv.get_attribute_list()\n",
+    "for i in attr_names:\n",
+    "    if \"TEMP\" in i:\n",
+    "        exec(\"value = recv.{}\".format(i))\n",
+    "        for brd_cnt in range(value.shape[0]):\n",
+    "            if (max_temp < value[brd_cnt]):\n",
+    "                stri = \"Hottest RCU2 device: Board {} {} Temperature {:3.1f}°C, above ambient +{:3.1f}\".format(brd_cnt, i, value[brd_cnt], value[brd_cnt]-float(ambient_temperature))\n",
+    "print(stri)\n",
+    "\n",
+    "max_temp=0\n",
+    "attr_names = apspu.get_attribute_list()\n",
+    "for i in attr_names:\n",
+    "    if \"TEMP\" in i:\n",
+    "        exec(\"value = apspu.{}\".format(i))\n",
+    "        stri = \"Hottest apspu device: {} Temperature {:3.1f}°C, above ambient +{:3.1f}\".format(i, value, value-float(ambient_temperature))\n",
+    "print(stri)\n",
+    "\n",
+    "max_temp=0\n",
+    "attr_names = apsct.get_attribute_list()\n",
+    "for i in attr_names:\n",
+    "    if \"TEMP\" in i:\n",
+    "        exec(\"value = apsct.{}\".format(i))\n",
+    "        stri = \"Hottest apsct device: {} Temperature {:3.1f}°C, above ambient +{:3.1f}\".format(i, value, value-float(ambient_temperature))\n",
+    "print(stri)\n",
+    "\n",
+    "\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "7f18e187",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 126,
+   "id": "d4f54175",
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Atttibutes of pcc are: \n",
+      "*********\n",
+      "version_R\n",
+      "opcua_missing_attributes_R\n",
+      "APSPUTR_I2C_error_R\n",
+      "APSPUTR_monitor_rate_RW\n",
+      "APSPUTR_translator_busy_R\n",
+      "APSPU_FAN1_RPM_R\n",
+      "APSPU_FAN2_RPM_R\n",
+      "APSPU_FAN3_RPM_R\n",
+      "APSPU_LBA_IOUT_R\n",
+      "APSPU_LBA_TEMP_R\n",
+      "APSPU_LBA_VOUT_R\n",
+      "APSPU_PCB_ID_R\n",
+      "APSPU_PCB_number_R\n",
+      "APSPU_PCB_version_R\n",
+      "APSPU_RCU2A_IOUT_R\n",
+      "APSPU_RCU2A_TEMP_R\n",
+      "APSPU_RCU2A_VOUT_R\n",
+      "APSPU_RCU2D_IOUT_R\n",
+      "APSPU_RCU2D_TEMP_R\n",
+      "APSPU_RCU2D_VOUT_R\n",
+      "State\n",
+      "Status\n",
+      "*********\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "#\n",
+    "# Print the available attributes\n",
+    "#\n",
+    "print(\"Atttibutes of pcc are: \\n*********\")\n",
+    "attr_names = apspu.get_attribute_list()\n",
+    "for i in attr_names:\n",
+    "    print(i)\n",
+    "#    exec(\"value = print(i, d.{})\".format(i))\n",
+    "print(\"*********\\n\")   \n"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "StationControl",
+   "language": "python",
+   "name": "stationcontrol"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.7.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
-- 
GitLab