Gå till innehållet

scSNMP – Användning

Alla funktioner i scSNMP skapar händelsedrivna övervakningsobjekt. Objekten pollar enheten med ett konfigurerbart intervall och skickar en händelse till huvudskriptet varje gång ny data har hämtats.


SynologySystemMIB

Hämtar övergripande systemstatus från en Synology NAS.

Parametrar

Parameter Typ Standardvärde Beskrivning
ipAddress String (obligatorisk) IP-adress till NAS-enheten
name String "<NONAME>" Namn på instansen
poll Boolean true true startar automatisk polling
interval Number 3600000 (60 min) Pollintervall i millisekunder
port Number 161 SNMP-port
community String "public" SNMP community string

Tillgänglig data i händelsen (event.data)

Egenskap Beskrivning
systemStatus Systemstatus: Normal, Failed
temperature Systemtemperatur i Celsius
powerStatus Strömförsörjningsstatus
systemFanStatus Systemfläktarnas status
cpuFanStatus CPU-fläktarnas status
modelName Modellnamn
serialNumber Serienummer
version DSM-version
upgradeAvailable Om DSM-uppdatering finns tillgänglig
ssCpuSystem CPU-användning i procent
memTotalReal Totalt RAM
memAvailReal Ledigt RAM
memCached Cachat minne
var snmp1 = new scSNMP.SynologySystemMIB("192.168.1.10", "NAS_Ethiris");
snmp1.getEventTarget().onDataAvailable = function(event)
{
    if(!event.error)
    {
        Debug.Print("NAS systemstatus: " + event.data.systemStatus.status);
        Debug.Print("NAS temperatur: " + event.data.temperature.value + "°C");
    }
    else
        Debug.Print("Fel vid SNMP-hämtning: " + event.errorMessage);
}

SynologyDiskMIB

Hämtar status per disk från en Synology NAS.

Parametrar

Parameter Typ Standardvärde Beskrivning
ipAddress String (obligatorisk) IP-adress till NAS-enheten
name String "<NONAME>" Namn på instansen
disks Array<Number> [1,2,3,4,5,6,7,8] Lista över diskindex att övervaka
poll Boolean true true startar automatisk polling
interval Number 3600000 (60 min) Pollintervall i millisekunder
port Number 161 SNMP-port
community String "public" SNMP community string

Tillgänglig data per disk (event.data["Disk N"])

Egenskap Beskrivning
diskStatus Normal, Initialized, Crashed osv.
diskHealthStatus Normal, Warning, Critical, Failing
diskTemperature Disktemperatur i Celsius
diskModel Diskmodell
diskRemainLife Uppskattad återstående livslängd
diskBadSector Antal defekta sektorer
var snmp2 = new scSNMP.SynologyDiskMIB("192.168.1.10", "NAS_Diskar", [1,2,3,4]);
snmp2.getEventTarget().onDataAvailable = function(event)
{
    if(!event.error)
    {
        Debug.Print("Disk 1 status: " + event.data["Disk 1"].diskStatus.status);
        Debug.Print("Disk 1 temperatur: " + event.data["Disk 1"].diskTemperature.value + "°C");
    }
}

SynologySystemTemperatureCheck

Händelsedriven temperaturövervakning för Synology NAS. Skickar en händelse när temperaturen passerar ett konfigurerat gränsvärde i någon riktning.

Parametrar

Parameter Typ Standardvärde Beskrivning
ipAddress String (obligatorisk) IP-adress till NAS-enheten
limit Number 50 Temperaturgränsvärde i Celsius
name String "<NONAME>" Namn på instansen
port Number 161 SNMP-port
community String "public" SNMP community string
interval Number 10000 Kontrollintervall i millisekunder

Händelseegenskaper

Egenskap Typ Beskrivning
event.isAboveLimit Boolean true om temperaturen överstiger gränsvärdet
event.isBelowLimit Boolean true om temperaturen understiger gränsvärdet
event.currentTemperature Number Aktuell temperatur i Celsius
event.limit Number Konfigurerat gränsvärde
var snmp3 = new scSNMP.SynologySystemTemperatureCheck("192.168.1.10", 45, "NAS_Temp");
snmp3.getEventTarget().onDataAvailable = function(event)
{
    if(!event.error)
        Debug.Print(event.text);
}

HPSystemMIB

Hämtar övergripande systemstatus från en HP-switch (testat på HPE OfficeConnect 1950).

Parametrar

Parameter Typ Standardvärde Beskrivning
ipAddress String (obligatorisk) IP-adress till switchen
name String "<NONAME>" Namn på instansen
poll Boolean true true startar automatisk polling
interval Number 3600000 (60 min) Pollintervall i millisekunder
port Number 161 SNMP-port
community String "public" SNMP community string

Tillgänglig data i händelsen (event.data)

Egenskap Beskrivning
hh3cEntityExtCpuUsage CPU-användning i procent
hh3cEntityExtMemUsage Minnesanvändning i procent
hh3cEntityExtUpTime Drifttid i sekunder
hh3cEntityExtManuSerialNum Serienummer
hh3cEntityExtTemperature Switchtemperatur
entPhysicalHardwareRev Hårdvaruversion
entPhysicalFirmwareRev Firmwareversion
var snmp4 = new scSNMP.HPSystemMIB("192.168.1.20", "HP_Switch");
snmp4.getEventTarget().onDataAvailable = function(event)
{
    if(!event.error)
    {
        Debug.Print("CPU: " + event.data.hh3cEntityExtCpuUsage.value + "%");
        Debug.Print("Minne: " + event.data.hh3cEntityExtMemUsage.value + "%");
    }
}

HPPortMIB

Hämtar portstatus per port från en HP-switch.

Parametrar

Parameter Typ Standardvärde Beskrivning
ipAddress String (obligatorisk) IP-adress till switchen
name String "<NONAME>" Namn på instansen
poll Boolean true true startar automatisk polling
interval Number 3600000 (60 min) Pollintervall i millisekunder
port Number 161 SNMP-port
community String "public" SNMP community string
ports Array<Number> [1,2,3,4] Portindex att övervaka

Tillgänglig data per port (event.data["Port N"])

Egenskap Beskrivning
ifHighSpeed Portens bandbredd i Mbit/s
ifSpeed Portens bandbredd i bit/s
dot3StatsDuplexStatus Duplexläge: unknown, halfDuplex, fullDuplex
hh3cIfStatFlowInBits Inkommande trafik i bits per intervall
hh3cIfStatFlowOutBits Utgående trafik i bits per intervall
var snmp5 = new scSNMP.HPPortMIB("192.168.1.20", "HP_Portar", true, 60000, 161, "public", [1,2,3,4,5,6]);
snmp5.getEventTarget().onDataAvailable = function(event)
{
    if(!event.error)
        Debug.Print("Port 1 hastighet: " + event.data["Port 1"].ifHighSpeed.value + " Mbit/s");
}

HPFanMIB

Hämtar fläktstatus från en HP-switch.

Parametrar

Parameter Typ Standardvärde Beskrivning
ipAddress String (obligatorisk) IP-adress till switchen
name String "<NONAME>" Namn på instansen
fans Array<Number> [1,2] Fläktindex att övervaka
poll Boolean true true startar automatisk polling
interval Number 3600000 (60 min) Pollintervall i millisekunder
port Number 161 SNMP-port
community String "public" SNMP community string

Tillgänglig data per fläkt (event.data["Fan N"])

Egenskap Beskrivning
operStatus Driftstatus: Not Supported, Disabled, Enabled, Dangerous
errorStatus Felstatus: Normal, Post failure, Fan error osv.
var snmp6 = new scSNMP.HPFanMIB("192.168.1.20", "HP_Fläktar", [1,2]);
snmp6.getEventTarget().onDataAvailable = function(event)
{
    if(!event.error)
        Debug.Print("Fläkt 1: " + event.data["Fan 1"].operStatus.status);
}

ArubaSystemMIB

Hämtar övergripande systemstatus från en Aruba-switch (testat på Aruba Instant On 1930).

Parametrar – samma som HPSystemMIB.

Tillgänglig data i händelsen (event.data)

Egenskap Beskrivning
rlPhdUnitEnvParamTempSensorValue Aktuell temperatur
rlPhdUnitEnvParamTempSensorStatus Temperaturstatus: Ok, Unavailable, Non-operational
rlPhdUnitEnvParamMonitorTemperatureStatus Temperaturlarmsstatus
rlCpuUtilDuringLastSecond CPU senaste sekunden (%)
rlCpuUtilDuringLastMinute CPU senaste minuten (%)
rlCpuUtilDuringLast5Minutes CPU senaste 5 minuterna (%)
rlPhdUnitGenParamModelName Modellnamn
rlPhdUnitGenParamSoftwareVersion Programvaruversion
rlPhdUnitGenParamSerialNum Serienummer
sysUpTime Drifttid (i 1/100 sekunder)
pethMainPsePower Total PoE-kapacitet i Watt
pethMainPseOperStatus PoE-status: On, Off, Faulty
pethMainPseConsumptionPower Aktuell PoE-förbrukning i Watt

ArubaFanMIB

Hämtar fläktstatus från en Aruba-switch. Parametrar – samma som HPFanMIB.

Tillgänglig data per fläkt (event.data["Fan N"])

Egenskap Beskrivning
fanStatus Status: Normal, Warning, Critical, Shutdown, Not present, Not functioning
fanSpeed Fläkthastighet (råvärde)

ArubaPortMIB

Hämtar portstatus per port från en Aruba-switch. Parametrar – samma som HPPortMIB.

Tillgänglig data per port (event.data["Port N"])

Egenskap Beskrivning
ifHighSpeed Hastighet i Mbit/s
dot3StatsDuplexStatus Duplexläge
ifAdminStatus Administrativ status: Up, Down, Testing
ifOperStatus Operativ status: Up, Down, Testing

ArubaPoeMIB

Hämtar PoE-status per port från en Aruba-switch.

Parametrar – samma som HPPortMIB.

Tillgänglig data per port (event.data["Port N"])

Egenskap Beskrivning
rlPethPsePortOutputVoltage Utspänning i millivolt
rlPethPsePortOutputCurrent Utström i milliampere
rlPethPsePortOutputPower Uteffekt i milliwatt
rlPethPsePortPowerLimit Konfigurerat effektgränsvärde i milliwatt
rlPethPsePortOperStatus Om porten är aktiv (True/False)
rlPethPsePortLinkPartnerPoeType Ansluten enhets PoE-typ

Skriptet

Ladda ner scSNMP.js

//***********************************************//
// The purpose of this script library
// is to collect data from one or more
// Synology NAS and/or HP/Aruba switches
// using SNMP and MIBs' defined by Synology and
// HP/Aruba documentation
// Version 1.3 (2024-03-04)
// Copyright © 2022-2024 Kentima AB. No rights reserved.
//***********************************************//

try
{    
    //SYNOLOGY-SYSTEM-MIB. Get system status Tested on Synology RS1219+
    this.SynologySystemMIB = function (ipAddress, name, poll, interval, port, community)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.SynologySystemMIB: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress   = ipAddress; //Store IP address
            var name        = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var poll        = (typeof poll == "undefined" || typeof poll !== "boolean") ? true : poll; //Store poll status
            var interval    = (typeof interval == "undefined" || typeof interval !== "number") ? (60000 * 60) : interval; //Store interval(how often to poll)
            var port        = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store Port number
            var community   = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //store community
            var snmpReader  = new SNMPReader(ipAddress, port, community); //Create new SNMPReader object
            var eventTarget = new EventTarget(); //Create an EventTarget

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            //Define function to send an Event
            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, data)
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init Event, (type, canBubble, cancelable)

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.name = name; //Store name in the event
                event.data = data; //Store data in the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event); //Send event
                else
                    throw new Error("Event listener 'DataAvailable' is missing"); //Throw an Error if Event listener 'DataAvailable' is missing
            }

            //Define function to get new data
            this.getData = function ()
            {
                try
                {
                    var data = {}; //Create new Struct object
                    snmpReader.Get(); //Get new data from SNMPReader object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        for (var oid in snmpReader.Results) //Iterate Results
                        {
                            var propName    = oids[oid].name;
                            var value       = snmpReader.Results[oid]; 
                            var description = oids[oid].description;
                            var status      = (typeof oids[oid].status != "undefined" && typeof oids[oid].status[snmpReader.Results[oid]] != "undefined") ? oids[oid].status[snmpReader.Results[oid]] : null;
                            data[propName] = 
                            {
                                name: propName,
                                oid: oid,
                                value: value,
                                description: description,
                                status: status
                            }; //Add data to data Object
                        }
                        sendEvent(false, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget, data); //Execute sendEvent() function
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error status, if Results Object is empty
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.SynologySystemMIB.getData(): " + e); //Catch any Error
                }
            }
            var oids = {} //Store OIDs

            var systemStatus = "1.3.6.1.4.1.6574.1.1.0";
            oids[systemStatus] = {};
            oids[systemStatus].name = "systemStatus";
            oids[systemStatus].description = "Synology system status";
            oids[systemStatus].status = ["Not Used(0)", "Normal(1): System is functioning normally", "Failed(2): Volume has crashed"];
            snmpReader.AddOID(systemStatus);

            var temperature = "1.3.6.1.4.1.6574.1.2.0";
            oids[temperature] = {};
            oids[temperature].name = "temperature";
            oids[temperature].description = "Synology system temperature (Celsius)";
            snmpReader.AddOID(temperature);

            var powerStatus = "1.3.6.1.4.1.6574.1.3.0";
            oids[powerStatus] = {};
            oids[powerStatus].name = "powerStatus";
            oids[powerStatus].description = "Synology power status";
            oids[powerStatus].status = ["Not Used(0)", "Normal(1): All power supplies are functioning normally", "Failed(2): One of the power supplies have failed"];
            snmpReader.AddOID(powerStatus);

            var fan             = {};
            fan.systemFanStatus = "1.3.6.1.4.1.6574.1.4.1.0";
            oids[fan.systemFanStatus] = {};
            oids[fan.systemFanStatus].name = "systemFanStatus";
            oids[fan.systemFanStatus].description = "Synology system fan status";
            oids[fan.systemFanStatus].status = ["Not Used(0)", "Normal(1): All internal fans are functioning normally", "Failed(2): One of the internal fans have stopped"];
            snmpReader.AddOID(fan.systemFanStatus);

            fan.cpuFanStatus = "1.3.6.1.4.1.6574.1.4.2.0";
            oids[fan.cpuFanStatus] = {};
            oids[fan.cpuFanStatus].name = "cpuFanStatus";
            oids[fan.cpuFanStatus].description = "Synology cpu fan status";
            oids[fan.cpuFanStatus].status = ["Not Used(0)", "Normal(1): All CPU fans functioning normally", "Failed(2): One of the CPU fans have stopped"];
            snmpReader.AddOID(fan.cpuFanStatus);

            var dsmInfo       = {};
            dsmInfo.modelName = "1.3.6.1.4.1.6574.1.5.1.0";
            oids[dsmInfo.modelName] = {};
            oids[dsmInfo.modelName].name = "modelName";
            oids[dsmInfo.modelName].description = "The model name of this NAS";
            snmpReader.AddOID(dsmInfo.modelName);

            dsmInfo.serialNumber = "1.3.6.1.4.1.6574.1.5.2.0";
            oids[dsmInfo.serialNumber] = {};
            oids[dsmInfo.serialNumber].name = "serialNumber";
            oids[dsmInfo.serialNumber].description = "The serial number of this NAS";
            snmpReader.AddOID(dsmInfo.serialNumber);

            dsmInfo.version = "1.3.6.1.4.1.6574.1.5.3.0";
            oids[dsmInfo.version] = {};
            oids[dsmInfo.version].name = "version";
            oids[dsmInfo.version].description = "The version of this DSM";
            snmpReader.AddOID(dsmInfo.version);

            dsmInfo.upgradeAvailable = "1.3.6.1.4.1.6574.1.5.4.0";
            oids[dsmInfo.upgradeAvailable] = {};
            oids[dsmInfo.upgradeAvailable].name = "upgradeAvailable";
            oids[dsmInfo.upgradeAvailable].description = "This oid is for checking whether there is a newer version of DSM.";
            oids[dsmInfo.upgradeAvailable].status = ["Not Used(0)", "Available(1): There is version ready for download.", "Unavailable(2): The DSM is latest version.", "Connecting(3): Checking for the latest DSM.", "Disconnected(4): Failed to connect to server.", "Others(5): If DSM is upgrading or downloading, the status will show others."];
            snmpReader.AddOID(dsmInfo.upgradeAvailable);

            var systemStats   = {};
            systemStats.ssCpuSystem = "1.3.6.1.4.1.2021.11.10.0";
            oids[systemStats.ssCpuSystem] = {};
            oids[systemStats.ssCpuSystem].name = "ssCpuSystem";
            oids[systemStats.ssCpuSystem].description = "percentages of system CPU time";
            snmpReader.AddOID(systemStats.ssCpuSystem);

            var memory               = {};
            memory.memTotalReal = "1.3.6.1.4.1.2021.4.5.0";
            oids[memory.memTotalReal] = {};
            oids[memory.memTotalReal].name = "memTotalReal";
            oids[memory.memTotalReal].description = "Total RAM in machine";
            snmpReader.AddOID(memory.memTotalReal);

            memory.memAvailReal = "1.3.6.1.4.1.2021.4.6.0";
            oids[memory.memAvailReal] = {};
            oids[memory.memAvailReal].name = "memAvailReal";
            oids[memory.memAvailReal].description = "Total RAM used";
            snmpReader.AddOID(memory.memAvailReal);

            memory.memCached = "1.3.6.1.4.1.2021.4.15.0";
            oids[memory.memCached] = {};
            oids[memory.memCached].name = "memCached";
            oids[memory.memCached].description = "Total Cached Memory";
            snmpReader.AddOID(memory.memCached);

            //Create timer if 'poll' is 'true'
            if (poll)
            {
                var timer = new Timer(1000, false); //Run once on startup, after 1 second timeout
                timer.parent = this; //Create reference to this object for access from timer object
                timer.onTimeout = function ()
                {
                    try
                    {
                        this.parent.getData(); //Execute getData() function
                        this.start(this.parent.getInterval()); //Restart timer object
                    }
                    catch (e)
                    {
                        Debug.Print("scSNMP.SynologySystemMIB.timer.onTimeout: " + e); //Catch error
                    }
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.SynologySystemMIB()', name: " + name + ", ipAddress: " + ipAddress + ", port: " + port + ", community: " + community + ", interval: " + interval / 1000 / 60 + " minutes");
        }
        catch (e)
        {
            Debug.Print("scSNMP.SynologySystemMIB: " + e); //Catch error
        }
    }

    //SYNOLOGY-DISK-MIB. Get disk status. Tested on Synology RS1219+
    this.SynologyDiskMIB = function (ipAddress, name, disks, poll, interval, port, community)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.SynologySystemMIB: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress   = ipAddress; //Store IP address
            var name        = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var disks       = (typeof disks == "undefined" || typeof disks !== "object") ? [1, 2, 3, 4, 5, 6, 7, 8] : disks; //Store disk
            var poll        = (typeof poll == "undefined" || typeof poll !== "boolean") ? true : poll; //Store poll status
            var interval    = (typeof interval == "undefined" || typeof interval !== "number") ? (60000 * 60) : interval; //Store interval(how often to poll)
            var port        = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store Port number
            var community   = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //store community
            var snmpReader  = new SNMPReader(ipAddress, port, community); //Create new SNMPReader object
            var eventTarget = new EventTarget(); //Create an EventTarget

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            //Define function to send an Event
            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, data)
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init event

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.data = data; //Store data in the event
                event.name = name; //Store name in the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event); //Send event
                else
                    throw new Error("Event listener for type 'DataAvailable' is missing"); //Throw an Error if Event listener 'DataAvailable' is missing
            }

            //Define function to get new data
            this.getData = function ()
            {
                try
                {
                    var data = {}; //Create new Struct object
                    for(var disk in diskEntry)
                    data[disk] = {}; //Create object for each disk

                    snmpReader.Get(); //Get new data from SNMPReader object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        for (var oid in snmpReader.Results) //Iterate Results
                        {
                            for(var disk in diskEntry)
                            {
                                var propName    = oids[oid].name;

                                if(diskEntry[disk][propName] != oid) //Only add data for relevant OID
                                    continue; 

                                var value       = snmpReader.Results[oid];
                                var description = oids[oid].description; 
                                var status      = (typeof oids[oid].status != "undefined" && typeof oids[oid].status[snmpReader.Results[oid]] != "undefined") ? oids[oid].status[snmpReader.Results[oid]] : null;
                                data[disk][propName] = 
                                {
                                    name: propName,
                                    oid: oid,
                                    value: value,
                                    description: description,
                                    status: status
                                }; //Add data to data Object
                            }
                        }
                        sendEvent(false, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget, data); //Execute sendEvent() function
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error status, if Results Object is empty
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.SynologyDiskMIB.getData(): " + e); //Catch any Error
                }
            }

            var oids      = {}; //Create Object to store 'oid' information
            var diskEntry = {}; //Create Object to store 'disk' information

            //Go through all available disks
            for (var disk in disks)
            {
                var d = "Disk " + disks[disk];
                diskEntry[d] = {};

                var oid = "1.3.6.1.4.1.6574.2.1.1.2." + (disks[disk] - 1);
                diskEntry[d].diskID = oid;
                oids[oid] = {};
                oids[oid].name = "diskID";
                oids[oid].description = "Synology disk ID (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.3." + (disks[disk] - 1);
                diskEntry[d].diskModel = oid;
                oids[oid] = {};
                oids[oid].name = "diskModel";
                oids[oid].description = "Synology disk model name (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.4." + (disks[disk] - 1);
                diskEntry[d].diskType = oid;
                oids[oid] = {};
                oids[oid].name = "diskType";
                oids[oid].description = "Synology disk type (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.5." + (disks[disk] - 1);
                diskEntry[d].diskStatus = oid;
                oids[oid] = {};
                oids[oid].name = "diskStatus";
                oids[oid].description = "Synology disk status (" + disks[disk] + "): ";
                oids[oid].status = ["Not Used(0)", "Normal(1): The hard disk functions normally.", "Initialized(2): The hard disk has system partition but no data.", "NotInitialized(3):    The hard disk does not have system in system partition.", "SystemPartitionFailed(4): The system partitions on the hard disks are damaged.", "Crashed(5): The hard disk has damaged."];
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.6." + (disks[disk] - 1);
                diskEntry[d].diskTemperature = oid;
                oids[oid] = {};
                oids[oid].name = "diskTemperature";
                oids[oid].description = "Synology disk temperature (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.7." + (disks[disk] - 1);
                diskEntry[d].diskRole = oid;
                oids[oid] = {};
                oids[oid].name = "diskRole";
                oids[oid].description = "Synology disk role (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.8." + (disks[disk] - 1);
                diskEntry[d].diskRetry = oid;
                oids[oid] = {};
                oids[oid].name = "diskRetry";
                oids[oid].description = "Synology disk retry (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.9." + (disks[disk] - 1);
                diskEntry[d].diskBadSector = oid;
                oids[oid] = {};
                oids[oid].name = "diskBadSector";
                oids[oid].description = "Synology disk bad sector (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.10." + (disks[disk] - 1);
                diskEntry[d].diskIdentifyFail = oid;
                oids[oid] = {};
                oids[oid].name = "diskIdentifyFail";
                oids[oid].description = "Synology disk identify fail (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.11." + (disks[disk] - 1);
                diskEntry[d].diskRemainLife = oid;
                oids[oid] = {};
                oids[oid].name = "diskRemainLife";
                oids[oid].description = "The estimated remaining life of disk (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.12." + (disks[disk] - 1);
                diskEntry[d].diskName = oid;
                oids[oid] = {};
                oids[oid].name = "diskName";
                oids[oid].description = "The disk name (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.13." + (disks[disk] - 1);
                diskEntry[d].diskHealthStatus = oid;
                oids[oid] = {};
                oids[oid].name = "diskHealthStatus";
                oids[oid].description = "Synology disk status (" + disks[disk] + "): ";
                oids[oid].status = ["Not Used(0)", "Normal(1): The disk health status is normal.", "Warning(2): The disk health status is warning", "Critical(3): The disk health status is critical.", "Failing(4): The disk health status is failing."];
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.101.1.1.8." + (disks[disk]);
                diskEntry[d].storageIOLA = oid;
                oids[oid] = {};
                oids[oid].name = "storageIOLA";
                oids[oid].description = "The disk load (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.101.1.1.14." + (disks[disk]);
                diskEntry[d].storageIODeviceSerial = oid;
                oids[oid] = {};
                oids[oid].name = "storageIODeviceSerial";
                oids[oid].description = "The disk serial (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.101.1.1.2." + (disks[disk]);
                diskEntry[d].storageIODevice = oid;
                oids[oid] = {};
                oids[oid].name = "storageIODevice";
                oids[oid].description = "The name of the device we are counting/checking";
                snmpReader.AddOID(oid);
            }

            //Create timer if 'poll' is 'true'
            if (poll)
            {
                var timer       = new Timer(1000, false); //Run once on startup, after 1 second timeout
                timer.parent    = this; //Create reference to this object for access from timer object
                timer.onTimeout = function ()
                {
                    try
                    {
                        this.parent.getData(); //Execute getData() function
                        this.start(this.parent.getInterval()); //Restart timer object
                    }
                    catch (e)
                    {
                        Debug.Print("scSNMP.SynologyDiskMIB.timer.onTimeout: " + e); //Catch error
                    }
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.SynologyDiskMIB()', name: " + name + ", ipAddress: " + ipAddress + ", disks: " + disks.toString() + ", port: " + port + ", community: " + community + ", interval: " + interval / 1000 / 60 + " minutes");
        }
        catch (e)
        {
            Debug.Print("scSNMP.SynologyDiskMIB: " + e); //Catch error
        }
    }

    //HH3C-COMMON-SYSTEM-MIB, entityMIB. Get system status. Tested on HPE OfficeConnect 1950 12XGT 4SFP+ Switch
    this.HPSystemMIB = function (ipAddress, name, poll, interval, port, community)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.HPSystemMIB: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress   = ipAddress; //Store IP address
            var name        = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var poll        = (typeof poll == "undefined" || typeof poll !== "boolean") ? true : poll; //Store poll status
            var interval    = (typeof interval == "undefined" || typeof interval !== "number") ? (60000 * 60) : interval; //Store interval(how often to poll)
            var port        = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store Port number
            var community   = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //store community
            var snmpReader = new SNMPReader(ipAddress, port, community); //Create new SNMPReader object
            var eventTarget = new EventTarget(); //Create an EventTarget

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            //Define function to send an Event
            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, data)
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init Event, (type, canBubble, cancelable)

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.name = name; //Store name in the event
                event.data = data; //Store data in the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event); //Send event
                else
                    throw new Error("Event listener 'DataAvailable' is missing"); //Throw an Error if Event listener 'DataAvailable' is missing
            }

            //Define function to get new data
            this.getData = function ()
            {
                try
                {
                    var data = {}; //Create new Struct object
                    snmpReader.Get(); //Get new data from SNMPReader object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        for (var oid in snmpReader.Results) //Iterate Results
                        {
                            var propName    = oids[oid].name;
                            var value       = snmpReader.Results[oid]; 
                            var description = oids[oid].description;
                            var status      = (typeof oids[oid].status != "undefined" && typeof oids[oid].status[snmpReader.Results[oid]] != "undefined") ? oids[oid].status[snmpReader.Results[oid]] : null;
                            data[propName] = 
                            {
                                name: propName,
                                oid: oid,
                                value: value,
                                description: description,
                                status: status
                            }; //Add data to data Object
                        }
                        sendEvent(false, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget, data); //Execute sendEvent() function
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error status, if Results Object is empty
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.HPSystemMIB.getData(): " + e); //Catch any Error
                }
            }
            var oids = {} //Store OIDs

            var hh3cEntityExtCpuUsage = "1.3.6.1.4.1.25506.2.6.1.1.1.1.6.212";
            oids[hh3cEntityExtCpuUsage] = {};
            oids[hh3cEntityExtCpuUsage].name = "hh3cEntityExtCpuUsage";
            oids[hh3cEntityExtCpuUsage].description = "The CPU usage for this entity. Generally, the overall CPU usage on the entity is calculated, independent of the number of CPUs on the entity.";
            snmpReader.AddOID(hh3cEntityExtCpuUsage);

            var hh3cEntityExtMemUsage = "1.3.6.1.4.1.25506.2.6.1.1.1.1.8.212";
            oids[hh3cEntityExtMemUsage] = {};
            oids[hh3cEntityExtMemUsage].name = "hh3cEntityExtMemUsage";
            oids[hh3cEntityExtMemUsage].description = "The memory usage for the entity. This object indicates what percent of memory are used.";
            snmpReader.AddOID(hh3cEntityExtMemUsage);

            var hh3cEntityExtUpTime = "1.3.6.1.4.1.25506.2.6.1.1.1.1.11.2";
            oids[hh3cEntityExtUpTime] = {};
            oids[hh3cEntityExtUpTime].name = "hh3cEntityExtUpTime";
            oids[hh3cEntityExtUpTime].description = "The uptime for the entity. The meaning of uptime is when the entity is up, and the value of the object will add 1 seconds while the entity is running.";
            snmpReader.AddOID(hh3cEntityExtUpTime);

            var hh3cEntityExtManuSerialNum = "1.3.6.1.4.1.25506.2.6.1.2.1.1.2.2";
            oids[hh3cEntityExtManuSerialNum] = {};
            oids[hh3cEntityExtManuSerialNum].name = "hh3cEntityExtManuSerialNum";
            oids[hh3cEntityExtManuSerialNum].description = "Manufacture serial number. The manufacture serial number of the entity such as chassis, module, and so on.  It is got from the device when manufacturing. For low level box-device, the manufacture serial number is the device-number of System Control Board(SCB for short), it is written into the SCB directly; for middle level or high level frame-device, the manufacture serial number is the device-numbers of SCB and Service Board, because the SCB, Service Board and chassis are separate to sale and the device-number of chassis cannot be written into board.";
            snmpReader.AddOID(hh3cEntityExtManuSerialNum);

            var entPhysicalHardwareRev = "1.3.6.1.2.1.47.1.1.1.1.8.2";
            oids[entPhysicalHardwareRev] = {};
            oids[entPhysicalHardwareRev].name = "entPhysicalHardwareRev";
            oids[entPhysicalHardwareRev].description = "The vendor-specific hardware revision string for the physical entity.  The preferred value is the hardware revision identifier actually printed on the component itself (if present). Note that if revision information is stored internally in a non-printable (e.g., binary) format, then the agent must convert such information to a printable format, in an implementation-specific manner. If no specific hardware revision string is associated with the physical component, or if this information is unknown to the agent, then this object will contain a zero-length string.";
            snmpReader.AddOID(entPhysicalHardwareRev);

            var entPhysicalFirmwareRev = "1.3.6.1.2.1.47.1.1.1.1.9.2";
            oids[entPhysicalFirmwareRev] = {};
            oids[entPhysicalFirmwareRev].name = "entPhysicalFirmwareRev";
            oids[entPhysicalFirmwareRev].description = "The vendor-specific firmware revision string for the physical entity. Note that if revision information is stored internally in a non-printable (e.g., binary) format, then the agent must convert such information to a printable format, in an implementation-specific manner. If no specific firmware programs are associated with the physical component, or if this information is unknown to the agent, then this object will contain a zero-length string.";
            snmpReader.AddOID(entPhysicalFirmwareRev);

            var entPhysicalSoftwareRev = "1.3.6.1.2.1.47.1.1.1.1.10.2";
            oids[entPhysicalSoftwareRev] = {};
            oids[entPhysicalSoftwareRev].name = "entPhysicalSoftwareRev";
            oids[entPhysicalSoftwareRev].description = "The vendor-specific software revision string for the physical entity. Note that if revision information is stored internally in a non-printable (e.g., binary) format, then the agent must convert such information to a printable format, in an implementation-specific manner. If no specific software programs are associated with the physical component, or if this information is unknown to the agent, then this object will contain a zero-length string.";
            snmpReader.AddOID(entPhysicalSoftwareRev);

            var entPhysicalDescr = "1.3.6.1.2.1.47.1.1.1.1.2.2";
            oids[entPhysicalDescr] = {};
            oids[entPhysicalDescr].name = "entPhysicalDescr";
            oids[entPhysicalDescr].description = "A textual description of physical entity.  This object should contain a string that identifies the manufacturer's name for the physical entity, and should be set to a distinct value for each version or model of the physical entity.";
            snmpReader.AddOID(entPhysicalDescr);

            var hh3cEntityExtTemperature = "1.3.6.1.4.1.25506.2.6.1.1.1.1.12.212";
            oids[hh3cEntityExtTemperature] = {};
            oids[hh3cEntityExtTemperature].name = "hh3cEntityExtTemperature";
            oids[hh3cEntityExtTemperature].description = "The temperature for the entity.";
            snmpReader.AddOID(hh3cEntityExtTemperature);

            //Create timer if 'poll' is 'true'
            if (poll)
            {
                var timer = new Timer(1000, false); //Run once on startup, after 1 second timeout
                timer.parent = this; //Create reference to this object for access from timer object
                timer.onTimeout = function ()
                {
                    try
                    {
                        this.parent.getData(); //Execute getData() function
                        this.start(this.parent.getInterval()); //Restart timer object
                    }
                    catch (e)
                    {
                        Debug.Print("scSNMP.HPSystemMIB.timer.onTimeout: " + e); //Catch error
                    }
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.HPSystemMIB()', name: " + name + ", ipAddress: " + ipAddress + ", port: " + port + ", community: " + community + ", interval: " + interval / 1000 / 60 + " minutes");
        }
        catch (e)
        {
            Debug.Print("scSNMP.HPSystemMIB: " + e); //Catch error
        }
    }

    //ifMIB. Get different kinds of port status. Tested on HPE OfficeConnect 1950 12XGT 4SFP+ Switch
    this.HPPortMIB = function (ipAddress, name, poll, interval, port, community, ports)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.HPPortMIB: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress   = ipAddress; //Store IP address
            var name        = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var poll        = (typeof poll == "undefined" || typeof poll !== "boolean") ? true : poll; //Store poll status
            var interval    = (typeof interval == "undefined" || typeof interval !== "number") ? (60000 * 60) : interval; //Store interval(how often to poll)
            var port        = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store Port number
            var community   = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //store community
            var ports       = (typeof ports == "undefined" || typeof ports !== "object") ? [1,2,3,4] : ports; //Number of ports to monitor
            var snmpReader  = new SNMPReader(ipAddress, port, community); //Create new SNMPReader object
            var eventTarget = new EventTarget(); //Create an EventTarget

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            //Define function to send an Event
            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, data)
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init Event, (type, canBubble, cancelable)

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.name = name; //Store name in the event
                event.data = data; //Store data in the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event); //Send event
                else
                    throw new Error("Event listener 'DataAvailable' is missing"); //Throw an Error if Event listener 'DataAvailable' is missing
            }

            //Define function to get new data
            this.getData = function ()
            {
                try
                {
                    var data = {}; //Create new Struct object
                    for(var port in portEntry)
                        data[port] = {}; //Create object for each port
                    snmpReader.Get(); //Get new data from SNMPReader object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        for (var oid in snmpReader.Results) //Iterate Results
                        {
                            for(var port in portEntry)
                            {
                                var propName    = oids[oid].name;

                                if(portEntry[port][propName] != oid) //Only add data for relevant OID
                                    continue; 

                                var value       = snmpReader.Results[oid];
                                var description = oids[oid].description; 
                                var status      = (typeof oids[oid].status != "undefined" && typeof oids[oid].status[snmpReader.Results[oid]] != "undefined") ? oids[oid].status[snmpReader.Results[oid]] : null;
                                data[port][propName] = 
                                {
                                    name: propName,
                                    oid: oid,
                                    value: value,
                                    description: description,
                                    status: status
                                }; //Add data to data Object
                            }
                        }
                        sendEvent(false, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget, data); //Execute sendEvent() function
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error status, if Results Object is empty
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.HPPortMIB.getData(): " + e); //Catch any Error
                }
            }
            var oids = {} //Store OIDs

            var portEntry = {}; //Create Object to store 'port' information

            //Go through all available disks
            for (var port in ports)
            {
                var p = "Port " + ports[port];
                portEntry[p] = {};

                var oid = "1.3.6.1.2.1.10.7.2.1.19." + (ports[port]);
                portEntry[p].dot3StatsDuplexStatus = oid;
                oids[oid] = {};
                oids[oid].name = "dot3StatsDuplexStatus";
                oids[oid].description = "The current mode of operation of the MAC entity. 'unknown' indicates that the current duplex mode could not be determined. (" + p + "): ";
                oids[oid].status = ["not used(0)", "unknown(1)", "halfDuplex(2)", "fullDuplex(3)"];
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.2.1.2.2.1.5." + (ports[port]);
                portEntry[p].ifSpeed = oid;
                oids[oid] = {};
                oids[oid].name = "ifSpeed";
                oids[oid].description = "An estimate of the interface's current bandwidth in bits per second. For interfaces which do not vary in bandwidth or for those where no accurate estimation can be made, this object should contain the nominal bandwidth. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.2.1.31.1.1.1.15." + (ports[port]);
                portEntry[p].ifHighSpeed = oid;
                oids[oid] = {};
                oids[oid].name = "ifHighSpeed";
                oids[oid].description = "An estimate of the interface's current bandwidth in units of 1,000,000 bits per second. If this object reports a value of `n' then the speed of the interface is somewhere in the range of `n-500,000' to `n+499,999'. For interfaces which do not vary in bandwidth or for those where no accurate estimation can be made, this object should contain the nominal bandwidth. For a sub-layer which has no concept of bandwidth, this object should be zero. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.25506.2.40.2.1.2.1.1.1." + (ports[port]);
                portEntry[p].hh3cIfStatFlowInterval = oid;
                oids[oid] = {};
                oids[oid].name = "hh3cIfStatFlowInterval";
                oids[oid].description = "Sampling interval(s) for in/out flow of interface. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.25506.2.40.2.1.2.1.1.2." + (ports[port]);
                portEntry[p].hh3cIfStatFlowInBits = oid;
                oids[oid] = {};
                oids[oid].name = "hh3cIfStatFlowInBits";
                oids[oid].description = "Flow in bits in the specific interval. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.25506.2.40.2.1.2.1.1.3." + (ports[port]);
                portEntry[p].hh3cIfStatFlowOutBits = oid;
                oids[oid] = {};
                oids[oid].name = "hh3cIfStatFlowOutBits";
                oids[oid].description = "Flow out bits in the specific interval. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.25506.2.40.2.1.2.1.1.6." + (ports[port]);
                portEntry[p].hh3cIfStatFlowInBytes = oid;
                oids[oid] = {};
                oids[oid].name = "hh3cIfStatFlowInBytes";
                oids[oid].description = "Flow in bytes in the specific interval. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.25506.2.40.2.1.2.1.1.7." + (ports[port]);
                portEntry[p].hh3cIfStatFlowOutBytes = oid;
                oids[oid] = {};
                oids[oid].name = "hh3cIfStatFlowOutBytes";
                oids[oid].description = "Flow out bytes in the specific interval. (" + p + "): ";
                snmpReader.AddOID(oid);
            }


            //Create timer if 'poll' is 'true'
            if (poll)
            {
                var timer = new Timer(1000, false); //Run once on startup, after 1 second timeout
                timer.parent = this; //Create reference to this object for access from timer object
                timer.onTimeout = function ()
                {
                    try
                    {
                        this.parent.getData(); //Execute getData() function
                        this.start(this.parent.getInterval()); //Restart timer object
                    }
                    catch (e)
                    {
                        Debug.Print("scSNMP.HPPortMIB.timer.onTimeout: " + e); //Catch error
                    }
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.HPPortMIB()', name: " + name + ", ipAddress: " + ipAddress + ", port: " + port + ", community: " + community + ", interval: " + interval / 1000 / 60 + " minutes");
        }
        catch (e)
        {
            Debug.Print("scSNMP.HPPortMIB: " + e); //Catch error
        }
    }

    //HH3C-ENTITY-MIB. Get fan status. Tested on HPE OfficeConnect 1950 12XGT 4SFP+ Switch
    this.HPFanMIB = function (ipAddress, name, fans, poll, interval, port, community)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.HPFanMIB: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress   = ipAddress; //Store IP address
            var name        = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var fans        = (typeof fans == "undefined" || typeof fans !== "object") ? [1, 2] : fans; //Store fans
            var poll        = (typeof poll == "undefined" || typeof poll !== "boolean") ? true : poll; //Store poll status
            var interval    = (typeof interval == "undefined" || typeof interval !== "number") ? (60000 * 60) : interval; //Store interval(how often to poll)
            var port        = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store Port number
            var community   = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //store community
            var snmpReader = new SNMPReader(ipAddress, port, community); //Create new SNMPReader object
            var eventTarget = new EventTarget(); //Create an EventTarget

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            //Define function to send an Event
            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, data)
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init Event, (type, canBubble, cancelable)

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.name = name; //Store name in the event
                event.data = data; //Store data in the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event); //Send event
                else
                    throw new Error("Event listener 'DataAvailable' is missing"); //Throw an Error if Event listener 'DataAvailable' is missing
            }

            //Define function to get new data
            this.getData = function ()
            {
                try
                {
                    var data = {}; //Create new Struct object
                    for(var fan in fanEntry)
                    data[fan] = {}; //Create object for each disk

                    snmpReader.Get(); //Get new data from SNMPReader object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        for (var oid in snmpReader.Results) //Iterate Results
                        {
                            for(var fan in fanEntry)
                            {
                                var propName    = oids[oid].name;

                                if(fanEntry[fan][propName] != oid) //Only add data for relevant OID
                                    continue; 

                                var value       = snmpReader.Results[oid];
                                var description = oids[oid].description;
                                var status      = (typeof oids[oid].status != "undefined" && typeof oids[oid].status["_" + snmpReader.Results[oid]] != "undefined") ? oids[oid].status["_" + snmpReader.Results[oid]] : null;
                                data[fan][propName] = 
                                {
                                    name: propName,
                                    oid: oid,
                                    value: value,
                                    description: description,
                                    status: status
                                }; //Add data to data Object
                            }
                        }
                        sendEvent(false, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget, data); //Execute sendEvent() function
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error status, if Results Object is empty
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.HPFanMIB.getData(): " + e); //Catch any Error
                }
            }           

            var oids      = {}; //Create Object to store 'oid' information
            var fanEntry = {}; //Create Object to store 'fan' information

            //Go through all available disks
            for (var fan in fans)
            {
                var f = "Fan " + fans[fan];
                fanEntry[f] = {};

                var oid = "1.3.6.1.4.1.25506.2.6.1.1.1.1.3." + (fans[fan] + 215);
                fanEntry[f].operStatus = oid;
                oids[oid] = {};
                oids[oid].name = "operStatus"; //"hh3cEntityExtOperStatus";
                oids[oid].description = "HP fan operating status (" + fans[fan] + "): ";
                oids[oid].status = {_1:f + ": Not Supported(1)",_2:f + ": Disabled(2)",_3:f + ": Enabled(3)",_4:f + ": Dangerous(4)"};
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.25506.2.6.1.1.1.1.19." + (fans[fan] + 215);
                fanEntry[f].errorStatus = oid;
                oids[oid] = {};
                oids[oid].name = "errorStatus"; //"hh3cEntityExtErrorStatus";
                oids[oid].description = "HP fan error status (" + fans[fan] + "): ";
                oids[oid].status = {_1:f + ": Not supported(1)",_2:f + ": Normal(2)",_3:f + ": Post failure(3)",_4:f + ": Entity absent(4)",_41:f + ": Fan error(41)"};
                snmpReader.AddOID(oid);
            }

            //Create timer if 'poll' is 'true'
            if (poll)
            {
                var timer = new Timer(1000, false); //Run once on startup, after 1 second timeout
                timer.parent = this; //Create reference to this object for access from timer object
                timer.onTimeout = function ()
                {
                    try
                    {
                        this.parent.getData(); //Execute getData() function
                        this.start(this.parent.getInterval()); //Restart timer object
                    }
                    catch (e)
                    {
                        Debug.Print("scSNMP.HPFanMIB.timer.onTimeout: " + e); //Catch error
                    }
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.HPFanMIB()', name: " + name + ", ipAddress: " + ipAddress + ", port: " + port + ", community: " + community + ", interval: " + interval / 1000 / 60 + " minutes, Fans: " + fans.toString());
        }
        catch (e)
        {
            Debug.Print("scSNMP.HPFanMIB: " + e); //Catch error
        }
    }

    //HPE-Physicaldescription-MIB, HPE-rndMng, rfc1213-mib, power-ethernet-mib. Get system status. Tested on Aruba Instant On 1930 24G Class4 PoE 4SFP/SFP+ 195W Switch JL683B
    this.ArubaSystemMIB = function (ipAddress, name, poll, interval, port, community)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.ArubaSystemMIB: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress   = ipAddress; //Store IP address
            var name        = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var poll        = (typeof poll == "undefined" || typeof poll !== "boolean") ? true : poll; //Store poll status
            var interval    = (typeof interval == "undefined" || typeof interval !== "number") ? (60000 * 60) : interval; //Store interval(how often to poll)
            var port        = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store Port number
            var community   = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //store community
            var snmpReader = new SNMPReader(ipAddress, port, community); //Create new SNMPReader object
            var eventTarget = new EventTarget(); //Create an EventTarget

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            //Define function to send an Event
            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, data)
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init Event, (type, canBubble, cancelable)

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.name = name; //Store name in the event
                event.data = data; //Store data in the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event); //Send event
                else
                    throw new Error("Event listener 'DataAvailable' is missing"); //Throw an Error if Event listener 'DataAvailable' is missing
            }

            //Define function to get new data
            this.getData = function ()
            {
                try
                {
                    var data = {}; //Create new Struct object
                    snmpReader.Get(); //Get new data from SNMPReader object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        for (var oid in snmpReader.Results) //Iterate Results
                        {
                            var propName    = oids[oid].name;
                            var value       = snmpReader.Results[oid]; 
                            var description = oids[oid].description;
                            var status      = (typeof oids[oid].status != "undefined" && typeof oids[oid].status["_" + snmpReader.Results[oid]] != "undefined") ? oids[oid].status["_" + snmpReader.Results[oid]] : null;
                            data[propName] = 
                            {
                                name: propName,
                                oid: oid,
                                value: value,
                                description: description,
                                status: status
                            }; //Add data to data Object
                        }
                        sendEvent(false, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget, data); //Execute sendEvent() function
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error status, if Results Object is empty
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.HPSystemMIB.getData(): " + e); //Catch any Error
                }
            }
            var oids = {} //Store OIDs

            var rlPhdUnitEnvParamTempSensorValue = "1.3.6.1.4.1.11.2.53.15.1.10.1";
            oids[rlPhdUnitEnvParamTempSensorValue] = {};
            oids[rlPhdUnitEnvParamTempSensorValue].name = "rlPhdUnitEnvParamTempSensorValue";
            oids[rlPhdUnitEnvParamTempSensorValue].description = "Current value for the Sensor being instrumented.";
            snmpReader.AddOID(rlPhdUnitEnvParamTempSensorValue);

            var rlPhdUnitEnvParamTempSensorStatus = "1.3.6.1.4.1.11.2.53.15.1.11.1";
            oids[rlPhdUnitEnvParamTempSensorStatus] = {};
            oids[rlPhdUnitEnvParamTempSensorStatus].name = "rlPhdUnitEnvParamTempSensorStatus";
            oids[rlPhdUnitEnvParamTempSensorStatus].description = "Status value for the Sensor being instrumented.";
            oids[rlPhdUnitEnvParamTempSensorStatus].status = {_1:"Ok(1)", _2:"Unavailable(2)", _3:"Non-operational(3)"};
            snmpReader.AddOID(rlPhdUnitEnvParamTempSensorStatus);

            var rlPhdUnitEnvParamMonitorTemperatureStatus = "1.3.6.1.4.1.11.2.53.15.1.16.1";
            oids[rlPhdUnitEnvParamMonitorTemperatureStatus] = {};
            oids[rlPhdUnitEnvParamMonitorTemperatureStatus].name = "rlPhdUnitEnvParamMonitorTemperatureStatus";
            oids[rlPhdUnitEnvParamMonitorTemperatureStatus].description = "Display environment monitoring chassis temperature status";
            oids[rlPhdUnitEnvParamMonitorTemperatureStatus].status = {_1:"Ok(1)", _2:"Over temperature threshold(2)", _3:"Over critical temperature threshold(3)"};
            snmpReader.AddOID(rlPhdUnitEnvParamMonitorTemperatureStatus);

            var rlCpuUtilDuringLastSecond = "1.3.6.1.4.1.11.2.1.7.0";
            oids[rlCpuUtilDuringLastSecond] = {};
            oids[rlCpuUtilDuringLastSecond].name = "rlCpuUtilDuringLastSecond";
            oids[rlCpuUtilDuringLastSecond].description = "Percentage of the device CPU utilization during last second. The value 101 is a dummy value, indicating that the CPU utilization was not measured (since measurement is disabled or was disabled during last second).";
            snmpReader.AddOID(rlCpuUtilDuringLastSecond);

            var rlCpuUtilDuringLastMinute = "1.3.6.1.4.1.11.2.1.8.0";
            oids[rlCpuUtilDuringLastMinute] = {};
            oids[rlCpuUtilDuringLastMinute].name = "rlCpuUtilDuringLastMinute";
            oids[rlCpuUtilDuringLastMinute].description = "Percentage of the device CPU utilization during last minute. The value 101 is a dummy value, indicating that the CPU utilization was not measured (since measurement is disabled or was disabled during last minute).";
            snmpReader.AddOID(rlCpuUtilDuringLastMinute);

            var rlCpuUtilDuringLast5Minutes = "1.3.6.1.4.1.11.2.1.9.0";
            oids[rlCpuUtilDuringLast5Minutes] = {};
            oids[rlCpuUtilDuringLast5Minutes].name = "rlCpuUtilDuringLast5Minutes";
            oids[rlCpuUtilDuringLast5Minutes].description = "Percentage of the device CPU utilization during the last 5 minutes. The value 101 is a dummy value, indicating that the CPU utilization was not measured (since measurement is disabled or was disabled during last 5 minutes).";
            snmpReader.AddOID(rlCpuUtilDuringLast5Minutes);

            var rlPhdUnitGenParamModelName = "1.3.6.1.4.1.11.2.53.14.1.11.1";
            oids[rlPhdUnitGenParamModelName] = {};
            oids[rlPhdUnitGenParamModelName].name = "rlPhdUnitGenParamModelName";
            oids[rlPhdUnitGenParamModelName].description = "Model name.";
            snmpReader.AddOID(rlPhdUnitGenParamModelName);

            var rlPhdUnitGenParamSoftwareVersion = "1.3.6.1.4.1.11.2.53.14.1.2.1";
            oids[rlPhdUnitGenParamSoftwareVersion] = {};
            oids[rlPhdUnitGenParamSoftwareVersion].name = "rlPhdUnitGenParamSoftwareVersion";
            oids[rlPhdUnitGenParamSoftwareVersion].description = "Software version.";
            snmpReader.AddOID(rlPhdUnitGenParamSoftwareVersion);

            var rlPhdUnitGenParamSerialNum = "1.3.6.1.4.1.11.2.53.14.1.5.1";
            oids[rlPhdUnitGenParamSerialNum] = {};
            oids[rlPhdUnitGenParamSerialNum].name = "rlPhdUnitGenParamSerialNum";
            oids[rlPhdUnitGenParamSerialNum].description = "Serial number.";
            snmpReader.AddOID(rlPhdUnitGenParamSerialNum);

            var sysUpTime = "1.3.6.1.2.1.1.3.0";
            oids[sysUpTime] = {};
            oids[sysUpTime].name = "sysUpTime";
            oids[sysUpTime].description = "The time (in hundredths of a second) since the network management portion of the system was last re-initialized.";
            snmpReader.AddOID(sysUpTime);

            var sysDescr = "1.3.6.1.2.1.1.1.0";
            oids[sysDescr] = {};
            oids[sysDescr].name = "sysDescr";
            oids[sysDescr].description = "The time (in hundredths of a second) since the network management portion of the system was last re-initialized.";
            snmpReader.AddOID(sysDescr);

            var pethMainPsePower = "1.3.6.1.2.1.105.1.3.1.1.2.1";
            oids[pethMainPsePower] = {};
            oids[pethMainPsePower].name = "pethMainPsePower";
            oids[pethMainPsePower].description = "The nominal power of the PSE expressed in Watts.";
            snmpReader.AddOID(pethMainPsePower);

            var pethMainPseOperStatus = "1.3.6.1.2.1.105.1.3.1.1.3.1";
            oids[pethMainPseOperStatus] = {};
            oids[pethMainPseOperStatus].name = "pethMainPseOperStatus";
            oids[pethMainPseOperStatus].description = "The operational status of the main PSE.";
            oids[pethMainPseOperStatus].status = {_1:"On(1)", _2:"Off(2)", _3:"Faulty(3)"};
            snmpReader.AddOID(pethMainPseOperStatus);

            var pethMainPseConsumptionPower = "1.3.6.1.2.1.105.1.3.1.1.4.1";
            oids[pethMainPseConsumptionPower] = {};
            oids[pethMainPseConsumptionPower].name = "pethMainPseConsumptionPower";
            oids[pethMainPseConsumptionPower].description = "Measured usage power expressed in Watts.";
            snmpReader.AddOID(pethMainPseConsumptionPower);

            var pethMainPseUsageThreshold = "1.3.6.1.2.1.105.1.3.1.1.5.1";
            oids[pethMainPseUsageThreshold] = {};
            oids[pethMainPseUsageThreshold].name = "pethMainPseUsageThreshold";
            oids[pethMainPseUsageThreshold].description = "The usage threshold expressed in percents for comparing the measured power and initiating an alarm if the threshold is exceeded.";
            snmpReader.AddOID(pethMainPseUsageThreshold);

            //Create timer if 'poll' is 'true'
            if (poll)
            {
                var timer = new Timer(1000, false); //Run once on startup, after 1 second timeout
                timer.parent = this; //Create reference to this object for access from timer object
                timer.onTimeout = function ()
                {
                    try
                    {
                        this.parent.getData(); //Execute getData() function
                        this.start(this.parent.getInterval()); //Restart timer object
                    }
                    catch (e)
                    {
                        Debug.Print("scSNMP.ArubaSystemMIB.timer.onTimeout: " + e); //Catch error
                    }
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.ArubaSystemMIB()', name: " + name + ", ipAddress: " + ipAddress + ", port: " + port + ", community: " + community + ", interval: " + interval / 1000 / 60 + " minutes");
        }
        catch (e)
        {
            Debug.Print("scSNMP.ArubaSystemMIB: " + e); //Catch error
        }
    }

    //HPE-Physicaldescription-MIB. Get fan status. Tested on Aruba Instant On 1930 24G Class4 PoE 4SFP/SFP+ 195W Switch JL683B
    this.ArubaFanMIB = function (ipAddress, name, fans, poll, interval, port, community)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.ArubaFanMIB: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress   = ipAddress; //Store IP address
            var name        = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var fans        = (typeof fans == "undefined" || typeof fans !== "object") ? [1, 2] : fans; //Store fans
            var poll        = (typeof poll == "undefined" || typeof poll !== "boolean") ? true : poll; //Store poll status
            var interval    = (typeof interval == "undefined" || typeof interval !== "number") ? (60000 * 60) : interval; //Store interval(how often to poll)
            var port        = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store Port number
            var community   = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //store community
            var snmpReader = new SNMPReader(ipAddress, port, community); //Create new SNMPReader object
            var eventTarget = new EventTarget(); //Create an EventTarget

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            //Define function to send an Event
            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, data)
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init Event, (type, canBubble, cancelable)

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.name = name; //Store name in the event
                event.data = data; //Store data in the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event); //Send event
                else
                    throw new Error("Event listener 'DataAvailable' is missing"); //Throw an Error if Event listener 'DataAvailable' is missing
            }

            //Define function to get new data
            this.getData = function ()
            {
                try
                {
                    var data = {}; //Create new Struct object
                    for(var fan in fanEntry)
                        data[fan] = {}; //Create object for each fan

                    snmpReader.Get(); //Get new data from SNMPReader object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        for (var oid in snmpReader.Results) //Iterate Results
                        {
                            for(var fan in fanEntry)
                            {
                                var propName    = oids[oid].name;

                                if(fanEntry[fan][propName] != oid) //Only add data for relevant OID
                                    continue; 

                                var value       = snmpReader.Results[oid];
                                var description = oids[oid].description;
                                var status      = (typeof oids[oid].status != "undefined" && typeof oids[oid].status["_" + snmpReader.Results[oid]] != "undefined") ? oids[oid].status["_" + snmpReader.Results[oid]] : null;
                                data[fan][propName] = 
                                {
                                    name: propName,
                                    oid: oid,
                                    value: value,
                                    description: description,
                                    status: status
                                }; //Add data to data Object
                            }
                        }
                        sendEvent(false, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget, data); //Execute sendEvent() function
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error status, if Results Object is empty
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.ArubaFanMIB.getData(): " + e); //Catch any Error
                }
            }           

            var oids      = {}; //Create Object to store 'oid' information
            var fanEntry = {}; //Create Object to store 'fan' information

            //Go through all available disks
            for (var fan in fans)
            {
                var f = "Fan " + fans[fan];
                fanEntry[f] = {};

                var index = Number(fans[fan]) + 3; //Fan 1 == 4
                var oid = "1.3.6.1.4.1.11.2.53.15.1." + index + ".1";
                fanEntry[f].fanStatus = oid;
                oids[oid] = {};
                oids[oid].status = {};
                oids[oid].name = "fanStatus"; //"rlPhdUnitEnvParamFanXStatus";
                oids[oid].description = "Aruba fan operating status (" + fans[fan] + "): ";
                oids[oid].status = {_1:"Normal(1)",_2:"Warning(2)",_3:"Critical(3)",_4:"Shutdown(4)",_5:"Not present(5)",_6:"Not functioning(6)",_7:"Not available(7)",_8:"Backing up(8)",_9:"Reading failed(9)"};
                snmpReader.AddOID(oid);

                var index = Number(fans[fan]) + 17; //Fan 1 == 18
                var oid = "1.3.6.1.4.1.11.2.53.15.1." + index + ".1";
                fanEntry[f].fanSpeed = oid;
                oids[oid] = {};
                oids[oid].status = {};
                oids[oid].name = "fanSpeed"; //"rlPhdUnitEnvParamFanXSpeed";
                oids[oid].description = "Aruba fan speed (" + fans[fan] + "): ";
                snmpReader.AddOID(oid);
            }

            //Create timer if 'poll' is 'true'
            if (poll)
            {
                var timer = new Timer(1000, false); //Run once on startup, after 1 second timeout
                timer.parent = this; //Create reference to this object for access from timer object
                timer.onTimeout = function ()
                {
                    try
                    {
                        this.parent.getData(); //Execute getData() function
                        this.start(this.parent.getInterval()); //Restart timer object
                    }
                    catch (e)
                    {
                        Debug.Print("scSNMP.ArubaFanMIB.timer.onTimeout: " + e); //Catch error
                    }
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.ArubaFanMIB()', name: " + name + ", ipAddress: " + ipAddress + ", port: " + port + ", community: " + community + ", interval: " + interval / 1000 / 60 + " minutes, Fans: " + fans.toString());
        }
        catch (e)
        {
            Debug.Print("scSNMP.ArubaFanMIB: " + e); //Catch error
        }
    }

    //rfc2233, IF-MIB. Get different kinds of port status. Tested on 
    this.ArubaPortMIB = function (ipAddress, name, poll, interval, port, community, ports)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.ArubaPortMIB: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress   = ipAddress; //Store IP address
            var name        = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var poll        = (typeof poll == "undefined" || typeof poll !== "boolean") ? true : poll; //Store poll status
            var interval    = (typeof interval == "undefined" || typeof interval !== "number") ? (60000 * 60) : interval; //Store interval(how often to poll)
            var sPort       = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store Port number
            var community   = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //store community
            var ports       = (typeof ports == "undefined" || typeof ports !== "object") ? [1,2,3,4] : ports; //Number of ports to monitor
            var snmpReader  = new SNMPReader(ipAddress, sPort, community); //Create new SNMPReader object
            var eventTarget = new EventTarget(); //Create an EventTarget

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            //Define function to send an Event
            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, data)
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init Event, (type, canBubble, cancelable)

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.name = name; //Store name in the event
                event.data = data; //Store data in the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event); //Send event
                else
                    throw new Error("Event listener 'DataAvailable' is missing"); //Throw an Error if Event listener 'DataAvailable' is missing
            }

            //Define function to get new data
            this.getData = function ()
            {
                try
                {
                    var data = {}; //Create new Struct object
                    for(var port in portEntry)
                        data[port] = {}; //Create object for each port
                    snmpReader.Get(); //Get new data from SNMPReader object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        for (var oid in snmpReader.Results) //Iterate Results
                        {
                            for(var port in portEntry)
                            {
                                var propName    = oids[oid].name;

                                if(portEntry[port][propName] != oid) //Only add data for relevant OID
                                    continue; 

                                var value       = snmpReader.Results[oid];
                                var description = oids[oid].description; 
                                var status      = (typeof oids[oid].status != "undefined" && typeof oids[oid].status["_" + snmpReader.Results[oid]] != "undefined") ? oids[oid].status["_" + snmpReader.Results[oid]] : null;
                                data[port][propName] = 
                                {
                                    name: propName,
                                    oid: oid,
                                    value: value,
                                    description: description,
                                    status: status
                                }; //Add data to data Object
                            }
                        }
                        sendEvent(false, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget, data); //Execute sendEvent() function
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error status, if Results Object is empty
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.ArubaPortMIB.getData(): " + e); //Catch any Error
                }
            }
            var oids = {} //Store OIDs

            var portEntry = {}; //Create Object to store 'port' information

            //Go through all available disks
            for (var port in ports)
            {
                var p = "Port " + ports[port];
                portEntry[p] = {};

                var oid = "1.3.6.1.2.1.10.7.2.1.19." + (ports[port]);
                portEntry[p].dot3StatsDuplexStatus = oid;
                oids[oid] = {};
                oids[oid].name = "dot3StatsDuplexStatus";
                oids[oid].description = "The current mode of operation of the MAC entity. 'unknown' indicates that the current duplex mode could not be determined. (" + p + "): ";
                oids[oid].status = { _1:"unknown(1)", _2:"halfDuplex(2)", _3:"fullDuplex(3)" };
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.2.1.31.1.1.1.15." + (ports[port]);
                portEntry[p].ifHighSpeed = oid;
                oids[oid] = {};
                oids[oid].name = "ifHighSpeed";
                oids[oid].description = "An estimate of the interface's current bandwidth in units of 1,000,000 bits per second. If this object reports a value of `n' then the speed of the interface is somewhere in the range of `n-500,000' to `n+499,999'. For interfaces which do not vary in bandwidth or for those where no accurate estimation can be made, this object should contain the nominal bandwidth. For a sub-layer which has no concept of bandwidth, this object should be zero. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.2.1.2.2.1.7." + (ports[port]);
                portEntry[p].ifAdminStatus = oid;
                oids[oid] = {};
                oids[oid].name = "ifAdminStatus";
                oids[oid].description = "The desired state of the interface. The testing(3) state indicates that no operational packets can be passed.  When a managed system initializes, all interfaces start with ifAdminStatus in the down(2) state.  As a result of either explicit management action or per configuration information retained by the managed system, ifAdminStatus is then changed to either the up(1) or testing(3) states (or remains in the down(2) state). (" + p + "): ";
                oids[oid].status = { _1:"Up(1)", _2:"Down(2)", _3:"Testing(3)"};
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.2.1.2.2.1.8." + (ports[port]);
                portEntry[p].ifOperStatus = oid;
                oids[oid] = {};
                oids[oid].name = "ifOperStatus";
                oids[oid].description = "The current operational state of the interface. The testing(3) state indicates that no operational packets can be passed.";
                oids[oid].status = { _1:"Up(1)", _2:"Down(2)", _3:"Testing(3)"};
                snmpReader.AddOID(oid);

                //ifHCInOctets
                //ifHCOutOctets
            }


            //Create timer if 'poll' is 'true'
            if (poll)
            {
                var timer = new Timer(1000, false); //Run once on startup, after 1 second timeout
                timer.parent = this; //Create reference to this object for access from timer object
                timer.onTimeout = function ()
                {
                    try
                    {
                        this.parent.getData(); //Execute getData() function
                        this.start(this.parent.getInterval()); //Restart timer object
                    }
                    catch (e)
                    {
                        Debug.Print("scSNMP.ArubaPortMIB.timer.onTimeout: " + e); //Catch error
                    }
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.ArubaPortMIB()', name: " + name + ", ipAddress: " + ipAddress + ", port: " + sPort + ", community: " + community + ", interval: " + interval / 1000 / 60 + " minutes");
        }
        catch (e)
        {
            Debug.Print("scSNMP.ArubaPortMIB: " + e); //Catch error
        }
    }            

    //HPE-POE. Get different kinds of port status. Tested on 
    this.ArubaPoeMIB = function (ipAddress, name, poll, interval, port, community, ports)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.ArubaPoeMIB: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress   = ipAddress; //Store IP address
            var name        = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var poll        = (typeof poll == "undefined" || typeof poll !== "boolean") ? true : poll; //Store poll status
            var interval    = (typeof interval == "undefined" || typeof interval !== "number") ? (60000 * 60) : interval; //Store interval(how often to poll)
            var sPort       = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store Port number
            var community   = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //store community
            var ports       = (typeof ports == "undefined" || typeof ports !== "object") ? [1,2,3,4] : ports; //Number of ports to monitor
            var snmpReader  = new SNMPReader(ipAddress, sPort, community); //Create new SNMPReader object
            var eventTarget = new EventTarget(); //Create an EventTarget

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            //Define function to send an Event
            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, data)
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init Event, (type, canBubble, cancelable)

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.name = name; //Store name in the event
                event.data = data; //Store data in the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event); //Send event
                else
                    throw new Error("Event listener 'DataAvailable' is missing"); //Throw an Error if Event listener 'DataAvailable' is missing
            }

            //Define function to get new data
            this.getData = function ()
            {
                try
                {
                    var data = {}; //Create new Struct object
                    for(var port in portEntry)
                        data[port] = {}; //Create object for each port
                    snmpReader.Get(); //Get new data from SNMPReader object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        for (var oid in snmpReader.Results) //Iterate Results
                        {
                            for(var port in portEntry)
                            {
                                var propName    = oids[oid].name;

                                if(portEntry[port][propName] != oid) //Only add data for relevant OID
                                    continue; 

                                var value       = snmpReader.Results[oid];
                                var description = oids[oid].description; 
                                var status      = (typeof oids[oid].status != "undefined" && typeof oids[oid].status["_" + snmpReader.Results[oid]] != "undefined") ? oids[oid].status["_" + snmpReader.Results[oid]] : null;
                                data[port][propName] = 
                                {
                                    name: propName,
                                    oid: oid,
                                    value: value,
                                    description: description,
                                    status: status
                                }; //Add data to data Object
                            }
                        }
                        sendEvent(false, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget, data); //Execute sendEvent() function
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error status, if Results Object is empty
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.ArubaPoeMIB.getData(): " + e); //Catch any Error
                }
            }
            var oids = {} //Store OIDs

            var portEntry = {}; //Create Object to store 'port' information

            //Go through all available ports
            for (var port in ports)
            {
                var p = "Port " + ports[port];
                portEntry[p] = {};

                var oid = "1.3.6.1.4.1.11.2.108.1.1.3.1." + (ports[port]);
                portEntry[p].rlPethPsePortOutputVoltage = oid;
                oids[oid] = {};
                oids[oid].name = "rlPethPsePortOutputVoltage";
                oids[oid].description = "This variable indicates on the output voltage level in millivolts from rlPethPsePortIndex. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.11.2.108.1.1.4.1." + (ports[port]);
                portEntry[p].rlPethPsePortOutputCurrent = oid;
                oids[oid] = {};
                oids[oid].name = "rlPethPsePortOutputCurrent";
                oids[oid].description = "This variable indicates on the output current level in milliampere from rlPethPsePortIndex. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.11.2.108.1.1.5.1." + (ports[port]);
                portEntry[p].rlPethPsePortOutputPower = oid;
                oids[oid] = {};
                oids[oid].name = "rlPethPsePortOutputPower";
                oids[oid].description = "This variable indicates on the output power level in milliwatts from rlPethPsePortIndex. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.11.2.108.1.1.6.1." + (ports[port]);
                portEntry[p].rlPethPsePortPowerLimit = oid;
                oids[oid] = {};
                oids[oid].name = "rlPethPsePortPowerLimit";
                oids[oid].description = "This variable indicates on the user configured power level in milli watts which is available from rlPethPsePortIndex. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.11.2.108.1.1.8.1." + (ports[port]);
                portEntry[p].rlPethPsePortStatusDescription = oid;
                oids[oid] = {};
                oids[oid].name = "rlPethPsePortStatusDescription";
                oids[oid].description = "This variable indicates the description of the hardware status of rlPethPsePortIndex. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.11.2.108.1.1.11.1." + (ports[port]);
                portEntry[p].rlPethPsePortOperStatus = oid;
                oids[oid] = {};
                oids[oid].name = "rlPethPsePortOperStatus";
                oids[oid].description = "This Read-Only variable indicates PoE port current status affected by time range active/inactive and admin status. (" + p + "): ";
                oids[oid].status = {_1:"True(1)",_2:"False(2)"};
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.11.2.108.1.1.14.1." + (ports[port]);
                portEntry[p].rlPethPsePortLinkPartnerPoeType = oid;
                oids[oid] = {};
                oids[oid].name = "rlPethPsePortLinkPartnerPoeType";
                oids[oid].description = "This variable indicates the link partner PoE type. (" + p + "): ";
                oids[oid].status = {_1:"None(1)",_2:"Poe(2)",_3:"Poe plus(3)",_4:"Poe 60w(4)",_5:"Poe BT type 3(5)",_6:"Poe BT type 4(6)"};
                snmpReader.AddOID(oid);
            }


            //Create timer if 'poll' is 'true'
            if (poll)
            {
                var timer = new Timer(1000, false); //Run once on startup, after 1 second timeout
                timer.parent = this; //Create reference to this object for access from timer object
                timer.onTimeout = function ()
                {
                    try
                    {
                        this.parent.getData(); //Execute getData() function
                        this.start(this.parent.getInterval()); //Restart timer object
                    }
                    catch (e)
                    {
                        Debug.Print("scSNMP.ArubaPoeMIB.timer.onTimeout: " + e); //Catch error
                    }
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.ArubaPoeMIB()', name: " + name + ", ipAddress: " + ipAddress + ", port: " + sPort + ", community: " + community + ", interval: " + interval / 1000 / 60 + " minutes");
        }
        catch (e)
        {
            Debug.Print("scSNMP.ArubaPoeMIB: " + e); //Catch error
        }
    }

    //Event driven system temperature check. Function will fire an event which can be processed in the main script.
    this.SynologySystemTemperatureCheck = function (ipAddress, limit, name, port, community, interval)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.SynologySystemTemperatureCheck: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress = ipAddress; //Store IP address
            var limit = (typeof limit == "undefined" || typeof limit !== "number") ? 50 : limit; //Store limit
            var name = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var port = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store poll
            var community = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //Store community
            var interval = (typeof interval == "undefined" || typeof interval !== "number") ? 10000 : interval; //Store interval(how often to poll)
            var OID = "1.3.6.1.4.1.6574.1.2.0";
            var snmpReader = new SNMPReader(ipAddress, port, community); //Create new SNMPReader object
            snmpReader.AddOID(OID); //Add system temperature oid
            var aboveEdge = false; //Variable to to keep track of positive/negative change
            var belowEdge = false; //Variable to to keep track of positive/negative change
            var eventTarget = new EventTarget(); //Create an EventTarget object

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, limit, isAboveLimit, isBelowLimit, temp) //Define function to send an Event
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init Event

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.name = name; //Store name in the event
                event.limit = limit; //Store limit in the event
                event.isAboveLimit = isAboveLimit; //Store above limit status in the event
                event.isBelowLimit = isBelowLimit; //Store below limit status in the event
                event.currentTemperature = temp; //Store currentTemperature
                event.text = "System temperature for '" + name + "' is " + (isAboveLimit ? "above" : "below or equal to") + " limit '" + limit + "C', current temperature: " + temp + "C"; //Add optional text to the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event);
                else
                    throw new Error("Event listener 'DataAvailable' is missing");
            }

            //Function to get new data
            this.getData = function ()
            {
                try
                {
                    snmpReader.Get(); //Create new Struct object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        var temp = snmpReader.Results[OID]; //Get current system temperature
                        var isAboveLimit = temp > limit; //Check if temperature is above limit
                        var isBelowLimit = temp <= limit; //Check if temperature is below or equals to limit
                        if ((isAboveLimit && !aboveEdge) || (isBelowLimit && !belowEdge)) //Check if temperature is above/below the limit at the same time as it was not above/below the limit on last timeout
                        {
                            sendEvent(false, 0, "", name, eventTarget, limit, isAboveLimit, isBelowLimit, temp); // Send event to EventTarget
                        }
                        else
                        {
                            //Debug.Print("Script running, current system temperature: " + temp + ", limit: " + this.limit); //For debug purposes
                        }
                        aboveEdge = isAboveLimit; //Store state for next interval
                        belowEdge = isBelowLimit; //Store state for next interval
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.SynologySystemTemperatureCheck.getData(): " + e); //Catch error
                }
            }

            //Create timer object to check if limit is above or below limit on timeout
            var timer = new Timer(1000, false);
            timer.parent = this; //Create reference to this object, to be able to access properties from onTimeout function
            timer.onTimeout = function ()
            {
                try
                {
                    this.parent.getData(); //Execute getData() function
                    this.start(this.parent.getInterval()); //Restart timer
                }
                catch (e)
                {
                    Debug.Print("scSNMP.SynologySystemTemperatureCheck.timer.onTimeout(): " + e); //Catch any error from onTimeout function
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.SynologySystemTemperatureCheck()', name: " + name + ", ipAddress: " + ipAddress + ", limit: " + limit + ", port: " + port + ", community: " + community + ", interval: " + interval / 1000 + " seconds, OID: " + OID);
        }
        catch (e)
        {
            Debug.Print("scSNMP.SynologySystemTemperatureCheck(): " + e);
        }
    }
}
catch (e)
{
    Debug.Print("scSNMP: " + e);
}

//Main Script
/*
try
{
    var init;
    if(init == undefined)
    {
        init      = true;

        var snmp1 = new scSNMP.SynologySystemMIB("192.168.20.70", "EthirisNAS_System");
        snmp1.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    Debug.Print("System: " + event.name + " - " + event.data.systemStatus.status);
                    Debug.Print("System: " + event.name + " - System temp: " + event.data.temperature.value);
                }
                else
                    Debug.Print("snmp1 - System: " + event.name + ", Something went wrong, connection to NAS may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
            }
            catch(e)
            {
                Debug.Print("snmp1.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp1.onDataChange = function()
        //{
        //  if(bSnmp1)
        //      snmp1.getData();
        //}

        snmp2 = new scSNMP.SynologyDiskMIB("192.168.20.70", "EthirisNAS_Disks");
        snmp2.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    Debug.Print("System: " + event.name + " - Disk 1 status: " + event.data["Disk 1"].diskStatus.status);
                    Debug.Print("System: " + event.name + " - Disk 1 temperature: " + event.data["Disk 1"].diskTemperature.value + "C");
                }
                else
                    Debug.Print("snmp2 - System: " + event.name + ", Something went wrong, connection to NAS may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
            }
            catch(e)
            {
                Debug.Print("snmp2.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp2.onDataChange = function()
        //{
        //  if(bSnmp2)
        //      snmp2.getData();
        //}

        var snmp3 = new scSNMP.SynologySystemTemperatureCheck("192.168.20.70", 40, "EthirisNAS");
        snmp3.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    Debug.Print(event.text);
                }
                else
                {
                    Debug.Print("snmp3 - System: " + event.name + ", Something went wrong, connection to NAS may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp3.getEventTarget().onDataAvailable: " + e);
            }
        }

        var snmp4 = new scSNMP.HPSystemMIB("192.168.20.60", "HP1950", true, 60000);
        snmp4.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    Debug.Print("System: " + event.name + " - System CPU usage(%): " + event.data.hh3cEntityExtCpuUsage.value);
                    Debug.Print("System: " + event.name + " - System memory usage(%): " + event.data.hh3cEntityExtMemUsage.value);
                }
                else
                {
                  Debug.Print("snmp4 - System: " + event.name + ", Something went wrong, connection to Switch may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp4.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp4.onDataChange = function()
        //{
        //  if(bSnmp4)
        //      snmp4.getData();
        //}

        var snmp5 = new scSNMP.HPPortMIB("192.168.20.60", "HP1950 - ports 1-6", true, 60000, 161, "public", [1,2,3,4,5,6]);
        snmp5.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    Debug.Print("System: " + event.name + " - Port 1 bandwidth(Mbits/s): " + event.data["Port 1"].ifHighSpeed.value);
                    Debug.Print("System: " + event.name + " - Port 1 duplex status: " + event.data["Port 1"].dot3StatsDuplexStatus.status);
                }
                else
                {
                    Debug.Print("snmp5 - System: " + event.name + ", Something went wrong, connection to Switch may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp5.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp5.onDataChange = function()
        //{
        //  if(bSnmp5)
        //      snmp5.getData();
        //}

        var snmp6 = new scSNMP.HPPortMIB("192.168.20.60", "HP1950 - ports 7-12", true, 60000, 161, "public", [7,8,9,10,11,12]);
        snmp6.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    Debug.Print("System: " + event.name + " - Port 12 bandwidth(Mbits/s): " + event.data["Port 12"].ifHighSpeed.value);
                    Debug.Print("System: " + event.name + " - Port 12 duplex status: " + event.data["Port 12"].dot3StatsDuplexStatus.status);
                }
                else
                {
                    Debug.Print("snmp6 - System: " + event.name + ", Something went wrong, connection to Switch may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp6.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp6.onDataChange = function()
        //{
        //  if(bSnmp6)
        //      snmp6.getData();
        //}

        var snmp7 = new scSNMP.HPPortMIB("192.168.20.60", "HP1950 - ports 13-16", true, 60000, 161, "public", [13,14,15,16]);
        snmp7.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    Debug.Print("System: " + event.name + " - Port 16 bandwidth(Mbits/s): " + event.data["Port 16"].ifHighSpeed.value);
                    Debug.Print("System: " + event.name + " - Port 16 duplex status: " + event.data["Port 16"].dot3StatsDuplexStatus.status);
                }
                else
                {
                    Debug.Print("snmp7 - System: " + event.name + ", Something went wrong, connection to Switch may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp7.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp7.onDataChange = function()
        //{
        //  if(bSnmp7)
        //      snmp7.getData();
        //}

        var snmp8 = new scSNMP.HPFanMIB("192.168.20.60", "HP1950", [1,2], true, 5000);
        snmp8.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    Debug.Print("System: " + event.name + " - Fan 1 status: " + event.data["Fan 1"].operStatus.status);
                    Debug.Print("System: " + event.name + " - Fan 1 error: " + event.data["Fan 1"].errorStatus.status);
                    Debug.Print("System: " + event.name + " - Fan 2 status: " + event.data["Fan 2"].operStatus.status);
                    Debug.Print("System: " + event.name + " - Fan 2 error: " + event.data["Fan 2"].errorStatus.status);
                }
                else
                {
                    Debug.Print("snmp8 - System: " + event.name + ", Something went wrong, connection to Switch may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp8.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp8.onDataChange = function()
        //{
        //  if(bSnmp8)
        //      snmp8.getData();
        //}

        var snmp9 = new scSNMP.ArubaFanMIB("192.168.20.60", "Aruba1930", [1,2], true, 5000);
        snmp9.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    for(var i in event.data)
                    {
                        var index = i.split(' ')[1];
                        Debug.Print(event.name + "FanStatus" + index + ": " + event.data[i].fanStatus.value);
                        Debug.Print(event.name + "FanStatusString" + index + ": " + event.data[i].fanStatus.status);
                        Debug.Print(event.name + "FanSpeed" + index + ": " + event.data[i].fanSpeed.value);
                    }
                }
                else
                {
                    Debug.Print("snmp9 - System: " + event.name + ", Something went wrong, connection to Switch may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp9.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp9.onDataChange = function()
        //{
        //  if(bSnmp9)
        //      snmp9.getData();
        //}

        var snmp10 = new scSNMP.ArubaSystemMIB("192.168.20.90", "Aruba1930");
        snmp10.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    for(var i in event.data)
                    {
                        Debug.Print(event.name + "TempSensorValue1" + ": " + event.data.rlPhdUnitEnvParamTempSensorValue.value);
                        Debug.Print(event.name + "TempSensorStatus1" + ": " + event.data.rlPhdUnitEnvParamTempSensorStatus.status);
                        Debug.Print(event.name + "MonitorTemperatureStatusValue1" + ": " + event.data.rlPhdUnitEnvParamMonitorTemperatureStatus.value);
                        Debug.Print(event.name + "MonitorTemperatureStatus1" + ": " + event.data.rlPhdUnitEnvParamMonitorTemperatureStatus.status);
                        Debug.Print(event.name + "CpuUtilDuringLastSecond1" + ": " + event.data.rlCpuUtilDuringLastSecond.value);
                        Debug.Print(event.name + "CpuUtilDuringLastMinute1" + ": " + event.data.rlCpuUtilDuringLastMinute.value);
                        Debug.Print(event.name + "CpuUtilDuringLast5Minutes1" + ": " + event.data.rlCpuUtilDuringLast5Minutes.value);
                        Debug.Print(event.name + "ModelName1" + ": " + event.data.rlPhdUnitGenParamModelName.value);
                        Debug.Print(event.name + "SoftwareVersion1" + ": " + event.data.rlPhdUnitGenParamSoftwareVersion.value);
                        Debug.Print(event.name + "SerialNum1" + ": " + event.data.rlPhdUnitGenParamSerialNum.value);
                        Debug.Print(event.name + "SysUpTime1" + ": " + event.data.sysUpTime.value);
                        Debug.Print(event.name + "SysDescr1" + ": " + event.data.sysDescr.value);
                        Debug.Print(event.name + "MainPsePower1" + ": " + event.data.pethMainPsePower.value);
                        Debug.Print(event.name + "MainPseOperStatus1" + ": " + event.data.pethMainPseOperStatus.status);
                        Debug.Print(event.name + "MainPseConsumptionPower1" + ": " + event.data.pethMainPseConsumptionPower.value);
                        Debug.Print(event.name + "MainPseUsageThreshold1" + ": " + event.data.pethMainPseUsageThreshold.value);
                    }
                }
                else
                {
                    Debug.Print("snmp10 - System: " + event.name + ", Something went wrong, connection to Switch may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp10.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp10.onDataChange = function()
        //{
        //  if(bSnmp10)
        //      snmp10.getData();
        //}

        var snmp11 = new scSNMP.ArubaPortMIB("192.168.20.100", "Aruba1930", true, 10000, 161, "public", [1,2,3,4,5,6,7]);
        snmp11.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    for(var i in event.data)
                    {
                        var index = i.split(' ')[1];
                        Debug.Print(event.name + "PortSpeed" + index + ": " + event.data[i].ifHighSpeed.value);
                        Debug.Print(event.name + "PortDuplexValue" + index + ": " + event.data[i].dot3StatsDuplexStatus.value);
                        Debug.Print(event.name + "PortDuplexStatus" + index + ": " + event.data[i].dot3StatsDuplexStatus.status);
                        Debug.Print(event.name + "PortStatusValue" + index + ": " + event.data[i].ifAdminStatus.value);
                        Debug.Print(event.name + "PortStatus" + index + ": " + event.data[i].ifAdminStatus.status);
                        Debug.Print(event.name + "PortOperatingStatusValue" + index + ": " + event.data[i].ifOperStatus.value);
                        Debug.Print(event.name + "PortOperatingStatus" + index + ": " + event.data[i].ifOperStatus.status);
                    }

                }
                else
                {
                    Debug.Print("snmp11 - System: " + event.name + ", Something went wrong, connection to Switch may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp11.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp11.onDataChange = function()
        //{
        //  if(bSnmp11)
        //      snmp11.getData();
        //}

        var snmp12 = new scSNMP.ArubaPoeMIB("192.168.20.100", "Aruba1930", true, 10000, 161, "public", [1,2,3,4,5,6]);
        snmp12.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    for(var i in event.data)
                    {
                        var index = i.split(' ')[1];
                        Debug.Print(event.name + "PortOutputVoltage" + index + ": " + event.data[i].rlPethPsePortOutputVoltage.value);
                        Debug.Print(event.name + "PortOutputCurrent" + index + ": " + event.data[i].rlPethPsePortOutputCurrent.value);
                        Debug.Print(event.name + "PortOutputPower" + index + ": " + event.data[i].rlPethPsePortOutputPower.value);
                        Debug.Print(event.name + "PortPowerLimit" + index + ": " + event.data[i].rlPethPsePortPowerLimit.value);
                        Debug.Print(event.name + "PortStatusDescription" + index + ": " + event.data[i].rlPethPsePortStatusDescription.value);
                        Debug.Print(event.name + "PortOperStatus" + index + ": " + event.data[i].rlPethPsePortOperStatus.status);
                        Debug.Print(event.name + "PortLinkPartnerPoeType" + index + ": " + event.data[i].rlPethPsePortLinkPartnerPoeType.status);
                    }
                }
                else
                {
                    Debug.Print("snmp12 - System: " + event.name + ", Something went wrong, connection to Switch may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp12.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp12.onDataChange = function()
        //{
        //  if(bSnmp12)
        //      snmp12.getData();
        //}
    }
}
catch(e)
{
    Debug.Print("Main script: " + e);
}
*/