diff --git a/_includes/docs/user-guide/calculated-fields/geofencing-calculated-field.md b/_includes/docs/user-guide/calculated-fields/geofencing-calculated-field.md
index e69de29bb2..c2aebe6a50 100644
--- a/_includes/docs/user-guide/calculated-fields/geofencing-calculated-field.md
+++ b/_includes/docs/user-guide/calculated-fields/geofencing-calculated-field.md
@@ -0,0 +1,275 @@
+* TOC
+{:toc}
+
+The **Geofencing** Calculated Field allows you to monitor entity movement in real-time without complex rule chains.
+It allows you to abstract complex spatial logic into a simple configuration, automatically monitoring whether an entity
+(such as a vehicle or container) is located within specific areas like restricted zones, parking lots, or operational boundaries.
+
+
+
+## Why use the Geofencing Calculated Field?
+
+Prior to this feature, GPS geofencing in ThingsBoard was primarily handled using Rule Nodes.
+While powerful for simple checks, the [GPS Geofencing Events](/docs/user-guide/rule-engine-2-0/nodes/action/gps-geofencing-events/)
+node has a critical architectural limitation regarding state management:
+
+- **Single State Limitation:** node persists an entity's geofencing state (Inside/Outside) using a fixed key tied to the Rule Engine service that processing the node. It effectively maintains only one state record per entity.
+- **The Conflict:** because the state is shared, you cannot track multiple distinct zones (e.g., "Safe Zone" and "Restricted Zone") simultaneously. Checking against Zone A and then Zone B would overwrite the single state record, causing the status to flip back and forth and triggering false "Entered" or "Left" events.
+
+The **Geofencing Calculated Field** solves this by introducing **Zone Groups:**
+
+- **Independent State Management:** the calculated field maintains a separate state for every configured zone group. This allows you to track if a device is "INSIDE" a "Safe Zone" while simultaneously being "OUTSIDE" a "Restricted Area" without any conflict.
+- **Zone Grouping:** when using related entities as zone sources, it can treat multiple physical polygons as a single logical group. If a device moves between two adjacent zones of the same type (e.g., "Restricted" areas), the field maintains a continuous "INSIDE" status, preventing false transition events.
+- **Alarm-Ready Output:** The field produces standardized telemetry (`Status` and `Event` values) per each group that can be passed directly into **Alarm Rules**, eliminating the need for complex rule chain logic to trigger alarms.
+
+
+
+## Creating a calculated field
+
+{% include /docs/user-guide/calculated-fields/blocks/creating-calculated-field.md %}
+
+
+
+## Configuration
+
+Define the entity coordinates, configure zone groups with their perimeter sources and reporting strategies.
+
+### General
+
+{% assign calculatedFieldType = "Select the Geofencing calculated field type — it evaluates real-time GPS coordinates against configured zone groups to track entity presence and detect transition events."%}
+{% include /docs/user-guide/calculated-fields/blocks/general-configuration.md %}
+
+
+
+### Entity coordinates
+
+Specifies the input data for the calculation. You must map the timeseries keys from the incoming telemetry that represent the entity's GPS location.
+
+- **Latitude / Longitude:** Enter the specific key names (e.g., "latitude" and "longitude" or "lat", "lng").
+- **Requirement:** The values must be numeric. If coordinates are missing or invalid, the calculation will be skipped.
+
+
+
+### Zone Groups
+
+A zone group is a logical category that bundles one or more physical zones (e.g., "Parking", "Restricted", "Loading") into an aggregated status check. The field evaluates all zones in the group to determine the entity's position:
+
+- "INSIDE": If the entity is present in any of the zones within the group.
+- "OUTSIDE": If the entity is not present in any of them.
+
+Click "Add zone group" to configure a new group. In the zone group configuration window, specify the following settings:
+
+#### Name
+
+The zone group name is used as a prefix for the generated geofencing telemetry (e.g., Name + `Status` and Name + `Event`).
+We recommend using camelCase (e.g., restrictedArea instead of Restricted Area) to ensure your output keys are clean and easy to use (e.g., `restrictedAreaStatus`, `restrictedAreaEvent`).
+
+#### Entity type
+
+When you configure a group, the system needs to know where the zone definitions (the polygons) are stored. This is determined by the Entity Type (Source) setting.
+To choose the right source, ask yourself:
+
+- Is this "self-geofencing" where each tracker has its own unique zone?
+ - _Answer:_ Yes.
+ - _Action:_ Select "Current entity".
+ - _How it works:_ The field looks for the perimeter attribute directly on the entity itself. This is perfect for "Home" zones or custom "Safe Areas" that are unique to each specific entity.
+
+- Does the group contain multiple zones, or will zones be added/removed dynamically?
+ - _Answer:_ Yes.
+ - _Action:_ Select a "Related entities" and configure a [Path from Entity to Zones](#path-from-entity-to-zones).
+ - _How it works:_ The field discovers zones by following a configured relation path starting from your entity. You can chain multiple levels in different directions to reach the target assets.
+ - _Example:_ Go "UP" from "Vehicle" to "Fleet" using the "FleetToVehicle" relation type, then go "DOWN" from "Fleet" to "Zone" using the "FleetToRestrictedZone" relation type.
+ - _Best Practice:_ This approach maximizes scalability. It allows you to use a single "Zone" asset profile for all geometries, while using different relation types (e.g., FleetToParking, FleetToRestricted) to logically group them. This way, a single fleet can easily manage multiple distinct zone groups without complex configuration.
+
+- Is this a general perimeter defined for an entire hierarchy (e.g., all devices under a Customer)?
+ - _Answer:_ Yes.
+ - _Action:_ Select "Current Tenant" or "Current Owner".
+ - _How it works:_ The field fetches the perimeter attribute from the business entity (Tenant or Customer) that owns the device. This effectively lets the device "inherit" a zone defined at the organizational level.
+ - _Best Practice:_ This is ideal for broad, high-level policies. For example, if you have a multi-customer solution, each "Owner" (Customer) entity can define its own global "Service Area" polygon. All devices belonging to that customer will automatically use that specific perimeter, keeping the solution dynamic and maintenance-free.
+
+> **⚠️ Note:** While you can select a specific static Device, Asset, or Customer, this is generally not recommended for production. It hardcodes a specific ID, which limits flexibility and makes it difficult to reuse this entity across different customers or tenants without manual reconfiguration.
+
+#### Perimeter attribute key
+
+Enter the name of the server-side attribute key name (on the source entity) that contains the zone geometry.
+
+- **Requirement:** The attribute value must be a JSON object defining the zone boundaries.
+- **Supported Perimeter Shapes:** The field supports both [Polygons](/docs/user-guide/widgets/map-widgets/#polygon) and [Circles](/docs/user-guide/widgets/map-widgets/#circle). Please refer to the linked documentation for the required JSON structure.
+
+#### Report strategy
+
+This setting controls what telemetry data the calculated field generates for the group. Choose the strategy that best fits your monitoring needs:
+
+- **Presence status and transition events**
+ - _Output:_ Generates both status (`INSIDE`/`OUTSIDE`) and events (`ENTERED`/`LEFT`).
+ - _Best For:_ Comprehensive monitoring. This allows you to visualize current status on dashboards *and* trigger real-time notifications or alarms based on entry/exit events.
+
+- **Presence status only**
+ - _Output:_ Generates only the status (`INSIDE`/`OUTSIDE`).
+ - _Best For:_ Simple state monitoring. Use this if you only need to know where the entity *is right now* (e.g., "Is the truck in the garage?") and do not need a historical log of transition events.
+
+- **Transition events only**
+ - _Output:_ Generates only the event (`ENTERED`/`LEFT`) when the status changes.
+ - _Best For:_ Event-driven logic. Use this to minimize data storage if you only care about the *moment* a boundary is crossed (e.g., counting how many times a vehicle entered a site).
+
+#### Path from Entity to Zones (only for the "Related Entities" entity type) {#path-from-entity-to-zones}
+
+This section defines the precise "road map" the system follows to find the zone entities.
+The path starts from the **Source Entity** (the Device or Asset running this Calculated Field) and follows the relations you specify.
+
+- **Level:** The sequence number indicating the depth of the relation step.
+ > **⚠️ Note:** The minimum level is 1. The maximum allowed depth is determined by the "Maximum relation level per 'Related entities' argument" in your Tenant Profile configuration.
+- **Direction:**
+ - **Up:** Looks for parent entities (e.g., from Device up to Fleet).
+ - **Down:** Looks for child entities (e.g., from Fleet down to Zone).
+- **Relation type:** The specific connection name to follow for each step (e.g., "FleetToVehicle", "FleetToRestrictedZone", "FleetToNoParkingZone").
+
+> **💡 Configuration Flexibility:** You are not restricted to a specific topology.
+> You can configure a single-level path (e.g., just one Up step if the zone is directly related to the source entity)
+> or a complex multi-level path (mixing Up and Down) depending on your entities hierarchy.
+
+**Example Configuration:** To find zones for a vehicle (Source Entity) that belongs to a fleet:
+ - **Level 1:** Direction: "Up", Relation type: VehicleToFleet (Finds the Fleet).
+ - **Level 2:** Direction: "Down", Relation type: "FleetToRestrictedZone" (Finds all zone entities linked to that Fleet with the "FleetToRestrictedZone" relation type).
+
+#### Create relations with matched zones (only for the "Related Entities" entity type)
+
+This feature is disabled by default. When enabled, the calculated field automatically creates relations between your Source Entity and the specific Zone Entity
+it is currently inside.
+
+**Lifecycle:** The calculated field automatically manages this relation based on the entity's movement:
+ - **On Enter:** The relation is created immediately when the entity enters the zone.
+ - **On Leave:** The relation is deleted immediately when the entity leaves the zone.
+
+**Use Case:** This is essential for dashboards where you want to see who is currently in a specific zone.
+- _Example:_ You can query the "Parking Area" asset to list all "Vehicle" entities that currently have a "CurrentlyInside" relation to it.
+
+**Configuration:**
+
+- **Relation direction:**
+ - **From zone to entity:** The Zone becomes the Parent and the Source Entity becomes the Child.
+ - **From entity to zone:** The Source Entity becomes the Parent and the Zone becomes the Child.
+- **Relation type:** The name of the relation type to create (e.g., "CurrentlyInside").
+
+#### Zone groups refresh interval (Visible when at least one group uses "Related entities")
+
+This setting controls how frequently the system updates the cache for dynamically found zones. You can disable, increase, or decrease this interval to balance data freshness against system performance.
+
+- **Function:** Defines the time the system waits before checking the database for changes in zone relations (e.g., a device moving to a new fleet).
+- **Configuration:**
+ - **Toggle Disabled:** The system fetches the zone relations once and never refreshes them. Use this only if your entity relations are permanent (e.g., static infrastructure) and will never change during runtime.
+ - **Toggle Enabled:** The system refreshes relations periodically based on the configured seconds.
+ > **⚠️ Note:** The minimum allowed value is determined by the "Min allowed update interval for 'Related entities' arguments" parameter in your Tenant Profile.
+ - **Tuning:**
+ - **Low Value (e.g., 60s):** Required when zone relations change dynamically. This minimizes the delay in detecting changes. While not instantaneous, it ensures that shortly after a reassignment (e.g., within 60s), the system updates its cache and applies the geofencing logic for incoming telemetry with the latest zones.
+ - **High Value (e.g., 3600s):** Recommended for environments where relations rarely change. This maximizes performance by reducing database load (caching the relations for a longer period).
+
+
+
+### Output
+
+The Geofencing field automatically generates internal variables based on your **Zone Group Names** and **Report Strategy**.
+You must map these variables to final output keys (Telemetry or Attributes) in this section.
+
+**Generated Variables Naming Convention:**
+
+The system constructs variable names by combining the **Zone Group Name** with the suffix `Status` or `Event`.
+
+For a group named **restrictedArea**:
+
+- **restrictedAreaStatus**
+ - _Values:_ `INSIDE`, `OUTSIDE`
+ - _Availability:_ Generated if zone group report strategy includes "Presence status".
+- **restrictedAreaEvent**
+ - _Values:_ `ENTERED`, `LEFT`
+ - _Availability:_ Generated only when a transition occurs, and the zone group report strategy includes "Transition events".
+
+> **💡 Best Practice:** Map these variables to **Time Series** data to maximize flexibility for both Dashboards and Alarms:
+ - **Status Variable:**
+ - _Visualization:_ Ideal for showing the current state (e.g., an LED indicator or map marker color).
+ - _Alarms:_ Perfect for duration-based logic (e.g., Trigger alarm if "restrictedAreaStatus" equals `INSIDE` for > 15 minutes).
+ - **Event Variable:**
+ - _Visualization:_ Useful for plotting historical transitions on charts or event tables.
+ - _Alarms:_ Perfect for instant triggers (e.g., Trigger alarm immediately when "restrictedAreaEvent" equals `ENTERED`).
+
+{% include /docs/user-guide/calculated-fields/blocks/output-strategy.md %}
+
+
+
+## Usage Examples
+
+To help you get started, here are three common configuration patterns applied to real-world scenarios.
+
+### Scenario 1: Pet Tracker (Self-Geofencing)
+
+**Use Case:** You are building a pet tracking solution. Each dog collar has a unique "Home Zone" defined by the owner (e.g., a 40-meter radius around their specific house).
+
+{% assign petTrackingUsageExample = '
+ ===
+ image: /images/user-guide/calculated-fields/geofencing/pet-tracking-example-1.png
+ title: You are building a pet tracking solution. Each dog collar has a unique “Home Zone” defined by the owner (e.g., a 40-meter radius around their specific house).'
+%}
+
+{% include images-gallery.liquid imageCollection=petTrackingUsageExample %}
+
+- **Goal:** Detect if the dog leaves its specific safety zone.
+- **Configuration:**
+ - **Entity Type:** "Current entity"
+ - **Perimeter Attribute:** "safeZone" (A server-side attribute on the device containing the circle geometry).
+- **Why this fits:** The zone is unique to the device. "Buddy" the dog has a different home location than "Rex," so the geometry must live on the device itself.
+
+### Scenario 2: Warehouse Equipment (Direct Association)
+
+**Use Case:** You manage a large distribution center. You have 2 forklifts, and each forklift is assigned to a specific "Warehouse Building" asset.
+
+{% assign warehouseEquipmentExample = '
+ ===
+ image: /images/user-guide/calculated-fields/geofencing/warehouse-equipment-example-2.png
+ title: You manage a large distribution center. You have 2 forklifts, and each forklift is assigned to a specific “Warehouse Building” asset.'
+%}
+
+{% include images-gallery.liquid imageCollection=warehouseEquipmentExample %}
+
+- **Goal:** Detect if a forklift leaves its assigned building.
+- **Configuration:**
+ - **Entity Type:** "Related entities"
+ - **Path:**
+ - _Level 1:_ Direction "Up", Relation type "Contains" (Finds the Warehouse that contains this forklift).
+- **Why this fits:** You don't need to draw the warehouse polygon 2 times. You draw it once on the "Warehouse Asset," and all contained forklifts automatically inherit it.
+
+### Scenario 3: Complex Fleet Management (Multiple Zone Types)
+
+**Use Case:** A logistics company manages a fleet of trucks. Each fleet must comply with complex rules involving multiple different types of areas simultaneously.
+
+{% assign complexFleetManagementExample = '
+ ===
+ image: /images/user-guide/calculated-fields/geofencing/complex-fleet-management-example-3.png
+ title: A logistics company manages a fleet of trucks. Each fleet must comply with complex rules involving multiple different types of areas simultaneously.'
+%}
+
+{% include images-gallery.liquid imageCollection=complexFleetManagementExample %}
+
+- **Goal:** Monitor three distinct conditions for the same truck at the same time:
+ 1. **Allowed:** Is the truck inside its designated "Service Zone"? (e.g., The main delivery district).
+ 2. **Restricted:** Did the truck enter a "No-Go Zone"? (e.g., A restricted facility or hazardous area located elsewhere).
+
+- **Configuration:** You would add **two separate zone groups** inside the same calculated field. Note that they both start by going **Up** to find the Fleet, then **Down** to find the specific zones.
+
+ 1. **"serviceArea" group path:** Up to Fleet (Contains) → Down to Zone (FleetToAllowedZone).
+ 2. **"restrictedArea" group path:** Up to Fleet (Contains) → Down to Zone (FleetToRestrictedZone).
+
+> **💡 Visualization Note:** In this demo, the Zone assets include a "zoneType" server attribute ("allowed" or "restricted").
+> This is used solely for simple color-coding on the Map Widget (Green vs. Red).
+> The Calculated Field logic does not use this attribute; it relies entirely on the Relation Type (FleetToAllowedZone vs FleetToRestrictedZone).
+
+- **Why this fits:**
+ - **Logic abstraction:** You can effectively "tag" a zone as Restricted or Allowed just by changing the relation type, and the trucks automatically apply the correct logic.
+ - **Centralized Scalability:** You can add a new restricted zone to the Fleet asset once, and hundreds of trucks will immediately begin avoiding it—no device-level updates required.
+ - **Dynamic Context:** If a truck is transferred to a different fleet, it automatically stops using the old zones and inherits the new fleet's boundaries instantly.
+
+
+
+## Your feedback
+
+Don't hesitate to star ThingsBoard on [github](https://github.com/thingsboard/thingsboard){:target="_blank"} to help us spread the word.
+If you have any questions about this sample, please [contact us](/docs/contact-us/){:target="_blank"}.
\ No newline at end of file
diff --git a/_includes/docs/user-guide/calculated-fields/index.md b/_includes/docs/user-guide/calculated-fields/index.md
index 056724b2ee..ff5f8f06ea 100644
--- a/_includes/docs/user-guide/calculated-fields/index.md
+++ b/_includes/docs/user-guide/calculated-fields/index.md
@@ -26,7 +26,7 @@ Using expressions, scripts, or specialized processing modes, users can standardi
- **Energy analytics** — calculating hourly/daily consumption and identifying peak loads.
- **Smoothing and filtering** — applying rolling averages, statistical aggregations, and noise reduction to telemetry.
- **Predictive maintenance** — generating derived metrics and detecting potential failures based on trends.
-- **Geofencing scenarios** — checking zone membership, generating ENTER/EXIT events, and monitoring route compliance.
+- **Geofencing** — evaluating real-time GPS coordinates against defined zones to track entity presence (INSIDE/OUTSIDE) and detect zone transition events (ENTERED/LEFT).
- **Propagation** — automatically transferring attributes or telemetry to related entities for data synchronization.
- **Group data aggregation** — computing min/max/avg/sum/count for sets of related devices or assets.
- **Historical time-series analysis** — performing time window aggregation, trend analysis, and statistical evaluation.
diff --git a/docs/user-guide/calculated-fields/geofencing-calculated-field.md b/docs/user-guide/calculated-fields/geofencing-calculated-field.md
index 75b8b4a8e9..c07c76f194 100644
--- a/docs/user-guide/calculated-fields/geofencing-calculated-field.md
+++ b/docs/user-guide/calculated-fields/geofencing-calculated-field.md
@@ -1,7 +1,7 @@
---
layout: docwithnav
title: Geofencing calculated field
-description: For complex calculations, TBEL is used. It enables advanced operations such as conditional statements, loops, and access to historical data.
+description: For evaluating real-time GPS coordinates against defined zones to track entity presence (INSIDE/OUTSIDE) and detect zone transition events (ENTERED/LEFT).
breadcrumbs: "true"
breadcrumbs-steps: "1"
hidetoc: "true"
diff --git a/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-example-assets-data.csv b/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-example-assets-data.csv
new file mode 100644
index 0000000000..db4073fef4
--- /dev/null
+++ b/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-example-assets-data.csv
@@ -0,0 +1,4 @@
+name;type;zoneType;perimeter
+North East Fleet;Fleet;;
+Service Zone A;Zone;allowed;"[[40.70345836671014,-74.14999275085601],[40.70237254064465,-74.15064451111766],[40.700758707969165,-74.1460418404481],[40.70184397401624,-74.14536055935832],[40.70256571358523,-74.14739370346071]]"
+No-Go Zone A;Zone;restricted;"[[40.703492899942965,-74.15011153362617],[40.701933407657414,-74.15106506223482],[40.70216935786786,-74.15171935248779],[40.70372335389025,-74.15071110193402]]"
\ No newline at end of file
diff --git a/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-example-devices-data.csv b/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-example-devices-data.csv
new file mode 100644
index 0000000000..44ac682b2b
--- /dev/null
+++ b/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-example-devices-data.csv
@@ -0,0 +1,3 @@
+name;type;latitude;longitude
+Truck 101;Truck;40.703231;-74.150586
+Truck 102;Truck;40.701081;-74.146437
\ No newline at end of file
diff --git a/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-example-fleet-asset-profile.json b/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-example-fleet-asset-profile.json
new file mode 100644
index 0000000000..8da2d60c51
--- /dev/null
+++ b/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-example-fleet-asset-profile.json
@@ -0,0 +1,10 @@
+{
+ "name": "Fleet",
+ "description": null,
+ "image": null,
+ "defaultRuleChainId": null,
+ "defaultDashboardId": null,
+ "defaultQueueName": null,
+ "defaultEdgeRuleChainId": null,
+ "default": false
+}
\ No newline at end of file
diff --git a/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-example-geofencing-cf.json b/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-example-geofencing-cf.json
new file mode 100644
index 0000000000..77000e3be4
--- /dev/null
+++ b/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-example-geofencing-cf.json
@@ -0,0 +1,72 @@
+{
+ "type": "GEOFENCING",
+ "name": "Fleet Geofencing",
+ "debugSettings": {
+ "failuresEnabled": true,
+ "allEnabled": true,
+ "allEnabledUntil": 0
+ },
+ "configurationVersion": 0,
+ "configuration": {
+ "type": "GEOFENCING",
+ "entityCoordinates": {
+ "latitudeKeyName": "latitude",
+ "longitudeKeyName": "longitude"
+ },
+ "zoneGroups": {
+ "restrictedArea": {
+ "perimeterKeyName": "perimeter",
+ "reportStrategy": "REPORT_TRANSITION_EVENTS_AND_PRESENCE_STATUS",
+ "createRelationsWithMatchedZones": true,
+ "refDynamicSourceConfiguration": {
+ "type": "RELATION_PATH_QUERY",
+ "levels": [
+ {
+ "direction": "TO",
+ "relationType": "Contains"
+ },
+ {
+ "direction": "FROM",
+ "relationType": "FleetToRestrictedZone"
+ }
+ ]
+ },
+ "relationType": "InsideZone",
+ "direction": "TO"
+ },
+ "serviceArea": {
+ "perimeterKeyName": "perimeter",
+ "reportStrategy": "REPORT_TRANSITION_EVENTS_AND_PRESENCE_STATUS",
+ "createRelationsWithMatchedZones": true,
+ "refDynamicSourceConfiguration": {
+ "type": "RELATION_PATH_QUERY",
+ "levels": [
+ {
+ "direction": "TO",
+ "relationType": "Contains"
+ },
+ {
+ "direction": "FROM",
+ "relationType": "FleetToAllowedZone"
+ }
+ ]
+ },
+ "relationType": "InsideZone",
+ "direction": "TO"
+ }
+ },
+ "scheduledUpdateEnabled": true,
+ "scheduledUpdateInterval": 60,
+ "output": {
+ "type": "TIME_SERIES",
+ "strategy": {
+ "type": "IMMEDIATE",
+ "ttl": 0,
+ "saveTimeSeries": true,
+ "saveLatest": true,
+ "sendWsUpdate": true,
+ "processCfs": true
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-example-truck-device-profile.json b/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-example-truck-device-profile.json
new file mode 100644
index 0000000000..8cbaaa7665
--- /dev/null
+++ b/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-example-truck-device-profile.json
@@ -0,0 +1,29 @@
+{
+ "name": "Truck",
+ "description": "",
+ "image": null,
+ "type": "DEFAULT",
+ "transportType": "DEFAULT",
+ "provisionType": "DISABLED",
+ "defaultRuleChainId": null,
+ "defaultDashboardId": null,
+ "defaultQueueName": null,
+ "provisionDeviceKey": null,
+ "firmwareId": null,
+ "softwareId": null,
+ "defaultEdgeRuleChainId": null,
+ "default": false,
+ "profileData": {
+ "configuration": {
+ "type": "DEFAULT"
+ },
+ "transportConfiguration": {
+ "type": "DEFAULT"
+ },
+ "provisionConfiguration": {
+ "type": "DISABLED",
+ "provisionDeviceSecret": null
+ },
+ "alarms": null
+ }
+}
\ No newline at end of file
diff --git a/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-example-zone-asset-profile.json b/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-example-zone-asset-profile.json
new file mode 100644
index 0000000000..fba4530e17
--- /dev/null
+++ b/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-example-zone-asset-profile.json
@@ -0,0 +1,10 @@
+{
+ "name": "Zone",
+ "description": null,
+ "image": null,
+ "defaultRuleChainId": null,
+ "defaultDashboardId": null,
+ "defaultQueueName": null,
+ "defaultEdgeRuleChainId": null,
+ "default": false
+}
\ No newline at end of file
diff --git a/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-tracking-dashboard.json b/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-tracking-dashboard.json
new file mode 100644
index 0000000000..4b0fc2258e
--- /dev/null
+++ b/docs/user-guide/resources/calculated-fields/geofencing/complex-fleet-management-tracking-dashboard.json
@@ -0,0 +1,501 @@
+{
+ "title": "Fleet Trucks Tracking Dashboard",
+ "image": null,
+ "mobileHide": false,
+ "mobileOrder": null,
+ "configuration": {
+ "description": "",
+ "widgets": {
+ "a0a1e643-8fed-8382-ca4f-39dd5f0091c3": {
+ "typeFullFqn": "system.map",
+ "type": "latest",
+ "sizeX": 8.5,
+ "sizeY": 6,
+ "config": {
+ "datasources": [],
+ "showTitle": true,
+ "backgroundColor": "rgba(0, 0, 0, 0)",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "padding": "0px",
+ "settings": {
+ "mapType": "geoMap",
+ "layers": [
+ {
+ "label": "{i18n:widgets.maps.layer.roadmap}",
+ "provider": "openstreet",
+ "layerType": "OpenStreetMap.Mapnik"
+ },
+ {
+ "label": "{i18n:widgets.maps.layer.satellite}",
+ "provider": "openstreet",
+ "layerType": "Esri.WorldImagery"
+ },
+ {
+ "label": "{i18n:widgets.maps.layer.hybrid}",
+ "provider": "openstreet",
+ "layerType": "Esri.WorldImagery",
+ "referenceLayer": "openstreetmap_hybrid"
+ }
+ ],
+ "imageSource": null,
+ "markers": [
+ {
+ "dsType": "entity",
+ "dsLabel": "",
+ "dsDeviceId": null,
+ "dsEntityAliasId": "7769d4d8-9585-0d5f-93e5-66415be9db1c",
+ "dsFilterId": null,
+ "additionalDataSources": null,
+ "additionalDataKeys": null,
+ "label": {
+ "show": true,
+ "type": "pattern",
+ "pattern": "${entityName}"
+ },
+ "tooltip": {
+ "show": true,
+ "trigger": "click",
+ "autoclose": true,
+ "type": "pattern",
+ "pattern": "${entityName}
Latitude: ${latitude:7}
Longitude: ${longitude:7}
Temperature: ${temperature} °C
See tooltip settings for details",
+ "offsetX": 0,
+ "offsetY": -1
+ },
+ "click": {
+ "type": "doNothing"
+ },
+ "groups": null,
+ "edit": {
+ "enabledActions": [
+ "move"
+ ],
+ "attributeScope": "SERVER_SCOPE",
+ "snappable": false
+ },
+ "xKey": {
+ "name": "latitude",
+ "type": "timeseries",
+ "label": "latitude",
+ "color": "#2196f3",
+ "settings": {}
+ },
+ "yKey": {
+ "name": "longitude",
+ "type": "timeseries",
+ "label": "longitude",
+ "color": "#2196f3",
+ "settings": {}
+ },
+ "markerType": "shape",
+ "markerShape": {
+ "shape": "markerShape1",
+ "size": 34,
+ "color": {
+ "type": "constant",
+ "color": "#307FE5"
+ }
+ },
+ "markerIcon": {
+ "iconContainer": "iconContainer1",
+ "icon": "mdi:lightbulb-on",
+ "size": 48,
+ "color": {
+ "type": "constant",
+ "color": "#307FE5"
+ }
+ },
+ "markerImage": {
+ "type": "image",
+ "image": "/assets/markers/shape1.svg",
+ "imageSize": 34
+ },
+ "markerOffsetX": 0.5,
+ "markerOffsetY": 1,
+ "markerClustering": {
+ "enable": false,
+ "zoomOnClick": true,
+ "maxZoom": null,
+ "maxClusterRadius": 80,
+ "zoomAnimation": true,
+ "showCoverageOnHover": true,
+ "spiderfyOnMaxZoom": false,
+ "chunkedLoad": false,
+ "lazyLoad": true,
+ "useClusterMarkerColorFunction": false,
+ "clusterMarkerColorFunction": null
+ }
+ }
+ ],
+ "polygons": [
+ {
+ "dsType": "entity",
+ "dsLabel": "",
+ "dsDeviceId": null,
+ "dsEntityAliasId": "030502c4-afe2-4a7b-2de1-14e8c87904fa",
+ "dsFilterId": null,
+ "additionalDataSources": null,
+ "additionalDataKeys": [
+ {
+ "name": "zoneType",
+ "type": "attribute",
+ "label": "zoneType",
+ "color": "#2196f3",
+ "settings": {}
+ }
+ ],
+ "label": {
+ "show": true,
+ "type": "pattern",
+ "pattern": "${entityName}",
+ "patternFunction": null
+ },
+ "tooltip": {
+ "show": false,
+ "trigger": "click",
+ "autoclose": true,
+ "type": "pattern",
+ "pattern": "${entityName}
TimeStamp: ${ts:7}",
+ "offsetX": 0,
+ "offsetY": -1
+ },
+ "click": {
+ "type": "doNothing"
+ },
+ "groups": null,
+ "edit": {
+ "enabledActions": [],
+ "attributeScope": "SERVER_SCOPE",
+ "snappable": false
+ },
+ "fillType": "color",
+ "fillColor": {
+ "type": "function",
+ "color": "#F443366B",
+ "rangeKey": null,
+ "range": [
+ {
+ "from": null,
+ "to": null,
+ "color": "rgba(0,0,0,0.87)"
+ }
+ ],
+ "colorFunction": "if (data.zoneType == \"allowed\") {\n return \"#4CAF506B\"\n} else {\n return \"#F443366B\"\n}\n"
+ },
+ "fillStripe": {
+ "weight": 3,
+ "color": {
+ "type": "constant",
+ "color": "#8f8f8f"
+ },
+ "spaceWeight": 9,
+ "spaceColor": {
+ "type": "constant",
+ "color": "rgba(143,143,143,0)"
+ },
+ "angle": 45
+ },
+ "fillImage": {
+ "type": "image",
+ "image": "/assets/widget-preview-empty.svg",
+ "preserveAspectRatio": true,
+ "opacity": 1,
+ "angle": 0,
+ "scale": 1
+ },
+ "strokeColor": {
+ "type": "function",
+ "color": "#F44336",
+ "rangeKey": null,
+ "range": null,
+ "colorFunction": "if (data.zoneType == \"allowed\") {\n return \"#4CAF50\"\n} else {\n return \"#F44336D9\"\n}"
+ },
+ "strokeWeight": 3,
+ "polygonKey": {
+ "name": "perimeter",
+ "label": "perimeter",
+ "type": "attribute",
+ "settings": {},
+ "color": "#2196f3"
+ }
+ }
+ ],
+ "circles": [],
+ "polylines": [],
+ "additionalDataSources": [],
+ "controlsPosition": "topleft",
+ "zoomActions": [
+ "scroll",
+ "doubleClick",
+ "controlButtons"
+ ],
+ "scales": [],
+ "dragModeButton": false,
+ "fitMapBounds": true,
+ "useDefaultCenterPosition": false,
+ "defaultCenterPosition": "0,0",
+ "defaultZoomLevel": 18,
+ "mapPageSize": 16384,
+ "mapActionButtons": [],
+ "background": {
+ "type": "color",
+ "color": "#fff",
+ "overlay": {
+ "enabled": false,
+ "color": "rgba(255,255,255,0.72)",
+ "blur": 3
+ }
+ },
+ "padding": "8px"
+ },
+ "title": "Map",
+ "showTitleIcon": false,
+ "titleTooltip": "",
+ "dropShadow": true,
+ "enableFullscreen": true,
+ "widgetStyle": {},
+ "widgetCss": "",
+ "titleStyle": {
+ "fontSize": "16px",
+ "fontWeight": 400
+ },
+ "pageSize": 1024,
+ "noDataDisplayMessage": "",
+ "configMode": "advanced",
+ "titleFont": null,
+ "titleColor": null,
+ "margin": "0px",
+ "borderRadius": "0px",
+ "iconSize": "24px",
+ "titleIcon": "map",
+ "iconColor": "#1F6BDD",
+ "actions": {}
+ },
+ "row": 0,
+ "col": 0,
+ "id": "a0a1e643-8fed-8382-ca4f-39dd5f0091c3"
+ },
+ "a0d018b5-0242-0438-61b7-05fc176a42f9": {
+ "typeFullFqn": "system.cards.entities_table",
+ "type": "latest",
+ "sizeX": 7.5,
+ "sizeY": 6.5,
+ "config": {
+ "showTitle": true,
+ "backgroundColor": "rgb(255, 255, 255)",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "padding": "4px",
+ "settings": {
+ "entitiesTitle": "Trucks",
+ "enableSearch": true,
+ "enableSelectColumnDisplay": true,
+ "enableStickyHeader": true,
+ "enableStickyAction": true,
+ "showCellActionsMenu": true,
+ "reserveSpaceForHiddenAction": "true",
+ "displayEntityName": false,
+ "entityNameColumnTitle": "",
+ "displayEntityLabel": false,
+ "entityLabelColumnTitle": "",
+ "displayEntityType": false,
+ "displayPagination": true,
+ "defaultPageSize": 10,
+ "pageStepCount": 3,
+ "pageStepIncrement": 10,
+ "defaultSortOrder": "name",
+ "useRowStyleFunction": false,
+ "rowStyleFunction": ""
+ },
+ "title": "Entities table",
+ "dropShadow": true,
+ "enableFullscreen": true,
+ "titleStyle": {
+ "fontSize": "16px",
+ "fontWeight": 400,
+ "padding": "5px 10px 5px 10px"
+ },
+ "showLegend": false,
+ "datasources": [
+ {
+ "type": "entity",
+ "name": "",
+ "entityAliasId": "7769d4d8-9585-0d5f-93e5-66415be9db1c",
+ "filterId": null,
+ "dataKeys": [
+ {
+ "name": "name",
+ "type": "entityField",
+ "label": "Name",
+ "color": "#2196f3",
+ "settings": {}
+ },
+ {
+ "name": "serviceAreaStatus",
+ "type": "timeseries",
+ "label": "Service Area Status",
+ "color": "#ffc107",
+ "settings": {},
+ "aggregationType": "NONE",
+ "units": null,
+ "decimals": null,
+ "funcBody": null,
+ "usePostProcessing": null,
+ "postFuncBody": null
+ },
+ {
+ "name": "restrictedAreaStatus",
+ "type": "timeseries",
+ "label": "Restricted Area Status",
+ "color": "#f44336",
+ "settings": {},
+ "aggregationType": "NONE",
+ "units": null,
+ "decimals": null,
+ "funcBody": null,
+ "usePostProcessing": null,
+ "postFuncBody": null
+ },
+ {
+ "name": "serviceAreaEvent",
+ "type": "timeseries",
+ "label": "Service Area Event",
+ "color": "#ffc107",
+ "settings": {},
+ "aggregationType": "NONE",
+ "units": null,
+ "decimals": null,
+ "funcBody": null,
+ "usePostProcessing": null,
+ "postFuncBody": null
+ },
+ {
+ "name": "restrictedAreaEvent",
+ "type": "timeseries",
+ "label": "Restricted Area Event",
+ "color": "#607d8b",
+ "settings": {},
+ "aggregationType": "NONE",
+ "units": null,
+ "decimals": null,
+ "funcBody": null,
+ "usePostProcessing": null,
+ "postFuncBody": null
+ }
+ ],
+ "alarmFilterConfig": {
+ "statusList": [
+ "ACTIVE"
+ ]
+ }
+ }
+ ],
+ "configMode": "advanced",
+ "actions": {
+ },
+ "showTitleIcon": false,
+ "titleIcon": "list",
+ "iconColor": null,
+ "titleFont": null,
+ "titleColor": null
+ },
+ "row": 0,
+ "col": 0,
+ "id": "a0d018b5-0242-0438-61b7-05fc176a42f9"
+ }
+ },
+ "states": {
+ "default": {
+ "name": "Fleet Trucks Tracking Dashboard",
+ "root": true,
+ "layouts": {
+ "main": {
+ "widgets": {
+ "a0a1e643-8fed-8382-ca4f-39dd5f0091c3": {
+ "sizeX": 24,
+ "sizeY": 8,
+ "row": 0,
+ "col": 0
+ },
+ "a0d018b5-0242-0438-61b7-05fc176a42f9": {
+ "sizeX": 24,
+ "sizeY": 4,
+ "row": 8,
+ "col": 0
+ }
+ },
+ "gridSettings": {
+ "layoutType": "default",
+ "backgroundColor": "#eeeeee",
+ "columns": 24,
+ "margin": 10,
+ "outerMargin": true,
+ "backgroundSizeMode": "100%",
+ "minColumns": 24,
+ "viewFormat": "grid",
+ "autoFillHeight": true,
+ "rowHeight": 70,
+ "backgroundImageUrl": null,
+ "mobileAutoFillHeight": false,
+ "mobileRowHeight": 70
+ }
+ }
+ }
+ }
+ },
+ "entityAliases": {
+ "7769d4d8-9585-0d5f-93e5-66415be9db1c": {
+ "id": "7769d4d8-9585-0d5f-93e5-66415be9db1c",
+ "alias": "Trucks",
+ "filter": {
+ "type": "deviceType",
+ "resolveMultiple": true,
+ "deviceTypes": [
+ "Truck"
+ ],
+ "deviceNameFilter": ""
+ }
+ },
+ "030502c4-afe2-4a7b-2de1-14e8c87904fa": {
+ "id": "030502c4-afe2-4a7b-2de1-14e8c87904fa",
+ "alias": "Fleet Zones",
+ "filter": {
+ "type": "assetType",
+ "resolveMultiple": true,
+ "assetTypes": [
+ "Zone"
+ ],
+ "assetNameFilter": ""
+ }
+ }
+ },
+ "filters": {},
+ "timewindow": {
+ "selectedTab": 0,
+ "realtime": {
+ "realtimeType": 0,
+ "interval": 10000,
+ "timewindowMs": 600000
+ },
+ "aggregation": {
+ "type": "AVG"
+ }
+ },
+ "settings": {
+ "stateControllerId": "entity",
+ "showTitle": false,
+ "showDashboardsSelect": true,
+ "showEntitiesSelect": true,
+ "showDashboardTimewindow": true,
+ "showDashboardExport": true,
+ "toolbarAlwaysOpen": true,
+ "titleColor": "rgba(0,0,0,0.870588)",
+ "showDashboardLogo": false,
+ "dashboardLogoUrl": null,
+ "hideToolbar": false,
+ "showFilters": true,
+ "showUpdateDashboardImage": true,
+ "dashboardCss": ""
+ }
+ },
+ "name": "Fleet Trucks Tracking Dashboard",
+ "resources": []
+}
\ No newline at end of file
diff --git a/docs/user-guide/resources/calculated-fields/geofencing/pet-tracking-dashboard.json b/docs/user-guide/resources/calculated-fields/geofencing/pet-tracking-dashboard.json
new file mode 100644
index 0000000000..8d22a51cf6
--- /dev/null
+++ b/docs/user-guide/resources/calculated-fields/geofencing/pet-tracking-dashboard.json
@@ -0,0 +1,442 @@
+{
+ "title": "Pets Tracking Dashboard",
+ "image": null,
+ "mobileHide": false,
+ "mobileOrder": null,
+ "configuration": {
+ "description": "",
+ "widgets": {
+ "672aa4f0-2f66-4691-09cd-8f9377f65a67": {
+ "typeFullFqn": "system.cards.entities_table",
+ "type": "latest",
+ "sizeX": 7.5,
+ "sizeY": 6.5,
+ "config": {
+ "showTitle": true,
+ "backgroundColor": "rgb(255, 255, 255)",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "padding": "4px",
+ "settings": {
+ "entitiesTitle": "Pets",
+ "enableSearch": true,
+ "enableSelectColumnDisplay": true,
+ "enableStickyHeader": true,
+ "enableStickyAction": true,
+ "showCellActionsMenu": true,
+ "reserveSpaceForHiddenAction": "true",
+ "displayEntityName": false,
+ "entityNameColumnTitle": "",
+ "displayEntityLabel": false,
+ "entityLabelColumnTitle": "",
+ "displayEntityType": false,
+ "displayPagination": true,
+ "defaultPageSize": 10,
+ "pageStepCount": 3,
+ "pageStepIncrement": 10,
+ "defaultSortOrder": "name",
+ "useRowStyleFunction": false,
+ "rowStyleFunction": ""
+ },
+ "title": "Entities table",
+ "dropShadow": true,
+ "enableFullscreen": true,
+ "titleStyle": {
+ "fontSize": "16px",
+ "fontWeight": 400,
+ "padding": "5px 10px 5px 10px"
+ },
+ "showLegend": false,
+ "datasources": [
+ {
+ "type": "entity",
+ "name": "",
+ "entityAliasId": "7769d4d8-9585-0d5f-93e5-66415be9db1c",
+ "filterId": null,
+ "dataKeys": [
+ {
+ "name": "name",
+ "type": "entityField",
+ "label": "Name",
+ "color": "#2196f3",
+ "settings": {}
+ },
+ {
+ "name": "safeAreaStatus",
+ "type": "timeseries",
+ "label": "Current Status",
+ "color": "#ffc107",
+ "settings": {},
+ "aggregationType": "NONE",
+ "units": null,
+ "decimals": null,
+ "funcBody": null,
+ "usePostProcessing": null,
+ "postFuncBody": null
+ },
+ {
+ "name": "safeAreaEvent",
+ "type": "timeseries",
+ "label": "Last Transition Event",
+ "color": "#f44336",
+ "settings": {},
+ "aggregationType": "NONE",
+ "units": null,
+ "decimals": null,
+ "funcBody": null,
+ "usePostProcessing": null,
+ "postFuncBody": null
+ }
+ ],
+ "alarmFilterConfig": {
+ "statusList": [
+ "ACTIVE"
+ ]
+ }
+ }
+ ],
+ "configMode": "advanced",
+ "actions": {
+ },
+ "showTitleIcon": false,
+ "titleIcon": "list",
+ "iconColor": null,
+ "titleFont": null,
+ "titleColor": null
+ },
+ "row": 0,
+ "col": 0,
+ "id": "672aa4f0-2f66-4691-09cd-8f9377f65a67"
+ },
+ "a0a1e643-8fed-8382-ca4f-39dd5f0091c3": {
+ "typeFullFqn": "system.map",
+ "type": "latest",
+ "sizeX": 8.5,
+ "sizeY": 6,
+ "config": {
+ "datasources": [],
+ "showTitle": true,
+ "backgroundColor": "rgba(0, 0, 0, 0)",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "padding": "0px",
+ "settings": {
+ "mapType": "geoMap",
+ "layers": [
+ {
+ "label": "{i18n:widgets.maps.layer.roadmap}",
+ "provider": "openstreet",
+ "layerType": "OpenStreetMap.Mapnik"
+ },
+ {
+ "label": "{i18n:widgets.maps.layer.satellite}",
+ "provider": "openstreet",
+ "layerType": "Esri.WorldImagery"
+ },
+ {
+ "label": "{i18n:widgets.maps.layer.hybrid}",
+ "provider": "openstreet",
+ "layerType": "Esri.WorldImagery",
+ "referenceLayer": "openstreetmap_hybrid"
+ }
+ ],
+ "imageSource": null,
+ "markers": [
+ {
+ "dsType": "entity",
+ "dsLabel": "",
+ "dsDeviceId": null,
+ "dsEntityAliasId": "7769d4d8-9585-0d5f-93e5-66415be9db1c",
+ "dsFilterId": null,
+ "additionalDataSources": null,
+ "additionalDataKeys": null,
+ "label": {
+ "show": true,
+ "type": "pattern",
+ "pattern": "${entityName}"
+ },
+ "tooltip": {
+ "show": true,
+ "trigger": "click",
+ "autoclose": true,
+ "type": "pattern",
+ "pattern": "${entityName}
Latitude: ${latitude:7}
Longitude: ${longitude:7}
Temperature: ${temperature} °C
See tooltip settings for details",
+ "offsetX": 0,
+ "offsetY": -1
+ },
+ "click": {
+ "type": "doNothing"
+ },
+ "groups": null,
+ "edit": {
+ "enabledActions": [
+ "move"
+ ],
+ "attributeScope": "SERVER_SCOPE",
+ "snappable": false
+ },
+ "xKey": {
+ "name": "latitude",
+ "type": "timeseries",
+ "label": "latitude",
+ "color": "#2196f3",
+ "settings": {}
+ },
+ "yKey": {
+ "name": "longitude",
+ "type": "timeseries",
+ "label": "longitude",
+ "color": "#2196f3",
+ "settings": {}
+ },
+ "markerType": "shape",
+ "markerShape": {
+ "shape": "markerShape1",
+ "size": 34,
+ "color": {
+ "type": "constant",
+ "color": "#307FE5"
+ }
+ },
+ "markerIcon": {
+ "iconContainer": "iconContainer1",
+ "icon": "mdi:lightbulb-on",
+ "size": 48,
+ "color": {
+ "type": "constant",
+ "color": "#307FE5"
+ }
+ },
+ "markerImage": {
+ "type": "image",
+ "image": "/assets/markers/shape1.svg",
+ "imageSize": 34
+ },
+ "markerOffsetX": 0.5,
+ "markerOffsetY": 1,
+ "markerClustering": {
+ "enable": false,
+ "zoomOnClick": true,
+ "maxZoom": null,
+ "maxClusterRadius": 80,
+ "zoomAnimation": true,
+ "showCoverageOnHover": true,
+ "spiderfyOnMaxZoom": false,
+ "chunkedLoad": false,
+ "lazyLoad": true,
+ "useClusterMarkerColorFunction": false,
+ "clusterMarkerColorFunction": null
+ }
+ }
+ ],
+ "polygons": [],
+ "circles": [
+ {
+ "dsType": "entity",
+ "dsLabel": "",
+ "dsDeviceId": null,
+ "dsEntityAliasId": "7769d4d8-9585-0d5f-93e5-66415be9db1c",
+ "dsFilterId": null,
+ "additionalDataSources": null,
+ "additionalDataKeys": null,
+ "label": {
+ "show": false,
+ "type": "pattern",
+ "pattern": "${entityName}"
+ },
+ "tooltip": {
+ "show": false,
+ "trigger": "click",
+ "autoclose": true,
+ "type": "pattern",
+ "pattern": "${entityName}
TimeStamp: ${ts:7}",
+ "offsetX": 0,
+ "offsetY": -1
+ },
+ "click": {
+ "type": "doNothing"
+ },
+ "groups": null,
+ "edit": {
+ "enabledActions": [],
+ "attributeScope": "SERVER_SCOPE",
+ "snappable": false
+ },
+ "fillType": "color",
+ "fillColor": {
+ "type": "constant",
+ "color": "rgba(51,136,255,0.2)"
+ },
+ "fillStripe": {
+ "weight": 3,
+ "color": {
+ "type": "constant",
+ "color": "#8f8f8f"
+ },
+ "spaceWeight": 9,
+ "spaceColor": {
+ "type": "constant",
+ "color": "rgba(143,143,143,0)"
+ },
+ "angle": 45
+ },
+ "fillImage": {
+ "type": "image",
+ "image": "/assets/widget-preview-empty.svg",
+ "preserveAspectRatio": true,
+ "opacity": 1,
+ "angle": 0,
+ "scale": 1
+ },
+ "strokeColor": {
+ "type": "constant",
+ "color": "#3388ff"
+ },
+ "strokeWeight": 3,
+ "circleKey": {
+ "name": "safeZone",
+ "type": "attribute",
+ "label": "safeZone",
+ "color": "#2196f3",
+ "settings": {}
+ }
+ }
+ ],
+ "polylines": [],
+ "additionalDataSources": [],
+ "controlsPosition": "topleft",
+ "zoomActions": [
+ "scroll",
+ "doubleClick",
+ "controlButtons"
+ ],
+ "scales": [],
+ "dragModeButton": false,
+ "fitMapBounds": true,
+ "useDefaultCenterPosition": false,
+ "defaultCenterPosition": "0,0",
+ "defaultZoomLevel": 18,
+ "mapPageSize": 16384,
+ "mapActionButtons": [],
+ "background": {
+ "type": "color",
+ "color": "#fff",
+ "overlay": {
+ "enabled": false,
+ "color": "rgba(255,255,255,0.72)",
+ "blur": 3
+ }
+ },
+ "padding": "8px"
+ },
+ "title": "Map",
+ "showTitleIcon": false,
+ "titleTooltip": "",
+ "dropShadow": true,
+ "enableFullscreen": true,
+ "widgetStyle": {},
+ "widgetCss": "",
+ "titleStyle": {
+ "fontSize": "16px",
+ "fontWeight": 400
+ },
+ "pageSize": 1024,
+ "noDataDisplayMessage": "",
+ "configMode": "advanced",
+ "titleFont": null,
+ "titleColor": null,
+ "margin": "0px",
+ "borderRadius": "0px",
+ "iconSize": "24px",
+ "titleIcon": "map",
+ "iconColor": "#1F6BDD",
+ "actions": {}
+ },
+ "row": 0,
+ "col": 0,
+ "id": "a0a1e643-8fed-8382-ca4f-39dd5f0091c3"
+ }
+ },
+ "states": {
+ "default": {
+ "name": "Pets Tracking Dashboard",
+ "root": true,
+ "layouts": {
+ "main": {
+ "widgets": {
+ "672aa4f0-2f66-4691-09cd-8f9377f65a67": {
+ "sizeX": 7,
+ "sizeY": 6,
+ "row": 0,
+ "col": 0
+ },
+ "a0a1e643-8fed-8382-ca4f-39dd5f0091c3": {
+ "sizeX": 17,
+ "sizeY": 6,
+ "row": 0,
+ "col": 7
+ }
+ },
+ "gridSettings": {
+ "layoutType": "default",
+ "backgroundColor": "#eeeeee",
+ "columns": 24,
+ "margin": 10,
+ "outerMargin": true,
+ "backgroundSizeMode": "100%",
+ "minColumns": 24,
+ "viewFormat": "grid",
+ "autoFillHeight": true,
+ "rowHeight": 70,
+ "backgroundImageUrl": null,
+ "mobileAutoFillHeight": false,
+ "mobileRowHeight": 70
+ }
+ }
+ }
+ }
+ },
+ "entityAliases": {
+ "7769d4d8-9585-0d5f-93e5-66415be9db1c": {
+ "id": "7769d4d8-9585-0d5f-93e5-66415be9db1c",
+ "alias": "Pets",
+ "filter": {
+ "type": "deviceType",
+ "resolveMultiple": true,
+ "deviceTypes": [
+ "Pet Tracker"
+ ],
+ "deviceNameFilter": ""
+ }
+ }
+ },
+ "filters": {},
+ "timewindow": {
+ "selectedTab": 0,
+ "realtime": {
+ "realtimeType": 0,
+ "interval": 10000,
+ "timewindowMs": 600000
+ },
+ "aggregation": {
+ "type": "AVG"
+ }
+ },
+ "settings": {
+ "stateControllerId": "entity",
+ "showTitle": false,
+ "showDashboardsSelect": true,
+ "showEntitiesSelect": true,
+ "showDashboardTimewindow": true,
+ "showDashboardExport": true,
+ "toolbarAlwaysOpen": true,
+ "titleColor": "rgba(0,0,0,0.870588)",
+ "showDashboardLogo": false,
+ "dashboardLogoUrl": null,
+ "hideToolbar": false,
+ "showFilters": true,
+ "showUpdateDashboardImage": true,
+ "dashboardCss": ""
+ }
+ },
+ "name": "Pets Tracking Dashboard",
+ "resources": []
+}
diff --git a/docs/user-guide/resources/calculated-fields/geofencing/pet-tracking-device-data.csv b/docs/user-guide/resources/calculated-fields/geofencing/pet-tracking-device-data.csv
new file mode 100644
index 0000000000..5ffdf5f829
--- /dev/null
+++ b/docs/user-guide/resources/calculated-fields/geofencing/pet-tracking-device-data.csv
@@ -0,0 +1,3 @@
+name;type;latitude;longitude;safeZone
+Buddy;Pet Tracker;40.722395;-73.637204;"{""latitude"": 40.722420, ""longitude"": -73.637177, ""radius"": 40}"
+Rex;Pet Tracker;40.722993;-73.634592;"{""latitude"": 40.722826, ""longitude"": -73.635079, ""radius"": 40}"
\ No newline at end of file
diff --git a/docs/user-guide/resources/calculated-fields/geofencing/pet-tracking-example-device-profile.json b/docs/user-guide/resources/calculated-fields/geofencing/pet-tracking-example-device-profile.json
new file mode 100644
index 0000000000..4120f5a4ce
--- /dev/null
+++ b/docs/user-guide/resources/calculated-fields/geofencing/pet-tracking-example-device-profile.json
@@ -0,0 +1,29 @@
+{
+ "name": "Pet Tracker",
+ "description": "",
+ "image": null,
+ "type": "DEFAULT",
+ "transportType": "DEFAULT",
+ "provisionType": "DISABLED",
+ "defaultRuleChainId": null,
+ "defaultDashboardId": null,
+ "defaultQueueName": null,
+ "provisionDeviceKey": null,
+ "firmwareId": null,
+ "softwareId": null,
+ "defaultEdgeRuleChainId": null,
+ "default": false,
+ "profileData": {
+ "configuration": {
+ "type": "DEFAULT"
+ },
+ "transportConfiguration": {
+ "type": "DEFAULT"
+ },
+ "provisionConfiguration": {
+ "type": "DISABLED",
+ "provisionDeviceSecret": null
+ },
+ "alarms": null
+ }
+}
diff --git a/docs/user-guide/resources/calculated-fields/geofencing/pet-tracking-example-geofencing-cf.json b/docs/user-guide/resources/calculated-fields/geofencing/pet-tracking-example-geofencing-cf.json
new file mode 100644
index 0000000000..b63e115d3b
--- /dev/null
+++ b/docs/user-guide/resources/calculated-fields/geofencing/pet-tracking-example-geofencing-cf.json
@@ -0,0 +1,37 @@
+{
+ "type": "GEOFENCING",
+ "name": "Safe Area Geofencing",
+ "debugSettings": {
+ "failuresEnabled": true,
+ "allEnabled": true,
+ "allEnabledUntil": 0
+ },
+ "configurationVersion": 0,
+ "configuration": {
+ "type": "GEOFENCING",
+ "entityCoordinates": {
+ "latitudeKeyName": "latitude",
+ "longitudeKeyName": "longitude"
+ },
+ "zoneGroups": {
+ "safeArea": {
+ "perimeterKeyName": "safeZone",
+ "reportStrategy": "REPORT_TRANSITION_EVENTS_AND_PRESENCE_STATUS",
+ "createRelationsWithMatchedZones": false
+ }
+ },
+ "scheduledUpdateEnabled": false,
+ "scheduledUpdateInterval": 0,
+ "output": {
+ "type": "TIME_SERIES",
+ "strategy": {
+ "type": "IMMEDIATE",
+ "ttl": 0,
+ "saveTimeSeries": true,
+ "saveLatest": true,
+ "sendWsUpdate": true,
+ "processCfs": true
+ }
+ }
+ }
+}
diff --git a/docs/user-guide/resources/calculated-fields/geofencing/warehouse-equipment-example-asset-data.csv b/docs/user-guide/resources/calculated-fields/geofencing/warehouse-equipment-example-asset-data.csv
new file mode 100644
index 0000000000..f01f980dc6
--- /dev/null
+++ b/docs/user-guide/resources/calculated-fields/geofencing/warehouse-equipment-example-asset-data.csv
@@ -0,0 +1,2 @@
+name;type;perimeter
+Warehouse Building A;Warehouse Building;"[[40.50160801939937,-74.28291499614717],[40.50510366361683,-74.27910090775787],[40.50410434401716,-74.27749693393709],[40.50221579326238,-74.27954077720644],[40.50099616095494,-74.28085505962373],[40.50099616095494,-74.28196012973787]]"
\ No newline at end of file
diff --git a/docs/user-guide/resources/calculated-fields/geofencing/warehouse-equipment-example-asset-profile.json b/docs/user-guide/resources/calculated-fields/geofencing/warehouse-equipment-example-asset-profile.json
new file mode 100644
index 0000000000..6f3719545e
--- /dev/null
+++ b/docs/user-guide/resources/calculated-fields/geofencing/warehouse-equipment-example-asset-profile.json
@@ -0,0 +1,10 @@
+{
+ "name": "Warehouse Building",
+ "description": null,
+ "image": null,
+ "defaultRuleChainId": null,
+ "defaultDashboardId": null,
+ "defaultQueueName": null,
+ "defaultEdgeRuleChainId": null,
+ "default": false
+}
diff --git a/docs/user-guide/resources/calculated-fields/geofencing/warehouse-equipment-example-device-profile.json b/docs/user-guide/resources/calculated-fields/geofencing/warehouse-equipment-example-device-profile.json
new file mode 100644
index 0000000000..7017018f13
--- /dev/null
+++ b/docs/user-guide/resources/calculated-fields/geofencing/warehouse-equipment-example-device-profile.json
@@ -0,0 +1,29 @@
+{
+ "name": "Fork Lift",
+ "description": "",
+ "image": null,
+ "type": "DEFAULT",
+ "transportType": "DEFAULT",
+ "provisionType": "DISABLED",
+ "defaultRuleChainId": null,
+ "defaultDashboardId": null,
+ "defaultQueueName": null,
+ "provisionDeviceKey": null,
+ "firmwareId": null,
+ "softwareId": null,
+ "defaultEdgeRuleChainId": null,
+ "default": false,
+ "profileData": {
+ "configuration": {
+ "type": "DEFAULT"
+ },
+ "transportConfiguration": {
+ "type": "DEFAULT"
+ },
+ "provisionConfiguration": {
+ "type": "DISABLED",
+ "provisionDeviceSecret": null
+ },
+ "alarms": null
+ }
+}
diff --git a/docs/user-guide/resources/calculated-fields/geofencing/warehouse-equipment-example-devices-data.csv b/docs/user-guide/resources/calculated-fields/geofencing/warehouse-equipment-example-devices-data.csv
new file mode 100644
index 0000000000..ce8c60a5a3
--- /dev/null
+++ b/docs/user-guide/resources/calculated-fields/geofencing/warehouse-equipment-example-devices-data.csv
@@ -0,0 +1,3 @@
+name;type;latitude;longitude
+Forklift A;Fork Lift;40.502106;-74.280575
+Forklift B;Fork Lift;40.500714;-74.282656
\ No newline at end of file
diff --git a/docs/user-guide/resources/calculated-fields/geofencing/warehouse-equipment-example-geofencing-cf.json b/docs/user-guide/resources/calculated-fields/geofencing/warehouse-equipment-example-geofencing-cf.json
new file mode 100644
index 0000000000..ba675f7a25
--- /dev/null
+++ b/docs/user-guide/resources/calculated-fields/geofencing/warehouse-equipment-example-geofencing-cf.json
@@ -0,0 +1,46 @@
+{
+ "type": "GEOFENCING",
+ "name": "Warehouse Geofencing",
+ "debugSettings": {
+ "failuresEnabled": true,
+ "allEnabled": true,
+ "allEnabledUntil": 0
+ },
+ "configurationVersion": 0,
+ "configuration": {
+ "type": "GEOFENCING",
+ "entityCoordinates": {
+ "latitudeKeyName": "latitude",
+ "longitudeKeyName": "longitude"
+ },
+ "zoneGroups": {
+ "warehouseArea": {
+ "perimeterKeyName": "perimeter",
+ "reportStrategy": "REPORT_TRANSITION_EVENTS_AND_PRESENCE_STATUS",
+ "createRelationsWithMatchedZones": false,
+ "refDynamicSourceConfiguration": {
+ "type": "RELATION_PATH_QUERY",
+ "levels": [
+ {
+ "direction": "TO",
+ "relationType": "Contains"
+ }
+ ]
+ }
+ }
+ },
+ "scheduledUpdateEnabled": true,
+ "scheduledUpdateInterval": 60,
+ "output": {
+ "type": "TIME_SERIES",
+ "strategy": {
+ "type": "IMMEDIATE",
+ "ttl": 0,
+ "saveTimeSeries": true,
+ "saveLatest": true,
+ "sendWsUpdate": true,
+ "processCfs": true
+ }
+ }
+ }
+}
diff --git a/docs/user-guide/resources/calculated-fields/geofencing/warehouse-equipment-tracking-dashboard.json b/docs/user-guide/resources/calculated-fields/geofencing/warehouse-equipment-tracking-dashboard.json
new file mode 100644
index 0000000000..e8e6541258
--- /dev/null
+++ b/docs/user-guide/resources/calculated-fields/geofencing/warehouse-equipment-tracking-dashboard.json
@@ -0,0 +1,454 @@
+{
+ "title": "Warehouse Equipment Tracking Dashboard",
+ "image": null,
+ "mobileHide": false,
+ "mobileOrder": null,
+ "configuration": {
+ "description": "",
+ "widgets": {
+ "672aa4f0-2f66-4691-09cd-8f9377f65a67": {
+ "typeFullFqn": "system.cards.entities_table",
+ "type": "latest",
+ "sizeX": 7.5,
+ "sizeY": 6.5,
+ "config": {
+ "showTitle": true,
+ "backgroundColor": "rgb(255, 255, 255)",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "padding": "4px",
+ "settings": {
+ "entitiesTitle": "Fork Lifts",
+ "enableSearch": true,
+ "enableSelectColumnDisplay": true,
+ "enableStickyHeader": true,
+ "enableStickyAction": true,
+ "showCellActionsMenu": true,
+ "reserveSpaceForHiddenAction": "true",
+ "displayEntityName": false,
+ "entityNameColumnTitle": "",
+ "displayEntityLabel": false,
+ "entityLabelColumnTitle": "",
+ "displayEntityType": false,
+ "displayPagination": true,
+ "defaultPageSize": 10,
+ "pageStepCount": 3,
+ "pageStepIncrement": 10,
+ "defaultSortOrder": "name",
+ "useRowStyleFunction": false,
+ "rowStyleFunction": ""
+ },
+ "title": "Entities table",
+ "dropShadow": true,
+ "enableFullscreen": true,
+ "titleStyle": {
+ "fontSize": "16px",
+ "fontWeight": 400,
+ "padding": "5px 10px 5px 10px"
+ },
+ "showLegend": false,
+ "datasources": [
+ {
+ "type": "entity",
+ "name": "",
+ "entityAliasId": "7769d4d8-9585-0d5f-93e5-66415be9db1c",
+ "filterId": null,
+ "dataKeys": [
+ {
+ "name": "name",
+ "type": "entityField",
+ "label": "Name",
+ "color": "#2196f3",
+ "settings": {}
+ },
+ {
+ "name": "warehouseAreaStatus",
+ "type": "timeseries",
+ "label": "Current Status",
+ "color": "#ffc107",
+ "settings": {},
+ "aggregationType": "NONE",
+ "units": null,
+ "decimals": null,
+ "funcBody": null,
+ "usePostProcessing": null,
+ "postFuncBody": null
+ },
+ {
+ "name": "warehouseAreaEvent",
+ "type": "timeseries",
+ "label": "Last Transition Event",
+ "color": "#f44336",
+ "settings": {},
+ "aggregationType": "NONE",
+ "units": null,
+ "decimals": null,
+ "funcBody": null,
+ "usePostProcessing": null,
+ "postFuncBody": null
+ }
+ ],
+ "alarmFilterConfig": {
+ "statusList": [
+ "ACTIVE"
+ ]
+ }
+ }
+ ],
+ "configMode": "advanced",
+ "actions": {
+ },
+ "showTitleIcon": false,
+ "titleIcon": "list",
+ "iconColor": null,
+ "titleFont": null,
+ "titleColor": null
+ },
+ "row": 0,
+ "col": 0,
+ "id": "672aa4f0-2f66-4691-09cd-8f9377f65a67"
+ },
+ "a0a1e643-8fed-8382-ca4f-39dd5f0091c3": {
+ "typeFullFqn": "system.map",
+ "type": "latest",
+ "sizeX": 8.5,
+ "sizeY": 6,
+ "config": {
+ "datasources": [],
+ "showTitle": true,
+ "backgroundColor": "rgba(0, 0, 0, 0)",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "padding": "0px",
+ "settings": {
+ "mapType": "geoMap",
+ "layers": [
+ {
+ "label": "{i18n:widgets.maps.layer.roadmap}",
+ "provider": "openstreet",
+ "layerType": "OpenStreetMap.Mapnik"
+ },
+ {
+ "label": "{i18n:widgets.maps.layer.satellite}",
+ "provider": "openstreet",
+ "layerType": "Esri.WorldImagery"
+ },
+ {
+ "label": "{i18n:widgets.maps.layer.hybrid}",
+ "provider": "openstreet",
+ "layerType": "Esri.WorldImagery",
+ "referenceLayer": "openstreetmap_hybrid"
+ }
+ ],
+ "imageSource": null,
+ "markers": [
+ {
+ "dsType": "entity",
+ "dsLabel": "",
+ "dsDeviceId": null,
+ "dsEntityAliasId": "7769d4d8-9585-0d5f-93e5-66415be9db1c",
+ "dsFilterId": null,
+ "additionalDataSources": null,
+ "additionalDataKeys": null,
+ "label": {
+ "show": true,
+ "type": "pattern",
+ "pattern": "${entityName}"
+ },
+ "tooltip": {
+ "show": true,
+ "trigger": "click",
+ "autoclose": true,
+ "type": "pattern",
+ "pattern": "${entityName}
Latitude: ${latitude:7}
Longitude: ${longitude:7}
Temperature: ${temperature} °C
See tooltip settings for details",
+ "offsetX": 0,
+ "offsetY": -1
+ },
+ "click": {
+ "type": "doNothing"
+ },
+ "groups": null,
+ "edit": {
+ "enabledActions": [
+ "move"
+ ],
+ "attributeScope": "SERVER_SCOPE",
+ "snappable": false
+ },
+ "xKey": {
+ "name": "latitude",
+ "type": "timeseries",
+ "label": "latitude",
+ "color": "#2196f3",
+ "settings": {}
+ },
+ "yKey": {
+ "name": "longitude",
+ "type": "timeseries",
+ "label": "longitude",
+ "color": "#2196f3",
+ "settings": {}
+ },
+ "markerType": "shape",
+ "markerShape": {
+ "shape": "markerShape1",
+ "size": 34,
+ "color": {
+ "type": "constant",
+ "color": "#307FE5"
+ }
+ },
+ "markerIcon": {
+ "iconContainer": "iconContainer1",
+ "icon": "mdi:lightbulb-on",
+ "size": 48,
+ "color": {
+ "type": "constant",
+ "color": "#307FE5"
+ }
+ },
+ "markerImage": {
+ "type": "image",
+ "image": "/assets/markers/shape1.svg",
+ "imageSize": 34
+ },
+ "markerOffsetX": 0.5,
+ "markerOffsetY": 1,
+ "markerClustering": {
+ "enable": false,
+ "zoomOnClick": true,
+ "maxZoom": null,
+ "maxClusterRadius": 80,
+ "zoomAnimation": true,
+ "showCoverageOnHover": true,
+ "spiderfyOnMaxZoom": false,
+ "chunkedLoad": false,
+ "lazyLoad": true,
+ "useClusterMarkerColorFunction": false,
+ "clusterMarkerColorFunction": null
+ }
+ }
+ ],
+ "polygons": [
+ {
+ "dsType": "entity",
+ "dsLabel": "",
+ "dsDeviceId": null,
+ "dsEntityAliasId": "030502c4-afe2-4a7b-2de1-14e8c87904fa",
+ "dsFilterId": null,
+ "additionalDataSources": null,
+ "additionalDataKeys": null,
+ "label": {
+ "show": false,
+ "type": "pattern",
+ "pattern": "${entityName}"
+ },
+ "tooltip": {
+ "show": false,
+ "trigger": "click",
+ "autoclose": true,
+ "type": "pattern",
+ "pattern": "${entityName}
TimeStamp: ${ts:7}",
+ "offsetX": 0,
+ "offsetY": -1
+ },
+ "click": {
+ "type": "doNothing"
+ },
+ "groups": null,
+ "edit": {
+ "enabledActions": [],
+ "attributeScope": "SERVER_SCOPE",
+ "snappable": false
+ },
+ "fillType": "color",
+ "fillColor": {
+ "type": "constant",
+ "color": "rgba(51,136,255,0.2)"
+ },
+ "fillStripe": {
+ "weight": 3,
+ "color": {
+ "type": "constant",
+ "color": "#8f8f8f"
+ },
+ "spaceWeight": 9,
+ "spaceColor": {
+ "type": "constant",
+ "color": "rgba(143,143,143,0)"
+ },
+ "angle": 45
+ },
+ "fillImage": {
+ "type": "image",
+ "image": "/assets/widget-preview-empty.svg",
+ "preserveAspectRatio": true,
+ "opacity": 1,
+ "angle": 0,
+ "scale": 1
+ },
+ "strokeColor": {
+ "type": "constant",
+ "color": "#3388ff"
+ },
+ "strokeWeight": 3,
+ "polygonKey": {
+ "name": "perimeter",
+ "label": "perimeter",
+ "type": "attribute",
+ "settings": {},
+ "color": "#2196f3"
+ }
+ }
+ ],
+ "circles": [],
+ "polylines": [],
+ "additionalDataSources": [],
+ "controlsPosition": "topleft",
+ "zoomActions": [
+ "scroll",
+ "doubleClick",
+ "controlButtons"
+ ],
+ "scales": [],
+ "dragModeButton": false,
+ "fitMapBounds": true,
+ "useDefaultCenterPosition": false,
+ "defaultCenterPosition": "0,0",
+ "defaultZoomLevel": 18,
+ "mapPageSize": 16384,
+ "mapActionButtons": [],
+ "background": {
+ "type": "color",
+ "color": "#fff",
+ "overlay": {
+ "enabled": false,
+ "color": "rgba(255,255,255,0.72)",
+ "blur": 3
+ }
+ },
+ "padding": "8px"
+ },
+ "title": "Map",
+ "showTitleIcon": false,
+ "titleTooltip": "",
+ "dropShadow": true,
+ "enableFullscreen": true,
+ "widgetStyle": {},
+ "widgetCss": "",
+ "titleStyle": {
+ "fontSize": "16px",
+ "fontWeight": 400
+ },
+ "pageSize": 1024,
+ "noDataDisplayMessage": "",
+ "configMode": "advanced",
+ "titleFont": null,
+ "titleColor": null,
+ "margin": "0px",
+ "borderRadius": "0px",
+ "iconSize": "24px",
+ "titleIcon": "map",
+ "iconColor": "#1F6BDD",
+ "actions": {}
+ },
+ "row": 0,
+ "col": 0,
+ "id": "a0a1e643-8fed-8382-ca4f-39dd5f0091c3"
+ }
+ },
+ "states": {
+ "default": {
+ "name": "Warehouse Equipment Tracking Dashboard",
+ "root": true,
+ "layouts": {
+ "main": {
+ "widgets": {
+ "672aa4f0-2f66-4691-09cd-8f9377f65a67": {
+ "sizeX": 7,
+ "sizeY": 6,
+ "row": 0,
+ "col": 0
+ },
+ "a0a1e643-8fed-8382-ca4f-39dd5f0091c3": {
+ "sizeX": 17,
+ "sizeY": 6,
+ "row": 0,
+ "col": 7
+ }
+ },
+ "gridSettings": {
+ "layoutType": "default",
+ "backgroundColor": "#eeeeee",
+ "columns": 24,
+ "margin": 10,
+ "outerMargin": true,
+ "backgroundSizeMode": "100%",
+ "minColumns": 24,
+ "viewFormat": "grid",
+ "autoFillHeight": true,
+ "rowHeight": 70,
+ "backgroundImageUrl": null,
+ "mobileAutoFillHeight": false,
+ "mobileRowHeight": 70
+ }
+ }
+ }
+ }
+ },
+ "entityAliases": {
+ "7769d4d8-9585-0d5f-93e5-66415be9db1c": {
+ "id": "7769d4d8-9585-0d5f-93e5-66415be9db1c",
+ "alias": "Fork Lifts",
+ "filter": {
+ "type": "deviceType",
+ "resolveMultiple": true,
+ "deviceTypes": [
+ "Fork Lift"
+ ],
+ "deviceNameFilter": ""
+ }
+ },
+ "030502c4-afe2-4a7b-2de1-14e8c87904fa": {
+ "id": "030502c4-afe2-4a7b-2de1-14e8c87904fa",
+ "alias": "Warehouse Buildings",
+ "filter": {
+ "type": "assetType",
+ "resolveMultiple": true,
+ "assetTypes": [
+ "Warehouse Building"
+ ],
+ "assetNameFilter": ""
+ }
+ }
+ },
+ "filters": {},
+ "timewindow": {
+ "selectedTab": 0,
+ "realtime": {
+ "realtimeType": 0,
+ "interval": 10000,
+ "timewindowMs": 600000
+ },
+ "aggregation": {
+ "type": "AVG"
+ }
+ },
+ "settings": {
+ "stateControllerId": "entity",
+ "showTitle": false,
+ "showDashboardsSelect": true,
+ "showEntitiesSelect": true,
+ "showDashboardTimewindow": true,
+ "showDashboardExport": true,
+ "toolbarAlwaysOpen": true,
+ "titleColor": "rgba(0,0,0,0.870588)",
+ "showDashboardLogo": false,
+ "dashboardLogoUrl": null,
+ "hideToolbar": false,
+ "showFilters": true,
+ "showUpdateDashboardImage": true,
+ "dashboardCss": ""
+ }
+ },
+ "name": "Warehouse Equipment Tracking Dashboard",
+ "resources": []
+}
\ No newline at end of file
diff --git a/images/user-guide/calculated-fields/geofencing/complex-fleet-management-example-3-preview.png b/images/user-guide/calculated-fields/geofencing/complex-fleet-management-example-3-preview.png
new file mode 100644
index 0000000000..0c5e5bb988
Binary files /dev/null and b/images/user-guide/calculated-fields/geofencing/complex-fleet-management-example-3-preview.png differ
diff --git a/images/user-guide/calculated-fields/geofencing/complex-fleet-management-example-3.png b/images/user-guide/calculated-fields/geofencing/complex-fleet-management-example-3.png
new file mode 100644
index 0000000000..a1011bdbd7
Binary files /dev/null and b/images/user-guide/calculated-fields/geofencing/complex-fleet-management-example-3.png differ
diff --git a/images/user-guide/calculated-fields/geofencing/pet-tracking-example-1-preview.png b/images/user-guide/calculated-fields/geofencing/pet-tracking-example-1-preview.png
new file mode 100644
index 0000000000..3da05a4e0e
Binary files /dev/null and b/images/user-guide/calculated-fields/geofencing/pet-tracking-example-1-preview.png differ
diff --git a/images/user-guide/calculated-fields/geofencing/pet-tracking-example-1.png b/images/user-guide/calculated-fields/geofencing/pet-tracking-example-1.png
new file mode 100644
index 0000000000..fb3fb6d751
Binary files /dev/null and b/images/user-guide/calculated-fields/geofencing/pet-tracking-example-1.png differ
diff --git a/images/user-guide/calculated-fields/geofencing/warehouse-equipment-example-2-preview.png b/images/user-guide/calculated-fields/geofencing/warehouse-equipment-example-2-preview.png
new file mode 100644
index 0000000000..441e6c6ff9
Binary files /dev/null and b/images/user-guide/calculated-fields/geofencing/warehouse-equipment-example-2-preview.png differ
diff --git a/images/user-guide/calculated-fields/geofencing/warehouse-equipment-example-2.png b/images/user-guide/calculated-fields/geofencing/warehouse-equipment-example-2.png
new file mode 100644
index 0000000000..4f1e0b847a
Binary files /dev/null and b/images/user-guide/calculated-fields/geofencing/warehouse-equipment-example-2.png differ