private static void CreateMeterAdvancedTemplate(AFElementTemplate meterBasicTemplate) { AFDatabase database = meterBasicTemplate.Database; AFElementTemplate meterAdvancedTemplate = database.ElementTemplates["MeterAdvanced"]; if (meterAdvancedTemplate == null) { database.ElementTemplates.Add("MeterAdvanced"); } AFCategory tsDataA = database.AttributeCategories["Time-Series Data"]; AFEnumerationSet mStatusEnum = database.EnumerationSets["Meter Status"]; meterAdvancedTemplate.BaseTemplate = meterBasicTemplate; AFAttributeTemplate statusAttrTemp = meterAdvancedTemplate.AttributeTemplates["Status"]; if (statusAttrTemp == null) { meterAdvancedTemplate.AttributeTemplates.Add("Status"); } statusAttrTemp.TypeQualifier = mStatusEnum; if (!statusAttrTemp.Categories.Contains(tsDataA)) { statusAttrTemp.Categories.Add(tsDataA); } statusAttrTemp.DataReferencePlugIn = database.PISystem.DataReferencePlugIns["PI Point"]; statusAttrTemp.ConfigString = @"\\%@\Configuration|PIDataArchiveName%\%Element%.%Attribute%"; }
public void Run() { PIServers piServers = new PIServers(); PIServer piServer = piServers["<PISERVER>"]; IList <PIPoint> points = PIPoint.FindPIPoints(piServer, new[] { "sample_floatpoint", "sample_digitalpoint" }); PIPoint floatingPIPoint = points[0]; PIPoint digitalPIPoint = points[1]; AFEnumerationSet digSet = piServer.StateSets["Modes"]; IList <AFValue> valuesToWrite = new List <AFValue>(); for (int i = 0; i < 10; i++) { AFTime time = new AFTime(new DateTime(2015, 1, 1, i, 0, 0, DateTimeKind.Local)); AFValue afValueFloat = new AFValue(i, time); // Associate the AFValue to a PI Point so we know where to write to. afValueFloat.PIPoint = floatingPIPoint; AFEnumerationValue digSetValue = i % 2 == 0 ? digSet["Auto"] : digSet["Manual"]; AFValue afValueDigital = new AFValue(digSetValue, time); afValueDigital.PIPoint = digitalPIPoint; valuesToWrite.Add(afValueFloat); valuesToWrite.Add(afValueDigital); } // Perform a bulk write. Use a single local call to PI Buffer Subsystem if possible. // Otherwise, make a single call to the PI Data Archive. // We use no compression just so we can check all the values are written. piServer.UpdateValues(valuesToWrite, AFUpdateOption.InsertNoCompression, AFBufferOption.BufferIfPossible); }
private static void CreateEnumerationSets(AFDatabase database) { if (database == null) { return; } if (!database.EnumerationSets.Contains("Building Type")) { AFEnumerationSet bTypeEnum = database.EnumerationSets.Add("Building Type"); bTypeEnum.Add("Residential", 0); bTypeEnum.Add("Business", 1); } if (!database.EnumerationSets.Contains("Meter Status")) { AFEnumerationSet mStatusEnum = database.EnumerationSets.Add("Meter Status"); mStatusEnum.Add("Good", 0); mStatusEnum.Add("Bad", 1); } if (database.IsDirty) { database.CheckIn(); } }
private void CreateTemplates(AFDatabase afDatabase) { AFElementTemplate elemTemplate = afDatabase.ElementTemplates.Add("BasicBoilerTemplate"); AFAttributeTemplate attrTemplate_Temperature = elemTemplate.AttributeTemplates.Add("Temperature"); AFAttributeTemplate attrTemplate_Pressure = elemTemplate.AttributeTemplates.Add("Pressure"); AFAttributeTemplate attrTemplate_Limit = elemTemplate.AttributeTemplates.Add("Limit"); AFAttributeTemplate attrTemplate_Mode = elemTemplate.AttributeTemplates.Add("Mode"); attrTemplate_Temperature.Type = typeof(float); attrTemplate_Pressure.Type = typeof(float); attrTemplate_Limit.Type = typeof(string); AFEnumerationSet modes = afDatabase.EnumerationSets["Modes"]; attrTemplate_Mode.TypeQualifier = modes; attrTemplate_Temperature.DataReferencePlugIn = AFDataReference.GetPIPointDataReference(afDatabase.PISystem); attrTemplate_Pressure.DataReferencePlugIn = AFDataReference.GetPIPointDataReference(afDatabase.PISystem); attrTemplate_Mode.DataReferencePlugIn = AFDataReference.GetPIPointDataReference(afDatabase.PISystem); attrTemplate_Temperature.ConfigString = @"%Database%.%..\Element%.%Element%.%Attribute%;ptclassname=classic;pointtype=float32;"; attrTemplate_Pressure.ConfigString = @"%Database%.%..\Element%.%Element%.%Attribute%;ptclassname=classic;pointtype=float32;"; attrTemplate_Mode.ConfigString = @"%Database%.%..\Element%.%Element%.%Attribute%;ptclassname=classic;pointtype=digital;digitalset=modes;"; // Do a bulk check in of all changes made so far. afDatabase.CheckIn(); }
static void storeEnumerationSet(AFEnumerationSet enumSet, DataTable dt) { addNameAndDescription(dt, enumSet, enumSet); foreach (var row in enumSet) { addNameAndDescription(dt, row, row); } }
private AFEnumerationSet CreateEnumerationSet(AFDatabase db) { AFEnumerationSet enumSet = db.EnumerationSets.Add(Constants.AF_ENUMERATION_SET_NAME); enumSet.Add("Very Good", 4); enumSet.Add("Good", 3); enumSet.Add("Bad", 2); enumSet.Add("Very Bad", 1); return(enumSet); }
private void CreateEnumerationSet(AFDatabase afDatabase) { AFEnumerationSet modes = afDatabase.EnumerationSets.Add("Modes"); modes.Add("Manual", 0); modes.Add("Auto", 1); modes.Add("Cascade", 2); modes.Add("Program", 3); modes.Add("Prog-Auto", 4); }
private static AFElementTemplate CreateMeterBasicTemplate(AFDatabase database) { AFElementTemplate meterBasicTemplate = database.ElementTemplates["MeterBasic"]; if (meterBasicTemplate != null) { return(meterBasicTemplate); } UOM uom = database.PISystem.UOMDatabase.UOMs["kilowatt hour"]; AFCategory mEnergyE = database.ElementCategories["Measures Energy"]; AFCategory bInfoA = database.AttributeCategories["Building Info"]; AFCategory locationA = database.AttributeCategories["Location"]; AFCategory tsDataA = database.AttributeCategories["Time-Series Data"]; AFEnumerationSet bTypeNum = database.EnumerationSets["Building Type"]; AFPlugIn PIPoint = database.PISystem.DataReferencePlugIns["PI Point"]; meterBasicTemplate = database.ElementTemplates.Add("MeterBasic"); meterBasicTemplate.Categories.Add(mEnergyE); AFAttributeTemplate substationAttrTemp = meterBasicTemplate.AttributeTemplates.Add("Substation"); substationAttrTemp.Type = typeof(string); AFAttributeTemplate usageLimitAttrTemp = meterBasicTemplate.AttributeTemplates.Add("Usage Limit"); usageLimitAttrTemp.Type = typeof(string); usageLimitAttrTemp.DefaultUOM = uom; AFAttributeTemplate buildingAttrTemp = meterBasicTemplate.AttributeTemplates.Add("Building"); buildingAttrTemp.Type = typeof(string); buildingAttrTemp.Categories.Add(bInfoA); AFAttributeTemplate bTypeAttrTemp = meterBasicTemplate.AttributeTemplates.Add("Building Type"); bTypeAttrTemp.TypeQualifier = bTypeNum; bTypeAttrTemp.Categories.Add(bInfoA); AFAttributeTemplate cityAttrTemp = meterBasicTemplate.AttributeTemplates.Add("City"); cityAttrTemp.Type = typeof(string); cityAttrTemp.Categories.Add(locationA); AFAttributeTemplate energyUsageAttrTemp = meterBasicTemplate.AttributeTemplates.Add("Energy Usage"); energyUsageAttrTemp.Type = typeof(Single); energyUsageAttrTemp.Categories.Add(tsDataA); energyUsageAttrTemp.DefaultUOM = uom; energyUsageAttrTemp.DataReferencePlugIn = PIPoint; energyUsageAttrTemp.ConfigString = @"\\%@\Configuration|PIDataArchiveName%\%Element%.%Attribute%;UOM=kWh"; return(meterBasicTemplate); }
public void DeleteTest() { instance.Delete(webId); AFDatabase db = StandardPISystem.Databases[Constants.AF_DATABASE_NAME]; db.Refresh(); AFEnumerationSet enumSet = AFObject.FindObject(Constants.AF_ENUMERATION_SET_PATH) as AFEnumerationSet; Assert.IsNull(enumSet); DeleteSampleDatabaseForTests(); CreateSampleDatabaseForTests(); }
public void CreateValueTest() { PIEnumerationValue enumerationValue = new PIEnumerationValue() { Name = "Ultra Good", Value = 5 }; instance.CreateValue(webId, enumerationValue); AFDatabase db = StandardPISystem.Databases[Constants.AF_DATABASE_NAME]; db.Refresh(); AFEnumerationSet enumSet = AFObject.FindObject(Constants.AF_ENUMERATION_SET_PATH) as AFEnumerationSet; Assert.IsTrue(enumSet.Count == 5); }
public void CreateSampleDatabaseForTests() { DeleteSampleDatabaseForTests(); CreateSecurityIdentities(); CreateSecurityMappings(); CreateUOMClasses(); AFDatabase db = CreateDatabase(); AFCategory analysisCategory1 = CreateCategory(db.AnalysisCategories, Constants.AF_ANALYSIS_CATEGORY_NAME, 1); AFCategory analysisCategory2 = CreateCategory(db.AnalysisCategories, Constants.AF_ANALYSIS_CATEGORY_NAME, 2); AFCategory tableCategory1 = CreateCategory(db.TableCategories, Constants.AF_TABLE_CATEGORY_NAME, 1); AFCategory tableCategory2 = CreateCategory(db.TableCategories, Constants.AF_TABLE_CATEGORY_NAME, 2); AFCategory attributeCategory1 = CreateCategory(db.AttributeCategories, Constants.AF_ATTRIBUTE_CATEGORY_NAME, 1); AFCategory attributeCategory2 = CreateCategory(db.AttributeCategories, Constants.AF_ATTRIBUTE_CATEGORY_NAME, 2); AFCategory elementCategory1 = CreateCategory(db.ElementCategories, Constants.AF_ELEMENT_CATEGORY_NAME, 1); AFCategory elementCategory2 = CreateCategory(db.ElementCategories, Constants.AF_ELEMENT_CATEGORY_NAME, 2); AFTable table = CreateTable(db); table.Categories.Add(tableCategory1); AFEnumerationSet enumSet = CreateEnumerationSet(db); AFElementTemplate elementTemplate = CreateElementTemplate(db); CreateElementFromTemplate(db, elementTemplate); AFElement el = CreateElementAndAttributes(db, elementCategory1, attributeCategory1); CreateElementForStreamSet(db); AFAnalysisTemplate analysisTemplate = CreateAnalysisTemplate(db); AFAnalysis an = CreateAnalysis(db, el, analysisCategory1, analysisCategory2); AFEventFrame ef = CreateEventFrame(db, null, elementCategory1); AFElementTemplate eventFrameTemplate = CreateEventFrameTemplate(db); AFEventFrame ef2 = CreateEventFrame(db, eventFrameTemplate, elementCategory1); db.CheckIn(); }
public void Run() { PISystems piSystems = new PISystems(); PISystem piSystem = piSystems["<AFSERVER>"]; AFDatabase afDatabase = piSystem.Databases["Basic-AFSDK-Sample"]; AFElement boilerA = afDatabase.Elements["Region_0"].Elements["BoilerA"]; AFElementTemplate elementTemplate = afDatabase.ElementTemplates["BasicBoilerTemplate"]; AFAttributeTemplate temperatureAttrTemplate = elementTemplate.AttributeTemplates["Temperature"]; AFAttributeTemplate modeAttrTemplate = elementTemplate.AttributeTemplates["Mode"]; AFElement.LoadAttributes(new[] { boilerA }, new[] { temperatureAttrTemplate, modeAttrTemplate }); AFEnumerationSet digSet = afDatabase.EnumerationSets["Modes"]; IList <AFValue> valuesToWrite = new List <AFValue>(); for (int i = 0; i < 10; i++) { AFTime time = new AFTime(new DateTime(2015, 1, 1, i, 0, 0, DateTimeKind.Local)); AFValue afValueFloat = new AFValue(i, time); // Associate the AFValue to an attribute so we know where to write to. afValueFloat.Attribute = boilerA.Attributes["Temperature"]; AFEnumerationValue digSetValue = i % 2 == 0 ? digSet["Auto"] : digSet["Manual"]; AFValue afValueDigital = new AFValue(digSetValue, time); afValueDigital.Attribute = boilerA.Attributes["Mode"]; valuesToWrite.Add(afValueFloat); valuesToWrite.Add(afValueDigital); } // Perform a bulk write. Use a single local call to PI Buffer Subsystem if possible. // Otherwise, make a single call to the PI Data Archive. // We use no compression just so we can check all the values are written. // AFListData is the class that provides the bulk write method. AFListData.UpdateValues(valuesToWrite, AFUpdateOption.InsertNoCompression, AFBufferOption.BufferIfPossible); }
public void UpdateTest() { string path = Constants.AF_ENUMERATION_SET_PATH; PIEnumerationSet enumSet = instance.GetByPath(path, null); enumSet.Id = null; enumSet.Description = "New enumeration set description"; enumSet.Links = null; enumSet.Path = null; enumSet.WebId = null; instance.Update(webId, enumSet); StandardPISystem.Refresh(); AFDatabase db = StandardPISystem.Databases[Constants.AF_DATABASE_NAME]; db.Refresh(); AFEnumerationSet afEnumSet = AFObject.FindObject(Constants.AF_ENUMERATION_SET_PATH) as AFEnumerationSet; afEnumSet.Database.Refresh(); afEnumSet.Refresh(); Assert.IsTrue(afEnumSet.Description == enumSet.Description); }
private static void CreateTemplates(AFDatabase database) { if (database == null) { return; } UOM uom = database.PISystem.UOMDatabase.UOMs["kilowatt hour"]; AFCategory mEnergyE = database.ElementCategories["Measures Energy"]; AFCategory sStatusE = database.ElementCategories["Shows Status"]; AFCategory bInfoA = database.AttributeCategories["Building Info"]; AFCategory locationA = database.AttributeCategories["Location"]; AFCategory tsDataA = database.AttributeCategories["Time-Series Data"]; AFEnumerationSet bTypeNum = database.EnumerationSets["Building Type"]; AFEnumerationSet mStatusEnum = database.EnumerationSets["Meter Status"]; // Create MeterBasic Element Template AFElementTemplate meterBasicTemplate; if (!database.ElementTemplates.Contains("MeterBasic")) { meterBasicTemplate = database.ElementTemplates.Add("MeterBasic"); meterBasicTemplate.Categories.Add(mEnergyE); AFAttributeTemplate substationAttrTemp = meterBasicTemplate.AttributeTemplates.Add("Substation"); substationAttrTemp.Type = typeof(string); AFAttributeTemplate usageLimitAttrTemp = meterBasicTemplate.AttributeTemplates.Add("Usage Limit"); usageLimitAttrTemp.Type = typeof(string); usageLimitAttrTemp.DefaultUOM = uom; AFAttributeTemplate buildingAttrTemp = meterBasicTemplate.AttributeTemplates.Add("Building"); buildingAttrTemp.Type = typeof(string); buildingAttrTemp.Categories.Add(bInfoA); AFAttributeTemplate bTypeAttrTemp = meterBasicTemplate.AttributeTemplates.Add("Building Type"); bTypeAttrTemp.TypeQualifier = bTypeNum; bTypeAttrTemp.Categories.Add(bInfoA); AFAttributeTemplate districtAttrTemp = meterBasicTemplate.AttributeTemplates.Add("District"); districtAttrTemp.Type = typeof(string); districtAttrTemp.Categories.Add(locationA); AFAttributeTemplate energyUsageAttrTemp = meterBasicTemplate.AttributeTemplates.Add("Energy Usage"); energyUsageAttrTemp.Type = typeof(double); energyUsageAttrTemp.Categories.Add(tsDataA); energyUsageAttrTemp.DefaultUOM = uom; energyUsageAttrTemp.DataReferencePlugIn = database.PISystem.DataReferencePlugIns["PI Point"]; energyUsageAttrTemp.ConfigString = @"\\%Server%\%Element%.%Attribute%;UOM=kWh"; } else { meterBasicTemplate = database.ElementTemplates["MeterBasic"]; } // Create MeterAdvanced Element Template if (!database.ElementTemplates.Contains("MeterAdvanced")) { AFElementTemplate meterAdvancedTemplate = database.ElementTemplates.Add("MeterAdvanced"); meterAdvancedTemplate.BaseTemplate = meterBasicTemplate; AFAttributeTemplate statusAttrTemp = meterAdvancedTemplate.AttributeTemplates.Add("Status"); statusAttrTemp.TypeQualifier = mStatusEnum; statusAttrTemp.Categories.Add(tsDataA); statusAttrTemp.DataReferencePlugIn = database.PISystem.DataReferencePlugIns["PI Point"]; statusAttrTemp.ConfigString = @"\\%Server%\%Element%.%Attribute%"; // Create District Element Template AFElementTemplate districtTemplate = database.ElementTemplates.Add("District"); AFAttributeTemplate districtEnergyUsageAttrTemp = districtTemplate.AttributeTemplates.Add("Energy Usage"); districtEnergyUsageAttrTemp.Type = typeof(double); districtEnergyUsageAttrTemp.DefaultUOM = uom; districtEnergyUsageAttrTemp.DataReferencePlugIn = database.PISystem.DataReferencePlugIns["PI Point"]; districtEnergyUsageAttrTemp.ConfigString = @"\\%Server%\%Element%.%Attribute%"; } // Do a checkin at the end instead of one-by-one. database.CheckIn(); }
/// <summary> /// Create the AF Database, Element Templates, and Attribute Templates. /// </summary> private void CreateAFTemplates() { // Check if PI System exists. PISystem targetPISystem = new PISystems()[_conf.AFServerName]; if (targetPISystem == null) { Console.WriteLine("AF server does not exist"); Environment.Exit(0); } // Check if AF Database exists. If so, delete it and recreate it to start anew. _afContext = new AFContext(); _afContext.Database = targetPISystem.Databases[_conf.AFDatabaseName]; if (_afContext.Database != null) { Console.Write(string.Format(@"AF Database {0} already exists. " + @"Press Y to remove and recreate the database, " + @"N to quit the program and specify a different database name : ", _conf.AFDatabaseName)); while (true) { ConsoleKeyInfo result = Console.ReadKey(); Console.WriteLine("\n"); if ((result.KeyChar == 'Y') || (result.KeyChar == 'y')) { targetPISystem.Databases.Remove(_afContext.Database); break; } else if ((result.KeyChar == 'N') || (result.KeyChar == 'n')) { Environment.Exit(0); } Console.Write("Invalid input, try again (Y/N) : "); } } _afContext.Database = targetPISystem.Databases.Add(_conf.AFDatabaseName); // Create the Enumeration Set. AFEnumerationSet modes = _afContext.Database.EnumerationSets.Add("Modes"); modes.Add("Manual", 0); modes.Add("Auto", 1); modes.Add("Cascade", 2); modes.Add("Program", 3); modes.Add("Prog-Auto", 4); // Create element templates for SubTree and Branch elements. AFElementTemplate subTree_ElemTmp = _afContext.Database.ElementTemplates.Add(Constants.SUBTREE); AFElementTemplate branch_ElemTmp = _afContext.Database.ElementTemplates.Add(Constants.BRANCH); AFAttributeTemplate subtree_Rollup_AttrTmp = subTree_ElemTmp.AttributeTemplates.Add(Constants.ROLLUP_SUM_ATTRIBUTE); AFAttributeTemplate branch_Rollup_AttrTmp = branch_ElemTmp.AttributeTemplates.Add(Constants.ROLLUP_SUM_ATTRIBUTE); AFAttributeTemplate threshold_AttrTmp = branch_ElemTmp.AttributeTemplates.Add(Constants.THRESHOLD_ATTRIBUTE); subtree_Rollup_AttrTmp.Type = typeof(float); branch_Rollup_AttrTmp.Type = typeof(float); threshold_AttrTmp.Type = typeof(int); AFPlugIn _piPointDR = AFDataReference.GetPIPointDataReference(targetPISystem); subtree_Rollup_AttrTmp.DataReferencePlugIn = _piPointDR; branch_Rollup_AttrTmp.DataReferencePlugIn = _piPointDR; string serverPath = @"\\" + _conf.PIServerName + @"\"; subtree_Rollup_AttrTmp.ConfigString = serverPath + @"HighAsset_%Element%_Total"; branch_Rollup_AttrTmp.ConfigString = serverPath + @"HighAsset_%Element%_Total"; threshold_AttrTmp.SetValue(_conf.ThresholdValue, null); // Create element templates for Leaf elements. _afContext.BaseLeafTemplate = _afContext.Database.ElementTemplates.Add(Constants.LEAF); _afContext.SinusoidLeafTemplate = _afContext.Database.ElementTemplates.Add(Constants.LEAF_SIN); _afContext.RandomLeafTemplate = _afContext.Database.ElementTemplates.Add(Constants.LEAF_RAND); _afContext.SinusoidLeafTemplate.BaseTemplate = _afContext.BaseLeafTemplate; _afContext.RandomLeafTemplate.BaseTemplate = _afContext.BaseLeafTemplate; // Add attribute templates for base leaf Element Templates. AFAttributeTemplate subtree_AttrTmp = _afContext.BaseLeafTemplate.AttributeTemplates.Add(Constants.SUBTREE); AFAttributeTemplate branch_AttrTmp = _afContext.BaseLeafTemplate.AttributeTemplates.Add(Constants.BRANCH); AFAttributeTemplate ID_AttrTmp = _afContext.BaseLeafTemplate.AttributeTemplates.Add(Constants.LEAF_ID); AFAttributeTemplate value_AttrTmp = _afContext.BaseLeafTemplate.AttributeTemplates.Add("Value"); AFAttributeTemplate mode_AttrTmp = _afContext.BaseLeafTemplate.AttributeTemplates.Add("Mode"); subtree_AttrTmp.Type = typeof(string); branch_AttrTmp.Type = typeof(string); ID_AttrTmp.Type = typeof(string); value_AttrTmp.Type = typeof(float); value_AttrTmp.DataReferencePlugIn = _piPointDR; mode_AttrTmp.DataReferencePlugIn = _piPointDR; mode_AttrTmp.TypeQualifier = modes; mode_AttrTmp.SetValue(modes["Manual"], null); mode_AttrTmp.ConfigString = serverPath + @"HighAsset_%Element%_Mode; ptclassname=classic; pointtype=digital; digitalset=modes; pointsource=R; location1=0; location4=3; location5=1"; // Add attribute templates for sinusoid leaf Element Templates. AFAttributeTemplate value_sinusoid_AttrTmp = _afContext.SinusoidLeafTemplate.AttributeTemplates.Add("Value"); value_sinusoid_AttrTmp.Type = typeof(double); value_sinusoid_AttrTmp.DataReferencePlugIn = _piPointDR; value_sinusoid_AttrTmp.ConfigString = serverPath + @"HighAsset_%Element%_Sinusoid; ptclassname=classic; pointtype=float32; pointsource=R; location1=0; location4=3; location5=0"; // Add attribute templates for random leaf Element Templates. AFAttributeTemplate value_random_AttrTmp = _afContext.RandomLeafTemplate.AttributeTemplates.Add("Value"); value_random_AttrTmp.Type = typeof(double); value_random_AttrTmp.DataReferencePlugIn = _piPointDR; value_random_AttrTmp.ConfigString = serverPath + @"HighAsset_%Element%_Random; ptclassname=classic; pointtype=float32; pointsource=R; location1=0; location4=3; location5=1"; // Create container element under which all leaf elements will be stored. _afContext.Database.Elements.Add("LeafElements"); // Do a bulk checkin of all changes made so far. _afContext.Database.CheckIn(AFCheckedOutMode.ObjectsCheckedOutThisThread); }