private CanvasPositionSource(string serialNumber, int panelID, EPositionPart part) :
            base(getID(serialNumber, panelID, part), getDisplayName(part), getCategory(serialNumber, panelID))
        {
            Communication.StaticOnLayoutEvent += ExternalControlEndpoint_StaticOnLayoutEvent;
            SerialNumber = serialNumber;
            PanelID      = panelID;
            Part         = part;
            var position = NanoleafPlugin.getClient(SerialNumber).Panels.First(p => p.ID.Equals(panelID));

            switch (part)
            {
            case EPositionPart.X:
                CurrentValue = position.X;
                break;

            case EPositionPart.Y:
                CurrentValue = position.Y;
                break;

            case EPositionPart.Orientation:
                CurrentValue = position.Orientation;
                break;
            }
        }
 private static string getDisplayName(EPositionPart part)
 {
     return(part.ToString());
 }
 private static string getID(string serialNumber, int panelID, EPositionPart part)
 {
     return($"Nanoleaf-{serialNumber}-Canvas:{panelID}-Position:{part}");
 }