Public/ConvertTo-LMDynamicGroupFromCategories.ps1

<#
.SYNOPSIS
Create a series of dynamic groups based off of active system.categories applied to your portal

.DESCRIPTION
Created dynamic groups based on in use device categories

.EXAMPLE
ConvertTo-LMDynamicGroupFromCategories

.NOTES
Created groups will be placed in devices by type default resource group

.INPUTS
None. You cannot pipe objects to this command.

.LINK
Module repo: https://github.com/stevevillardi/Logic.Monitor

.LINK
PSGallery: https://www.powershellgallery.com/packages/Logic.Monitor
#>

Function ConvertTo-LMDynamicGroupFromCategories {

    $device_list = @()
    $category_list = @()

    #Get list of LM devices
    $devices = Get-LMDevice

    #Loop through each device build custom object
    foreach ($dev in $devices) {
        $device_list += [PSCustomObject]@{
            id          = $dev.id
            displayName = ($dev.displayName).toupper()
            categories  = ($dev.customProperties[$dev.customProperties.name.IndexOf("system.categories")].value).Split(",")

        }
    }

    #Loop through custom object and aggregate categories
    foreach ($category in $device_list.categories) {
        $category_list += $category
    }

    #Dedupe list down to unique values
    $category_list = $category_list | Select-Object -Unique

    #Grab id for devices by type folder (could optionally be set to any group)
    $root_group = (Get-LMDeviceGroup -Name "Devices by Type").id

    #if we have a matching folder continue
    if ($root_group) {
        #Grab list of dynamic groups currently inside root group
        $current_groups = (Get-LMDeviceGroupGroups -Id $root_group).name

        #Compare the group list and pull out anything we already created or matches existing groups
        $creation_list = (Compare-Object -ReferenceObject $current_groups -DifferenceObject $category_list.Replace("/", " ").Replace("_", " ") | Where-Object { $_.SideIndicator -eq "=>" }).InputObject
    
        #Loop trough category list and create any groups not already exisitng
        foreach ($group in $creation_list) {
            $name = $group.Replace("/", " ").Replace("_", " ")
            New-LMDeviceGroup -Name $name -AppliesTo "hasCategory(`"$group`")" -ParentGroupId $root_group -Description "Auto created by PowerShell module"
        }
    }
}