Skip navigation
All Places > PI Developers Club > Blog > 2019 > April
2019

Upgrades to PI System 2018 SP2

 

A new version of PI Server was recently released; PI Server 2018 SP2. OSIsoft encourages our customers to upgrade to this version to take advantage of all the enhancements and quality improvements that are included with the 2018 SP2 version.

 

Our public PI Web API endpoint and the supporting services behind it at devdata.osisoft.com are also in need of an upgrade.  :-)

 

While OSIsoft does not guarantee an SLA with the DevData public endpoint, we'd like to give you fair warning before we undertake any maintenance activities.

 

 

To that end: devdata.osisoft.com will be unavailable beginning at 4PM Eastern time (New York) on Friday of this week (2019-04-26 20:00 UTC), with an expected max downtime period of three hours as other server-based upgrade and maintenance activities are performed.

 

 

If you experience any issues please send an email to TechnologyEnablementTeam@osisoft.com

Greetings to our PI DevClub community.  It's that time once again where we announce the 2019 class of PI DevClub All-Stars.  Not to spoil the surprise, but I could have dusted off the 2018 announcement, and only scratched off a couple of names.  Allow me to explain these particular awards a bit more.  You do not have to be a paid subscriber to PI Developers Club.  Anyone who is a subscriber is automatically eligible for the award.  For anyone is who is not a subscriber, we review many of their posts to be sure that a significant number of posts are code-related.  However, code is not limited to the PI Developer Technologies (AF SDK, PI Web API, SQL Family).  We include Asset Analytics and PowerShell as well.

 

What you will discover common in all the winners is not just a sharp technical knowledge of PI, but more so a willingness to help others.  Awards are given as a recognition of such spirit to help others.

 

PI Developers Club Community All-Stars

This is a repeat across the board as 2018.

 

  • Roger Palmen  checks in at the top of our list.  This should not be surprising to anyone who even casually follows the forums.  Since winning All-Star the previous year, Roger has also climbed to top of the All-Time Leaderboard.  Seriously, I have lost track of how many consecutive years Roger has won.  7 or 8 maybe.
  • John Messinger  wins for the 3rd year in a row.
  • Dan Fishman  wins for the 2nd year in a row.

 

It's interesting having a global community because when I wake up in the morning to read the forums, these All-Stars have most likely already replied to most new questions.  John is from Australia, Roger from the Netherlands, and Dan is US-based.

 

PI Developers Club Rising Star

Anyone who has not previously won an All-Star or Rising Star award is eligible for Rising Star as long as some portion of their posts have been code-related.  This years recipient is a very prolific poster, the majority of which are not within the PI DevClub forums.  Nonetheless since he posts with such a high volume, we were able to easily find many that were code-related.

 

 

 

Prizes

The Community All-Stars and Rising Star all win the same award:

 

  • Amazon Gift Card worth 400 USD.
  • 1 year free subscription to PI Developers Club.
  • 100% discount to one of the following PI World events: Gothenburg 2019 or any PI World 2020.

 

 

Employee All-Stars

While all OSIsoft employees are always eager to give a helping hand, we want to recognize those they go the extra mile.  Our 2019 Internal All-Stars are:

 

Sebastien Raposo  And Seb is already making a strong claim for 2020 with his excellent, must-read series on Asset Analytics.

Jinmo Yi  wins for the 2nd year in a row.

David Hearn  is a multiple recipient.  I joke that I know when the Asset team has completed their sprint because David's posting activity increases around that time.

 

The Internal All-Stars each win an Amazon Gift Card worth 200 USD.

 

 

Never too late to think of next year

It's not impossible to break into the top 3 and shake the grip that Roger, John, and Dan have on the All-Star awards.  I have seen Ernst Amort (prefers being called Holger) and Jim Gavigan each with good activity in their own blogs.  Will Rhys Kirk, Asle Frantzen, or Lonnie Bowling find time in their jobs to post more and find themselves returning to the winners circle?  Time will tell.  See you next year when we announce the 2020 winners.

Last week during PI World, Rong Xu and I gave a talk about using PI Web API with PowerApps.

 

PowerApps is a tool offered by Microsoft which features a drag and drop app building experience. Adding logic to access PI Web API and controlling other UI components is similar to calling functions in Microsoft Excel. This reduces the technical knowledge in order to create custom solutions using your PI System data.

 

Click image below to ENLARGE

EditorScreen.PNG

 

As promised, I've attached the PowerApps app, Postman Collection and a copy of the AF database that was used in this talk. Be aware that exporting and importing apps are still a 'preview' feature in PowerApps so you may run into issues using this export directly. Instead, I recommend following along with the recording to build up the app.

 

The Postman Collection contains the requests that were used in this talk. Take note that the Web IDs used in this collection will not work in your environment because they contain information specific to the AF Server that was targeted in the talk.

WebID

 

Early last year I introduced you to a deep dive of how WebID works internally in PI Web API.  For those of you generating Web API clients using OpenAPI and Swagger, you'll notice straight away that your web clients do not include a helper for constructing and deconstructing WebID strings.  This requires you to use a helper.  Here is one that I wrote by hand for the Google Go language (golang), which is pretty simple to use.

 

To construct a WebID you find the appropriate structure you need to find the right struct to create a WebID from a path (and optionally, specify supporting information if there's a subtype needed).  When constructing WebID locally this code example here will always build PathOnly WebID types, since those are the most human-readable.

 

For encoding a WebID for an ElementAttribute, that looks like this:

 

webid := EncodeWebID(NewAFAttributeWebID("CLSAF\\Chris\\CLSAF|Memory % In Use", IS_AF_ELEMENT))

 

And encoding a WebID locally for a PI Point looks like this:

 

webid := EncodeWebID(NewPIPointWebID("CLSAF\\SINUSOID"))

 

Enjoy!

 

The Go code

 

package gowebapi

import (
    "encoding/base64"
    "fmt"
    "log"
    "strings"
)

type BaseElementType int
type AnalysisRuleOwnerType int
type EnumerationSourceMarkerType int
type TimeRuleOwnerType int

// Used by AFAnalysisRuleWebID
const (
    ANALYSIS_RULE_OWNER_ANALYSIS AnalysisRuleOwnerType = 0
    ANALYSIS_RULE_OWNER_TEMPLATE AnalysisRuleOwnerType = 1
)

// Used by AFAttribute
const (
    IS_AF_ELEMENT      BaseElementType = 0
    IS_AF_EVENTFRAME   BaseElementType = 1
    IS_AF_NOTIFICATION BaseElementType = 2
)

// Used by AFEnumerationSet
const (
    ENUM_SOURCE_MARKER_IS_PISYSTEM = 0
    ENUM_SOURCE_MARKER_IS_PISERVER = 1
)

// Used by AFTimeRule
const (
    TIME_RULE_OWNER_ANALYSIS         = 0
    TIME_RULE_OWNER_ANALYSISTEMPLATE = 1
)

// *************************************************
// Structures to represent decoded WebIDs
// *************************************************

type AFAnalysisWebID struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type AFAnalysisCategoryWebID struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type AFAnalysisTemplateWebID struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type AFAnalysisRuleWebID struct {
    Type        string
    Version     string
    Marker      string
    OwnerMarker string
    Name        string
}
type AFAnalysisRulePluginWebID struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type AFAttributeWebID struct {
    Type              string
    Version           string
    Marker            string
    BaseElementMarker string
    Name              string
}

type AFAttributeCategoryWebID struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type AFAttributeTemplateWebID struct {
    Type                  string
    Version               string
    Marker                string
    ElementTemplateMarker string
    Name                  string
}

type AFDatabaseWebID struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type AFElementWebID struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type AFElementCategoryWebID struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type AFElementTemplateWebID struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type AFEnumerationSetWebID struct {
    Type         string
    Version      string
    Marker       string
    SourceMarker string
    Name         string
}

type AFEnumerationValueWebID struct {
    Type         string
    Version      string
    Marker       string
    SourceMarker string
    Name         string
}

type AFEventFrameWebID struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type AFNotificationWebID struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type AFNotificationTemplateWebID struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type AFNotificationContactTemplateWebID struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type AFTimeRuleWebID struct {
    Type        string
    Version     string
    Marker      string
    OwnerMarker string
    Name        string
}

type AFTimeRulePluginWebID struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type AFSecurityIdentityWebId struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type AFSecurityMappingWebId struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type AFTableWebId struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type AFTableCategoryWebId struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type PIPointWebId struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type PIServerWebId struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type PISystemWebId struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type UOMWebId struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

type UOMClassWebId struct {
    Type    string
    Version string
    Marker  string
    Name    string
}

// *************************************************
// Functions to create parseable WebID structures
// *************************************************

func NewAFAnalysisWebID(path string) AFAnalysisWebID {
    var webID AFAnalysisWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "Xs"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFAnalysisCategoryWebID(path string) AFAnalysisCategoryWebID {
    var webID AFAnalysisCategoryWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "XC"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFAnalysisTemplateWebID(path string) AFAnalysisTemplateWebID {
    var webID AFAnalysisTemplateWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "XT"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFAnalysisRuleWebID(path string, ownerType AnalysisRuleOwnerType) AFAnalysisRuleWebID {
    var webID AFAnalysisRuleWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "XR"

    switch ownerType {
    case ANALYSIS_RULE_OWNER_ANALYSIS:
        webID.OwnerMarker = "X"
    case ANALYSIS_RULE_OWNER_TEMPLATE:
        webID.OwnerMarker = "T"
    }

    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFAnalysisRulePluginWebID(path string) AFAnalysisRulePluginWebID {
    var webID AFAnalysisRulePluginWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "XP"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFAttributeWebID(path string, baseType BaseElementType) AFAttributeWebID {
    var webID AFAttributeWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "Ab"

    switch baseType {
    case 0:
        webID.BaseElementMarker = "E"
    case 1:
        webID.BaseElementMarker = "F"
    case 2:
        webID.BaseElementMarker = "N"
    }

    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFAttributeCategoryWebID(path string) AFAttributeCategoryWebID {
    var webID AFAttributeCategoryWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "AC"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFAttributeTemplateWebID(path string) AFAttributeTemplateWebID {
    var webID AFAttributeTemplateWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "AT"
    webID.ElementTemplateMarker = "E"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFDatabaseWebID(path string) AFDatabaseWebID {
    var webID AFDatabaseWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "RD"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFElementWebID(path string) AFElementWebID {
    var webID AFElementWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "Em"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFElementCategoryWebID(path string) AFElementCategoryWebID {
    var webID AFElementCategoryWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "EC"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFElementTemplateWebID(path string) AFElementTemplateWebID {
    var webID AFElementTemplateWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "ET"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFEnumerationSetWebID(path string, sourceMarker EnumerationSourceMarkerType) AFEnumerationSetWebID {
    var webID AFEnumerationSetWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "MS"

    switch sourceMarker {
    case ENUM_SOURCE_MARKER_IS_PISYSTEM:
        webID.SourceMarker = "R"
    case ENUM_SOURCE_MARKER_IS_PISERVER:
        webID.SourceMarker = "D"
    }

    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFEnumerationValueWebID(path string, sourceMarker EnumerationSourceMarkerType) AFEnumerationValueWebID {
    var webID AFEnumerationValueWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "MV"

    switch sourceMarker {
    case ENUM_SOURCE_MARKER_IS_PISYSTEM:
        webID.SourceMarker = "R"
    case ENUM_SOURCE_MARKER_IS_PISERVER:
        webID.SourceMarker = "D"
    }

    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFEventFrameWebID(path string) AFEventFrameWebID {
    var webID AFEventFrameWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "Fm"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFNotificationWebID(path string) AFNotificationWebID {
    var webID AFNotificationWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "Nf"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFNotificationTemplateWebID(path string) AFNotificationTemplateWebID {
    var webID AFNotificationTemplateWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "NT"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFNotificationContactTemplateWebID(path string) AFNotificationContactTemplateWebID {
    var webID AFNotificationContactTemplateWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "NC"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFTimeRuleWebID(path string, ownerType TimeRuleOwnerType) AFTimeRuleWebID {
    var webID AFTimeRuleWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "TR"

    switch ownerType {
    case TIME_RULE_OWNER_ANALYSIS:
        webID.OwnerMarker = "X"
    case TIME_RULE_OWNER_ANALYSISTEMPLATE:
        webID.OwnerMarker = "T"
    }

    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFTimeRulePluginWebID(path string) AFTimeRulePluginWebID {
    var webID AFTimeRulePluginWebID

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "TP"

    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFSecurityIdentityWebID(path string) AFSecurityIdentityWebId {
    var webID AFSecurityIdentityWebId

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "SI"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFSecurityMappingWebID(path string) AFSecurityMappingWebId {
    var webID AFSecurityMappingWebId

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "SM"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFTableWebID(path string) AFTableWebId {
    var webID AFTableWebId

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "Bl"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewAFTableCategoryWebID(path string) AFTableCategoryWebId {
    var webID AFTableCategoryWebId

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "BC"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewPIPointWebID(path string) PIPointWebId {
    var webID PIPointWebId

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "DP"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewPIServerWebID(path string) PIServerWebId {
    var webID PIServerWebId

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "DS"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewPISystemWebID(path string) PISystemWebId {
    var webID PISystemWebId

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "RS"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewUOMWebID(path string) UOMWebId {
    var webID UOMWebId

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "Ut"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

func NewUOMClassWebID(path string) UOMClassWebId {
    var webID UOMClassWebId

    webID.Type = "P"
    webID.Version = "1"
    webID.Marker = "UC"
    webID.Name = strings.TrimSpace(strings.ToUpper(path))

    return webID
}

// *************************************************
// Functions that process WebIDs
// *************************************************

// Converts a string to a de-padded Base64 string
func Base64EncodeNoPadding(text string) string {
    return strings.Replace(base64.StdEncoding.EncodeToString([]byte(text)), "=", "", -1)
}

// By passing in any number of WebID structures, you get back a valid WebID to use
// when calling PI Web API endpoints or sending structure lists.
func EncodeWebID(webIdStructure interface{}) (webIDString string) {

    switch webIdStructure.(type) {
    case AFAnalysisWebID:
        webId := webIdStructure.(AFAnalysisWebID)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFAnalysisCategoryWebID:
        webId := webIdStructure.(AFAnalysisCategoryWebID)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFAnalysisTemplateWebID:
        webId := webIdStructure.(AFAnalysisTemplateWebID)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFAnalysisRuleWebID:
        webId := webIdStructure.(AFAnalysisRuleWebID)
        return fmt.Sprintf("%v%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            webId.OwnerMarker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFAnalysisRulePluginWebID:
        webId := webIdStructure.(AFAnalysisRulePluginWebID)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFAttributeWebID:
        webId := webIdStructure.(AFAttributeWebID)
        return fmt.Sprintf("%v%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            webId.BaseElementMarker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFAttributeCategoryWebID:
        webId := webIdStructure.(AFAttributeCategoryWebID)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFAttributeTemplateWebID:
        webID := webIdStructure.(AFAttributeTemplateWebID)
        return fmt.Sprintf("%v%v%v%v%v",
            webID.Type,
            webID.Version,
            webID.Marker,
            webID.ElementTemplateMarker,
            Base64EncodeNoPadding(webID.Name),
        )
    case AFDatabaseWebID:
        webId := webIdStructure.(AFDatabaseWebID)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFElementWebID:
        webId := webIdStructure.(AFElementWebID)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFElementCategoryWebID:
        webId := webIdStructure.(AFElementCategoryWebID)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFElementTemplateWebID:
        webId := webIdStructure.(AFElementTemplateWebID)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFEnumerationSetWebID:
        webId := webIdStructure.(AFEnumerationSetWebID)
        return fmt.Sprintf("%v%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            webId.SourceMarker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFEnumerationValueWebID:
        webId := webIdStructure.(AFEnumerationValueWebID)
        return fmt.Sprintf("%v%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            webId.SourceMarker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFEventFrameWebID:
        webId := webIdStructure.(AFEventFrameWebID)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFNotificationWebID:
        webId := webIdStructure.(AFNotificationWebID)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFNotificationTemplateWebID:
        webId := webIdStructure.(AFNotificationTemplateWebID)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFNotificationContactTemplateWebID:
        webId := webIdStructure.(AFNotificationContactTemplateWebID)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFTimeRuleWebID:
        webId := webIdStructure.(AFTimeRuleWebID)
        return fmt.Sprintf("%v%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            webId.OwnerMarker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFTimeRulePluginWebID:
        webId := webIdStructure.(AFTimeRulePluginWebID)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFSecurityIdentityWebId:
        webId := webIdStructure.(AFSecurityIdentityWebId)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFSecurityMappingWebId:
        webId := webIdStructure.(AFSecurityMappingWebId)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFTableWebId:
        webId := webIdStructure.(AFTableWebId)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case AFTableCategoryWebId:
        webId := webIdStructure.(AFTableCategoryWebId)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case PIPointWebId:
        webId := webIdStructure.(PIPointWebId)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case PIServerWebId:
        webId := webIdStructure.(PIServerWebId)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case PISystemWebId:
        webId := webIdStructure.(PISystemWebId)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case UOMWebId:
        webId := webIdStructure.(UOMWebId)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    case UOMClassWebId:
        webId := webIdStructure.(UOMClassWebId)
        return fmt.Sprintf("%v%v%v%v",
            webId.Type,
            webId.Version,
            webId.Marker,
            Base64EncodeNoPadding(webId.Name),
        )
    }

    log.Fatal("The item you passed to gowebapi.EncodeWebID() is not a supported type. Use the pi.New..WebId functions to create a valid WebID struct.")
    return ""
}

Greetings fellow PI Geeks!

 

It is about to be that time of the year again next week where we come together to learn from each other and share about the innovative and exciting things that is made possible with the wonderful PI System.

 

 

Cloud computing will be one of the major themes in this year's event. At OSIsoft, our Cloud Vision is to be Ready Now, Ready for Tomorrow.

To fulfill this vision today, the traditional on-premise PI System workloads can be migrated to an IaaS model in the cloud. In the future, a PaaS model migration will also be possible with OSIsoft Cloud Services.

For those of you who are looking to deploy a PI System effortlessly in the cloud in just a matter of minutes, there is a Tech Talk that is perfect for you!

Unlike a normal talk, this Tech Talk will go more in-depth into the topic presented with live demos, and will last for 90 minutes as opposed to the usual 45 minutes.

 

Below are the details of the Tech Talk that will be presented by me and Valentin.

 

Effortlessly deploying a PI System in Azure or AWS

Time: Day 2, 10 April 2019, Wednesday, 2:30 PM - 4:00 PM

Location: Parc 55, Mission II, Level 4

 

An increasing number of organizations are migrating their IT workloads to cloud platforms as part of their digital transformation and cloud first initiatives. New techniques have emerged to ease some of these challenges with automating deployments of network, storage and compute. Join us in this Tech Talk to learn about using automation and infrastructure as code tools to deploy a PI System simply on Amazon Web Services or Microsoft Azure cloud. AWS CloudFormation templates and ARM scripts are used for hosting the PI System on these platforms, helping to automate Dev/Test/Prod deployment of the PI System.

 

Hope to see you next Wednesday and have a great weekend!

Filter Blog

By date: By tag: