From 8c37c4b2a15a2503459a518028bccad55990ee28 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Corn=C3=A9=20Lukken?= <lukken@astron.nl>
Date: Mon, 27 May 2024 09:05:51 +0000
Subject: [PATCH] Small refactor station state errors and objects

---
 README.md                                     |   1 +
 docker/snmp-exporter/generator.yml            |   4 +-
 docker/snmp-exporter/lofar_mibs/ACX-MIB.mib   | 364 +++++++++---------
 infra/README.md                               |   1 -
 tangostationcontrol/VERSION                   |   2 +-
 .../tangostationcontrol/states/hibernate.py   |  17 +-
 .../tangostationcontrol/states/off.py         |   8 +-
 .../tangostationcontrol/states/on.py          |   8 +-
 .../tangostationcontrol/states/standby.py     |  14 +-
 .../states/station_state.py                   |  15 +-
 10 files changed, 209 insertions(+), 225 deletions(-)

diff --git a/README.md b/README.md
index a10bb47f1..7eaf2c5dc 100644
--- a/README.md
+++ b/README.md
@@ -161,6 +161,7 @@ Next change the version in the following places:
 
 # Release Notes
 
+* 0.38.5 Unify exception handling for station manager
 * 0.38.4 Fixed ordering in subband_frequency_R, which broke frequency calculations for HBA
 * 0.38.3 Upgraded to JupyterLab v4
 * 0.38.2 Fixed polling of some attributes required by Metadata device
diff --git a/docker/snmp-exporter/generator.yml b/docker/snmp-exporter/generator.yml
index eb824ec68..65b5971ee 100644
--- a/docker/snmp-exporter/generator.yml
+++ b/docker/snmp-exporter/generator.yml
@@ -226,7 +226,7 @@ modules:
       wrsPtpServoExt:
         type: EnumAsStateSet
 #
-# Eltek Enexus Power controllers 
+# Eltek Enexus Power controllers
 #
   eltek:
     walk:
@@ -313,7 +313,7 @@ modules:
         type: EnumAsStateSet
       smartNodeErrorStatus:
         type: EnumAsStateSet
-  
+
 
 # Cisco Wireless LAN Controller
   cisco_wlc:
diff --git a/docker/snmp-exporter/lofar_mibs/ACX-MIB.mib b/docker/snmp-exporter/lofar_mibs/ACX-MIB.mib
index 9af49ada9..e241a3179 100644
--- a/docker/snmp-exporter/lofar_mibs/ACX-MIB.mib
+++ b/docker/snmp-exporter/lofar_mibs/ACX-MIB.mib
@@ -4,16 +4,16 @@
 --       ORGANIZATION "Unipower"
 --       CONTACT-INFO "www.unipowerco.com"
 --       DESCRIPTION "System Information, ACX Power Systems"
-	
+
 ACX-MIB DEFINITIONS ::= BEGIN
 
 IMPORTS
    MODULE-IDENTITY,
-   enterprises, 
+   enterprises,
    IpAddress,
    Integer32		   		    FROM SNMPv2-SMI
-   DisplayString, 
-   RowStatus, 
+   DisplayString,
+   RowStatus,
    StorageType                  FROM SNMPv2-TC
    OBJECT-TYPE,
    NOTIFICATION-TYPE            FROM SNMPv2-SMI
@@ -24,21 +24,21 @@ IMPORTS
    KeyChange					FROM SNMP-USER-BASED-SM-MIB
    snmpTrapOID                  FROM SNMPv2-MIB
    TEXTUAL-CONVENTION			FROM SNMPv2-TC;
-   
+
 powecMIB MODULE-IDENTITY
 	LAST-UPDATED "201906180000Z"
 	ORGANIZATION "Unipower"
 	CONTACT-INFO "www.unipowerco.com"
-	DESCRIPTION 
+	DESCRIPTION
 		"System Information, ACX Power Systems"
 	REVISION "201906180000Z"
-	DESCRIPTION 
+	DESCRIPTION
 		"Revision 1.15"
-		::= { enterprises 5961 }   
+		::= { enterprises 5961 }
 
 	acxPowerSystem      OBJECT IDENTIFIER ::= { powecMIB 5 }
-	systemInfo 			OBJECT IDENTIFIER ::= { acxPowerSystem 1 } 
-	powerSystem			OBJECT IDENTIFIER ::= { acxPowerSystem 2 } 
+	systemInfo 			OBJECT IDENTIFIER ::= { acxPowerSystem 1 }
+	powerSystem			OBJECT IDENTIFIER ::= { acxPowerSystem 2 }
 	systemParameters	OBJECT IDENTIFIER ::= { acxPowerSystem 3 }
 	customBoost			OBJECT IDENTIFIER ::= { systemParameters 46 }
 	agentSetup			OBJECT IDENTIFIER ::= { acxPowerSystem 4 }
@@ -76,7 +76,7 @@ UsmPrivProtocol ::=  TEXTUAL-CONVENTION
 				aesPrivProtocol(1),
 				noPrivProtocol(2)
 			}
-			
+
 SwitchValue ::= TEXTUAL-CONVENTION
 		STATUS current
 		DESCRIPTION
@@ -86,7 +86,7 @@ SwitchValue ::= TEXTUAL-CONVENTION
 				off(0),
 				on(1)
 			}
-		
+
 ComStatusValue ::= TEXTUAL-CONVENTION
 		STATUS current
 		DESCRIPTION
@@ -96,7 +96,7 @@ ComStatusValue ::= TEXTUAL-CONVENTION
 				ok(0),
 				fail(1)
 			}
-			
+
 AlarmValue ::= TEXTUAL-CONVENTION
 		STATUS current
 		DESCRIPTION
@@ -107,7 +107,7 @@ AlarmValue ::= TEXTUAL-CONVENTION
 				alarm(1)
 			}
 
--- ------------------------------------------------------------			
+-- ------------------------------------------------------------
 -- SYSTEM INFO variables
 -- ------------------------------------------------------------
 
@@ -158,52 +158,52 @@ batteryDescript OBJECT-TYPE
 	DESCRIPTION
 		"String containing a description of the Battery"
 	::= { systemInfo 6 }
-	
+
 batteryCapacity OBJECT-TYPE
 	SYNTAX Integer32 (0..30000)
 	MAX-ACCESS read-write
 	STATUS current
 	DESCRIPTION
 		"An integer containing battery capacity in Ah"
-		
+
 	::= { systemInfo 7 }
-	
+
 installationDate OBJECT-TYPE
 	SYNTAX DisplayString
 	MAX-ACCESS read-write
 	STATUS current
 	DESCRIPTION
 		"Installation date of the system of the form 'DD.MM.YY'"
-		
+
 	::= { systemInfo 8 }
-	
+
 updateDate OBJECT-TYPE
 	SYNTAX DisplayString
 	MAX-ACCESS read-write
 	STATUS current
 	DESCRIPTION
 		"Last date of updating system of the form 'DD.MM.YY'"
-		
+
 	::= { systemInfo 9 }
-	
+
 powerSystemAddress OBJECT-TYPE
 	SYNTAX Integer32 (0..255)
 	MAX-ACCESS read-write
 	STATUS current
 	DESCRIPTION
 		"An integer containing the address of the System"
-		
-	::= { systemInfo 10 }	
-	
+
+	::= { systemInfo 10 }
+
 powerSystemSerialCode OBJECT-TYPE
 	SYNTAX DisplayString
 	MAX-ACCESS read-only
 	STATUS current
 	DESCRIPTION
-		"Serial Number in new format (ACX version 2.22 and newer)"		
+		"Serial Number in new format (ACX version 2.22 and newer)"
 	::= { systemInfo 11 }
 
--- ------------------------------------------------------------	
+-- ------------------------------------------------------------
 -- POWER SYSTEM variables
 -- ------------------------------------------------------------
 
@@ -238,7 +238,7 @@ rectifierCurrent	OBJECT-TYPE
 	STATUS current
 	DESCRIPTION
 		"A variable containing the rectifier current (A*10)"
-	::= { powerSystem 4 }  
+	::= { powerSystem 4 }
 
 battTemperature	OBJECT-TYPE
 	SYNTAX Integer32
@@ -246,15 +246,15 @@ battTemperature	OBJECT-TYPE
 	STATUS current
 	DESCRIPTION
 		"A variable containing the battery temperature(C)"
-	::= { powerSystem 5 }  
-	
+	::= { powerSystem 5 }
+
 acPhase1Voltage	OBJECT-TYPE
 	SYNTAX Integer32
 	MAX-ACCESS read-only
 	STATUS current
 	DESCRIPTION
 		"A variable containing AC input voltage for phase 1 (V), (-1) means measurement not available"
-	::= { powerSystem 6 }  
+	::= { powerSystem 6 }
 
 acPhase2Voltage	OBJECT-TYPE
 	SYNTAX Integer32
@@ -262,7 +262,7 @@ acPhase2Voltage	OBJECT-TYPE
 	STATUS current
 	DESCRIPTION
 		"A variable containing AC input voltage for phase 2 (V), (-1) means measurement not available"
-	::= { powerSystem 7 }  
+	::= { powerSystem 7 }
 
 acPhase3Voltage	OBJECT-TYPE
 	SYNTAX Integer32
@@ -270,7 +270,7 @@ acPhase3Voltage	OBJECT-TYPE
 	STATUS current
 	DESCRIPTION
 		"A variable containing AC input voltage for phase 3 (V), (-1) means measurement not available"
-	::= { powerSystem 8 }  
+	::= { powerSystem 8 }
 
 remainBatteryTime	OBJECT-TYPE
 	SYNTAX Integer32
@@ -278,7 +278,7 @@ remainBatteryTime	OBJECT-TYPE
 	STATUS current
 	DESCRIPTION
 		"A variable containing the remaining battery time in (minutes)"
-	::= { powerSystem 9 } 	
+	::= { powerSystem 9 }
 
 dcdcCurrent	OBJECT-TYPE
 	SYNTAX Integer32
@@ -286,9 +286,9 @@ dcdcCurrent	OBJECT-TYPE
 	STATUS current
 	DESCRIPTION
 		"A variable containing the DC/DC units total current (A*10)"
-	::= { powerSystem 10 }  
+	::= { powerSystem 10 }
 
--- ------------------------------------------------------------	
+-- ------------------------------------------------------------
 -- SYSTEM PARAMETERS
 -- ------------------------------------------------------------
 
@@ -357,7 +357,7 @@ lowVoltReconLim	OBJECT-TYPE
 	DESCRIPTION
 		"A variable containing the Low Voltage Reconnect Limit (V*10)"
 	::= { systemParameters 8 }
-	
+
 partLoadDiscon1Limit	OBJECT-TYPE
 	SYNTAX Integer32 (0..30000)
 	MAX-ACCESS read-write
@@ -392,7 +392,7 @@ highVoltLim	OBJECT-TYPE
 	DESCRIPTION
 		"A variable containing the High Voltage Limit (V*10)"
 	::= { systemParameters 12 }
-	
+
 highVoltDisconLim	OBJECT-TYPE
 	SYNTAX Integer32 (0..30000)
 	MAX-ACCESS read-write
@@ -651,22 +651,22 @@ lowACVoltLim OBJECT-TYPE
 	STATUS current
 	DESCRIPTION
 		"A variable containing the Low AC Voltage Limit (V)"
-	::= { systemParameters 44 }	
-	
+	::= { systemParameters 44 }
+
 turnOnOffRecifiers OBJECT-TYPE
 	SYNTAX Integer32 (0 | 1)
 	MAX-ACCESS read-write
 	STATUS current
 	DESCRIPTION
-		"A switch for turning On/Off rectifiers, 
+		"A switch for turning On/Off rectifiers,
 		 NOTE: If system does not have another power source (e.g. battery),
 		 this will cause system shutdown"
-	::= { systemParameters 45 }	
+	::= { systemParameters 45 }
 
 -- ------------------------------------------------------------
 -- Custom boost parameters
 -- ------------------------------------------------------------
-	
+
 cbBatteryCapacity OBJECT-TYPE
 	SYNTAX Integer32 (0..30000)
 	MAX-ACCESS read-write
@@ -674,7 +674,7 @@ cbBatteryCapacity OBJECT-TYPE
 	DESCRIPTION
 		"Battery capacity Cn in Ah, capacity is for required rating"
 	::= { customBoost 1 }
-	
+
 cbBODTime OBJECT-TYPE
 	SYNTAX Integer32
 	MAX-ACCESS read-write
@@ -683,7 +683,7 @@ cbBODTime OBJECT-TYPE
 		"Minimal Battery on discharge time in minutes
 		 required to custom boost is activated"
 	::= { customBoost 2 }
-	
+
 cbStage1Duration OBJECT-TYPE
 	SYNTAX Integer32
 	MAX-ACCESS read-write
@@ -691,7 +691,7 @@ cbStage1Duration OBJECT-TYPE
 	DESCRIPTION
 		"Custom boost Stage1 duration in minutes"
 	::= { customBoost 3 }
-	
+
 cbStage1BatCurLimit OBJECT-TYPE
 	SYNTAX Integer32 (0..1000)
 	MAX-ACCESS read-write
@@ -708,7 +708,7 @@ cbStage2Duration OBJECT-TYPE
 	DESCRIPTION
 		"Custom boost Stage2 duration in minutes"
 	::= { customBoost 5 }
-	
+
 cbStage2BatCurLimit OBJECT-TYPE
 	SYNTAX Integer32 (0..1000)
 	MAX-ACCESS read-write
@@ -717,13 +717,13 @@ cbStage2BatCurLimit OBJECT-TYPE
 		"Custom boost Stage2 battery current limit in % of cbBatteryCapacity
 		 resolution is 1 => 0.1%"
 	::= { customBoost 6 }
-	
+
 cbStage2EarlyExitBatCurLimit OBJECT-TYPE
 	SYNTAX Integer32 (0..1000)
 	MAX-ACCESS read-write
 	STATUS current
 	DESCRIPTION
-		"Custom boost Stage2 early exit (before cbStage2Duration expires) 
+		"Custom boost Stage2 early exit (before cbStage2Duration expires)
 		 battery current limit in % of cbBatteryCapacity
 		 resolution is 1 => 0.1%"
 	::= { customBoost 7 }
@@ -736,7 +736,7 @@ customBoostEnable OBJECT-TYPE
 		"A variable containing the Custom Boost Flag (1 for auto boost enabled, 0 disabled)."
 	::= { customBoost 8 }
 
--- ------------------------------------------------------------	
+-- ------------------------------------------------------------
 -- AGENT SETUP
 -- ------------------------------------------------------------
 
@@ -747,7 +747,7 @@ trapReciepient1 OBJECT-TYPE
 	DESCRIPTION
 		"IP address of Trap Reciepient 1"
 	::= { agentSetup 1 }
-	
+
 trapReciepient2 OBJECT-TYPE
 	SYNTAX IpAddress
 	MAX-ACCESS read-write
@@ -755,7 +755,7 @@ trapReciepient2 OBJECT-TYPE
 	DESCRIPTION
 		"IP address of Trap Reciepient 2"
 	::= { agentSetup 2 }
-	
+
 trapReciepient3 OBJECT-TYPE
 	SYNTAX IpAddress
 	MAX-ACCESS read-write
@@ -763,7 +763,7 @@ trapReciepient3 OBJECT-TYPE
 	DESCRIPTION
 		"IP address of Trap Reciepient 3"
 	::= { agentSetup 3 }
-	
+
 trapReciepient4 OBJECT-TYPE
 	SYNTAX IpAddress
 	MAX-ACCESS read-write
@@ -771,7 +771,7 @@ trapReciepient4 OBJECT-TYPE
 	DESCRIPTION
 		"IP address of Trap Reciepient 4"
 	::= { agentSetup 4 }
-	
+
 trapReciepient5 OBJECT-TYPE
 	SYNTAX IpAddress
 	MAX-ACCESS read-write
@@ -779,7 +779,7 @@ trapReciepient5 OBJECT-TYPE
 	DESCRIPTION
 		"IP address of Trap Reciepient 5"
 	::= { agentSetup 5 }
-	
+
 trapReciepient6 OBJECT-TYPE
 	SYNTAX IpAddress
 	MAX-ACCESS read-write
@@ -787,7 +787,7 @@ trapReciepient6 OBJECT-TYPE
 	DESCRIPTION
 		"IP address of Trap Reciepient 6"
 	::= { agentSetup 6 }
-	
+
 trapReciepient7 OBJECT-TYPE
 	SYNTAX IpAddress
 	MAX-ACCESS read-write
@@ -795,7 +795,7 @@ trapReciepient7 OBJECT-TYPE
 	DESCRIPTION
 		"IP address of Trap Reciepient 7"
 	::= { agentSetup 7 }
-	
+
 trapReciepient8 OBJECT-TYPE
 	SYNTAX IpAddress
 	MAX-ACCESS read-write
@@ -803,20 +803,20 @@ trapReciepient8 OBJECT-TYPE
 	DESCRIPTION
 		"IP address of Trap Reciepient 8"
 	::= { agentSetup 8 }
-	
+
 trapCommunityName OBJECT-TYPE
 	SYNTAX DisplayString (SIZE (0..15))
 	MAX-ACCESS read-write
 	STATUS current
 	DESCRIPTION
 		"A variable containing Trap community name"
-	::= { agentSetup 9 }	
-	
+	::= { agentSetup 9 }
+
 -- ------------------------------------------------------------
 -- ALARM INFO variables (Alarm and Status Information)
 -- The alarmData, extraAlarmData and statusData
--- are integers from 0-255 containing the byte value received 
--- from the controlmodule. 
+-- are integers from 0-255 containing the byte value received
+-- from the controlmodule.
 -- ------------------------------------------------------------
 
 numbOfAlarms	OBJECT-TYPE
@@ -850,7 +850,7 @@ alarmData3	OBJECT-TYPE
 	DESCRIPTION
 		"A byte containing alarm data 3"
 	::= { alarmInfo 4 }
-	
+
 extraAlarmData1	OBJECT-TYPE
 	SYNTAX Integer32 (0..255)
 	MAX-ACCESS read-only
@@ -858,7 +858,7 @@ extraAlarmData1	OBJECT-TYPE
 	DESCRIPTION
 		"A byte containing extra alarm data 1"
 	::= { alarmInfo 5 }
-	
+
 extraAlarmData2	OBJECT-TYPE
 	SYNTAX Integer32 (0..255)
 	MAX-ACCESS read-only
@@ -1027,7 +1027,7 @@ extAlarm15Name OBJECT-TYPE
 		"Ext.alarm 15 name"
 	::= { alarmInfo 26 }
 
--- ------------------------------------------------------------	
+-- ------------------------------------------------------------
 -- rectifierInfo
 -- ------------------------------------------------------------
 
@@ -1037,7 +1037,7 @@ numOfRectifiers OBJECT-TYPE
     STATUS current
     DESCRIPTION
         "Number of Rectifiers installed in the system"
-    ::= { rectifierInfo 1 }   
+    ::= { rectifierInfo 1 }
 
 numOfChannels OBJECT-TYPE
     SYNTAX Integer32 (0..255)
@@ -1061,8 +1061,8 @@ moduleTable OBJECT-TYPE
     STATUS current
     DESCRIPTION
         "Module Information Table"
-    ::= { rectifierInfo 2 }        
-    
+    ::= { rectifierInfo 2 }
+
 moduleEntry OBJECT-TYPE
     SYNTAX ModuleEntry
     MAX-ACCESS not-accessible
@@ -1071,7 +1071,7 @@ moduleEntry OBJECT-TYPE
         "Queue of Module Table"
     INDEX { moduleIndex }
      ::= { moduleTable 1 }
-     
+
 ModuleEntry ::=
     SEQUENCE {
         moduleIndex
@@ -1105,7 +1105,7 @@ ModuleEntry ::=
 		serialNumber
 			Integer32
 	}
-	
+
 moduleIndex OBJECT-TYPE
 	SYNTAX Integer32 (0..100)
     MAX-ACCESS read-only
@@ -1121,7 +1121,7 @@ moduleAddress OBJECT-TYPE
     DESCRIPTION
         "Address of current module viewed in the Module Table, (-1) means this value is invalid"
     ::= { moduleEntry 2 }
-	
+
 moduleComStatus	OBJECT-TYPE
 	SYNTAX ComStatusValue
     MAX-ACCESS read-only
@@ -1129,7 +1129,7 @@ moduleComStatus	OBJECT-TYPE
     DESCRIPTION
         "Module Communication Status, 0-OK, 1-Failed, (-1) means this value is invalid"
     ::= { moduleEntry 3 }
-    
+
 moduleOk OBJECT-TYPE
 	SYNTAX AlarmValue
     MAX-ACCESS read-only
@@ -1137,7 +1137,7 @@ moduleOk OBJECT-TYPE
     DESCRIPTION
         "Rectifier Module Ok or Alarm, 0-OK, 1-Alarm, (-1) means this value is invalid"
     ::= { moduleEntry 4 }
-     
+
 moduleEnabled OBJECT-TYPE
 	SYNTAX SwitchValue
     MAX-ACCESS read-write
@@ -1145,7 +1145,7 @@ moduleEnabled OBJECT-TYPE
     DESCRIPTION
         "Rectifier module is activated or not, 1-Activated, 0-Disable, (-1) means this value is invalid"
     ::= { moduleEntry 5 }
-    
+
 inputVoltage OBJECT-TYPE
 	SYNTAX Integer32 (0..30000)
     MAX-ACCESS read-only
@@ -1153,7 +1153,7 @@ inputVoltage OBJECT-TYPE
     DESCRIPTION
         "Module Input Voltage(V), (-1) means measurement not available"
     ::= { moduleEntry 6 }
-    
+
 outputVoltage OBJECT-TYPE
 	SYNTAX Integer32 (0..30000)
     MAX-ACCESS read-only
@@ -1169,7 +1169,7 @@ outputCurrent OBJECT-TYPE
     DESCRIPTION
         "Module Current (A*10), (-1) means measurement not available"
     ::= { moduleEntry 8 }
-    
+
 meanCurrent	OBJECT-TYPE
 	SYNTAX Integer32 (0..30000)
     MAX-ACCESS read-only
@@ -1225,7 +1225,7 @@ serialNumber OBJECT-TYPE
     DESCRIPTION
         "Serial Number of the module, (-1) means this value is invalid"
     ::= { moduleEntry 15 }
-    
+
 -- ------------------------------------------------------------
 -- BATTERY INFORMATION
 -- ------------------------------------------------------------
@@ -1237,14 +1237,14 @@ numbOfBatteries OBJECT-TYPE
     DESCRIPTION
         "Number of battery strings installed in the system"
     ::= { batteryInfo 1 }
-    
+
 typeofBattery OBJECT-TYPE
     SYNTAX Integer32 (0..100)
     MAX-ACCESS read-only
     STATUS current
     DESCRIPTION
         "Type of battery installed in the system"
-    ::= { batteryInfo 2 }    
+    ::= { batteryInfo 2 }
 
 symmetryTable OBJECT-TYPE
     SYNTAX SEQUENCE OF SymmetryEntry
@@ -1252,8 +1252,8 @@ symmetryTable OBJECT-TYPE
     STATUS current
     DESCRIPTION
         "Symmetry Information Table"
-    ::= { batteryInfo 3 }        
-    
+    ::= { batteryInfo 3 }
+
 symmetryEntry OBJECT-TYPE
     SYNTAX SymmetryEntry
     MAX-ACCESS not-accessible
@@ -1262,7 +1262,7 @@ symmetryEntry OBJECT-TYPE
         "Queue of Symmetry Table"
     INDEX { batteryIndex }
      ::= { symmetryTable 1 }
-     
+
 SymmetryEntry ::=
     SEQUENCE {
         batteryIndex
@@ -1276,7 +1276,7 @@ SymmetryEntry ::=
         symmetry4
             Integer32
 	}
-	
+
 batteryIndex OBJECT-TYPE
 	SYNTAX Integer32 (0..100)
     MAX-ACCESS read-only
@@ -1284,7 +1284,7 @@ batteryIndex OBJECT-TYPE
     DESCRIPTION
         "Index of current battery string viewed in the Symmetry Table"
     ::= { symmetryEntry 1 }
-    
+
 symmetry1 OBJECT-TYPE
 	SYNTAX Integer32 (0..30000)
     MAX-ACCESS read-only
@@ -1292,15 +1292,15 @@ symmetry1 OBJECT-TYPE
     DESCRIPTION
         "Symmetry Voltage in Block 1 (V*100), (-1) means this value is invalid"
     ::= { symmetryEntry 2 }
- 
+
 symmetry2 OBJECT-TYPE
 	SYNTAX Integer32 (0..30000)
     MAX-ACCESS read-only
 	STATUS  current
     DESCRIPTION
         "Symmetry Voltage in Block 2 (V*100), (-1) means this value is invalid"
-    ::= { symmetryEntry 3 }    
-    
+    ::= { symmetryEntry 3 }
+
 symmetry3 OBJECT-TYPE
 	SYNTAX Integer32 (0..30000)
     MAX-ACCESS read-only
@@ -1308,14 +1308,14 @@ symmetry3 OBJECT-TYPE
     DESCRIPTION
         "Symmetry Voltage in Block 3 (V*100), (-1) means this value is invalid for this battery type"
     ::= { symmetryEntry 4 }
-    
+
 symmetry4 OBJECT-TYPE
 	SYNTAX Integer32 (0..30000)
     MAX-ACCESS read-only
 	STATUS  current
     DESCRIPTION
         "Symmetry Voltage in Block 4 (V*100), (-1) means this value is invalid for this battery type"
-    ::= { symmetryEntry 5 }    
+    ::= { symmetryEntry 5 }
 
 -- ------------------------------------------------------------
 -- ALARM HISTORY INFORMATION
@@ -1327,7 +1327,7 @@ alarmHistoryCount OBJECT-TYPE
     STATUS current
     DESCRIPTION
         "Number of Alarm History entries in the History Table"
-    ::= { alarmHistory 1 }  
+    ::= { alarmHistory 1 }
 
 alarmHistoryTable OBJECT-TYPE
     SYNTAX SEQUENCE OF AlarmHistoryEntry
@@ -1335,8 +1335,8 @@ alarmHistoryTable OBJECT-TYPE
     STATUS current
     DESCRIPTION
         "Alarm History Table"
-    ::= { alarmHistory 2 }        
-    
+    ::= { alarmHistory 2 }
+
 alarmHistoryEntry OBJECT-TYPE
     SYNTAX AlarmHistoryEntry
     MAX-ACCESS not-accessible
@@ -1345,7 +1345,7 @@ alarmHistoryEntry OBJECT-TYPE
         "Queue of History Table"
     INDEX { ahTableIndex }
      ::= { alarmHistoryTable 1 }
-     
+
 AlarmHistoryEntry ::=
     SEQUENCE {
         ahTableIndex
@@ -1363,7 +1363,7 @@ AlarmHistoryEntry ::=
         ahData5
             Integer32
 	}
-	
+
 ahTableIndex OBJECT-TYPE
 	SYNTAX Integer32 (0..100)
     MAX-ACCESS read-only
@@ -1379,7 +1379,7 @@ ahTime OBJECT-TYPE
     DESCRIPTION
         "Time and date of the History Table entry"
     ::= { alarmHistoryEntry 2 }
-    
+
 ahData1 OBJECT-TYPE
 	SYNTAX Integer32 (0..255)
     MAX-ACCESS read-only
@@ -1387,7 +1387,7 @@ ahData1 OBJECT-TYPE
     DESCRIPTION
         "A byte containing alarm history data 1"
     ::= { alarmHistoryEntry 3 }
-    
+
 ahData2 OBJECT-TYPE
 	SYNTAX Integer32 (0..255)
     MAX-ACCESS read-only
@@ -1395,7 +1395,7 @@ ahData2 OBJECT-TYPE
     DESCRIPTION
         "A byte containing alarm history data 2"
     ::= { alarmHistoryEntry 4 }
-    
+
 ahData3 OBJECT-TYPE
 	SYNTAX Integer32 (0..255)
     MAX-ACCESS read-only
@@ -1411,14 +1411,14 @@ ahData4 OBJECT-TYPE
     DESCRIPTION
         "A byte containing alarm history data 4"
     ::= { alarmHistoryEntry 6 }
-    
+
 ahData5 OBJECT-TYPE
 	SYNTAX Integer32 (0..255)
     MAX-ACCESS read-only
 	STATUS  current
     DESCRIPTION
         "A byte containing alarm history data 5"
-    ::= { alarmHistoryEntry 7 }    
+    ::= { alarmHistoryEntry 7 }
 
 -- ------------------------------------------------------------
 -- DCDCModuleInfo
@@ -1430,7 +1430,7 @@ numOfDCDCUnits OBJECT-TYPE
     STATUS current
     DESCRIPTION
         "Number of DCDC Modules installed in the system"
-    ::= { dcdcInfo 1 }   
+    ::= { dcdcInfo 1 }
 
 dcdcTable OBJECT-TYPE
     SYNTAX SEQUENCE OF DCDCModuleEntry
@@ -1438,8 +1438,8 @@ dcdcTable OBJECT-TYPE
     STATUS current
     DESCRIPTION
         "DCDC Module Information Table"
-    ::= { dcdcInfo 2 }        
-    
+    ::= { dcdcInfo 2 }
+
 dcdcModuleEntry OBJECT-TYPE
     SYNTAX DCDCModuleEntry
     MAX-ACCESS not-accessible
@@ -1482,7 +1482,7 @@ DCDCModuleEntry ::=
 		dcdcSerialNumber
 			Integer32
 	}
-	
+
 dcdcModuleIndex OBJECT-TYPE
 	SYNTAX Integer32 (0..100)
     MAX-ACCESS read-only
@@ -1498,7 +1498,7 @@ dcdcModuleAddress OBJECT-TYPE
     DESCRIPTION
         "Address of current module viewed in the DCDC Module Table, (-1) means this value is invalid"
     ::= { dcdcModuleEntry 2 }
-	
+
 dcdcModuleComStatus	OBJECT-TYPE
 	SYNTAX ComStatusValue
     MAX-ACCESS read-only
@@ -1506,7 +1506,7 @@ dcdcModuleComStatus	OBJECT-TYPE
     DESCRIPTION
         "Module Communication Status, 0-OK, 1-Failed, (-1) means this value is invalid"
     ::= { dcdcModuleEntry 3 }
-    
+
 dcdcModuleOk OBJECT-TYPE
 	SYNTAX AlarmValue
     MAX-ACCESS read-only
@@ -1514,7 +1514,7 @@ dcdcModuleOk OBJECT-TYPE
     DESCRIPTION
         "DCDC Module Ok or Alarm, 0-OK, 1-Alarm, (-1) means this value is invalid"
     ::= { dcdcModuleEntry 4 }
-     
+
 dcdcModuleEnabled OBJECT-TYPE
 	SYNTAX SwitchValue
     MAX-ACCESS read-only
@@ -1522,7 +1522,7 @@ dcdcModuleEnabled OBJECT-TYPE
     DESCRIPTION
         "DCDC module is enabled or not, 1-Enabled, 0-Disabled, (-1) means this value is invalid"
     ::= { dcdcModuleEntry 5 }
-    
+
 dcdcInputVoltage OBJECT-TYPE
 	SYNTAX Integer32 (0..30000)
     MAX-ACCESS read-only
@@ -1530,7 +1530,7 @@ dcdcInputVoltage OBJECT-TYPE
     DESCRIPTION
         "Module Input Voltage(V), (-1) means measurement not available"
     ::= { dcdcModuleEntry 6 }
-    
+
 dcdcOutputVoltage OBJECT-TYPE
 	SYNTAX Integer32 (0..30000)
     MAX-ACCESS read-only
@@ -1546,7 +1546,7 @@ dcdcOutputCurrent OBJECT-TYPE
     DESCRIPTION
         "Module Current (A*10), (-1) means measurement not available"
     ::= { dcdcModuleEntry 8 }
-    
+
 dcdcMeanCurrent	OBJECT-TYPE
 	SYNTAX Integer32 (0..30000)
     MAX-ACCESS read-only
@@ -1602,7 +1602,7 @@ dcdcSerialNumber OBJECT-TYPE
     DESCRIPTION
         "Serial Number of the module, (-1) means this value is invalid"
     ::= { dcdcModuleEntry 15 }
-    
+
 -- ------------------------------------------------------------
 -- SLIInfo
 -- ------------------------------------------------------------
@@ -1613,7 +1613,7 @@ numOfSLIUnits OBJECT-TYPE
     STATUS current
     DESCRIPTION
         "Number of SLI inverters installed in the system"
-    ::= { sliInfo 1 }   
+    ::= { sliInfo 1 }
 
 sliTable OBJECT-TYPE
     SYNTAX SEQUENCE OF SLIModuleEntry
@@ -1621,8 +1621,8 @@ sliTable OBJECT-TYPE
     STATUS current
     DESCRIPTION
         "SLI Module internal information table"
-    ::= { sliInfo 2 }        
-    
+    ::= { sliInfo 2 }
+
 sliModuleEntry OBJECT-TYPE
     SYNTAX SLIModuleEntry
     MAX-ACCESS not-accessible
@@ -1663,7 +1663,7 @@ SLIModuleEntry ::=
 		sliSerialNumber
 			Integer32
 	}
-	
+
 sliModuleIndex OBJECT-TYPE
 	SYNTAX Integer32 (0..100)
     MAX-ACCESS read-only
@@ -1679,7 +1679,7 @@ sliModuleAddress OBJECT-TYPE
     DESCRIPTION
         "Communication address of current SLI inverter viewed in the current SLI Table, (-1) means this value is not available"
     ::= { sliModuleEntry 2 }
-	
+
 sliModuleComStatus	OBJECT-TYPE
 	SYNTAX ComStatusValue
     MAX-ACCESS read-only
@@ -1687,7 +1687,7 @@ sliModuleComStatus	OBJECT-TYPE
     DESCRIPTION
         "Sli inverter communication status, 0-OK, 1-Failed, (-1) means this value is not available"
     ::= { sliModuleEntry 3 }
-    
+
 sliOutputVoltage OBJECT-TYPE
 	SYNTAX Integer32
     MAX-ACCESS read-only
@@ -1703,7 +1703,7 @@ sliOutputCurrent OBJECT-TYPE
     DESCRIPTION
         "SLI inverter output current in hundredths of A (A*100), (-1) means that this value is not available"
     ::= { sliModuleEntry 5 }
-    
+
 sliOutputPower	OBJECT-TYPE
 	SYNTAX Integer32
     MAX-ACCESS read-only
@@ -1727,7 +1727,7 @@ sliGridCurrent	OBJECT-TYPE
     DESCRIPTION
         "SLI inverter AC Grid Output Current in hundredths of Amperes (A*100), (-1) means this value is not available"
     ::= { sliModuleEntry 8 }
-	
+
 sliModuleGeneralFailure OBJECT-TYPE
 	SYNTAX AlarmValue
     MAX-ACCESS read-only
@@ -1810,7 +1810,7 @@ sliTSStatus OBJECT-TYPE
     DESCRIPTION
         "Transfer switch status, (-1) means this value is not available"
     ::= { sliModuleEntry 13 }
-	
+
 sliSerialNumber OBJECT-TYPE
 	SYNTAX Integer32
     MAX-ACCESS read-only
@@ -1830,7 +1830,7 @@ alarmTTable OBJECT-TYPE
     DESCRIPTION
         "Alarm state and trap setting table"
     ::= { alarmTable 1 }
-    
+
 alarmTableEntry OBJECT-TYPE
     SYNTAX AlarmTableEntry
     MAX-ACCESS not-accessible
@@ -1851,7 +1851,7 @@ AlarmTableEntry ::=
         alarmTrapDisable
             Integer32
 	}
-	
+
 alarmTableIndex OBJECT-TYPE
 	SYNTAX Integer32 (0..100)
     MAX-ACCESS read-only
@@ -1867,7 +1867,7 @@ alarmDescription OBJECT-TYPE
     DESCRIPTION
         "Alarm decription (Name)"
     ::= { alarmTableEntry 2 }
-	
+
 alarmStatus	OBJECT-TYPE
 	SYNTAX Integer32
     MAX-ACCESS read-only
@@ -1875,14 +1875,14 @@ alarmStatus	OBJECT-TYPE
     DESCRIPTION
         "Alarm Status, 0-Off (Alarm is not active), 1-Active"
     ::= { alarmTableEntry 3 }
-    
+
 alarmTrapDisable OBJECT-TYPE
 	SYNTAX Integer32
     MAX-ACCESS read-write
 	STATUS  current
     DESCRIPTION
         "Flag if trap is disabled or enabled for this alarm"
-    ::= { alarmTableEntry 4 }	
+    ::= { alarmTableEntry 4 }
 
 -- ------------------------------------------------------------
 -- SNMPv3 USM
@@ -1894,7 +1894,7 @@ usmUserTable     OBJECT-TYPE
     MAX-ACCESS  not-accessible
     STATUS       current
     DESCRIPTION "This table is used to configure ACX USM.
-				 To get the SNMPv3 access, user need to configure security 
+				 To get the SNMPv3 access, user need to configure security
 		         name,authentication,auth password,priv protocol and priv password.
 				 Table returns zero strings if SNMPv1/2c is selected in controller"
     ::= { snmpV3USM 1 }
@@ -1903,7 +1903,7 @@ usmUserEntry     OBJECT-TYPE
     SYNTAX		UsmUserEntry
     MAX-ACCESS	not-accessible
     STATUS current
-    DESCRIPTION 	
+    DESCRIPTION
 		"User security configurations for USM."
 	INDEX   { usmIndex }
     ::= { usmUserTable 1 }
@@ -1916,7 +1916,7 @@ UsmUserEntry   ::= SEQUENCE {
         usmPrivProtocol UsmPrivProtocol,
         usmPrivKey		KeyChange,
 		usmStorage		StorageType,
-		usmStatus		RowStatus		
+		usmStatus		RowStatus
     }
 
 usmIndex	  	OBJECT-TYPE
@@ -1939,12 +1939,12 @@ usmAuthProtocol OBJECT-TYPE
     SYNTAX	UsmAuthProtocol
     MAX-ACCESS	read-write
     STATUS	current
-    DESCRIPTION  
+    DESCRIPTION
 		"Authentication support to the SNMPv3.
-		If usmAuthProtocol == NoAuthProtocol, then SNMPv3 Stack does 
+		If usmAuthProtocol == NoAuthProtocol, then SNMPv3 Stack does
 		not support/requires authentication.
 		If usmAuthProtocol == HMACMD5Auth , supports MD5 auth
-		If usmAuthProtocol == HMACSHAAuth, supports SHA Auth 	
+		If usmAuthProtocol == HMACSHAAuth, supports SHA Auth
         If a set operation tries to set value as
         NoAuthProtocol while the usmPrivProtocol value
         for the same userName is not equal to NoPrivProtocol,
@@ -1960,17 +1960,17 @@ usmAuthKey OBJECT-TYPE
                         -- typically (SIZE (0 | 40)) for HMACSHA
     MAX-ACCESS  read-write
     STATUS	current
-    DESCRIPTION  
+    DESCRIPTION
 		"This object in the MIB is associated to usmAuthProtocol.
-		A secret authentication key is required to establish a secure connection 
-		between snmp agent and manager."			
+		A secret authentication key is required to establish a secure connection
+		between snmp agent and manager."
     ::= { usmUserEntry 4 }
 
 usmPrivProtocol OBJECT-TYPE
     SYNTAX	UsmPrivProtocol
     MAX-ACCESS  read-write
     STATUS	current
-    DESCRIPTION 
+    DESCRIPTION
 		" A privacy protocol to provide encryption and decryption
 		of SNMPv3 pdu."
     ::= { usmUserEntry 5 }
@@ -1981,27 +1981,27 @@ usmPrivKey OBJECT-TYPE
     STATUS	current
     DESCRIPTION
 		"This object in the MIB is associated to usmPrivProtocol.
-		A secret privacy key is required to establish a secure connection 
+		A secret privacy key is required to establish a secure connection
 		between snmp agent and manager."
     ::= { usmUserEntry 6 }
-	
+
 usmStorage OBJECT-TYPE
     SYNTAX	StorageType
     MAX-ACCESS read-only
     STATUS	current
-    DESCRIPTION 
+    DESCRIPTION
 		"This object indicates storage type for user data (always nonVolatile)."
     ::= { usmUserEntry 7 }
-	
+
 usmStatus OBJECT-TYPE
     SYNTAX	RowStatus
     MAX-ACCESS read-only
     STATUS	current
-    DESCRIPTION 
+    DESCRIPTION
 		"This object indicates user status (always active)."
     ::= { usmUserEntry 8 }
 
--- ------------------------------------------------------------	
+-- ------------------------------------------------------------
 -- Traps
 -- As defined in RFC each TRAP V2 contains at least OBJECTS { snmpTrapOID }
 -- which is set to 1 at cleared to 0 during corresponding events
@@ -2021,42 +2021,42 @@ highVoltTrap NOTIFICATION-TYPE
     DESCRIPTION
             "High DC Voltage Alarm"
     ::= { powecACXTrap 2 }
-    
+
 loadBattDisconTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Load/Battery Disconnected"
     ::= { powecACXTrap 3 }
-	
+
 mainsFailTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Mains Failure Alarm"
     ::= { powecACXTrap 4 }
-	
+
 distrFuseTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Distribution Fuse Failure"
     ::= { powecACXTrap 5 }
-	
+
 lowACTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Low AC input voltage"
     ::= { powecACXTrap 6 }
-	
+
 battFailTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Battery Test Failure"
     ::= { powecACXTrap 7 }
-	
+
 moduleFailTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
@@ -2070,250 +2070,250 @@ battTempTrap NOTIFICATION-TYPE
     DESCRIPTION
             "High Battery Temperature Alarm"
     ::= { powecACXTrap 9 }
-	
+
 symmFailTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Battery Symmetry Alarm"
     ::= { powecACXTrap 10 }
-	
+
 battFuseTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Battery Fuse Failure"
     ::= { powecACXTrap 11 }
-	
+
 highLoadTrap NOTIFICATION-TYPE
-	OBJECTS { snmpTrapOID }	
+	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "High Load"
     ::= { powecACXTrap 12 }
-	
+
 highACTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "High AC input voltage"
     ::= { powecACXTrap 13 }
-	
+
 urgentModFailTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Urgent Module Alarm"
     ::= { powecACXTrap 14 }
-	
+
 comFailTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Communication Failure"
     ::= { powecACXTrap 15 }
-	
+
 partLoadDiscon1Trap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Partial Load Disconnect 1 Alarm"
     ::= { powecACXTrap 16 }
-	
+
 tempProbeTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Temperature probe fault"
     ::= { powecACXTrap 17 }
-	
+
 dischargingTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Battery on Discharge"
     ::= { powecACXTrap 18 }
-	
+
 ovShutdownTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Overvoltage Shutdown alarm"
     ::= { powecACXTrap 19 }
-	
+
 lowBattTempTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Low Battery Temperature"
     ::= { powecACXTrap 20 }
-	
+
 partLoadDiscon2Trap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Partial Load Disconnect 2 Alarm"
     ::= { powecACXTrap 21 }
-	
+
 partLoadDiscon3Trap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Partial Load Disconnect 3 Alarm"
     ::= { powecACXTrap 22 }
-	
+
 alarmsBlockedTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Alarms Blocked"
     ::= { powecACXTrap 23 }
-	
+
 extAlarm0Trap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Ext.alarm 0"
     ::= { powecACXTrap 24 }
-	
+
 extAlarm1Trap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Ext.alarm 1"
     ::= { powecACXTrap 25 }
-	
+
 extAlarm2Trap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Ext.alarm 2"
     ::= { powecACXTrap 26 }
-	
+
 extAlarm3Trap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Ext.alarm 3"
     ::= { powecACXTrap 27 }
-	
+
 extAlarm4Trap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Ext.alarm 4"
     ::= { powecACXTrap 28 }
-	
+
 extAlarm5Trap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Ext.alarm 5"
     ::= { powecACXTrap 29 }
-	
+
 extAlarm6Trap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Ext.alarm 6"
     ::= { powecACXTrap 30 }
-	
+
 extAlarm7Trap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Ext.alarm 7"
     ::= { powecACXTrap 31 }
-	
+
 extAlarm8Trap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Ext.alarm 8"
     ::= { powecACXTrap 32 }
-	
+
 extAlarm9Trap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Ext.alarm 9"
     ::= { powecACXTrap 33 }
-	
+
 extAlarm10Trap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Ext.alarm 10"
     ::= { powecACXTrap 34 }
-	
+
 extAlarm11Trap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Ext.alarm 11"
     ::= { powecACXTrap 35 }
-	
+
 extAlarm12Trap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Ext.alarm 12"
     ::= { powecACXTrap 36 }
-	
+
 extAlarm13Trap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Ext.alarm 13"
     ::= { powecACXTrap 37 }
-	
+
 extAlarm14Trap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Ext.alarm 14"
     ::= { powecACXTrap 38 }
-	
+
 extAlarm15Trap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "Ext.alarm 15"
     ::= { powecACXTrap 39 }
-	
+
 u1NormalTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "System output reference changed to Normal"
     ::= { powecACXTrap 40 }
-	
+
 u2BoostTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "System output reference changed to Boost"
     ::= { powecACXTrap 41 }
-	
+
 u3TestTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "System output reference changed to Test"
     ::= { powecACXTrap 42 }
-	
+
 u4SpareTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "System output reference changed to Spare"
     ::= { powecACXTrap 43 }
- 
+
 snmpV3ReadyTrap NOTIFICATION-TYPE
 	OBJECTS { snmpTrapOID }
 	STATUS current
     DESCRIPTION
             "SNMPv3 Engine is ready"
     ::= { powecACXTrap 44 }
-	
+
 END
diff --git a/infra/README.md b/infra/README.md
index b2d4c1b00..8c77701ac 100644
--- a/infra/README.md
+++ b/infra/README.md
@@ -185,4 +185,3 @@ resources (see [above](#clean-up-lingering-resources)).
 ## unable to destroy resource Name: station, Type: network
 
 Solution: some containers are still running. Stop them, or force stop all containers using ``docker ps -q -a | xargs docker rm -f``.
-
diff --git a/tangostationcontrol/VERSION b/tangostationcontrol/VERSION
index 87f0b954e..e92c04be1 100644
--- a/tangostationcontrol/VERSION
+++ b/tangostationcontrol/VERSION
@@ -1 +1 @@
-0.38.4
+0.38.5
diff --git a/tangostationcontrol/tangostationcontrol/states/hibernate.py b/tangostationcontrol/tangostationcontrol/states/hibernate.py
index 196a31a72..70a0de3e8 100644
--- a/tangostationcontrol/tangostationcontrol/states/hibernate.py
+++ b/tangostationcontrol/tangostationcontrol/states/hibernate.py
@@ -1,7 +1,7 @@
 # Copyright (C) 2024 ASTRON (Netherlands Institute for Radio Astronomy)
 # SPDX-License-Identifier: Apache-2.0
 import logging
-from tango import DevFailed, Except
+from tango import DevFailed
 from tangostationcontrol.states.station_state import StationState
 from tangostationcontrol.states.station_state_enum import StationStateEnum
 
@@ -28,12 +28,9 @@ class HibernateState(StationState):
         from tangostationcontrol.states.off import OffState
 
         # not implemented -> call the correct state transition function
-        self._station_manager.requested_station_state = OffState(
-            self._station_manager, self._power_hierarchy
-        ).state.name
-        self._station_manager.set_station_state(
-            OffState(self._station_manager, self._power_hierarchy)
-        )
+        new_state = OffState(self._station_manager, self._power_hierarchy)
+        self._station_manager.requested_station_state = new_state.state.name
+        self._station_manager.set_station_state(new_state)
 
     async def station_standby(self):
         """Transition HIBERNATE -> STANDBY"""
@@ -46,11 +43,7 @@ class HibernateState(StationState):
                 self._power_hierarchy.hibernate_to_standby,
             )
         except DevFailed as exc:
-            error_string = self.get_transition_error_string(target_state)
-            logger.exception(error_string)
-            Except.re_throw_exception(
-                exc, "DevFailed", error_string, str(self._station_manager)
-            )
+            self.generate_transition_error(target_state, logger, exc)
         self._station_manager.set_station_state(
             StandbyState(self._station_manager, self._power_hierarchy)
         )
diff --git a/tangostationcontrol/tangostationcontrol/states/off.py b/tangostationcontrol/tangostationcontrol/states/off.py
index 88bd6d491..f345f489e 100644
--- a/tangostationcontrol/tangostationcontrol/states/off.py
+++ b/tangostationcontrol/tangostationcontrol/states/off.py
@@ -1,7 +1,7 @@
 # Copyright (C) 2024 ASTRON (Netherlands Institute for Radio Astronomy)
 # SPDX-License-Identifier: Apache-2.0
 import logging
-from tango import DevFailed, Except
+from tango import DevFailed
 from tangostationcontrol.states.station_state import StationState
 from tangostationcontrol.states.station_state_enum import StationStateEnum
 
@@ -37,11 +37,7 @@ class OffState(StationState):
                 self._power_hierarchy.off_to_hibernate,
             )
         except DevFailed as exc:
-            error_string = self.get_transition_error_string(target_state)
-            logger.exception(error_string)
-            Except.re_throw_exception(
-                exc, "DevFailed", error_string, str(self._station_manager)
-            )
+            self.generate_transition_error(target_state, logger, exc)
         self._station_manager.set_station_state(
             HibernateState(self._station_manager, self._power_hierarchy)
         )
diff --git a/tangostationcontrol/tangostationcontrol/states/on.py b/tangostationcontrol/tangostationcontrol/states/on.py
index 7e322d239..65647698f 100644
--- a/tangostationcontrol/tangostationcontrol/states/on.py
+++ b/tangostationcontrol/tangostationcontrol/states/on.py
@@ -1,7 +1,7 @@
 # Copyright (C) 2024 ASTRON (Netherlands Institute for Radio Astronomy)
 # SPDX-License-Identifier: Apache-2.0
 import logging
-from tango import DevFailed, Except
+from tango import DevFailed
 from tangostationcontrol.states.station_state import StationState
 from tangostationcontrol.states.station_state_enum import StationStateEnum
 
@@ -38,11 +38,7 @@ class OnState(StationState):
                 self._power_hierarchy.on_to_standby,
             )
         except DevFailed as exc:
-            error_string = self.get_transition_error_string(target_state)
-            logger.exception(error_string)
-            Except.re_throw_exception(
-                exc, "DevFailed", error_string, str(self._station_manager)
-            )
+            self.generate_transition_error(target_state, logger, exc)
         self._station_manager.set_station_state(
             StandbyState(self._station_manager, self._power_hierarchy)
         )
diff --git a/tangostationcontrol/tangostationcontrol/states/standby.py b/tangostationcontrol/tangostationcontrol/states/standby.py
index 5f28f2d96..9e946218b 100644
--- a/tangostationcontrol/tangostationcontrol/states/standby.py
+++ b/tangostationcontrol/tangostationcontrol/states/standby.py
@@ -1,7 +1,7 @@
 # Copyright (C) 2024 ASTRON (Netherlands Institute for Radio Astronomy)
 # SPDX-License-Identifier: Apache-2.0
 import logging
-from tango import DevFailed, Except
+from tango import DevFailed
 from tangostationcontrol.states.station_state import StationState
 from tangostationcontrol.states.station_state_enum import StationStateEnum
 
@@ -34,11 +34,7 @@ class StandbyState(StationState):
                 self._power_hierarchy.standby_to_hibernate,
             )
         except DevFailed as exc:
-            error_string = self.get_transition_error_string(target_state)
-            logger.exception(error_string)
-            Except.re_throw_exception(
-                exc, "DevFailed", error_string, str(self._station_manager)
-            )
+            self.generate_transition_error(target_state, logger, exc)
         self._station_manager.set_station_state(
             HibernateState(self._station_manager, self._power_hierarchy)
         )
@@ -54,11 +50,7 @@ class StandbyState(StationState):
                 self._power_hierarchy.standby_to_on,
             )
         except DevFailed as exc:
-            error_string = self.get_transition_error_string(target_state)
-            logger.exception(error_string)
-            Except.re_throw_exception(
-                exc, "DevFailed", error_string, str(self._station_manager)
-            )
+            self.generate_transition_error(target_state, logger, exc)
         self._station_manager.set_station_state(
             OnState(self._station_manager, self._power_hierarchy)
         )
diff --git a/tangostationcontrol/tangostationcontrol/states/station_state.py b/tangostationcontrol/tangostationcontrol/states/station_state.py
index b13773aec..ebf359fc7 100644
--- a/tangostationcontrol/tangostationcontrol/states/station_state.py
+++ b/tangostationcontrol/tangostationcontrol/states/station_state.py
@@ -5,7 +5,8 @@ import logging
 from abc import ABC, abstractmethod
 from typing import Callable, Awaitable
 from functools import wraps
-from tango import DevState, DeviceProxy
+
+from tango import DevState, DeviceProxy, Except, DevFailed
 
 from tangostationcontrol.states.station_state_enum import StationStateEnum
 
@@ -71,11 +72,17 @@ class StationState(ABC):
         """Return the timeout for a given station state"""
         return cls.TIMEOUT_DICT[state]
 
-    def get_transition_error_string(self, target_state: StationStateEnum) -> str:
-        """Print standard transition error string"""
-        return f"Station {self._station_manager.Station_Name} \
+    def generate_transition_error(
+        self, target_state: StationStateEnum, log: logging.Logger, exc: DevFailed
+    ):
+        """Generate standardized error for state transistions"""
+        error_string = f"Station {self._station_manager.Station_Name} \
             can not transition to {target_state.name} state. \
             Current state is {self.state.name}"
+        log.exception(error_string)
+        Except.re_throw_exception(
+            exc, "DevFailed", error_string, str(self._station_manager)
+        )
 
     def get_transition_current_state_error(self) -> None:
         """Log a warning message after performing a transition to
-- 
GitLab