> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.kodelabs.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Angus

> Connect Angus to KODE OS for work orders data

> Connect Angus to KODE OS for work orders data integration

## Overview

Use this integration to connect Angus to KODE OS. You can discover devices and points, collect sensor and non-sensor data with hybrid snapshot collection, and use supported actions for work order workflows.

| Property            | Value                |
| ------------------- | -------------------- |
| **System Type**     | Work Orders          |
| **Communication**   | REST                 |
| **Collection**      | Hybrid (Pull + Push) |
| **Collection Mode** | SNAPSHOT             |
| **Actions**         | Supported            |

## Supported Capabilities

* Discover Devices & Points
* Collect Sensor Data
* Collect Non-Sensor Data

## Prerequisites

* An active account with Angus and access to their API or developer portal
* Username and password credentials for the Angus system
* KODE OS environment with access to Data Sources

## Configure Connector in KODE OS

1. Navigate to **Data Sources** in your building
2. Click **API Catalog** and search for **Angus**
3. Click **+ Add Datasource**
4. Fill in the fields below and complete the three-page setup flow

| Field               | Required | Type     | Description                                              |
| ------------------- | -------- | -------- | -------------------------------------------------------- |
| **URL**             | Yes      | text     | The base URL or IP address of the external system        |
| **Username**        | Yes      | text     | The username for authenticating with the external system |
| **Password**        | Yes      | password | The password for authenticating with the external system |
| **API Building ID** | Yes      | text     | The building or source identifier in the external system |
| **File Name**       | Yes      | text     | The name of the file to upload or reference              |

## Discover Devices and Points

After configuring the connector, click **Discover** on the connector detail page. KODE OS will query the Angus system and return a list of available devices and their data points.

Review the discovered items and select the devices you want to register in KODE OS.

For more details on the discovery process, see the [Discovery guide](/products/integrations/capabilities/discovery).

## Devices and Points

When you discover devices from Angus, KODE OS maps them to the following device types and data points:

### IO Reader / Controller

Canonical Type: `IOREADER`

| # | Point      | Description                                                          | Unit | Writable | Collection |
| - | ---------- | -------------------------------------------------------------------- | ---- | -------- | ---------- |
| 1 | `INACTIVE` | **True** -- INACTIVE is active / **False** -- INACTIVE is not active | --   | No       | Polling    |

## What Data You Get

### Point History

Time-series readings including INACTIVE, collected at regular intervals from connected devices

### Work Orders

Maintenance and service requests including title, description, status, priority, assignee, due dates, vendor response, resolution details, and cost estimates

KODE OS maps Angus data to these standard fields:

| KODE Field            | Source Field                                                         | Notes                |
| --------------------- | -------------------------------------------------------------------- | -------------------- |
| **id**                | `displayId`                                                          | --                   |
| **title**             | `trade`                                                              | --                   |
| **description**       | `String.join(": ", wOTitle, schedTitle`                              | --                   |
| **status**            | `status`                                                             | --                   |
| **priority**          | `priority`                                                           | --                   |
| **floor**             | `floor`                                                              | --                   |
| **location**          | `suite`                                                              | --                   |
| **assignedTo**        | `assignedTo`                                                         | --                   |
| **createdAt**         | `DateUtils.cutMillis`                                                | transformed          |
| **updatedAt**         | `statusDate`                                                         | --                   |
| **dueDate**           | `DateUtils.cutMillis`                                                | transformed          |
| **completedAt**       | `DateUtils.utcDate( DateUtils.cutMillis(dateCompleted`               | transformed          |
| **duration**          | `actTime`                                                            | --                   |
| **resolutionDetails** | `closureNotes`                                                       | --                   |
| **assetId**           | `equipmentId`                                                        | --                   |
| **assetType**         | `system`                                                             | --                   |
| **customFields**      | `(custom fields)`                                                    | custom fields object |
| **id**                | `displayID`                                                          | --                   |
| **title**             | `trade`                                                              | --                   |
| **description**       | `woDetail`                                                           | --                   |
| **status**            | `status`                                                             | --                   |
| **priority**          | `priority`                                                           | --                   |
| **category**          | `requestType`                                                        | --                   |
| **subCategory**       | `bulletinType`                                                       | --                   |
| **floor**             | `floor`                                                              | --                   |
| **location**          | `suite`                                                              | --                   |
| **problemCause**      | `delayComment`                                                       | --                   |
| **createdBy**         | `requestedBy + ": " + Utils.toEmptyStringIfNull(contactEmailAddress` | --                   |
| **assignedTo**        | `assignedTo`                                                         | --                   |
| **createdAt**         | `DateUtils.cutMillis`                                                | transformed          |
| **updatedAt**         | `statusDate`                                                         | --                   |
| **dueDate**           | `DateUtils.cutMillis`                                                | transformed          |
| **startedAt**         | `DateUtils.utcDate( DateUtils.cutMillis(dateWorkStarted`             | transformed          |
| **completedAt**       | `DateUtils.utcDate( DateUtils.cutMillis(dateCompleted`               | transformed          |
| **duration**          | `timeCompletion`                                                     | --                   |
| **resolutionDetails** | `closureNotes`                                                       | --                   |
| **estimatedCost**     | `totalAmountEstimated`                                               | --                   |
| **lastComment**       | `qrsComment`                                                         | --                   |
| **customFields**      | `(custom fields)`                                                    | custom fields object |

### Equipment

Equipment inventory and metadata records including equipment type, model, location, and maintenance status

### Polling Schedule

* **WorkOrder** -- Default polling: 5 minutes (min: 5 minutes, max: 1 hours)
* **Equipment** -- Default polling: 1 hours (min: 1 hours, max: 1 days)
* **Point History** -- Default polling: 1 days (min: 1 days, max: 1 days)

For more details on collection modes, see the [Data Collection guide](/products/integrations/capabilities/data-collection).

## Available Actions

### Create Work Order

**Type:** Write

Creates a new work order in the Angus AnyWhere system

| Field              | Type    | Required | Input     | Options / Default    |
| ------------------ | ------- | -------- | --------- | -------------------- |
| **Priority**       | STRING  | Yes      | Drop Down | Static priority list |
| **WO Title**       | STRING  | Yes      | Text Box  | --                   |
| **Instructions**   | STRING  | No       | Text Area | --                   |
| **Estimated Time** | INTEGER | Yes      | Number    | --                   |
| **Trade**          | STRING  | Yes      | Drop Down | Static trades list   |

#### Example Request

```json theme={null}
{
  "Priority": "High",
  "WOTitle": "example-value",
  "EstTime": "2026-03-29T10:00:00Z",
  "Trade": "example-value",
  "Instructions": "example-value"
}
```

#### Expected Result

* KODE OS sends the action to the external API using the configured connector credentials
* The external system returns success (typically HTTP 2xx) and processes the requested operation

For more details on how actions work, see the [Actions guide](/products/integrations/capabilities/actions).

## Use Cases

Once connected, this integration enables you to:

* Centralize maintenance requests and work order status from facility management systems
* Create and update work orders directly from KODE OS when issues are detected
* Track maintenance KPIs including response time, completion rate, and cost

## Troubleshooting

<AccordionGroup>
  <Accordion title="Authentication or connection error">
    Verify that the credentials are correct and have not expired. Check that the URL is reachable from the KODE OS environment. Verify the username and password are correct and the account has not been locked in the Angus system.
  </Accordion>

  <Accordion title="Discovery returns no devices">
    Verify the connector credentials have sufficient permissions in the Angus system to list devices. Run a test connection first to confirm connectivity. Some systems require specific API scopes or roles for device enumeration.
  </Accordion>

  <Accordion title="Data collection stops or gaps appear">
    Check the connector status on the Data Sources page. If the status shows an error, review the error logs on the connector detail page. Common causes include expired credentials, network changes, or rate limiting by the Angus API.
  </Accordion>
</AccordionGroup>
