Please ensure Javascript is enabled for purposes of website accessibility
Powered by Zoomin Software. For more details please contactZoomin

AF SDK Getting Started

Lesson 5 exercise solutions

  • Last UpdatedMay 16, 2023
  • 2 minute read
  • Exercise 1: Create Event Frame Template

    static AFElementTemplate CreateEventFrameTemplate(AFDatabase database)
    {
    AFElementTemplate eventFrameTemplate =
    database.ElementTemplates["Daily Usage"];
    if (eventFrameTemplate != null)
    return eventFrameTemplate;

    eventFrameTemplate = database.ElementTemplates.Add("Daily Usage");
    eventFrameTemplate.InstanceType = typeof(AFEventFrame);
    eventFrameTemplate.NamingPattern =
    @"%TEMPLATE%-%ELEMENT%-%STARTTIME:yyyy-MM-dd%-EF*";

    AFAttributeTemplate usage =
    eventFrameTemplate.AttributeTemplates.Add("Average Energy Usage");
    usage.Type = typeof(Single);
    usage.DataReferencePlugIn = AFDataReference.GetPIPointDataReference();
    usage.ConfigString = @".\Elements[.]|Energy Usage;TimeRangeMethod=Average";
    usage.DefaultUOM = database.PISystem.UOMDatabase.UOMs["kilowatt hour"];

    if (database.IsDirty)
    database.CheckIn();

    return eventFrameTemplate;
    }

  • Exercise 2: Create Event Frames

    static void CreateEventFrames(AFDatabase database, AFElementTemplate eventFrameTemplate)
    {
    string queryString = "Template:MeterBasic";
    {
    // This method returns the collection of AFBaseElement objects that
    // were created with this template.
    using (AFElementSearch elementQuery =
    new AFElementSearch(database, "Meters", queryString))
    {
    DateTime timeReference = DateTime.Today.AddDays(-7);
    int count = 0;
    foreach (AFElement meter in elementQuery.FindElements())
    {
    foreach (int day in Enumerable.Range(1, 7))
    {
    AFTime startTime = new AFTime(timeReference.AddDays(day - 1));
    AFTime endTime = new AFTime(startTime.LocalTime.AddDays(1));
    AFEventFrame ef = new AFEventFrame(database, "*",
    eventFrameTemplate);
    ef.SetStartTime(startTime);
    ef.SetEndTime(endTime);
    ef.PrimaryReferencedElement = meter;
    // It is good practice to periodically
    // check in the database
    if (++count % 500 == 0)
    database.CheckIn();
    }
    }
    }
    }

    if (database.IsDirty)
    database.CheckIn();
    }

  • Exercise 3: Capture Values

    static public void CaptureValues(AFDatabase database, AFElementTemplate eventFrameTemplate)
    {
    // Formulate search constraints on time and template
    AFTime startTime = DateTime.Today.AddDays(-7);
    string queryString = $"template:\"{eventFrameTemplate.Name}\"";
    using (AFEventFrameSearch eventFrameSearch =
    new AFEventFrameSearch(database, "EventFrame Captures",
    AFEventFrameSearchMode.ForwardFromStartTime, startTime, queryString))
    {
    eventFrameSearch.CacheTimeout = TimeSpan.FromMinutes(5);
    int count = 0;
    foreach (AFEventFrame item in eventFrameSearch.FindEventFrames())
    {
    item.CaptureValues();
    if ((count++ % 500) == 0)
    database.CheckIn();
    }

    if (database.IsDirty)
    database.CheckIn();
    }
    }

  • Exercise 4: Print Report

    static void PrintReport(AFDatabase database, AFElementTemplate eventFrameTemplate)
    {
    AFTime startTime = DateTime.Today.AddDays(-7);
    AFTime endTime =
    startTime.LocalTime.AddDays(+8); // Or DateTime.Today.AddDays(1);
    string queryString =
    $"template:'{eventFrameTemplate.Name}' ElementName:Meter003";
    using (AFEventFrameSearch eventFrameSearch =
    new AFEventFrameSearch(database, "EventFrame Captures",
    AFSearchMode.StartInclusive, startTime, endTime, queryString))
    {
    eventFrameSearch.CacheTimeout = TimeSpan.FromMinutes(5);
    foreach (AFEventFrame ef in eventFrameSearch.FindEventFrames())
    {
    Console.WriteLine("{0}, {1}, {2}",
    ef.Name,
    ef.PrimaryReferencedElement.Name,
    ef.Attributes["Average Energy Usage"].GetValue().Value);
    }
    }
    }

TitleResults for “How to create a CRG?”Also Available in